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            [
 47                sources.profile,
 48                sources.release_channel,
 49                sources.user,
 50                sources.server,
 51                Some(sources.default),
 52            ]
 53            .into_iter()
 54            .flatten()
 55            .filter_map(|mode| mode.vim_mode)
 56            .next()
 57            .ok_or_else(Self::missing_default)?,
 58        ))
 59    }
 60
 61    fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {
 62        // TODO: could possibly check if any of the `vim.<foo>` keys are set?
 63    }
 64}
 65
 66#[derive(Debug)]
 67pub struct HelixModeSetting(pub bool);
 68
 69#[derive(
 70    Copy,
 71    Clone,
 72    PartialEq,
 73    Eq,
 74    Debug,
 75    Default,
 76    serde::Serialize,
 77    serde::Deserialize,
 78    SettingsUi,
 79    SettingsKey,
 80    JsonSchema,
 81)]
 82#[settings_key(None)]
 83pub struct HelixModeSettingContent {
 84    /// Whether or not to enable Helix mode.
 85    ///
 86    /// Default: false
 87    pub helix_mode: Option<bool>,
 88}
 89
 90impl Settings for HelixModeSetting {
 91    type FileContent = HelixModeSettingContent;
 92
 93    fn load(sources: SettingsSources<Self::FileContent>, _: &mut App) -> Result<Self> {
 94        Ok(Self(
 95            [
 96                sources.profile,
 97                sources.release_channel,
 98                sources.user,
 99                sources.server,
100                Some(sources.default),
101            ]
102            .into_iter()
103            .flatten()
104            .filter_map(|mode| mode.helix_mode)
105            .next()
106            .ok_or_else(Self::missing_default)?,
107        ))
108    }
109
110    fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {
111        // TODO: could possibly check if any of the `helix.<foo>` keys are set?
112    }
113}