aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorMehdi Abedi2024-02-14 10:53:15 +0000
committerGitHub2024-02-14 10:53:15 +0000
commit4df08ddbe02f1e8d84c6aa4be810a91f83c73441 (patch)
treee7b76a3d51140e7a8b279023986fd337ac2fe447 /helix-term
parentc59f29921da98e23525c9ff4ffa82e330310e6fe (diff)
Allow numbers as second input event (#8471)
* Make sure pending key list is empty when count handling This will allow using numbers as second key event. * count handling; add an exception for 'g' * Lookup the key event before considering a number as count * Avoid the allocation of another vec for the pending keys --------- Co-authored-by: x <x@torrent>
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/keymap.rs9
-rw-r--r--helix-term/src/ui/editor.rs4
2 files changed, 12 insertions, 1 deletions
diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs
index d9297e08..975274ed 100644
--- a/helix-term/src/keymap.rs
+++ b/helix-term/src/keymap.rs
@@ -303,6 +303,15 @@ impl Keymaps {
self.sticky.as_ref()
}
+ pub fn contains_key(&self, mode: Mode, key: KeyEvent) -> bool {
+ let keymaps = &*self.map();
+ let keymap = &keymaps[&mode];
+ keymap
+ .search(self.pending())
+ .and_then(KeyTrie::node)
+ .is_some_and(|node| node.contains_key(&key))
+ }
+
/// Lookup `key` in the keymap to try and find a command to execute. Escape
/// key cancels pending keystrokes. If there are no pending keystrokes but a
/// sticky node is in use, it will be cleared.
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index fef62a29..bb749d2e 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -903,7 +903,9 @@ impl EditorView {
fn command_mode(&mut self, mode: Mode, cxt: &mut commands::Context, event: KeyEvent) {
match (event, cxt.editor.count) {
// count handling
- (key!(i @ '0'), Some(_)) | (key!(i @ '1'..='9'), _) => {
+ (key!(i @ '0'), Some(_)) | (key!(i @ '1'..='9'), _)
+ if !self.keymaps.contains_key(mode, event) =>
+ {
let i = i.to_digit(10).unwrap() as usize;
cxt.editor.count =
std::num::NonZeroUsize::new(cxt.editor.count.map_or(i, |c| c.get() * 10 + i));