@@ -252,17 +252,14 @@ pub enum KeymapResult {
253#[derive(Debug, Clone, PartialEq, Deserialize)]
253#[derive(Debug, Clone, PartialEq, Deserialize)]
254#[serde(transparent)]
254#[serde(transparent)]
255−pub struct Keymap {
255+pub struct Keymap(KeyTrie);
260/// A map of command names to keybinds that will execute the command.
257/// A map of command names to keybinds that will execute the command.
261pub type ReverseKeymap = HashMap<String, Vec<Vec<KeyEvent>>>;
258pub type ReverseKeymap = HashMap<String, Vec<Vec<KeyEvent>>>;
263impl Keymap {
260impl Keymap {
264 pub fn new(root: KeyTrie) -> Self {
261 pub fn new(root: KeyTrie) -> Self {
265− Keymap { root }
262+ Keymap(root)
268 pub fn reverse_map(&self) -> ReverseKeymap {
265 pub fn reverse_map(&self) -> ReverseKeymap {
@@ -290,30 +287,28 @@ impl Keymap {
292 let mut res = HashMap::new();
289 let mut res = HashMap::new();
293− map_node(&mut res, &self.root, &mut Vec::new());
290+ map_node(&mut res, &self.0, &mut Vec::new());
297− pub fn root(&self) -> &KeyTrie {
301− pub fn merge(&mut self, other: Self) {
302− self.root.merge_nodes(other.root);
306impl Deref for Keymap {
295impl Deref for Keymap {
307− type Target = KeyTrieNode;
296+ type Target = KeyTrie;
309 fn deref(&self) -> &Self::Target {
298 fn deref(&self) -> &Self::Target {
310− self.root.node().unwrap()
299+ &self.0
303+impl DerefMut for Keymap {
304+ fn deref_mut(&mut self) -> &mut Self::Target {
314impl Default for Keymap {
309impl Default for Keymap {
315 fn default() -> Self {
310 fn default() -> Self {
316− Self::new(KeyTrie::Node(KeyTrieNode::default()))
311+ Self(KeyTrie::Node(KeyTrieNode::default()))
@@ -367,7 +362,7 @@ impl Keymaps {
367 let first = self.state.get(0).unwrap_or(&key);
362 let first = self.state.get(0).unwrap_or(&key);
368 let trie_node = match self.sticky {
363 let trie_node = match self.sticky {
369 Some(ref trie) => Cow::Owned(KeyTrie::Node(trie.clone())),
364 Some(ref trie) => Cow::Owned(KeyTrie::Node(trie.clone())),
370− None => Cow::Borrowed(&keymap.root),
365+ None => Cow::Borrowed(&keymap.0),
373 let trie = match trie_node.search(&[*first]) {
368 let trie = match trie_node.search(&[*first]) {
@@ -412,7 +407,7 @@ impl Default for Keymaps {
412/// Merge default config keys with user overwritten keys for custom user config.
407/// Merge default config keys with user overwritten keys for custom user config.
413pub fn merge_keys(dst: &mut HashMap<Mode, Keymap>, mut delta: HashMap<Mode, Keymap>) {
408pub fn merge_keys(dst: &mut HashMap<Mode, Keymap>, mut delta: HashMap<Mode, Keymap>) {
414 for (mode, keys) in dst {
409 for (mode, keys) in dst {
415− keys.merge(delta.remove(mode).unwrap_or_default())
410+ keys.merge_nodes(delta.remove(mode).unwrap_or_default().0)
@@ -478,25 +473,39 @@ mod tests {
478 let keymap = merged_keyamp.get_mut(&Mode::Normal).unwrap();
473 let keymap = merged_keyamp.get_mut(&Mode::Normal).unwrap();
479 // Assumes that `g` is a node in default keymap
474 // Assumes that `g` is a node in default keymap
480 assert_eq!(
475 assert_eq!(
481− keymap.root().search(&[key!('g'), key!('$')]).unwrap(),
476+ keymap.search(&[key!('g'), key!('$')]).unwrap(),
482 &KeyTrie::MappableCommand(MappableCommand::goto_line_end),
477 &KeyTrie::MappableCommand(MappableCommand::goto_line_end),
483 "Leaf should be present in merged subnode"
478 "Leaf should be present in merged subnode"
485 // Assumes that `gg` is in default keymap
480 // Assumes that `gg` is in default keymap
486 assert_eq!(
481 assert_eq!(
487− keymap.root().search(&[key!('g'), key!('g')]).unwrap(),
482+ keymap.search(&[key!('g'), key!('g')]).unwrap(),
488 &KeyTrie::MappableCommand(MappableCommand::delete_char_forward),
483 &KeyTrie::MappableCommand(MappableCommand::delete_char_forward),
489 "Leaf should replace old leaf in merged subnode"
484 "Leaf should replace old leaf in merged subnode"
491 // Assumes that `ge` is in default keymap
486 // Assumes that `ge` is in default keymap
492 assert_eq!(
487 assert_eq!(
493− keymap.root().search(&[key!('g'), key!('e')]).unwrap(),
488+ keymap.search(&[key!('g'), key!('e')]).unwrap(),
494 &KeyTrie::MappableCommand(MappableCommand::goto_last_line),
489 &KeyTrie::MappableCommand(MappableCommand::goto_last_line),
495 "Old leaves in subnode should be present in merged node"
490 "Old leaves in subnode should be present in merged node"
498− assert!(merged_keyamp.get(&Mode::Normal).unwrap().len() > 1);
494+ merged_keyamp
496+ .and_then(|key_trie| key_trie.node())
499− assert!(merged_keyamp.get(&Mode::Insert).unwrap().len() > 0);
502+ merged_keyamp
504+ .and_then(|key_trie| key_trie.node())
@@ -519,22 +528,19 @@ mod tests {
519 let keymap = merged_keyamp.get_mut(&Mode::Normal).unwrap();
528 let keymap = merged_keyamp.get_mut(&Mode::Normal).unwrap();
520 // Make sure mapping works
529 // Make sure mapping works
521 assert_eq!(
530 assert_eq!(
524− .search(&[key!(' '), key!('s'), key!('v')])
531+ keymap.search(&[key!(' '), key!('s'), key!('v')]).unwrap(),
526 &KeyTrie::MappableCommand(MappableCommand::vsplit),
532 &KeyTrie::MappableCommand(MappableCommand::vsplit),
527 "Leaf should be present in merged subnode"
533 "Leaf should be present in merged subnode"
529 // Make sure an order was set during merge
535 // Make sure an order was set during merge
530− let node = keymap.root().search(&[crate::key!(' ')]).unwrap();
536+ let node = keymap.search(&[crate::key!(' ')]).unwrap();
531 assert!(!node.node().unwrap().order().is_empty())
537 assert!(!node.node().unwrap().order().is_empty())
535 fn aliased_modes_are_same_in_default_keymap() {
541 fn aliased_modes_are_same_in_default_keymap() {
536 let keymaps = Keymaps::default().map();
542 let keymaps = Keymaps::default().map();
537− let root = keymaps.get(&Mode::Normal).unwrap().root();
543+ let root = keymaps.get(&Mode::Normal).unwrap();
538 assert_eq!(
544 assert_eq!(
539 root.search(&[key!(' '), key!('w')]).unwrap(),
545 root.search(&[key!(' '), key!('w')]).unwrap(),
540 root.search(&["C-w".parse::<KeyEvent>().unwrap()]).unwrap(),
546 root.search(&["C-w".parse::<KeyEvent>().unwrap()]).unwrap(),