Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/editor.rs')
-rw-r--r--helix-view/src/editor.rs66
1 files changed, 63 insertions, 3 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index ef491853..635f7261 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -55,6 +55,8 @@ use arc_swap::{
ArcSwap,
};
+pub const DEFAULT_AUTO_SAVE_DELAY: u64 = 3000;
+
fn deserialize_duration_millis<'de, D>(deserializer: D) -> Result<Duration, D::Error>
where
D: serde::Deserializer<'de>,
@@ -266,8 +268,11 @@ pub struct Config {
pub auto_completion: bool,
/// Automatic formatting on save. Defaults to true.
pub auto_format: bool,
- /// Automatic save on focus lost. Defaults to false.
- pub auto_save: bool,
+ /// Automatic save on focus lost and/or after delay.
+ /// Time delay in milliseconds since last edit after which auto save timer triggers.
+ /// Time delay defaults to false with 3000ms delay. Focus lost defaults to false.
+ #[serde(deserialize_with = "deserialize_auto_save")]
+ pub auto_save: AutoSave,
/// Set a global text_width
pub text_width: usize,
/// Time in milliseconds since last keypress before idle timers trigger.
@@ -771,6 +776,61 @@ impl WhitespaceRender {
}
}
+#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
+#[serde(rename_all = "kebab-case")]
+pub struct AutoSave {
+ /// Auto save after a delay in milliseconds. Defaults to disabled.
+ #[serde(default)]
+ pub after_delay: AutoSaveAfterDelay,
+ /// Auto save on focus lost. Defaults to false.
+ #[serde(default)]
+ pub focus_lost: bool,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
+#[serde(deny_unknown_fields)]
+pub struct AutoSaveAfterDelay {
+ #[serde(default)]
+ /// Enable auto save after delay. Defaults to false.
+ pub enable: bool,
+ #[serde(default = "default_auto_save_delay")]
+ /// Time delay in milliseconds. Defaults to [DEFAULT_AUTO_SAVE_DELAY].
+ pub timeout: u64,
+}
+
+impl Default for AutoSaveAfterDelay {
+ fn default() -> Self {
+ Self {
+ enable: false,
+ timeout: DEFAULT_AUTO_SAVE_DELAY,
+ }
+ }
+}
+
+fn default_auto_save_delay() -> u64 {
+ DEFAULT_AUTO_SAVE_DELAY
+}
+
+fn deserialize_auto_save<'de, D>(deserializer: D) -> Result<AutoSave, D::Error>
+where
+ D: serde::Deserializer<'de>,
+{
+ #[derive(Deserialize, Serialize)]
+ #[serde(untagged, deny_unknown_fields, rename_all = "kebab-case")]
+ enum AutoSaveToml {
+ EnableFocusLost(bool),
+ AutoSave(AutoSave),
+ }
+
+ match AutoSaveToml::deserialize(deserializer)? {
+ AutoSaveToml::EnableFocusLost(focus_lost) => Ok(AutoSave {
+ focus_lost,
+ ..Default::default()
+ }),
+ AutoSaveToml::AutoSave(auto_save) => Ok(auto_save),
+ }
+}
+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct WhitespaceCharacters {
@@ -881,7 +941,7 @@ impl Default for Config {
auto_pairs: AutoPairConfig::default(),
auto_completion: true,
auto_format: true,
- auto_save: false,
+ auto_save: AutoSave::default(),
idle_timeout: Duration::from_millis(250),
completion_timeout: Duration::from_millis(250),
preview_completion_insert: true,