Skip to content

Commit

Permalink
Trim \n from hints/semantic-/simple selection
Browse files Browse the repository at this point in the history
Before this patch a hint regex ending in the last column would append a
newline, despite this newline being "invisible" to the user. To match
the expected behavior, newlines are trimmed from regex hint matches.

To ensure consistency the simple and semantic selection also do not
include a newline at the end of the copied text anymore.

Fixes alacritty#5697.
  • Loading branch information
a5ob7r authored Jan 4, 2022
1 parent 437f42f commit 2057ac2
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 17 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Strip trailing whitespaces when yanking from a block selection
- Display area keeps history position when viewport is cleared
- Commands spawn from the current directory of the foreground shell in Unix-like systems
- Remove trailing newline from strings taken from hints or simple/semantic selections

### Fixed

Expand Down
40 changes: 23 additions & 17 deletions alacritty_terminal/src/term/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::config::Config;
use crate::event::{Event, EventListener};
use crate::grid::{Dimensions, Grid, GridIterator, Scroll};
use crate::index::{self, Boundary, Column, Direction, Line, Point, Side};
use crate::selection::{Selection, SelectionRange};
use crate::selection::{Selection, SelectionRange, SelectionType};
use crate::term::cell::{Cell, Flags, LineLength};
use crate::term::color::{Colors, Rgb};
use crate::vi_mode::{ViModeCursor, ViMotion};
Expand Down Expand Up @@ -348,24 +348,30 @@ impl<T> Term<T> {
/// Convert the active selection to a String.
pub fn selection_to_string(&self) -> Option<String> {
let selection_range = self.selection.as_ref().and_then(|s| s.to_range(self))?;
let SelectionRange { start, end, is_block } = selection_range;
let SelectionRange { start, end, .. } = selection_range;

let mut res = String::new();

if is_block {
for line in (start.line.0..end.line.0).map(Line::from) {
res += self
.line_to_string(line, start.column..end.column, start.column.0 != 0)
.trim_end();

// If the last column is included, newline is appended automatically.
if end.column != self.columns() - 1 {
res += "\n";
match self.selection.as_ref() {
Some(Selection { ty: SelectionType::Block, .. }) => {
for line in (start.line.0..end.line.0).map(Line::from) {
res += self
.line_to_string(line, start.column..end.column, start.column.0 != 0)
.trim_end();

// If the last column is included, newline is appended automatically.
if end.column != self.columns() - 1 {
res += "\n";
}
}
}
res += self.line_to_string(end.line, start.column..end.column, true).trim_end();
} else {
res = self.bounds_to_string(start, end);
res += self.line_to_string(end.line, start.column..end.column, true).trim_end();
},
Some(Selection { ty: SelectionType::Lines, .. }) => {
res = self.bounds_to_string(start, end) + "\n";
},
_ => {
res = self.bounds_to_string(start, end);
},
}

Some(res)
Expand All @@ -382,7 +388,7 @@ impl<T> Term<T> {
res += &self.line_to_string(line, start_col..end_col, line == end.line);
}

res
res.strip_suffix('\n').map(str::to_owned).unwrap_or(res)
}

/// Convert a single line in the grid to a String.
Expand Down Expand Up @@ -2103,7 +2109,7 @@ mod tests {
);
selection.update(Point { line: Line(2), column: Column(2) }, Side::Right);
term.selection = Some(selection);
assert_eq!(term.selection_to_string(), Some("aaa\n\naaa\n".into()));
assert_eq!(term.selection_to_string(), Some("aaa\n\naaa".into()));
}

/// Check that the grid can be serialized back and forth losslessly.
Expand Down

0 comments on commit 2057ac2

Please sign in to comment.