diff options
author | Blaž Hrastnik | 2021-03-11 07:14:52 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2021-03-11 07:15:27 +0000 |
commit | 4acf30102282584e31d8ac9a7a69e45acbdd64ec (patch) | |
tree | 397163644e7adca237cf3309b942895ebc5fa4cb /helix-term | |
parent | 62c991230f511b2dc11f8d1701260511800429d4 (diff) |
Implement the f/t/F/T find/till family of commands.
Diffstat (limited to 'helix-term')
-rw-r--r-- | helix-term/src/commands.rs | 92 | ||||
-rw-r--r-- | helix-term/src/keymap.rs | 11 |
2 files changed, 95 insertions, 8 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index f60f646e..edc38a48 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -5,7 +5,7 @@ use helix_core::{ regex::{self, Regex}, register, search, selection, state::{coords_at_pos, pos_at_coords, Direction, Granularity, State}, - Change, ChangeSet, Position, Range, Selection, Tendril, Transaction, + Change, ChangeSet, Position, Range, RopeSlice, Selection, Tendril, Transaction, }; use once_cell::sync::Lazy; @@ -236,7 +236,13 @@ pub fn extend_next_word_end(cx: &mut Context) { doc.set_selection(selection); } -pub fn find_next_char(cx: &mut Context) { +#[inline] +fn _find_char<F>(cx: &mut Context, search_fn: F, inclusive: bool, extend: bool) +where + // TODO: make an options struct for and abstract this Fn into a searcher type + // use the definition for w/b/e too + F: Fn(RopeSlice, char, usize, usize, bool) -> Option<usize>, +{ // TODO: count is reset to 1 before next key so we move it into the closure here. // Would be nice to carry over. let count = cx.count; @@ -252,9 +258,13 @@ pub fn find_next_char(cx: &mut Context) { let text = doc.text().slice(..); let selection = doc.selection().transform(|mut range| { - if let Some(pos) = search::find_nth_next(text, ch, range.head, count) { - Range::new(range.head, pos) - // or (range.anchor, pos) for extend + if let Some(pos) = search::find_nth_next(text, ch, range.head, count, inclusive) { + if extend { + Range::new(range.anchor, pos) + } else { + // select + Range::new(range.head, pos) + } // or (pos, pos) to move to found val } else { range @@ -266,6 +276,78 @@ pub fn find_next_char(cx: &mut Context) { }) } +pub fn find_till_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_next, + false, /* inclusive */ + false, /* extend */ + ) +} + +pub fn find_next_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_next, + true, /* inclusive */ + false, /* extend */ + ) +} + +pub fn extend_till_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_next, + false, /* inclusive */ + true, /* extend */ + ) +} + +pub fn extend_next_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_next, + true, /* inclusive */ + true, /* extend */ + ) +} + +pub fn till_prev_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_prev, + false, /* inclusive */ + false, /* extend */ + ) +} + +pub fn find_prev_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_prev, + true, /* inclusive */ + false, /* extend */ + ) +} + +pub fn extend_till_prev_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_prev, + false, /* inclusive */ + true, /* extend */ + ) +} + +pub fn extend_prev_char(cx: &mut Context) { + _find_char( + cx, + search::find_nth_prev, + true, /* inclusive */ + true, /* extend */ + ) +} + fn scroll(view: &mut View, offset: usize, direction: Direction) { use Direction::*; let text = view.doc.text().slice(..); diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs index d956679a..58a465fe 100644 --- a/helix-term/src/keymap.rs +++ b/helix-term/src/keymap.rs @@ -137,10 +137,10 @@ pub fn default() -> Keymaps { key!('k') => commands::move_line_up, key!('l') => commands::move_char_right, - // key!('t') => commands::till_next_char, + key!('t') => commands::find_till_char, key!('f') => commands::find_next_char, - // key!('T') => commands::till_prev_char, - // key!('f') => commands::find_prev_char, + shift!('T') => commands::till_prev_char, + shift!('F') => commands::find_prev_char, // and matching set for select mode (extend) key!('0') => commands::move_line_start, @@ -261,6 +261,11 @@ pub fn default() -> Keymaps { key!('b') => commands::extend_prev_word_start, key!('e') => commands::extend_next_word_end, + key!('t') => commands::extend_till_char, + key!('f') => commands::extend_next_char, + shift!('T') => commands::extend_till_prev_char, + shift!('F') => commands::extend_prev_char, + Key { code: KeyCode::Esc, modifiers: Modifiers::NONE |