From 242353b2ba2e8814a86d861b4d99e2dc4ac2f7be Mon Sep 17 00:00:00 2001 From: StratusFearMe21 <57533634+StratusFearMe21@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:12:59 -0600 Subject: [PATCH] Add ability to configure atomic saving (#13656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ɓukasz Langa --- book/src/editor.md | 1 + helix-view/src/document.rs | 3 ++- helix-view/src/editor.rs | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/book/src/editor.md b/book/src/editor.md index 667a7147c..b264201f5 100644 --- a/book/src/editor.md +++ b/book/src/editor.md @@ -53,6 +53,7 @@ | `workspace-lsp-roots` | Directories relative to the workspace root that are treated as LSP roots. Should only be set in `.helix/config.toml` | `[]` | | `default-line-ending` | The line ending to use for new documents. Can be `native`, `lf`, `crlf`, `ff`, `cr` or `nel`. `native` uses the platform's native line ending (`crlf` on Windows, otherwise `lf`). | `native` | | `insert-final-newline` | Whether to automatically insert a trailing line-ending on write if missing | `true` | +| `atomic-save` | Whether to use atomic operations to write documents to disk. This prevents data loss if the editor is interrupted while writing the file, but may confuse some file watching/hot reloading programs. | `true` | | `trim-final-newlines` | Whether to automatically remove line-endings after the final one on write | `false` | | `trim-trailing-whitespace` | Whether to automatically remove whitespace preceding line endings on write | `false` | | `popup-border` | Draw border around `popup`, `menu`, `all`, or `none` | `none` | diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index a0a56113c..2fff23471 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -980,6 +980,7 @@ impl Document { // mark changes up to now as saved let current_rev = self.get_current_revision(); let doc_id = self.id(); + let atomic_save = self.config.load().atomic_save; let encoding_with_bom_info = (self.encoding, self.has_bom); let last_saved_time = self.last_saved_time; @@ -1029,7 +1030,7 @@ impl Document { // Assume it is a hardlink to prevent data loss if the metadata cant be read (e.g. on certain Windows configurations) let is_hardlink = helix_stdx::faccess::hardlink_count(&write_path).unwrap_or(2) > 1; - let backup = if path.exists() { + let backup = if path.exists() && atomic_save { let path_ = write_path.clone(); // hacks: we use tempfile to handle the complex task of creating // non clobbered temporary path for us we don't want diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 2e5c60cfa..27dc45235 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -345,6 +345,10 @@ pub struct Config { pub default_line_ending: LineEndingConfig, /// Whether to automatically insert a trailing line-ending on write if missing. Defaults to `true`. pub insert_final_newline: bool, + /// Whether to use atomic operations to write documents to disk. + /// This prevents data loss if the editor is interrupted while writing the file, but may + /// confuse some file watching/hot reloading programs. Defaults to `true`. + pub atomic_save: bool, /// Whether to automatically remove all trailing line-endings after the final one on write. /// Defaults to `false`. pub trim_final_newlines: bool, @@ -1020,6 +1024,7 @@ impl Default for Config { workspace_lsp_roots: Vec::new(), default_line_ending: LineEndingConfig::default(), insert_final_newline: true, + atomic_save: true, trim_final_newlines: false, trim_trailing_whitespace: false, smart_tab: Some(SmartTabConfig::default()),