vim_mode_setting.rs

  1//! Contains the [`VimModeSetting`] and [`HelixModeSetting`] used to enable/disable Vim and Helix modes.
  2//!
  3//! This is in its own crate as we want other crates to be able to enable or
  4//! disable Vim/Helix modes without having to depend on the `vim` crate in its
  5//! entirety.
  6
  7use anyhow::Result;
  8use gpui::App;
  9use schemars::JsonSchema;
 10use settings::{Settings, SettingsKey, SettingsSources, SettingsUi};
 11
 12/// Initializes the `vim_mode_setting` crate.
 13pub fn init(cx: &mut App) {
 14    VimModeSetting::register(cx);
 15    HelixModeSetting::register(cx);
 16}
 17
 18pub struct VimModeSetting(pub bool);
 19
 20#[derive(
 21    Copy,
 22    Clone,
 23    PartialEq,
 24    Eq,
 25    Debug,
 26    Default,
 27    serde::Serialize,
 28    serde::Deserialize,
 29    SettingsUi,
 30    SettingsKey,
 31    JsonSchema,
 32)]
 33#[settings_key(None)]
 34pub struct VimModeSettingContent {
 35    /// Whether or not to enable Vim mode.
 36    ///
 37    /// Default: false
 38    pub vim_mode: Option<bool>,
 39}
 40
 41impl Settings for VimModeSetting {
 42    type FileContent = VimModeSettingContent;
 43
 44    fn load(sources: SettingsSources<Self::FileContent>, _: &mut App) -> Result<Self> {
 45        Ok(Self(
 46            sources
 47                .user
 48                .and_then(|mode| mode.vim_mode)
 49                .or(sources.server.and_then(|mode| mode.vim_mode))
 50                .or(sources.default.vim_mode)
 51                .ok_or_else(Self::missing_default)?,
 52        ))
 53    }
 54
 55    fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {
 56        // TODO: could possibly check if any of the `vim.<foo>` keys are set?
 57    }
 58}
 59
 60#[derive(Debug)]
 61pub struct HelixModeSetting(pub bool);
 62
 63#[derive(
 64    Copy,
 65    Clone,
 66    PartialEq,
 67    Eq,
 68    Debug,
 69    Default,
 70    serde::Serialize,
 71    serde::Deserialize,
 72    SettingsUi,
 73    SettingsKey,
 74    JsonSchema,
 75)]
 76#[settings_key(None)]
 77pub struct HelixModeSettingContent {
 78    /// Whether or not to enable Helix mode.
 79    ///
 80    /// Default: false
 81    pub helix_mode: Option<bool>,
 82}
 83
 84impl Settings for HelixModeSetting {
 85    type FileContent = HelixModeSettingContent;
 86
 87    fn load(sources: SettingsSources<Self::FileContent>, _: &mut App) -> Result<Self> {
 88        Ok(Self(
 89            sources
 90                .user
 91                .and_then(|mode| mode.helix_mode)
 92                .or(sources.server.and_then(|mode| mode.helix_mode))
 93                .or(sources.default.helix_mode)
 94                .ok_or_else(Self::missing_default)?,
 95        ))
 96    }
 97
 98    fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {
 99        // TODO: could possibly check if any of the `helix.<foo>` keys are set?
100    }
101}