Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/keymap.rs')
-rw-r--r--helix-term/src/keymap.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs
index 55c107f3..aae78933 100644
--- a/helix-term/src/keymap.rs
+++ b/helix-term/src/keymap.rs
@@ -279,6 +279,34 @@ pub enum Domain {
Component(&'static str),
}
+const REMAPPABLE_COMPONENTS: [&'static str; 3] = [
+ crate::ui::DYNAMIC_PICKER_ID,
+ crate::ui::PICKER_ID,
+ // TODO: make it a constant
+ "buffer-picker",
+];
+
+impl<'de> Deserialize<'de> for Domain {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: serde::Deserializer<'de>,
+ {
+ let s = String::deserialize(deserializer)?;
+ if let Ok(mode) = s.parse::<Mode>() {
+ return Ok(Domain::Mode(mode));
+ } else if let Some(name) = REMAPPABLE_COMPONENTS
+ .iter()
+ .find(|name| **name == s.as_str())
+ {
+ Ok(Domain::Component(name))
+ } else {
+ Err(serde::de::Error::custom(format!(
+ "Unknown keymap domain {s}. Expected a mode or component name"
+ )))
+ }
+ }
+}
+
pub struct Keymaps {
pub map: Box<dyn DynAccess<HashMap<Domain, KeyTrie>>>,
/// Stores pending keys waiting for the next key. This is relative to a