diff options
-rw-r--r-- | helix-term/src/commands.rs | 5 | ||||
-rw-r--r-- | helix-term/src/ui/editor.rs | 8 | ||||
-rw-r--r-- | helix-view/src/input.rs | 27 |
3 files changed, 29 insertions, 11 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index d7937ff5..d4fa34e0 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -2237,9 +2237,8 @@ pub fn command_palette(cx: &mut Context) { .iter() .map(|bind| { bind.iter() - .map(|key| key.to_string()) - .collect::<Vec<String>>() - .join("+") + .map(|key| key.key_sequence_format()) + .collect::<String>() }) .collect::<Vec<String>>() .join(", ") diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index ec25ce94..dc6362c6 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -13,7 +13,6 @@ use helix_core::{ }, movement::Direction, syntax::{self, HighlightEvent}, - unicode::segmentation::UnicodeSegmentation, unicode::width::UnicodeWidthStr, LineEnding, Position, Range, Selection, Transaction, }; @@ -1391,12 +1390,7 @@ impl Component for EditorView { disp.push_str(&count.to_string()) } for key in self.keymaps.pending() { - let s = key.to_string(); - if s.graphemes(true).count() > 1 { - disp.push_str(&format!("<{}>", s)); - } else { - disp.push_str(&s); - } + disp.push_str(&key.key_sequence_format()); } if let Some(pseudo_pending) = &cx.editor.pseudo_pending { disp.push_str(pseudo_pending.as_str()) diff --git a/helix-view/src/input.rs b/helix-view/src/input.rs index 5b867930..093006c4 100644 --- a/helix-view/src/input.rs +++ b/helix-view/src/input.rs @@ -1,6 +1,6 @@ //! Input event handling, currently backed by crossterm. use anyhow::{anyhow, Error}; -use helix_core::unicode::width::UnicodeWidthStr; +use helix_core::unicode::{segmentation::UnicodeSegmentation, width::UnicodeWidthStr}; use serde::de::{self, Deserialize, Deserializer}; use std::fmt; @@ -22,6 +22,31 @@ impl KeyEvent { _ => None, } } + + /// Format the key in such a way that a concatenated sequence + /// of keys can be read easily. + /// + /// ``` + /// # use std::str::FromStr; + /// # use helix_view::input::KeyEvent; + /// + /// let k = KeyEvent::from_str("w").unwrap().key_sequence_format(); + /// assert_eq!(k, "w"); + /// + /// let k = KeyEvent::from_str("C-w").unwrap().key_sequence_format(); + /// assert_eq!(k, "<C-w>"); + /// + /// let k = KeyEvent::from_str(" ").unwrap().key_sequence_format(); + /// assert_eq!(k, "<space>"); + /// ``` + pub fn key_sequence_format(&self) -> String { + let s = self.to_string(); + if s.graphemes(true).count() > 1 { + format!("<{}>", s) + } else { + s + } + } } pub(crate) mod keys { |