helix: Further cleanups to helix paste in line mode (#38694)

I noticed that after we paste in line mode, the cursor position is
positioned at the beginning of the next logical line which is somewhat
undesirable since then inserting/appending will position the cursor
after the selection. This does not match helix behaviour which we should
further investigate.

Follow-up to https://github.com/zed-industries/zed/pull/38663

Release Notes:

- N/A
This commit is contained in:
Jakub Konka
2025-09-23 07:44:50 +00:00
committed by GitHub
parent 4532765ae8
commit f07bc12aed
+34 -27
View File
@@ -84,21 +84,14 @@ impl Vim {
let display_point = if line_mode {
if action.before {
movement::line_beginning(&display_map, sel.start, false)
} else if sel.start.column() > 0
&& sel.end.column() == 0
&& sel.start != sel.end
{
sel.end
} else {
let point = movement::line_end(&display_map, sel.end, false);
if sel.end.column() == 0 && point.column() > 0 {
// If the selection ends at the beginning of the next line, and the current line
// under the cursor is not empty, we paste at the selection's end.
sel.end
if sel.start == sel.end {
movement::right(
&display_map,
movement::line_end(&display_map, sel.end, false),
)
} else {
// If however the current line under the cursor is empty, we need to move
// to the beginning of the next line to avoid pasting above the end of current selection.
movement::right(&display_map, point)
sel.end
}
}
} else if action.before {
@@ -132,12 +125,6 @@ impl Vim {
let offset = anchor.to_offset(&snapshot);
if action.before {
offset.saturating_sub(len)..offset
} else if line_mode {
// In line mode, we always move the cursor to the end of the inserted text.
// Otherwise, while it looks fine visually, inserting/appending ends up
// in the next logical line which is not desirable.
debug_assert!(len > 0);
offset..(offset + len - 1)
} else {
offset..(offset + len)
}
@@ -401,8 +388,8 @@ mod test {
indoc! {"
The quick brown
fox jumps over
«nˇ»
the lazy dog."},
«n
ˇ»the lazy dog."},
Mode::HelixNormal,
);
@@ -411,8 +398,8 @@ mod test {
cx.set_state(
indoc! {"
The quick brown
fox jumps over
ˇthe lazy dog."},
fox jumps overˇ
the lazy dog."},
Mode::HelixNormal,
);
cx.simulate_keystrokes("p");
@@ -420,8 +407,8 @@ mod test {
indoc! {"
The quick brown
fox jumps over
«nˇ»
the lazy dog."},
«n
ˇ»the lazy dog."},
Mode::HelixNormal,
);
@@ -437,11 +424,31 @@ mod test {
cx.assert_state(
indoc! {"
«fox jumps overˇ»
The quick brown
«fox jumps over
ˇ»The quick brown
fox jumps over
the lazy dog."},
Mode::HelixNormal,
);
cx.set_state(
indoc! {"
«The quick brown
fox jumps over
ˇ»the lazy dog."},
Mode::HelixNormal,
);
cx.simulate_keystrokes("y p p");
cx.assert_state(
indoc! {"
The quick brown
fox jumps over
The quick brown
fox jumps over
«The quick brown
fox jumps over
ˇ»the lazy dog."},
Mode::HelixNormal,
);
}
}