diff options
author | Christian Duerr <chrisduerr@users.noreply.github.com> | 2018-09-26 18:42:41 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-26 18:42:41 +0000 |
commit | 593d7718d0d3e1e2071021d34178856079ac8bf7 (patch) | |
tree | 414b5eda0eb9a5ca881eb6274c9995a473ba9554 /src/term | |
parent | 94b9345a26370fc02fa092016e59511a330f4cb4 (diff) | |
download | alacritty-593d7718d0d3e1e2071021d34178856079ac8bf7.tar.gz alacritty-593d7718d0d3e1e2071021d34178856079ac8bf7.zip |
Fix selection of empty lines
When selecting multiple lines in Alacritty, there was an issue with
empty lines not being copied. This behavior has been chanaged so empty
lines should be correctly copied now.
When copying content which ends with an empty line, Alacritty would copy
an additional empty line.
This has been resolved by only adding empty lines when the empty line
was not in the last selected line.
Diffstat (limited to 'src/term')
-rw-r--r-- | src/term/mod.rs | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/src/term/mod.rs b/src/term/mod.rs index eefc432e..af464320 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -941,16 +941,11 @@ impl Term { use std::ops::Range; trait Append : PushChar { - fn append(&mut self, grid: &Grid<Cell>, line: usize, cols: Range<Column>) -> Option<Range<Column>>; + fn append(&mut self, grid: &Grid<Cell>, line: usize, cols: Range<Column>); } impl Append for String { - fn append( - &mut self, - grid: &Grid<Cell>, - mut line: usize, - cols: Range<Column> - ) -> Option<Range<Column>> { + fn append(&mut self, grid: &Grid<Cell>, mut line: usize, cols: Range<Column>) { // Select until last line still within the buffer line = min(line, grid.len() - 1); @@ -958,23 +953,18 @@ impl Term { let line_length = grid_line.line_length(); let line_end = min(line_length, cols.end + 1); - if cols.start >= line_end { - None - } else { + if line_end.0 == 0 && cols.end >= grid.num_cols() - 1 { + self.push('\n'); + } else if cols.start < line_end { for cell in &grid_line[cols.start..line_end] { if !cell.flags.contains(cell::Flags::WIDE_CHAR_SPACER) { self.push(cell.c); } } - let range = Some(cols.start..line_end); if cols.end >= grid.num_cols() - 1 { - if let Some(ref range) = range { - self.maybe_newline(grid, line, range.end); - } + self.maybe_newline(grid, line, line_end); } - - range } } } @@ -2006,7 +1996,7 @@ mod tests { use term::cell; use grid::{Grid, Scroll}; - use index::{Point, Line, Column}; + use index::{Point, Line, Column, Side}; use ansi::{self, Handler, CharsetIndex, StandardCharset}; use selection::Selection; use std::mem; @@ -2082,6 +2072,34 @@ mod tests { assert_eq!(term.selection_to_string(), Some(String::from("\"aa\"a\n"))); } + #[test] + fn selecting_empty_line() { + let size = SizeInfo { + width: 21.0, + height: 51.0, + cell_width: 3.0, + cell_height: 3.0, + padding_x: 0.0, + padding_y: 0.0, + }; + let mut term = Term::new(&Default::default(), size); + let mut grid: Grid<Cell> = Grid::new(Line(3), Column(3), 0, Cell::default()); + for l in 0..3 { + if l != 1 { + for c in 0..3 { + grid[Line(l)][Column(c)].c = 'a'; + } + } + } + + mem::swap(&mut term.grid, &mut grid); + + let mut selection = Selection::simple(Point { line: 2, col: Column(0) }, Side::Left); + selection.update(Point { line: 0, col: Column(2) }, Side::Right); + *term.selection_mut() = Some(selection); + assert_eq!(term.selection_to_string(), Some("aaa\n\naaa\n".into())); + } + /// Check that the grid can be serialized back and forth losslessly /// /// This test is in the term module as opposed to the grid since we want to |