on master help sign in
Make `Keymap` a tuple struct.
commitf7df53c9481ebd9024a439eacb0467051faa30f9 authorgibbz00 <gabrielhansson00@gmail.com> dateWed 31 May 2023, 23:59 (3 years ago) parentdaea97a
1 file changed+36−30
helix-term/src/keymap.rs+36−30
helix-term/src/keymap.rs+36−30
@@ -252,17 +252,14 @@ pub enum KeymapResult {
252252
253253#[derive(Debug, Clone, PartialEq, Deserialize)]
254254#[serde(transparent)]
255−pub struct Keymap {
256− /// Always a Node
257− root: KeyTrie,
258−}
255+pub struct Keymap(KeyTrie);
259256
260257/// A map of command names to keybinds that will execute the command.
261258pub type ReverseKeymap = HashMap<String, Vec<Vec<KeyEvent>>>;
262259
263260impl Keymap {
264261 pub fn new(root: KeyTrie) -> Self {
265− Keymap { root }
262+ Keymap(root)
266263 }
267264
268265 pub fn reverse_map(&self) -> ReverseKeymap {
@@ -290,30 +287,28 @@ impl Keymap {
290287 }
291288
292289 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());
294291 res
295292 }
296−
297− pub fn root(&self) -> &KeyTrie {
298− &self.root
299− }
300−
301− pub fn merge(&mut self, other: Self) {
302− self.root.merge_nodes(other.root);
303− }
304293}
305294
306295impl Deref for Keymap {
307− type Target = KeyTrieNode;
296+ type Target = KeyTrie;
308297
309298 fn deref(&self) -> &Self::Target {
310− self.root.node().unwrap()
299+ &self.0
300+ }
301+}
302+
303+impl DerefMut for Keymap {
304+ fn deref_mut(&mut self) -> &mut Self::Target {
305+ &mut self.0
311306 }
312307}
313308
314309impl Default for Keymap {
315310 fn default() -> Self {
316− Self::new(KeyTrie::Node(KeyTrieNode::default()))
311+ Self(KeyTrie::Node(KeyTrieNode::default()))
317312 }
318313}
319314
@@ -367,7 +362,7 @@ impl Keymaps {
367362 let first = self.state.get(0).unwrap_or(&key);
368363 let trie_node = match self.sticky {
369364 Some(ref trie) => Cow::Owned(KeyTrie::Node(trie.clone())),
370− None => Cow::Borrowed(&keymap.root),
365+ None => Cow::Borrowed(&keymap.0),
371366 };
372367
373368 let trie = match trie_node.search(&[*first]) {
@@ -412,7 +407,7 @@ impl Default for Keymaps {
412407/// Merge default config keys with user overwritten keys for custom user config.
413408pub fn merge_keys(dst: &mut HashMap<Mode, Keymap>, mut delta: HashMap<Mode, Keymap>) {
414409 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)
416411 }
417412}
418413
@@ -478,25 +473,39 @@ mod tests {
478473 let keymap = merged_keyamp.get_mut(&Mode::Normal).unwrap();
479474 // Assumes that `g` is a node in default keymap
480475 assert_eq!(
481− keymap.root().search(&[key!('g'), key!('$')]).unwrap(),
476+ keymap.search(&[key!('g'), key!('$')]).unwrap(),
482477 &KeyTrie::MappableCommand(MappableCommand::goto_line_end),
483478 "Leaf should be present in merged subnode"
484479 );
485480 // Assumes that `gg` is in default keymap
486481 assert_eq!(
487− keymap.root().search(&[key!('g'), key!('g')]).unwrap(),
482+ keymap.search(&[key!('g'), key!('g')]).unwrap(),
488483 &KeyTrie::MappableCommand(MappableCommand::delete_char_forward),
489484 "Leaf should replace old leaf in merged subnode"
490485 );
491486 // Assumes that `ge` is in default keymap
492487 assert_eq!(
493− keymap.root().search(&[key!('g'), key!('e')]).unwrap(),
488+ keymap.search(&[key!('g'), key!('e')]).unwrap(),
494489 &KeyTrie::MappableCommand(MappableCommand::goto_last_line),
495490 "Old leaves in subnode should be present in merged node"
496491 );
497492
498− assert!(merged_keyamp.get(&Mode::Normal).unwrap().len() > 1);
499− assert!(merged_keyamp.get(&Mode::Insert).unwrap().len() > 0);
493+ assert!(
494+ merged_keyamp
495+ .get(&Mode::Normal)
496+ .and_then(|key_trie| key_trie.node())
497+ .unwrap()
498+ .len()
499+ > 1
500+ );
501+ assert!(
502+ merged_keyamp
503+ .get(&Mode::Insert)
504+ .and_then(|key_trie| key_trie.node())
505+ .unwrap()
506+ .len()
507+ > 0
508+ );
500509 }
501510
502511 #[test]
@@ -519,22 +528,19 @@ mod tests {
519528 let keymap = merged_keyamp.get_mut(&Mode::Normal).unwrap();
520529 // Make sure mapping works
521530 assert_eq!(
522− keymap
523− .root()
524− .search(&[key!(' '), key!('s'), key!('v')])
525− .unwrap(),
531+ keymap.search(&[key!(' '), key!('s'), key!('v')]).unwrap(),
526532 &KeyTrie::MappableCommand(MappableCommand::vsplit),
527533 "Leaf should be present in merged subnode"
528534 );
529535 // 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();
531537 assert!(!node.node().unwrap().order().is_empty())
532538 }
533539
534540 #[test]
535541 fn aliased_modes_are_same_in_default_keymap() {
536542 let keymaps = Keymaps::default().map();
537− let root = keymaps.get(&Mode::Normal).unwrap().root();
543+ let root = keymaps.get(&Mode::Normal).unwrap();
538544 assert_eq!(
539545 root.search(&[key!(' '), key!('w')]).unwrap(),
540546 root.search(&["C-w".parse::<KeyEvent>().unwrap()]).unwrap(),