aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
authorSkyler Hawthorne2022-08-24 05:13:41 +0000
committerSkyler Hawthorne2022-10-19 02:31:39 +0000
commit57de4e62519a59aece104867569c2b9ad044af54 (patch)
tree8ab5a88dbdad6f64073aae48a49d13f996ad83eb /helix-term/src
parent7b11e9ac6941188c6f6148961fdd97e34988490e (diff)
various fixes in write-all path
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/commands/typed.rs25
-rw-r--r--helix-term/src/compositor.rs12
2 files changed, 25 insertions, 12 deletions
diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs
index fa2ba5e6..7fd619d9 100644
--- a/helix-term/src/commands/typed.rs
+++ b/helix-term/src/commands/typed.rs
@@ -573,13 +573,20 @@ fn write_all_impl(
return Ok(());
}
- let mut errors = String::new();
+ let mut errors: Option<String> = None;
let auto_format = cx.editor.config().auto_format;
let jobs = &mut cx.jobs;
+
// save all documents
for doc in &mut cx.editor.documents.values_mut() {
if doc.path().is_none() {
- errors.push_str("cannot write a buffer without a filename\n");
+ errors = errors
+ .or_else(|| Some(String::new()))
+ .map(|mut errs: String| {
+ errs.push_str("cannot write a buffer without a filename\n");
+ errs
+ });
+
continue;
}
@@ -591,7 +598,7 @@ fn write_all_impl(
doc.auto_format().map(|fmt| {
let callback =
make_format_callback(doc.id(), doc.version(), fmt, Some((None, force)));
- jobs.callback(callback);
+ jobs.add(Job::with_callback(callback).wait_before_exiting());
})
} else {
None
@@ -603,12 +610,12 @@ fn write_all_impl(
}
if quit {
+ cx.block_try_flush_writes()?;
+
if !force {
buffers_remaining_impl(cx.editor)?;
}
- cx.block_try_flush_writes()?;
-
// close all views
let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect();
for view_id in views {
@@ -616,7 +623,13 @@ fn write_all_impl(
}
}
- bail!(errors)
+ if let Some(errs) = errors {
+ if !force {
+ bail!(errs);
+ }
+ }
+
+ Ok(())
}
fn write_all(
diff --git a/helix-term/src/compositor.rs b/helix-term/src/compositor.rs
index 6ef77341..5077807d 100644
--- a/helix-term/src/compositor.rs
+++ b/helix-term/src/compositor.rs
@@ -29,17 +29,17 @@ pub struct Context<'a> {
impl<'a> Context<'a> {
/// Waits on all pending jobs, and then tries to flush all pending write
- /// operations for the current document.
+ /// operations for all documents.
pub fn block_try_flush_writes(&mut self) -> anyhow::Result<()> {
tokio::task::block_in_place(|| {
helix_lsp::block_on(self.jobs.finish(Some(self.editor), None))
})?;
- let doc = doc_mut!(self.editor);
-
- tokio::task::block_in_place(|| helix_lsp::block_on(doc.try_flush_saves()))
- .map(|result| result.map(|_| ()))
- .unwrap_or(Ok(()))?;
+ for doc in &mut self.editor.documents.values_mut() {
+ tokio::task::block_in_place(|| helix_lsp::block_on(doc.try_flush_saves()))
+ .map(|result| result.map(|_| ()))
+ .unwrap_or(Ok(()))?;
+ }
Ok(())
}