diff options
author | Ivan Tham | 2021-06-17 16:52:41 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2021-06-19 07:37:15 +0000 |
commit | ca806d4f852e934651132fc9570a6110e30f646d (patch) | |
tree | 66e3fcfd6c018f435e23aee30aafd367ec39d7f2 /helix-term/src/config.rs | |
parent | 1c2585202145467f0fde7ad9c571e462081c3656 (diff) |
Refactor key into helix-view
Now also make use of Deserialize for Config.
Diffstat (limited to 'helix-term/src/config.rs')
-rw-r--r-- | helix-term/src/config.rs | 76 |
1 files changed, 45 insertions, 31 deletions
diff --git a/helix-term/src/config.rs b/helix-term/src/config.rs index e5e17753..9c962299 100644 --- a/helix-term/src/config.rs +++ b/helix-term/src/config.rs @@ -1,10 +1,9 @@ -use anyhow::{Error, Result}; -use std::{collections::HashMap, str::FromStr}; +use serde::Deserialize; -use serde::{de::Error as SerdeError, Deserialize, Serialize}; - -use crate::keymap::{parse_keymaps, Keymaps}; +use crate::commands::Command; +use crate::keymap::Keymaps; +#[derive(Debug, PartialEq, Deserialize)] pub struct GlobalConfig { pub lsp_progress: bool, } @@ -15,35 +14,50 @@ impl Default for GlobalConfig { } } -#[derive(Default)] +#[derive(Debug, Default, PartialEq, Deserialize)] +#[serde(default)] pub struct Config { pub global: GlobalConfig, - pub keymaps: Keymaps, + pub keys: Keymaps, } -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -struct TomlConfig { - lsp_progress: Option<bool>, - keys: Option<HashMap<String, HashMap<String, String>>>, -} +#[test] +fn parsing_keymaps_config_file() { + use helix_core::hashmap; + use helix_view::document::Mode; + use helix_view::input::{KeyCode, KeyEvent, KeyModifiers}; -impl<'de> Deserialize<'de> for Config { - fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> - where - D: serde::Deserializer<'de>, - { - let config = TomlConfig::deserialize(deserializer)?; - Ok(Self { - global: GlobalConfig { - lsp_progress: config.lsp_progress.unwrap_or(true), - }, - keymaps: config - .keys - .map(|r| parse_keymaps(&r)) - .transpose() - .map_err(|e| D::Error::custom(format!("Error deserializing keymap: {}", e)))? - .unwrap_or_else(Keymaps::default), - }) - } + let sample_keymaps = r#" + [keys.insert] + y = "move_line_down" + S-C-a = "delete_selection" + + [keys.normal] + A-F12 = "move_next_word_end" + "#; + + assert_eq!( + toml::from_str::<Config>(sample_keymaps).unwrap(), + Config { + global: Default::default(), + keys: Keymaps(hashmap! { + Mode::Insert => hashmap! { + KeyEvent { + code: KeyCode::Char('y'), + modifiers: KeyModifiers::NONE, + } => Command::move_line_down, + KeyEvent { + code: KeyCode::Char('a'), + modifiers: KeyModifiers::SHIFT | KeyModifiers::CONTROL, + } => Command::delete_selection, + }, + Mode::Normal => hashmap! { + KeyEvent { + code: KeyCode::F(12), + modifiers: KeyModifiers::ALT, + } => Command::move_next_word_end, + }, + }) + } + ); } |