Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unbind-default-keys config option #2733

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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, Keymap>>,
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(),
}
Comment on lines +71 to +75
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let mut keys;
match local.unbind_default_keys {
true => keys = HashMap::default(),
false => 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)
}
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(),
}
Comment on lines +105 to +109
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let mut keys;
match config.unbind_default_keys {
true => keys = HashMap::default(),
false => 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);
}
Expand Down
11 changes: 7 additions & 4 deletions helix-term/src/keymap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,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,
};
Comment on lines +363 to +366
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let keymap = match keymaps.get(&mode) {
Some(keymap) => keymap,
None => return KeymapResult::NotFound,
};
let Some(keymap) = keymaps.get(&mode) else { return KeymapResult::NotFound; };

This is the style used elsewhere in the code.


if key!(Esc) == key {
if !self.state.is_empty() {
Expand Down Expand Up @@ -415,10 +418,10 @@ 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, Keymap>, mut delta: HashMap<Mode, Keymap>) {
for (mode, keys) in dst {
keys.merge(delta.remove(mode).unwrap_or_default())
for (mode, keys) in delta.drain() {
dst.entry(mode).or_default().merge(keys);
}
}

Expand Down