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 | 88 |
1 files changed, 58 insertions, 30 deletions
diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs index 09865ca4..1f43c266 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,18 +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; +mod state; 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 { pub use unicode_general_category as category; @@ -40,12 +33,56 @@ 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 repostory 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]) -> 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.clone(), + }; + + let mut top_marker = None; + for ancestor in root.ancestors() { + for marker in root_markers { + if ancestor.join(marker).exists() { + top_marker = Some(ancestor); + break; + } + } + // don't go higher than repo + if ancestor.join(".git").is_dir() { + // Use workspace if detected from marker + return Some(top_marker.unwrap_or(ancestor).to_path_buf()); + } + } -mod rope_reader; + // In absence of git repo, use workspace if detected + if top_marker.is_some() { + top_marker.map(|a| a.to_path_buf()) + } else { + Some(current_dir) + } +} -pub use rope_reader::RopeReader; -pub use ropey::{self, str_utils, Rope, RopeBuilder, RopeSlice}; +pub use ropey::{Rope, RopeBuilder, RopeSlice}; // pub use tendril::StrTendril as Tendril; pub use smartstring::SmartString; @@ -53,25 +90,16 @@ pub use smartstring::SmartString; pub type Tendril = SmartString<smartstring::LazyCompact>; #[doc(inline)] -pub use {regex, tree_house::tree_sitter}; - -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, -}; -#[allow(deprecated)] -pub use position::{pos_at_visual_coords, visual_coords_at_pos}; +pub use {regex, tree_sitter}; +pub use graphemes::RopeGraphemes; +pub use position::{coords_at_pos, pos_at_coords, visual_coords_at_pos, Position}; pub use selection::{Range, Selection}; pub use smallvec::{smallvec, SmallVec}; pub use syntax::Syntax; -pub use completion::CompletionItem; pub use diagnostic::Diagnostic; +pub use state::State; -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}; |