mirror of
https://github.com/helix-editor/helix.git
synced 2025-01-19 13:37:06 +04:00
lsp: Provide workspace root on client.initialize()
This commit is contained in:
parent
14830e75ff
commit
8d6fad4cac
@ -45,6 +45,30 @@ pub(crate) fn find_first_non_whitespace_char(text: RopeSlice, line_num: usize) -
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn find_root(root: Option<&str>) -> Option<std::path::PathBuf> {
|
||||||
|
let current_dir = std::env::current_dir().expect("unable to determine current directory");
|
||||||
|
|
||||||
|
let root = match root {
|
||||||
|
Some(root) => {
|
||||||
|
let root = std::path::Path::new(root);
|
||||||
|
if root.is_absolute() {
|
||||||
|
root.to_path_buf()
|
||||||
|
} else {
|
||||||
|
current_dir.join(root)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => current_dir,
|
||||||
|
};
|
||||||
|
|
||||||
|
for ancestor in root.ancestors() {
|
||||||
|
// TODO: also use defined roots if git isn't found
|
||||||
|
if ancestor.join(".git").is_dir() {
|
||||||
|
return Some(ancestor.to_path_buf());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(not(embed_runtime))]
|
#[cfg(not(embed_runtime))]
|
||||||
pub fn runtime_dir() -> std::path::PathBuf {
|
pub fn runtime_dir() -> std::path::PathBuf {
|
||||||
// runtime env var || dir where binary is located
|
// runtime env var || dir where binary is located
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
Call, Error, OffsetEncoding, Result,
|
Call, Error, OffsetEncoding, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
use helix_core::{ChangeSet, Rope};
|
use helix_core::{find_root, ChangeSet, Rope};
|
||||||
|
|
||||||
// use std::collections::HashMap;
|
// use std::collections::HashMap;
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
@ -218,13 +218,14 @@ pub async fn reply(
|
|||||||
|
|
||||||
pub async fn initialize(&mut self) -> Result<()> {
|
pub async fn initialize(&mut self) -> Result<()> {
|
||||||
// TODO: delay any requests that are triggered prior to initialize
|
// TODO: delay any requests that are triggered prior to initialize
|
||||||
|
let root = find_root(None).and_then(|root| lsp::Url::from_file_path(root).ok());
|
||||||
|
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
let params = lsp::InitializeParams {
|
let params = lsp::InitializeParams {
|
||||||
process_id: Some(std::process::id()),
|
process_id: Some(std::process::id()),
|
||||||
|
// root_path is obsolete, use root_uri
|
||||||
root_path: None,
|
root_path: None,
|
||||||
// root_uri: Some(lsp_types::Url::parse("file://localhost/")?),
|
root_uri: root,
|
||||||
root_uri: None, // set to project root in the future
|
|
||||||
initialization_options: None,
|
initialization_options: None,
|
||||||
capabilities: lsp::ClientCapabilities {
|
capabilities: lsp::ClientCapabilities {
|
||||||
text_document: Some(lsp::TextDocumentClientCapabilities {
|
text_document: Some(lsp::TextDocumentClientCapabilities {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use helix_core::{
|
use helix_core::{
|
||||||
comment, coords_at_pos, graphemes, indent, match_brackets,
|
comment, coords_at_pos, find_root, graphemes, indent, match_brackets,
|
||||||
movement::{self, Direction},
|
movement::{self, Direction},
|
||||||
object, pos_at_coords,
|
object, pos_at_coords,
|
||||||
regex::{self, Regex},
|
regex::{self, Regex},
|
||||||
@ -1093,30 +1093,6 @@ pub fn command_mode(cx: &mut Context) {
|
|||||||
cx.push_layer(Box::new(prompt));
|
cx.push_layer(Box::new(prompt));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_root(root: Option<&str>) -> Option<PathBuf> {
|
|
||||||
let current_dir = std::env::current_dir().expect("unable to determine current directory");
|
|
||||||
|
|
||||||
let root = match root {
|
|
||||||
Some(root) => {
|
|
||||||
let root = Path::new(root);
|
|
||||||
if root.is_absolute() {
|
|
||||||
root.to_path_buf()
|
|
||||||
} else {
|
|
||||||
current_dir.join(root)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => current_dir,
|
|
||||||
};
|
|
||||||
|
|
||||||
for ancestor in root.ancestors() {
|
|
||||||
// TODO: also use defined roots if git isn't found
|
|
||||||
if ancestor.join(".git").is_dir() {
|
|
||||||
return Some(ancestor.to_path_buf());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn file_picker(cx: &mut Context) {
|
pub fn file_picker(cx: &mut Context) {
|
||||||
let root = find_root(None).unwrap_or_else(|| PathBuf::from("./"));
|
let root = find_root(None).unwrap_or_else(|| PathBuf::from("./"));
|
||||||
let picker = ui::file_picker(root);
|
let picker = ui::file_picker(root);
|
||||||
|
Loading…
Reference in New Issue
Block a user