@@ -5,7 +5,7 @@ use helix_view::{document::Mode, info::Info, input::KeyEvent};
5use serde::Deserialize;
5use serde::Deserialize;
7 borrow::Cow,
7 borrow::Cow,
8− collections::HashMap,
8+ collections::{BTreeSet, HashMap},
9 ops::{Deref, DerefMut},
9 ops::{Deref, DerefMut},
@@ -137,20 +137,28 @@ impl KeyTrieNode {
139 pub fn infobox(&self) -> Info {
139 pub fn infobox(&self) -> Info {
140− let mut body: Vec<(&str, Vec<KeyEvent>)> = Vec::with_capacity(self.len());
140+ let mut body: Vec<(&str, BTreeSet<KeyEvent>)> = Vec::with_capacity(self.len());
141 for (&key, trie) in self.iter() {
141 for (&key, trie) in self.iter() {
142 let desc = match trie {
142 let desc = match trie {
143 KeyTrie::Leaf(cmd) => cmd.doc(),
143 KeyTrie::Leaf(cmd) => cmd.doc(),
144 KeyTrie::Node(n) => n.name(),
144 KeyTrie::Node(n) => n.name(),
146 match body.iter().position(|(d, _)| d == &desc) {
146 match body.iter().position(|(d, _)| d == &desc) {
147− // FIXME: multiple keys are ordered randomly (use BTreeSet)
147+ Some(pos) => {
148− Some(pos) => body[pos].1.push(key),
148+ body[pos].1.insert(key);
151+ let mut keys = BTreeSet::new();
149− None => body.push((desc, vec![key])),
153+ body.push((desc, keys));
152 body.sort_unstable_by_key(|(_, keys)| {
157 body.sort_unstable_by_key(|(_, keys)| {
153− self.order.iter().position(|&k| k == keys[0]).unwrap()
160+ .position(|&k| k == *keys.iter().next().unwrap())
155 let prefix = format!("{} ", self.name());
163 let prefix = format!("{} ", self.name());
156 if body.iter().all(|(desc, _)| desc.starts_with(&prefix)) {
164 if body.iter().all(|(desc, _)| desc.starts_with(&prefix)) {