diff options
author | Blaž Hrastnik | 2020-06-07 15:28:17 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2020-06-07 15:28:17 +0000 |
commit | 843c20a5504a110dd0bc726d84062851290f1afe (patch) | |
tree | 164b2a39c9620cab0f8a3e2a6c14a71317939515 /helix-term/src/keymap.rs | |
parent | e98cdebf1eb6ea5233c0d4cb0ae84c251fdae987 (diff) |
Add a keymap module.
Diffstat (limited to 'helix-term/src/keymap.rs')
-rw-r--r-- | helix-term/src/keymap.rs | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs new file mode 100644 index 00000000..b2d6738b --- /dev/null +++ b/helix-term/src/keymap.rs @@ -0,0 +1,116 @@ +use crossterm::event::{KeyEvent as Key, KeyModifiers as Modifiers}; +use helix_core::commands::{self, Command}; +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? +// + = +// } +// } + +macro_rules! hashmap { + (@single $($x:tt)*) => (()); + (@count $($rest:expr),*) => (<[()]>::len(&[$(hashmap!(@single $rest)),*])); + + ($($key:expr => $value:expr,)+) => { hashmap!($($key => $value),+) }; + ($($key:expr => $value:expr),*) => { + { + let _cap = hashmap!(@count $($key),*); + let mut _map = ::std::collections::HashMap::with_capacity(_cap); + $( + let _ = _map.insert($key, $value); + )* + _map + } + }; +} + +type Keymap = HashMap<Key, Command>; + +fn default() -> Keymap { + hashmap!( + Key { + code: "h", + modifiers: Modifiers::NONE + } => commands::move_char_left, + Key { + code: "j", + modifiers: Modifiers::NONE + } => commands::move_line_down, + Key { + code: "k", + modifiers: Modifiers::NONE + } => commands::move_line_up, + Key { + code: "l", + modifiers: Modifiers::NONE + } => commands::move_char_right, + ); +} |