diff options
Diffstat (limited to 'helix-view/src/keymap.rs')
-rw-r--r-- | helix-view/src/keymap.rs | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/helix-view/src/keymap.rs b/helix-view/src/keymap.rs new file mode 100644 index 00000000..705357a8 --- /dev/null +++ b/helix-view/src/keymap.rs @@ -0,0 +1,131 @@ +use crate::commands::{self, Command}; +use helix_core::{hashmap, state}; +use std::collections::HashMap; + +// Kakoune-inspired: +// mode = { +// normal = { +// q = record_macro +// w = (next) word +// e = end of word +// r = +// t = 'till char +// y = yank +// u = undo +// U = redo +// i = insert +// I = INSERT (start of line) +// o = open below (insert on new line below) +// O = open above (insert on new line above) +// p = paste (before cursor) +// P = PASTE (after cursor) +// ` = +// [ = select to text object start (alt = select whole object) +// ] = select to text object end +// { = extend to inner object start +// } = extend to inner object end +// a = append +// A = APPEND (end of line) +// s = split +// S = select +// d = delete() +// f = find_char() +// g = goto (gg, G, gc, gd, etc) +// +// h = move_char_left(n) +// j = move_line_down(n) +// k = move_line_up(n) +// l = move_char_right(n) +// : = command line +// ; = collapse selection to cursor +// " = use register +// ` = convert case? (to lower) (alt = swap case) +// ~ = convert to upper case +// . = repeat last command +// \ = disable hook? +// / = search +// > = indent +// < = deindent +// % = select whole buffer (in vim = jump to matching bracket) +// * = search pattern in selection +// ( = rotate main selection backward +// ) = rotate main selection forward +// - = trim selections? (alt = merge contiguous sel together) +// @ = convert tabs to spaces +// & = align cursor +// ? = extend to next given regex match (alt = to prev) +// +// z = save selections +// Z = restore selections +// x = select line +// X = extend line +// c = change selected text +// C = copy selection? +// v = view menu (viewport manipulation) +// b = select to previous word start +// B = select to previous WORD start +// +// +// +// +// +// +// = = align? +// + = +// } +// } + +#[cfg(feature = "term")] +pub use crossterm::event::{KeyCode, KeyEvent as Key, KeyModifiers as Modifiers}; + +// TODO: could be trie based +type Keymap = HashMap<Vec<Key>, Command>; +type Keymaps = HashMap<state::Mode, Keymap>; + +pub fn default() -> Keymaps { + hashmap!( + state::Mode::Normal => + hashmap!( + vec![Key { + code: KeyCode::Char('h'), + modifiers: Modifiers::NONE + }] => commands::move_char_left as Command, + vec![Key { + code: KeyCode::Char('j'), + modifiers: Modifiers::NONE + }] => commands::move_line_down as Command, + vec![Key { + code: KeyCode::Char('k'), + modifiers: Modifiers::NONE + }] => commands::move_line_up as Command, + vec![Key { + code: KeyCode::Char('l'), + modifiers: Modifiers::NONE + }] => commands::move_char_right as Command, + vec![Key { + code: KeyCode::Char('i'), + modifiers: Modifiers::NONE + }] => commands::insert_mode as Command, + vec![Key { + code: KeyCode::Char('I'), + modifiers: Modifiers::SHIFT, + }] => commands::prepend_to_line as Command, + vec![Key { + code: KeyCode::Char('a'), + modifiers: Modifiers::NONE + }] => commands::append_mode as Command, + vec![Key { + code: KeyCode::Char('A'), + modifiers: Modifiers::SHIFT, + }] => commands::append_to_line as Command, + vec![Key { + code: KeyCode::Char('o'), + modifiers: Modifiers::NONE + }] => commands::open_below as Command, + vec![Key { + code: KeyCode::Esc, + modifiers: Modifiers::NONE + }] => commands::normal_mode as Command, + ) + ) +} |