Unnamed repository; edit this file 'description' to name the repository.
Add ability to configure atomic saving (#13656)
Co-authored-by: Ɓukasz Langa <[email protected]>
StratusFearMe21 8 months ago
parent de89846 · commit 242353b
-rw-r--r--book/src/editor.md1
-rw-r--r--helix-view/src/document.rs3
-rw-r--r--helix-view/src/editor.rs5
3 files changed, 8 insertions, 1 deletions
diff --git a/book/src/editor.md b/book/src/editor.md
index 667a7147..b264201f 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 a0a56113..2fff2347 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 2e5c60cf..27dc4523 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()),