aboutsummaryrefslogtreecommitdiff
path: root/src/term/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/term/mod.rs')
-rw-r--r--src/term/mod.rs52
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