mirror of
https://github.com/helix-editor/helix.git
synced 2025-10-06 00:13:28 +02:00
feat: specify custom lang server(s) for :lsp-stop
and :lsp-restart
(#12578)
Co-authored-by: Nikita Revenco <154856872+NikitaRevenco@users.noreply.github.com>
This commit is contained in:
@@ -618,51 +618,45 @@ impl Registry {
|
||||
Ok(self.inner[id].clone())
|
||||
}
|
||||
|
||||
/// If this method is called, all documents that have a reference to language servers used by the language config have to refresh their language servers,
|
||||
/// as it could be that language servers of these documents were stopped by this method.
|
||||
/// If this method is called, all documents that have a reference to the language server have to refresh their language servers,
|
||||
/// See helix_view::editor::Editor::refresh_language_servers
|
||||
pub fn restart(
|
||||
pub fn restart_server(
|
||||
&mut self,
|
||||
name: &str,
|
||||
language_config: &LanguageConfiguration,
|
||||
doc_path: Option<&std::path::PathBuf>,
|
||||
root_dirs: &[PathBuf],
|
||||
enable_snippets: bool,
|
||||
) -> Result<Vec<Arc<Client>>> {
|
||||
language_config
|
||||
.language_servers
|
||||
.iter()
|
||||
.filter_map(|LanguageServerFeatures { name, .. }| {
|
||||
if let Some(old_clients) = self.inner_by_name.remove(name) {
|
||||
if old_clients.is_empty() {
|
||||
log::info!("restarting client for '{name}' which was manually stopped");
|
||||
} else {
|
||||
log::info!("stopping existing clients for '{name}'");
|
||||
}
|
||||
for old_client in old_clients {
|
||||
self.file_event_handler.remove_client(old_client.id());
|
||||
self.inner.remove(old_client.id());
|
||||
tokio::spawn(async move {
|
||||
let _ = old_client.force_shutdown().await;
|
||||
});
|
||||
}
|
||||
}
|
||||
let client = match self.start_client(
|
||||
name.clone(),
|
||||
language_config,
|
||||
doc_path,
|
||||
root_dirs,
|
||||
enable_snippets,
|
||||
) {
|
||||
Ok(client) => client,
|
||||
Err(StartupError::NoRequiredRootFound) => return None,
|
||||
Err(StartupError::Error(err)) => return Some(Err(err)),
|
||||
};
|
||||
self.inner_by_name
|
||||
.insert(name.to_owned(), vec![client.clone()]);
|
||||
) -> Option<Result<Arc<Client>>> {
|
||||
if let Some(old_clients) = self.inner_by_name.remove(name) {
|
||||
if old_clients.is_empty() {
|
||||
log::info!("restarting client for '{name}' which was manually stopped");
|
||||
} else {
|
||||
log::info!("stopping existing clients for '{name}'");
|
||||
}
|
||||
for old_client in old_clients {
|
||||
self.file_event_handler.remove_client(old_client.id());
|
||||
self.inner.remove(old_client.id());
|
||||
tokio::spawn(async move {
|
||||
let _ = old_client.force_shutdown().await;
|
||||
});
|
||||
}
|
||||
}
|
||||
let client = match self.start_client(
|
||||
name.to_string(),
|
||||
language_config,
|
||||
doc_path,
|
||||
root_dirs,
|
||||
enable_snippets,
|
||||
) {
|
||||
Ok(client) => client,
|
||||
Err(StartupError::NoRequiredRootFound) => return None,
|
||||
Err(StartupError::Error(err)) => return Some(Err(err)),
|
||||
};
|
||||
self.inner_by_name
|
||||
.insert(name.to_owned(), vec![client.clone()]);
|
||||
|
||||
Some(Ok(client))
|
||||
})
|
||||
.collect()
|
||||
Some(Ok(client))
|
||||
}
|
||||
|
||||
pub fn stop(&mut self, name: &str) {
|
||||
|
Reference in New Issue
Block a user