@@ -118,11 +118,22 @@ impl KeyTrieNode {
118118 }
119119 self.map.insert(key, trie);
120120 }
121+ self.set_order();
122+ }
121123
122− for &key in self.map.keys() {
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) {
129+ for (&key, trie) in self.map.iter_mut() {
123130 if !self.order.contains(&key) {
124131 self.order.push(key);
125132 }
133+ // Order must be recursivly set
134+ if let KeyTrie::Node(node) = trie {
135+ node.set_order();
136+ }
126137 }
127138 }
128139
@@ -140,7 +151,7 @@ impl KeyTrieNode {
140151 }
141152 }
142153 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()
144155 });
145156 let prefix = format!("{} ", self.name());
146157 if body.iter().all(|(desc, _)| desc.starts_with(&prefix)) {
@@ -151,6 +162,11 @@ impl KeyTrieNode {
151162 }
152163 Info::new(self.name(), body)
153164 }
165+
166+ /// Get a reference to the key trie node's order.
167+ pub fn order(&self) -> &[KeyEvent] {
168+ self.order.as_slice()
169+ }
154170}
155171
156172impl Default for KeyTrieNode {
@@ -235,6 +251,7 @@ pub enum KeymapResultKind {
235251
236252/// Returned after looking up a key in [`Keymap`]. The `sticky` field has a
237253/// reference to the sticky node if one is currently active.
254+#[derive(Debug)]
238255pub struct KeymapResult<'a> {
239256 pub kind: KeymapResultKind,
240257 pub sticky: Option<&'a KeyTrieNode>,
@@ -717,4 +734,38 @@ mod tests {
717734 assert!(merged_config.keys.0.get(&Mode::Normal).unwrap().len() > 1);
718735 assert!(merged_config.keys.0.get(&Mode::Insert).unwrap().len() > 0);
719736 }
737+
738+ #[test]
739+ fn order_should_be_set() {
740+ let config = Config {
741+ keys: Keymaps(hashmap! {
742+ Mode::Normal => Keymap::new(
743+ keymap!({ "Normal mode"
744+ "space" => { ""
745+ "s" => { ""
746+ "v" => vsplit,
747+ "c" => hsplit,
748+ },
749+ },
750+ })
751+ )
752+ }),
753+ ..Default::default()
754+ };
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
759+ assert_eq!(
760+ keymap
761+ .root()
762+ .search(&[key!(' '), key!('s'), key!('v')])
763+ .unwrap(),
764+ &KeyTrie::Leaf(Command::vsplit),
765+ "Leaf should be present in merged subnode"
766+ );
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())
770+ }
720771}