Teach file picker how to find the project root (.git).
This commit is contained in:
parent
8098e9bdcd
commit
e833d65b77
2 changed files with 32 additions and 8 deletions
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue