aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinden Krouse2024-05-01 20:48:08 +0000
committerJJ2024-05-01 23:06:27 +0000
commit0a08d7eb5e5049dee8804dffcb110d7d27503810 (patch)
tree9d0a565114788738e1bfa125faaa842ce57f4d9d
parent3bff36ab90aba7de8bb5bff7dbb8230d81cdf582 (diff)
Add unbind-default-keys config option
ref: https://github.com/helix-editor/helix/issues/2720 ref: https://github.com/helix-editor/helix/pull/2733
-rw-r--r--book/src/remapping.md18
-rw-r--r--helix-term/src/config.rs12
-rw-r--r--helix-term/src/keymap.rs7
3 files changed, 33 insertions, 4 deletions
diff --git a/book/src/remapping.md b/book/src/remapping.md
index d762c6ad..d23950aa 100644
--- a/book/src/remapping.md
+++ b/book/src/remapping.md
@@ -75,5 +75,23 @@ Ctrl, Shift and Alt modifiers are encoded respectively with the prefixes
Keys can be disabled by binding them to the `no_op` command.
+To remove all default bindings, `unbind-default-keys = true` can be added to the top level configuration.
+
+```toml
+unbind-default-keys = true
+
+# Only these normal mode bindings will be used
+[keys.normal]
+n = "normal_mode"
+t = "goto_definition"
+
+# remember to add bindings to return to normal mode
+[keys.select]
+esc = "normal_mode"
+
+[keys.insert]
+esc = "normal_mode"
+```
+
A list of commands is available in the [Keymap](https://docs.helix-editor.com/keymap.html) documentation
and in the source code at [`helix-term/src/commands.rs`](https://github.com/helix-editor/helix/blob/master/helix-term/src/commands.rs) at the invocation of `static_commands!` macro and the `TypableCommandList`.
diff --git a/helix-term/src/config.rs b/helix-term/src/config.rs
index bcba8d8e..ace10821 100644
--- a/helix-term/src/config.rs
+++ b/helix-term/src/config.rs
@@ -20,6 +20,8 @@ pub struct Config {
#[serde(deny_unknown_fields)]
pub struct ConfigRaw {
pub theme: Option<String>,
+ #[serde(default)]
+ pub unbind_default_keys: bool,
pub keys: Option<HashMap<Mode, KeyTrie>>,
pub editor: Option<toml::Value>,
}
@@ -66,7 +68,10 @@ impl Config {
local.and_then(|file| toml::from_str(&file).map_err(ConfigLoadError::BadConfig));
let res = match (global_config, local_config) {
(Ok(global), Ok(local)) => {
- let mut keys = keymap::default();
+ let mut keys = match local.unbind_default_keys {
+ true => HashMap::default(),
+ false => keymap::default(),
+ };
if let Some(global_keys) = global.keys {
merge_keys(&mut keys, global_keys)
}
@@ -96,7 +101,10 @@ impl Config {
return Err(ConfigLoadError::BadConfig(err))
}
(Ok(config), Err(_)) | (Err(_), Ok(config)) => {
- let mut keys = keymap::default();
+ let mut keys = match config.unbind_default_keys {
+ true => HashMap::default(),
+ false => keymap::default(),
+ };
if let Some(keymap) = config.keys {
merge_keys(&mut keys, keymap);
}
diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs
index 975274ed..995e3c41 100644
--- a/helix-term/src/keymap.rs
+++ b/helix-term/src/keymap.rs
@@ -318,7 +318,10 @@ impl Keymaps {
pub fn get(&mut self, mode: Mode, key: KeyEvent) -> KeymapResult {
// TODO: remove the sticky part and look up manually
let keymaps = &*self.map();
- let keymap = &keymaps[&mode];
+ let keymap = match keymaps.get(&mode) {
+ Some(keymap) => keymap,
+ None => return KeymapResult::NotFound,
+ };
if key!(Esc) == key {
if !self.state.is_empty() {
@@ -373,7 +376,7 @@ impl Default for Keymaps {
}
}
-/// Merge default config keys with user overwritten keys for custom user config.
+/// Merge existing config keys with user overwritten keys.
pub fn merge_keys(dst: &mut HashMap<Mode, KeyTrie>, mut delta: HashMap<Mode, KeyTrie>) {
for (mode, keys) in dst {
keys.merge_nodes(