use crate::{ buffer::Mode, command::Action, keymap::{bindn, bind1, KeyMap, KeySeq, PrefixNode}, }; pub struct Config { // TODO must be a power of 2, lol pub tab_width: usize, pub number: bool, pub nmap: KeyMap, pub imap: KeyMap, } impl Default for Config { fn default() -> Self { use Action::*; let nmap = KeyMap::from_iter([ bind1('i', [InsertBefore]), bind1('a', [InsertAfter]), bind1('h', [MoveCharPrev]), bind1('l', [MoveCharNext]), bind1('j', [MoveLineForward(1)]), bind1('J', [MoveLineForward(25)]), bind1('k', [MoveLineBack(1)]), bind1('K', [MoveLineBack(25)]), bindn(['g', 'g'], [MoveFirstLine]), bind1('G', [MoveLastLine]), bind1('I', [MoveLineStart, InsertBefore]), bind1('A', [MoveLineEnd, InsertAfter]), bind1('o', [NewlineAfter, MoveLineForward(1), InsertBefore]), bind1('O', [NewlineBefore, MoveLineBack(1), InsertBefore]), bindn(['d', 'd'], [KillLine]), ]); let imap = KeyMap::from_iter([ bind1('\x7F', [EraseBackward]), bind1( '\n', [BreakLine, MoveLineForward(1), MoveLineStart, InsertBefore], ), bind1( '\x0D', [BreakLine, MoveLineForward(1), MoveLineStart, InsertBefore], ), ]); Self { tab_width: 4, number: true, nmap, imap, } } } impl Config { pub fn key_seq(&self, mode: Mode, seq: &KeySeq) -> Option<&PrefixNode>> { match mode { Mode::Normal => self.nmap.get(seq), Mode::Insert => self.imap.get(seq), } } }