aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGokul Soumya2022-06-21 16:46:50 +0000
committerGitHub2022-06-21 16:46:50 +0000
commit8b67acf130e12cf8aaa439fe19ea7b8917db300b (patch)
tree7f53afaae727a23c664347ec932fd16693359609
parent8ad0b83e306ff6dfc1499d3e6d25b2fd36a096a4 (diff)
Format keys identically in statusline and command palette (#2790)
The command palette previously used + as a delimiter for denoting a single key in a key sequence, (like C+w). This was at odds with how the statusline displayed them with pending keys (like <C-w>). This patch changes the palette formatting to the statusline formatting
-rw-r--r--helix-term/src/commands.rs5
-rw-r--r--helix-term/src/ui/editor.rs8
-rw-r--r--helix-view/src/input.rs27
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 {