Skip to content

Commit

Permalink
Add unbind_default_keys config option (#1)
Browse files Browse the repository at this point in the history
* Add `unbind_default_keys` config option

Based on helix-editor#2733

* Fix lint issues
  • Loading branch information
postsolar committed Jan 19, 2024
1 parent 9c56afe commit 20b7d8e
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 10 deletions.
18 changes: 18 additions & 0 deletions book/src/remapping.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
14 changes: 12 additions & 2 deletions helix-term/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
}
Expand Down Expand Up @@ -66,7 +68,11 @@ 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 => keys = HashMap::default(),
false => keys = keymap::default(),
}
if let Some(global_keys) = global.keys {
merge_keys(&mut keys, global_keys)
}
Expand Down Expand Up @@ -96,7 +102,11 @@ 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 => keys = HashMap::default(),
false => keys = keymap::default(),
}
if let Some(keymap) = config.keys {
merge_keys(&mut keys, keymap);
}
Expand Down
17 changes: 9 additions & 8 deletions helix-term/src/keymap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,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() {
Expand Down Expand Up @@ -364,14 +367,12 @@ 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(
delta
.remove(mode)
.unwrap_or_else(|| KeyTrie::Node(KeyTrieNode::default())),
)
for (mode, keys) in delta.drain() {
dst.entry(mode)
.or_insert(KeyTrie::Node(KeyTrieNode::default()))
.merge_nodes(keys)
}
}

Expand Down

0 comments on commit 20b7d8e

Please sign in to comment.