diff options
author | Ivan Tham | 2022-02-21 14:58:54 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2022-04-02 15:46:53 +0000 |
commit | 8350ee9a0ef38ff4e78bfa5dc30e874d6d2510ef (patch) | |
tree | 01c1486aaa420a8d98046619cde79d53b92cdb19 /helix-core/src/movement.rs | |
parent | e2a6e33b98ac6dd1d42be659706c7e0d248e8f5d (diff) |
Add paragraph textobject
Change parameter/argument key from p to a since paragraph only have p
but parameter are also called arguments sometimes and a is not used.
Diffstat (limited to 'helix-core/src/movement.rs')
-rw-r--r-- | helix-core/src/movement.rs | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/helix-core/src/movement.rs b/helix-core/src/movement.rs index dec6eeb9..970aff88 100644 --- a/helix-core/src/movement.rs +++ b/helix-core/src/movement.rs @@ -153,12 +153,12 @@ fn word_move(slice: RopeSlice, range: Range, count: usize, target: WordMotionTar pub fn move_prev_para(slice: RopeSlice, range: Range, count: usize, behavior: Movement) -> Range { let mut line = range.cursor_line(slice); let first_char = slice.line_to_char(line) == range.cursor(slice); + let prev_line_empty = rope_is_line_ending(slice.line(line.saturating_sub(1))); let curr_line_empty = rope_is_line_ending(slice.line(line)); - let last_line_empty = rope_is_line_ending(slice.line(line.saturating_sub(1))); - let line_to_empty = last_line_empty && !curr_line_empty; + let prev_empty_to_line = prev_line_empty && !curr_line_empty; - // iterate current line if first character after paragraph boundary - if line_to_empty && !first_char { + // skip character before paragraph boundary + if prev_empty_to_line && !first_char { line += 1; } let mut lines = slice.lines_at(line); @@ -176,7 +176,7 @@ pub fn move_prev_para(slice: RopeSlice, range: Range, count: usize, behavior: Mo let head = slice.line_to_char(line); let anchor = if behavior == Movement::Move { // exclude first character after paragraph boundary - if line_to_empty && first_char { + if prev_empty_to_line && first_char { range.cursor(slice) } else { range.head @@ -193,13 +193,12 @@ pub fn move_next_para(slice: RopeSlice, range: Range, count: usize, behavior: Mo prev_grapheme_boundary(slice, slice.line_to_char(line + 1)) == range.cursor(slice); let curr_line_empty = rope_is_line_ending(slice.line(line)); let next_line_empty = rope_is_line_ending(slice.line(line.saturating_sub(1))); - let empty_to_line = curr_line_empty && !next_line_empty; + let curr_empty_to_line = curr_line_empty && !next_line_empty; - // iterate current line if first character after paragraph boundary - if empty_to_line && last_char { + // skip character after paragraph boundary + if curr_empty_to_line && last_char { line += 1; } - let mut lines = slice.lines_at(line).map(rope_is_line_ending).peekable(); for _ in 0..count { while lines.next_if(|&e| !e).is_some() { @@ -211,7 +210,7 @@ pub fn move_next_para(slice: RopeSlice, range: Range, count: usize, behavior: Mo } let head = slice.line_to_char(line); let anchor = if behavior == Movement::Move { - if empty_to_line && last_char { + if curr_empty_to_line && last_char { range.head } else { range.cursor(slice) @@ -1256,7 +1255,7 @@ mod test { #[test] fn test_behaviour_when_moving_to_prev_paragraph_single() { let tests = [ - ("^@", "@^"), + ("^@", "^@"), ("^s@tart at\nfirst char\n", "@s^tart at\nfirst char\n"), ("start at\nlast char^\n@", "@start at\nlast char\n^"), ("goto\nfirst\n\n^p@aragraph", "@goto\nfirst\n\n^paragraph"), @@ -1315,7 +1314,7 @@ mod test { #[test] fn test_behaviour_when_moving_to_next_paragraph_single() { let tests = [ - ("^@", "@^"), + ("^@", "^@"), ("^s@tart at\nfirst char\n", "^start at\nfirst char\n@"), ("start at\nlast char^\n@", "start at\nlast char^\n@"), ( |