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}