diff --git a/book/src/editor.md b/book/src/editor.md index b5544a06297a..b9516dd546e5 100644 --- a/book/src/editor.md +++ b/book/src/editor.md @@ -64,6 +64,7 @@ | `clipboard-provider` | Which API to use for clipboard interaction. One of `pasteboard` (MacOS), `wayland`, `x-clip`, `x-sel`, `win-32-yank`, `termux`, `tmux`, `windows`, `termcode`, `none`, or a custom command set. | Platform and environment specific. | | `editor-config` | Whether to read settings from [EditorConfig](https://editorconfig.org) files | `true` | | `rainbow-brackets` | Whether to render rainbow colors for matching brackets. Requires tree-sitter `rainbows.scm` queries for the language. | `false` | +| `load-default-keymap` | Whether to load the default before applying the keymap from your config file. Useful for using non qwerty keyboard layouts. | `true` | ### `[editor.clipboard-provider]` Section diff --git a/helix-term/src/config.rs b/helix-term/src/config.rs index bcba8d8e1d45..5190784cee50 100644 --- a/helix-term/src/config.rs +++ b/helix-term/src/config.rs @@ -66,14 +66,6 @@ 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(); - if let Some(global_keys) = global.keys { - merge_keys(&mut keys, global_keys) - } - if let Some(local_keys) = local.keys { - merge_keys(&mut keys, local_keys) - } - let editor = match (global.editor, local.editor) { (None, None) => helix_view::editor::Config::default(), (None, Some(val)) | (Some(val), None) => { @@ -84,6 +76,19 @@ impl Config { .map_err(ConfigLoadError::BadConfig)?, }; + let mut keys = if editor.load_default_keymap { + keymap::default() + } else { + keymap::empty() + }; + + if let Some(global_keys) = global.keys { + merge_keys(&mut keys, global_keys) + } + if let Some(local_keys) = local.keys { + merge_keys(&mut keys, local_keys) + } + Config { theme: local.theme.or(global.theme), keys, @@ -96,17 +101,25 @@ impl Config { return Err(ConfigLoadError::BadConfig(err)) } (Ok(config), Err(_)) | (Err(_), Ok(config)) => { - let mut keys = keymap::default(); + let editor = config.editor.map_or_else( + || Ok(helix_view::editor::Config::default()), + |val| val.try_into().map_err(ConfigLoadError::BadConfig), + )?; + + let mut keys = if editor.load_default_keymap { + keymap::default() + } else { + keymap::empty() + }; + if let Some(keymap) = config.keys { merge_keys(&mut keys, keymap); } + Config { theme: config.theme, keys, - editor: config.editor.map_or_else( - || Ok(helix_view::editor::Config::default()), - |val| val.try_into().map_err(ConfigLoadError::BadConfig), - )?, + editor, } } diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs index d8227b500ee7..4736a7c393db 100644 --- a/helix-term/src/keymap.rs +++ b/helix-term/src/keymap.rs @@ -15,7 +15,7 @@ use std::{ sync::Arc, }; -pub use default::default; +pub use default::{default, empty}; use macros::key; #[derive(Debug, Clone, Default)] diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 5bbbd3f40429..3e742f6f87bc 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -1,5 +1,7 @@ use std::collections::HashMap; +use crate::keymap::KeyTrieNode; + use super::macros::keymap; use super::{KeyTrie, Mode}; use helix_core::hashmap; @@ -410,3 +412,11 @@ pub fn default() -> HashMap { Mode::Insert => insert, ) } + +pub fn empty() -> HashMap { + hashmap!( + Mode::Normal => KeyTrie::Node(KeyTrieNode::new("", HashMap::new(), Vec::new())), + Mode::Select => KeyTrie::Node(KeyTrieNode::new("", HashMap::new(), Vec::new())), + Mode::Insert => KeyTrie::Node(KeyTrieNode::new("", HashMap::new(), Vec::new())), + ) +} diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index cd8560e09ae9..45a4fda897e2 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -381,6 +381,8 @@ pub struct Config { pub editor_config: bool, /// Whether to render rainbow colors for matching brackets. Defaults to `false`. pub rainbow_brackets: bool, + // Whether to load the default keymap + pub load_default_keymap: bool, } #[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)] @@ -1061,6 +1063,7 @@ impl Default for Config { clipboard_provider: ClipboardProvider::default(), editor_config: true, rainbow_brackets: false, + load_default_keymap: true, } } }