aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-03-29 08:04:12 +0000
committerBlaž Hrastnik2021-03-30 01:14:50 +0000
commite833d65b77211c76cd1eef1ac723efb3f61d38ba (patch)
treea197aed994c75326e88e15736fa9c847ac0d296e /helix-term
parent8098e9bdcd85890d86b45be4e889604f651d7f8c (diff)
Teach file picker how to find the project root (.git).
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/commands.rs30
-rw-r--r--helix-term/src/ui/mod.rs10
2 files changed, 32 insertions, 8 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index fa7a4162..166325b9 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -14,7 +14,7 @@ use crate::{
ui::{self, Completion, Picker, Popup, Prompt, PromptEvent},
};
-use std::path::PathBuf;
+use std::path::{Path, PathBuf};
use helix_view::{
document::Mode,
@@ -840,8 +840,34 @@ pub fn command_mode(cx: &mut Context) {
);
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) {
- let picker = ui::file_picker("./");
+ let root = find_root(None).unwrap_or_else(|| PathBuf::from("./"));
+ let picker = ui::file_picker(root);
cx.push_layer(Box::new(picker));
}
diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs
index 0e38e598..47c75d2f 100644
--- a/helix-term/src/ui/mod.rs
+++ b/helix-term/src/ui/mod.rs
@@ -79,10 +79,9 @@ pub fn regex_prompt(
)
}
-pub fn file_picker(root: &str) -> Picker<PathBuf> {
+pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
use ignore::Walk;
- // TODO: determine root based on git root
- let files = Walk::new(root).filter_map(|entry| match entry {
+ let files = Walk::new(root.clone()).filter_map(|entry| match entry {
Ok(entry) => {
// filter dirs, but we might need special handling for symlinks!
if !entry.file_type().unwrap().is_dir() {
@@ -96,12 +95,11 @@ pub fn file_picker(root: &str) -> Picker<PathBuf> {
const MAX: usize = 1024;
- use helix_view::Editor;
Picker::new(
files.take(MAX).collect(),
- |path: &PathBuf| {
+ move |path: &PathBuf| {
// format_fn
- path.strip_prefix("./").unwrap().to_str().unwrap().into()
+ path.strip_prefix(&root).unwrap().to_str().unwrap().into()
},
move |editor: &mut Editor, path: &PathBuf, action| {
let document_id = editor