aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-08-19 02:36:56 +0000
committerBlaž Hrastnik2021-08-19 02:37:42 +0000
commit115754c5ee5e105ca5b1943abe9b2a1b2299c2bc (patch)
tree73f3bc6a73136ca578bb1c5db52adbe6cb9f8739 /helix-term/src
parent12ea3888c59aec8e6d0b4dcf6a3ad92a84edaca7 (diff)
Simplify write/write_all commands, we no longer need to excessively block
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/commands.rs39
1 files changed, 18 insertions, 21 deletions
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<P: AsRef<Path>>(
cx: &mut compositor::Context,
path: Option<P>,
- ) -> Result<tokio::task::JoinHandle<Result<(), anyhow::Error>>, 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(