aboutsummaryrefslogtreecommitdiff
path: root/helix-core
diff options
context:
space:
mode:
authorPascal Kuthe2023-01-30 23:31:21 +0000
committerBlaž Hrastnik2023-03-29 03:57:30 +0000
commit2d10a429ebf7abe5af184b6227346377dc0523e8 (patch)
tree114b19f0031fc001d7798a31372675a94623262f /helix-core
parentd59b80514e15d26f280a9b0dbd18afac08578638 (diff)
add workspace config and manual LSP root management
fixup documentation Co-authored-by: LeoniePhiline <22329650+LeoniePhiline@users.noreply.github.com> fixup typo Co-authored-by: LeoniePhiline <22329650+LeoniePhiline@users.noreply.github.com>
Diffstat (limited to 'helix-core')
-rw-r--r--helix-core/src/lib.rs47
-rw-r--r--helix-core/src/syntax.rs6
2 files changed, 7 insertions, 46 deletions
diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs
index 4d50e48b..b67e2c8a 100644
--- a/helix-core/src/lib.rs
+++ b/helix-core/src/lib.rs
@@ -36,55 +36,12 @@ pub mod unicode {
pub use unicode_width as width;
}
+pub use helix_loader::find_workspace;
+
pub fn find_first_non_whitespace_char(line: RopeSlice) -> Option<usize> {
line.chars().position(|ch| !ch.is_whitespace())
}
-/// Find project root.
-///
-/// Order of detection:
-/// * Top-most folder containing a root marker in current git repository
-/// * Git repository root if no marker detected
-/// * Top-most folder containing a root marker if not git repository detected
-/// * Current working directory as fallback
-pub fn find_root(root: Option<&str>, root_markers: &[String]) -> 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.clone(),
- };
-
- let mut top_marker = None;
- for ancestor in root.ancestors() {
- if root_markers
- .iter()
- .any(|marker| ancestor.join(marker).exists())
- {
- top_marker = Some(ancestor);
- }
-
- if ancestor.join(".git").exists() {
- // Top marker is repo root if not root marker was detected yet
- if top_marker.is_none() {
- top_marker = Some(ancestor);
- }
- // Don't go higher than repo if we're in one
- break;
- }
- }
-
- // Return the found top marker or the current_dir as fallback
- top_marker.map_or(current_dir, |a| a.to_path_buf())
-}
-
pub use ropey::{self, str_utils, Rope, RopeBuilder, RopeSlice};
// pub use tendril::StrTendril as Tendril;
diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs
index e494ee9b..40846967 100644
--- a/helix-core/src/syntax.rs
+++ b/helix-core/src/syntax.rs
@@ -20,7 +20,7 @@ use std::{
fmt,
hash::{Hash, Hasher},
mem::{replace, transmute},
- path::Path,
+ path::{Path, PathBuf},
str::FromStr,
sync::Arc,
};
@@ -127,6 +127,10 @@ pub struct LanguageConfiguration {
pub auto_pairs: Option<AutoPairs>,
pub rulers: Option<Vec<u16>>, // if set, override editor's rulers
+
+ /// Hardcoded LSP root directories relative to the workspace root, like `examples` or `tools/fuzz`.
+ /// Falling back to the current working directory if none are configured.
+ pub workspace_lsp_roots: Option<Vec<PathBuf>>,
}
#[derive(Debug, PartialEq, Eq, Hash)]