aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
authorDaniel Ebert2021-11-01 14:50:12 +0000
committerBlaž Hrastnik2021-11-03 02:56:55 +0000
commiteb8745db0999a50464ac183baa138c4e511430f2 (patch)
tree6089d754bf8d27f7cb865422d04947b4fa785026 /helix-term/src
parente505bf2b4809681840d1684a23ad21255fca290d (diff)
Implement key ordering for info box
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/keymap.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs
index cd953c5c..827f71d9 100644
--- a/helix-term/src/keymap.rs
+++ b/helix-term/src/keymap.rs
@@ -5,7 +5,7 @@ use helix_view::{document::Mode, info::Info, input::KeyEvent};
use serde::Deserialize;
use std::{
borrow::Cow,
- collections::HashMap,
+ collections::{BTreeSet, HashMap},
ops::{Deref, DerefMut},
};
@@ -137,20 +137,28 @@ impl KeyTrieNode {
}
pub fn infobox(&self) -> Info {
- let mut body: Vec<(&str, Vec<KeyEvent>)> = Vec::with_capacity(self.len());
+ let mut body: Vec<(&str, BTreeSet<KeyEvent>)> = Vec::with_capacity(self.len());
for (&key, trie) in self.iter() {
let desc = match trie {
KeyTrie::Leaf(cmd) => cmd.doc(),
KeyTrie::Node(n) => n.name(),
};
match body.iter().position(|(d, _)| d == &desc) {
- // FIXME: multiple keys are ordered randomly (use BTreeSet)
- Some(pos) => body[pos].1.push(key),
- None => body.push((desc, vec![key])),
+ Some(pos) => {
+ body[pos].1.insert(key);
+ }
+ None => {
+ let mut keys = BTreeSet::new();
+ keys.insert(key);
+ body.push((desc, keys));
+ }
}
}
body.sort_unstable_by_key(|(_, keys)| {
- self.order.iter().position(|&k| k == keys[0]).unwrap()
+ self.order
+ .iter()
+ .position(|&k| k == *keys.iter().next().unwrap())
+ .unwrap()
});
let prefix = format!("{} ", self.name());
if body.iter().all(|(desc, _)| desc.starts_with(&prefix)) {