aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/commands.rs
diff options
context:
space:
mode:
authorNathan Vegdahl2021-06-24 06:53:22 +0000
committerBlaž Hrastnik2021-06-24 09:25:56 +0000
commit8935e7a8791eea391a1de41a78278b4bf5dd241d (patch)
tree78b221c467351b10b2157a626cc054239cea3800 /helix-term/src/commands.rs
parent394629ab73442ed07af210fbe2dddecd60b83300 (diff)
Fix open-new-line command for CRLF, as well as other bugs.
Fixes #363. I set out to fix issue #363, but after fixing it discovered some other things were wrong with the command while testing. In summary: - #363 was because it was still assuming a line ending width of 1 char in its indexing calculations, even when actually inserting CRLF. - Aside from #363, it actually needed to set `line_end_index` to zero for *all* calculations that use it when line == 0, but it was only doing so for a single calculation.
Diffstat (limited to 'helix-term/src/commands.rs')
-rw-r--r--helix-term/src/commands.rs18
1 files changed, 11 insertions, 7 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 9e44d256..d176fbca 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -1825,8 +1825,16 @@ fn open(cx: &mut Context, open: Open) {
Open::Above => line,
};
- // insert newlines after this index for both Above and Below variants
- let line_end_index = line_end_char_index(&doc.text().slice(..), line.saturating_sub(1));
+ // Index to insert newlines after, as well as the char width
+ // to use to compensate for those inserted newlines.
+ let (line_end_index, line_end_offset_width) = if line == 0 {
+ (0, 0)
+ } else {
+ (
+ line_end_char_index(&doc.text().slice(..), line.saturating_sub(1)),
+ doc.line_ending.len_chars(),
+ )
+ };
// TODO: share logic with insert_newline for indentation
let indent_level = indent::suggested_indent_for_pos(
@@ -1844,11 +1852,7 @@ fn open(cx: &mut Context, open: Open) {
let text = text.repeat(count);
// calculate new selection ranges
- let pos = if line == 0 {
- 0 // Required since text will have a min len of 1 (\n)
- } else {
- offs + line_end_index + 1
- };
+ let pos = offs + line_end_index + line_end_offset_width;
for i in 0..count {
// pos -> beginning of reference line,
// + (i * (1+indent_len)) -> beginning of i'th line from pos