summaryrefslogtreecommitdiff
path: root/alacritty_terminal
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2020-01-15 17:36:33 +0100
committerGitHub <noreply@github.com>2020-01-15 17:36:33 +0100
commit7d1edf01c2d16eedbbfb652b1e57db0f819f12c0 (patch)
treef44acb48c984076c0f9cc727d1ffd5cb8e5defed /alacritty_terminal
parent7dc406252b06a19b8d5c4f2a2fdebe90a5ad65e2 (diff)
downloadalacritty-7d1edf01c2d16eedbbfb652b1e57db0f819f12c0.tar.gz
alacritty-7d1edf01c2d16eedbbfb652b1e57db0f819f12c0.zip
Expand line selection across wrapped lines
Diffstat (limited to 'alacritty_terminal')
-rw-r--r--alacritty_terminal/src/selection.rs10
-rw-r--r--alacritty_terminal/src/term/mod.rs30
2 files changed, 33 insertions, 7 deletions
diff --git a/alacritty_terminal/src/selection.rs b/alacritty_terminal/src/selection.rs
index 6e6dd9c8..1c747d99 100644
--- a/alacritty_terminal/src/selection.rs
+++ b/alacritty_terminal/src/selection.rs
@@ -317,14 +317,14 @@ impl Selection {
Some(Span { start, end, is_block: false })
}
- fn span_lines<T>(term: &T, mut start: Point<isize>, mut end: Point<isize>) -> Option<Span>
+ fn span_lines<T>(term: &T, start: Point<isize>, end: Point<isize>) -> Option<Span>
where
- T: Dimensions,
+ T: Search,
{
- end.col = term.dimensions().col - 1;
- start.col = Column(0);
+ let start = term.line_search_left(start.into());
+ let end = term.line_search_right(end.into());
- Some(Span { start: start.into(), end: end.into(), is_block: false })
+ Some(Span { start, end, is_block: false })
}
fn span_simple<T>(
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs
index 3e8d8618..8edf3d3f 100644
--- a/alacritty_terminal/src/term/mod.rs
+++ b/alacritty_terminal/src/term/mod.rs
@@ -56,6 +56,10 @@ pub trait Search {
fn semantic_search_left(&self, _: Point<usize>) -> Point<usize>;
/// Find the nearest semantic boundary _to the point_ of provided point.
fn semantic_search_right(&self, _: Point<usize>) -> Point<usize>;
+ /// Find the beginning of a line, following line wraps.
+ fn line_search_left(&self, _: Point<usize>) -> Point<usize>;
+ /// Find the end of a line, following line wraps.
+ fn line_search_right(&self, _: Point<usize>) -> Point<usize>;
/// Find the nearest matching bracket.
fn bracket_search(&self, _: Point<usize>) -> Option<Point<usize>>;
}
@@ -109,6 +113,28 @@ impl<T> Search for Term<T> {
point
}
+ fn line_search_left(&self, mut point: Point<usize>) -> Point<usize> {
+ while point.line + 1 < self.grid.len()
+ && self.grid[point.line + 1][self.grid.num_cols() - 1].flags.contains(Flags::WRAPLINE)
+ {
+ point.line += 1;
+ }
+
+ point.col = Column(0);
+
+ point
+ }
+
+ fn line_search_right(&self, mut point: Point<usize>) -> Point<usize> {
+ while self.grid[point.line][self.grid.num_cols() - 1].flags.contains(Flags::WRAPLINE) {
+ point.line -= 1;
+ }
+
+ point.col = self.grid.num_cols() - 1;
+
+ point
+ }
+
fn bracket_search(&self, point: Point<usize>) -> Option<Point<usize>> {
let start_char = self.grid[point.line][point.col].c;
@@ -973,7 +999,7 @@ impl<T> Term<T> {
tab_mode = true;
}
- if !cell.flags.contains(cell::Flags::WIDE_CHAR_SPACER) {
+ if !cell.flags.contains(Flags::WIDE_CHAR_SPACER) {
// Push cells primary character
text.push(cell.c);
@@ -986,7 +1012,7 @@ impl<T> Term<T> {
if cols.end >= self.cols() - 1
&& (line_end == Column(0)
- || !self.grid[line][line_end - 1].flags.contains(cell::Flags::WRAPLINE))
+ || !self.grid[line][line_end - 1].flags.contains(Flags::WRAPLINE))
{
text.push('\n');
}