use crossterm::event::{KeyCode, 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; pub fn default() -> Keymap { hashmap!( Key { code: KeyCode::Char('h'), modifiers: Modifiers::NONE } => commands::move_char_left as Command, Key { code: KeyCode::Char('j'), modifiers: Modifiers::NONE } => commands::move_line_down as Command, Key { code: KeyCode::Char('k'), modifiers: Modifiers::NONE } => commands::move_line_up as Command, Key { code: KeyCode::Char('l'), modifiers: Modifiers::NONE } => commands::move_char_right as Command, ) }