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}