Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-core/src/lib.rs')
| -rw-r--r-- | helix-core/src/lib.rs | 80 |
1 files changed, 55 insertions, 25 deletions
diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs index 09865ca4..ee174e69 100644 --- a/helix-core/src/lib.rs +++ b/helix-core/src/lib.rs @@ -1,17 +1,11 @@ pub use encoding_rs as encoding; pub mod auto_pairs; -pub mod case_conversion; pub mod chars; -pub mod command_line; pub mod comment; -pub mod completion; pub mod config; pub mod diagnostic; pub mod diff; -pub mod doc_formatter; -pub mod editor_config; -pub mod fuzzy; pub mod graphemes; pub mod history; pub mod increment; @@ -21,17 +15,17 @@ pub mod macros; pub mod match_brackets; pub mod movement; pub mod object; +pub mod path; mod position; +pub mod register; pub mod search; pub mod selection; -pub mod snippets; +pub mod shellwords; pub mod surround; pub mod syntax; pub mod test; -pub mod text_annotations; pub mod textobject; mod transaction; -pub mod uri; pub mod wrap; pub mod unicode { @@ -40,11 +34,55 @@ 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(), + }; -mod rope_reader; + 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 rope_reader::RopeReader; pub use ropey::{self, str_utils, Rope, RopeBuilder, RopeSlice}; // pub use tendril::StrTendril as Tendril; @@ -53,25 +91,17 @@ pub use smartstring::SmartString; pub type Tendril = SmartString<smartstring::LazyCompact>; #[doc(inline)] -pub use {regex, tree_house::tree_sitter}; +pub use {regex, tree_sitter}; +pub use graphemes::RopeGraphemes; pub use position::{ - char_idx_at_visual_offset, coords_at_pos, pos_at_coords, softwrapped_dimensions, - visual_offset_from_anchor, visual_offset_from_block, Position, VisualOffsetError, + coords_at_pos, pos_at_coords, pos_at_visual_coords, visual_coords_at_pos, Position, }; -#[allow(deprecated)] -pub use position::{pos_at_visual_coords, visual_coords_at_pos}; - pub use selection::{Range, Selection}; pub use smallvec::{smallvec, SmallVec}; pub use syntax::Syntax; -pub use completion::CompletionItem; pub use diagnostic::Diagnostic; -pub use line_ending::{LineEnding, NATIVE_LINE_ENDING}; -pub use transaction::{Assoc, Change, ChangeSet, Deletion, Operation, Transaction}; - -pub use uri::Uri; - -pub use tree_house::Language; +pub use line_ending::{LineEnding, DEFAULT_LINE_ENDING}; +pub use transaction::{Assoc, Change, ChangeSet, Operation, Transaction}; |