diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 4c154979..fa6bcb0c 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -31,7 +31,7 @@ use crate::{ }; use crate::job::{self, Job, Jobs}; -use futures_util::{FutureExt, TryFutureExt}; +use futures_util::FutureExt; use std::num::NonZeroUsize; use std::{fmt, future::Future}; @@ -1389,7 +1389,7 @@ mod cmd { fn write_impl>( cx: &mut compositor::Context, path: Option

, - ) -> Result>, anyhow::Error> { + ) -> anyhow::Result<()> { let jobs = &mut cx.jobs; let (_, doc) = current!(cx.editor); @@ -1410,7 +1410,9 @@ mod cmd { jobs.callback(callback); shared }); - Ok(tokio::spawn(doc.format_and_save(fmt))) + let future = doc.format_and_save(fmt); + cx.jobs.add(Job::new(future).wait_before_exiting()); + Ok(()) } fn write( @@ -1418,11 +1420,7 @@ mod cmd { args: &[&str], _event: PromptEvent, ) -> anyhow::Result<()> { - let handle = write_impl(cx, args.first())?; - cx.jobs - .add(Job::new(handle.unwrap_or_else(|e| Err(e.into()))).wait_before_exiting()); - - Ok(()) + write_impl(cx, args.first()) } fn new_file( @@ -1565,8 +1563,7 @@ mod cmd { args: &[&str], event: PromptEvent, ) -> anyhow::Result<()> { - let handle = write_impl(cx, args.first())?; - let _ = helix_lsp::block_on(handle)?; + write_impl(cx, args.first())?; quit(cx, &[], event) } @@ -1575,8 +1572,7 @@ mod cmd { args: &[&str], event: PromptEvent, ) -> anyhow::Result<()> { - let handle = write_impl(cx, args.first())?; - let _ = helix_lsp::block_on(handle)?; + write_impl(cx, args.first())?; force_quit(cx, &[], event) } @@ -1603,7 +1599,7 @@ mod cmd { } fn write_all_impl( - editor: &mut Editor, + cx: &mut compositor::Context, _args: &[&str], _event: PromptEvent, quit: bool, @@ -1612,25 +1608,26 @@ mod cmd { let mut errors = String::new(); // save all documents - for (_, doc) in &mut editor.documents { + for (_, doc) in &mut cx.editor.documents { if doc.path().is_none() { errors.push_str("cannot write a buffer without a filename\n"); continue; } // TODO: handle error. - let _ = helix_lsp::block_on(tokio::spawn(doc.save())); + let handle = doc.save(); + cx.jobs.add(Job::new(handle).wait_before_exiting()); } if quit { if !force { - buffers_remaining_impl(editor)?; + buffers_remaining_impl(cx.editor)?; } // close all views - let views: Vec<_> = editor.tree.views().map(|(view, _)| view.id).collect(); + let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect(); for view_id in views { - editor.close(view_id, false); + cx.editor.close(view_id, false); } } @@ -1642,7 +1639,7 @@ mod cmd { args: &[&str], event: PromptEvent, ) -> anyhow::Result<()> { - write_all_impl(&mut cx.editor, args, event, false, false) + write_all_impl(cx, args, event, false, false) } fn write_all_quit( @@ -1650,7 +1647,7 @@ mod cmd { args: &[&str], event: PromptEvent, ) -> anyhow::Result<()> { - write_all_impl(&mut cx.editor, args, event, true, false) + write_all_impl(cx, args, event, true, false) } fn force_write_all_quit( @@ -1658,7 +1655,7 @@ mod cmd { args: &[&str], event: PromptEvent, ) -> anyhow::Result<()> { - write_all_impl(&mut cx.editor, args, event, true, true) + write_all_impl(cx, args, event, true, true) } fn quit_all_impl(