Make Copy and Trim ignore empty lines, and fix vim line selections (#29019)
Close #28519 Release Notes: Update `editor: copy and trim` command: 1. Ignore empty lines in the middle: ``` Line 1 Line 2 ``` Will copy text to clipboard: ``` Line 1 Line 2 ``` Before this commit trim not performed 1. Fix select use vim line selections, trim not works
This commit is contained in:
parent
5f7189e5af
commit
72218f4a61
2 changed files with 40 additions and 2 deletions
|
@ -10155,11 +10155,19 @@ impl Editor {
|
||||||
..Point::new(row.0, buffer.line_len(row)),
|
..Point::new(row.0, buffer.line_len(row)),
|
||||||
);
|
);
|
||||||
for row in start.row + 1..=end.row {
|
for row in start.row + 1..=end.row {
|
||||||
|
let mut line_len = buffer.line_len(MultiBufferRow(row));
|
||||||
|
if row == end.row {
|
||||||
|
line_len = end.column;
|
||||||
|
}
|
||||||
|
if line_len == 0 {
|
||||||
|
trimmed_selections
|
||||||
|
.push(Point::new(row, 0)..Point::new(row, line_len));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let row_indent_size = buffer.indent_size_for_line(MultiBufferRow(row));
|
let row_indent_size = buffer.indent_size_for_line(MultiBufferRow(row));
|
||||||
if row_indent_size.len >= first_indent.len {
|
if row_indent_size.len >= first_indent.len {
|
||||||
trimmed_selections.push(
|
trimmed_selections.push(
|
||||||
Point::new(row, first_indent.len)
|
Point::new(row, first_indent.len)..Point::new(row, line_len),
|
||||||
..Point::new(row, buffer.line_len(MultiBufferRow(row))),
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
trimmed_selections.clear();
|
trimmed_selections.clear();
|
||||||
|
|
|
@ -5121,6 +5121,36 @@ if is_entire_line {
|
||||||
),
|
),
|
||||||
"When selecting past the indent, nothing is trimmed"
|
"When selecting past the indent, nothing is trimmed"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
cx.set_state(
|
||||||
|
r#" «for selection in selections.iter() {
|
||||||
|
let mut start = selection.start;
|
||||||
|
|
||||||
|
let mut end = selection.end;
|
||||||
|
let is_entire_line = selection.is_empty();
|
||||||
|
if is_entire_line {
|
||||||
|
start = Point::new(start.row, 0);
|
||||||
|
ˇ» end = cmp::min(max_point, Point::new(end.row + 1, 0));
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
cx.update_editor(|e, window, cx| e.copy_and_trim(&CopyAndTrim, window, cx));
|
||||||
|
assert_eq!(
|
||||||
|
cx.read_from_clipboard()
|
||||||
|
.and_then(|item| item.text().as_deref().map(str::to_string)),
|
||||||
|
Some(
|
||||||
|
"for selection in selections.iter() {
|
||||||
|
let mut start = selection.start;
|
||||||
|
|
||||||
|
let mut end = selection.end;
|
||||||
|
let is_entire_line = selection.is_empty();
|
||||||
|
if is_entire_line {
|
||||||
|
start = Point::new(start.row, 0);
|
||||||
|
"
|
||||||
|
.to_string()
|
||||||
|
),
|
||||||
|
"Copying with stripping should ignore empty lines"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[gpui::test]
|
#[gpui::test]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue