@@ -118,11 +118,22 @@ impl KeyTrieNode {
119 self.map.insert(key, trie);
119 self.map.insert(key, trie);
124+ /// Sets the order of the mapping recursivly since the
125+ /// the trie can contain child nodes without order.
126+ /// The order is missing from child nodes since it's not
127+ /// parsed from the config.toml
128+ fn set_order(&mut self) {
122− for &key in self.map.keys() {
129+ for (&key, trie) in self.map.iter_mut() {
123 if !self.order.contains(&key) {
130 if !self.order.contains(&key) {
124 self.order.push(key);
131 self.order.push(key);
133+ // Order must be recursivly set
134+ if let KeyTrie::Node(node) = trie {
@@ -140,7 +151,7 @@ impl KeyTrieNode {
142 body.sort_unstable_by_key(|(_, keys)| {
153 body.sort_unstable_by_key(|(_, keys)| {
143− self.order.iter().position(|&k| k == keys[0]).unwrap_or(0)
154+ self.order.iter().position(|&k| k == keys[0]).unwrap()
145 let prefix = format!("{} ", self.name());
156 let prefix = format!("{} ", self.name());
146 if body.iter().all(|(desc, _)| desc.starts_with(&prefix)) {
157 if body.iter().all(|(desc, _)| desc.starts_with(&prefix)) {
@@ -151,6 +162,11 @@ impl KeyTrieNode {
152 Info::new(self.name(), body)
163 Info::new(self.name(), body)
166+ /// Get a reference to the key trie node's order.
167+ pub fn order(&self) -> &[KeyEvent] {
168+ self.order.as_slice()
156impl Default for KeyTrieNode {
172impl Default for KeyTrieNode {
@@ -235,6 +251,7 @@ pub enum KeymapResultKind {
236/// Returned after looking up a key in [`Keymap`]. The `sticky` field has a
252/// Returned after looking up a key in [`Keymap`]. The `sticky` field has a
237/// reference to the sticky node if one is currently active.
253/// reference to the sticky node if one is currently active.
238pub struct KeymapResult<'a> {
255pub struct KeymapResult<'a> {
239 pub kind: KeymapResultKind,
256 pub kind: KeymapResultKind,
240 pub sticky: Option<&'a KeyTrieNode>,
257 pub sticky: Option<&'a KeyTrieNode>,
@@ -717,4 +734,38 @@ mod tests {
717 assert!(merged_config.keys.0.get(&Mode::Normal).unwrap().len() > 1);
734 assert!(merged_config.keys.0.get(&Mode::Normal).unwrap().len() > 1);
718 assert!(merged_config.keys.0.get(&Mode::Insert).unwrap().len() > 0);
735 assert!(merged_config.keys.0.get(&Mode::Insert).unwrap().len() > 0);
739+ fn order_should_be_set() {
740+ let config = Config {
741+ keys: Keymaps(hashmap! {
742+ Mode::Normal => Keymap::new(
743+ keymap!({ "Normal mode"
753+ ..Default::default()
755+ let mut merged_config = merge_keys(config.clone());
756+ assert_ne!(config, merged_config);
757+ let keymap = merged_config.keys.0.get_mut(&Mode::Normal).unwrap();
758+ // Make sure mapping works
762+ .search(&[key!(' '), key!('s'), key!('v')])
764+ &KeyTrie::Leaf(Command::vsplit),
765+ "Leaf should be present in merged subnode"
767+ // Make sure an order was set during merge
768+ let node = keymap.root().search(&[crate::key!(' ')]).unwrap();
769+ assert!(!node.node().unwrap().order().is_empty())