aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--helix-term/src/application.rs11
-rw-r--r--helix-view/Cargo.toml1
-rw-r--r--helix-view/src/editor.rs20
4 files changed, 23 insertions, 10 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 12a03dac..24c277e1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -342,6 +342,7 @@ version = "0.2.0"
dependencies = [
"anyhow",
"crossterm",
+ "futures-util",
"helix-core",
"helix-lsp",
"helix-tui",
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 1f02ac4f..2fae467f 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -406,16 +406,7 @@ impl Application {
self.event_loop().await;
- tokio::time::timeout(
- Duration::from_millis(500),
- future::join_all(
- self.editor
- .language_servers
- .iter_clients()
- .map(|client| client.force_shutdown()),
- ),
- )
- .await;
+ self.editor.close_language_servers(None).await;
// reset cursor shape
write!(stdout, "\x1B[2 q");
diff --git a/helix-view/Cargo.toml b/helix-view/Cargo.toml
index 13539a5a..7f18e9a2 100644
--- a/helix-view/Cargo.toml
+++ b/helix-view/Cargo.toml
@@ -27,6 +27,7 @@ once_cell = "1.8"
url = "2"
tokio = { version = "1", features = ["full"] }
+futures-util = { version = "0.3", features = ["std", "async-await"], default-features = false }
slotmap = "1"
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index a1c93f75..db8ae87a 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -2,7 +2,9 @@ use crate::{theme::Theme, tree::Tree, Document, DocumentId, RegisterSelection, V
use tui::layout::Rect;
use tui::terminal::CursorKind;
+use futures_util::future;
use std::path::PathBuf;
+use std::time::Duration;
use slotmap::SlotMap;
@@ -270,4 +272,22 @@ impl Editor {
(None, CursorKind::Hidden)
}
}
+
+ /// Closes language servers with timeout. The default timeout is 500 ms, use
+ /// `timeout` parameter to override this.
+ pub async fn close_language_servers(
+ &self,
+ timeout: Option<u64>,
+ ) -> Result<(), tokio::time::error::Elapsed> {
+ tokio::time::timeout(
+ Duration::from_millis(timeout.unwrap_or(500)),
+ future::join_all(
+ self.language_servers
+ .iter_clients()
+ .map(|client| client.force_shutdown()),
+ ),
+ )
+ .await
+ .map(|_| ())
+ }
}