feat: open floating explorer as Tree in Insert mode
This commit is contained in:
+76
-6
@@ -771,7 +771,7 @@ impl Editor {
|
||||
project_root: std::env::current_dir()?,
|
||||
file_picker: None,
|
||||
file_explorer_side: DockSide::Right,
|
||||
file_picker_view: FileView::List,
|
||||
file_picker_view: FileView::Tree,
|
||||
file_explorer_view: FileView::Tree,
|
||||
count: None,
|
||||
};
|
||||
@@ -1450,6 +1450,13 @@ impl Editor {
|
||||
}
|
||||
}
|
||||
}
|
||||
if presentation == FilePresentation::Floating
|
||||
&& view == FileView::Tree
|
||||
&& let Some(picker) = &mut self.file_picker
|
||||
&& !picker.searching
|
||||
{
|
||||
picker.start_search();
|
||||
}
|
||||
self.palette = None;
|
||||
self.count = None;
|
||||
self.clear_leader();
|
||||
@@ -3340,6 +3347,50 @@ mod tests {
|
||||
editor
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn floating_default_tree_starts_filtering_then_escape_navigates_before_close() {
|
||||
let directory = Directory::new();
|
||||
fs::create_dir(directory.path("dir")).unwrap();
|
||||
fs::write(directory.path("dir/first.txt"), "first").unwrap();
|
||||
fs::write(directory.path("dir/second.txt"), "second").unwrap();
|
||||
let mut editor = project_editor(&directory);
|
||||
type_text(&mut editor, " osecond.txt");
|
||||
let picker = editor.file_picker().unwrap();
|
||||
assert_eq!(picker.view, FileView::Tree);
|
||||
assert!(picker.focused && picker.searching);
|
||||
assert_eq!(picker.query, "second.txt");
|
||||
assert_eq!(
|
||||
picker.entries().nth(picker.selected).unwrap().path,
|
||||
Path::new("dir/second.txt")
|
||||
);
|
||||
editor.handle(Input::Escape);
|
||||
let picker = editor.file_picker().unwrap();
|
||||
assert!(picker.focused && !picker.searching);
|
||||
assert_eq!(
|
||||
picker.entries().nth(picker.selected).unwrap().path,
|
||||
Path::new("dir")
|
||||
);
|
||||
editor.handle(Input::Char('l'));
|
||||
assert!(
|
||||
editor
|
||||
.file_picker()
|
||||
.unwrap()
|
||||
.entries()
|
||||
.next()
|
||||
.unwrap()
|
||||
.expanded
|
||||
);
|
||||
editor.handle(Input::Escape);
|
||||
assert!(editor.file_picker().is_none());
|
||||
assert_eq!(editor.lines(), &[String::new()]);
|
||||
editor.set_file_picker_view("list").unwrap();
|
||||
type_text(&mut editor, " osecond.txt");
|
||||
assert_eq!(editor.file_picker().unwrap().view, FileView::List);
|
||||
editor.handle(Input::Enter);
|
||||
assert_eq!(editor.lines(), &["second"]);
|
||||
assert!(editor.file_picker().is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn selection_navigation_wraps_without_touching_any_underlying_mode() {
|
||||
let directory = Directory::new();
|
||||
@@ -3705,6 +3756,7 @@ mod tests {
|
||||
fs::write(directory.path(name), "text").unwrap();
|
||||
}
|
||||
let mut editor = project_editor(&directory);
|
||||
editor.set_file_picker_view("list").unwrap();
|
||||
type_text(&mut editor, " o");
|
||||
editor.handle(Input::Ctrl('K'));
|
||||
assert_eq!(editor.file_picker().unwrap().selected, 2);
|
||||
@@ -3788,6 +3840,8 @@ mod tests {
|
||||
type_text(&mut editor, " o");
|
||||
assert_eq!(editor.file_picker().unwrap().query, "");
|
||||
editor.handle(Input::Escape);
|
||||
assert!(editor.file_picker().unwrap().focused);
|
||||
editor.handle(Input::Escape);
|
||||
assert!(editor.file_picker().is_none());
|
||||
}
|
||||
|
||||
@@ -3867,6 +3921,7 @@ mod tests {
|
||||
assert!(editor.file_picker().unwrap().error.is_none());
|
||||
editor.handle(Input::Escape);
|
||||
editor.handle(Input::Escape);
|
||||
editor.handle(Input::Escape);
|
||||
editor.handle(Input::Char('i'));
|
||||
type_text(&mut editor, "X");
|
||||
editor.open_file_picker(FilePresentation::Docked);
|
||||
@@ -3970,6 +4025,8 @@ mod tests {
|
||||
editor.open_file_picker(FilePresentation::Floating);
|
||||
editor.handle(Input::Paste("ignored".into()));
|
||||
editor.handle(Input::Escape);
|
||||
assert!(editor.file_picker().unwrap().focused);
|
||||
editor.handle(Input::Escape);
|
||||
assert_eq!(editor.mode(), Mode::Insert);
|
||||
assert!(editor.active.insert_start.is_some());
|
||||
assert_eq!(editor.context().text, "X");
|
||||
@@ -4023,8 +4080,6 @@ mod tests {
|
||||
fs::create_dir(directory.path("folder")).unwrap();
|
||||
fs::write(directory.path("file.txt"), "text").unwrap();
|
||||
let mut editor = project_editor(&directory);
|
||||
assert_eq!(editor.file_picker_view(), FileView::List);
|
||||
assert_eq!(editor.file_explorer_view(), FileView::Tree);
|
||||
editor.open_file_picker(FilePresentation::Docked);
|
||||
assert_eq!(editor.file_picker().unwrap().view, FileView::Tree);
|
||||
editor.set_file_picker_view("TREE").unwrap();
|
||||
@@ -4066,6 +4121,9 @@ mod tests {
|
||||
let mut editor = project_editor(&directory);
|
||||
editor.set_file_picker_view("tree").unwrap();
|
||||
editor.open_file_picker(presentation);
|
||||
if presentation == FilePresentation::Floating {
|
||||
editor.handle(Input::Escape);
|
||||
}
|
||||
let selected = |editor: &Editor| {
|
||||
let picker = editor.file_picker().unwrap();
|
||||
picker
|
||||
@@ -4179,6 +4237,9 @@ mod tests {
|
||||
let undo = editor.active.undo.len();
|
||||
editor.set_file_picker_view("tree").unwrap();
|
||||
editor.open_file_picker(presentation);
|
||||
if presentation == FilePresentation::Floating {
|
||||
editor.handle(Input::Escape);
|
||||
}
|
||||
type_text(&mut editor, "123 b xyz");
|
||||
editor.handle(Input::Paste("ignored".into()));
|
||||
editor.handle(Input::Backspace);
|
||||
@@ -4392,7 +4453,10 @@ mod tests {
|
||||
let mut editor = project_editor(&directory);
|
||||
editor.set_file_picker_view("tree").unwrap();
|
||||
editor.open_file_picker(presentation);
|
||||
type_text(&mut editor, "ineedle.txt");
|
||||
if presentation == FilePresentation::Docked {
|
||||
editor.handle(Input::Char('i'));
|
||||
}
|
||||
type_text(&mut editor, "needle.txt");
|
||||
let picker = editor.file_picker().unwrap();
|
||||
assert_eq!(
|
||||
picker.entries().nth(picker.selected).unwrap().path,
|
||||
@@ -4407,7 +4471,10 @@ mod tests {
|
||||
editor.open_file_picker(presentation);
|
||||
editor.handle(Input::Ctrl('w'));
|
||||
editor.open_file_picker(presentation);
|
||||
type_text(&mut editor, "imodule");
|
||||
if presentation == FilePresentation::Docked {
|
||||
editor.handle(Input::Char('i'));
|
||||
}
|
||||
type_text(&mut editor, "module");
|
||||
assert!(
|
||||
editor
|
||||
.file_picker()
|
||||
@@ -4453,7 +4520,10 @@ mod tests {
|
||||
editor.edit_buffer(b.clone(), false).unwrap();
|
||||
fs::write(&a, b"\xff").unwrap();
|
||||
editor.open_file_picker(presentation);
|
||||
type_text(&mut editor, "isame");
|
||||
if presentation == FilePresentation::Docked {
|
||||
editor.handle(Input::Char('i'));
|
||||
}
|
||||
type_text(&mut editor, "same");
|
||||
let picker = editor.file_picker.as_mut().unwrap();
|
||||
let labels = picker
|
||||
.entries()
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ Default keys (configurable with config.bind):
|
||||
All modes: Ctrl+p command palette; type to filter, Ctrl+j/k or arrows select, Enter accept, Esc cancel
|
||||
Normal/Visual: Space is leader; Space Space opens palette; Esc cancels prefix
|
||||
Normal leader: Space w saves; Space b n/p/l/d next/previous/list/close buffer
|
||||
Files: Space o floating list; Space e docked compact tree (right by default)
|
||||
Files: Space o floating tree INSERT; Space e docked tree NORMAL (right by default)
|
||||
tree NORMAL: hjkl navigate; INSERT: type to filter, Ctrl+hjkl navigate; Enter toggles/opens
|
||||
i filters in tree INSERT; Esc returns NORMAL, then editor; Ctrl+t view, Ctrl+w close, Ctrl+r refresh
|
||||
Normal: i/a insert, I/A insert at first nonblank/end, o/O new line
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ impl Default for Config {
|
||||
bindings: Vec::new(),
|
||||
leader: "space".into(),
|
||||
file_explorer_side: "right".into(),
|
||||
file_picker_view: "list".into(),
|
||||
file_picker_view: "tree".into(),
|
||||
file_explorer_view: "tree".into(),
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ module Vamp
|
||||
@bindings = []
|
||||
@leader = "space"
|
||||
@file_explorer_side = "right"
|
||||
@file_picker_view = "list"
|
||||
@file_picker_view = "tree"
|
||||
@file_explorer_view = "tree"
|
||||
end
|
||||
|
||||
|
||||
+5
-9
@@ -276,9 +276,12 @@ end
|
||||
);
|
||||
assert_eq!(
|
||||
session.editor().file_picker().unwrap().view,
|
||||
crate::files::FileView::List
|
||||
crate::files::FileView::Tree
|
||||
);
|
||||
assert_eq!(session.editor().file_picker().unwrap().query, "");
|
||||
assert!(session.editor().file_picker().unwrap().searching);
|
||||
session.handle(Input::Escape);
|
||||
assert!(session.editor().file_picker().unwrap().focused);
|
||||
session.handle(Input::Escape);
|
||||
assert!(session.editor().file_picker().is_none());
|
||||
session.handle(Input::Char('u'));
|
||||
@@ -318,10 +321,7 @@ end
|
||||
session.editor().file_picker().unwrap().view,
|
||||
crate::files::FileView::Tree
|
||||
);
|
||||
assert!(!session.editor().file_picker().unwrap().searching);
|
||||
session.handle(Input::Char('x'));
|
||||
assert_eq!(session.editor().file_picker().unwrap().query, "");
|
||||
session.handle(Input::Char('i'));
|
||||
assert!(session.editor().file_picker().unwrap().searching);
|
||||
session.handle(Input::Char('x'));
|
||||
session.handle(Input::Ctrl('h'));
|
||||
assert_eq!(session.editor().file_picker().unwrap().query, "x");
|
||||
@@ -365,10 +365,6 @@ end
|
||||
session.editor().file_explorer_view(),
|
||||
crate::files::FileView::Tree
|
||||
);
|
||||
assert_eq!(
|
||||
session.editor().file_picker_view(),
|
||||
crate::files::FileView::List
|
||||
);
|
||||
session.handle(Input::Char('n'));
|
||||
assert_eq!(
|
||||
session.editor().cursor(),
|
||||
|
||||
@@ -833,6 +833,7 @@ mod tests {
|
||||
#[test]
|
||||
fn file_list_window_follows_control_j_k_selection() {
|
||||
let mut editor = Editor::open(None, vec![]).unwrap();
|
||||
editor.set_file_picker_view("list").unwrap();
|
||||
editor.handle(Input::Char(' '));
|
||||
editor.handle(Input::Char('o'));
|
||||
let count = editor.file_picker().unwrap().entries().len();
|
||||
@@ -864,6 +865,7 @@ mod tests {
|
||||
fn list_footers_show_remapped_and_disabled_selection_keys() {
|
||||
let mut editor = Editor::open(None, vec![]).unwrap();
|
||||
editor.set_file_explorer_view("list").unwrap();
|
||||
editor.set_file_picker_view("list").unwrap();
|
||||
for key in ["ctrl+j", "ctrl+n", "down", "ctrl+k", "up"] {
|
||||
editor.bind("selection", key, None).unwrap();
|
||||
}
|
||||
@@ -1422,6 +1424,10 @@ mod tests {
|
||||
editor.handle(Input::Char(' '));
|
||||
editor.handle(Input::Char(key));
|
||||
assert_eq!(editor.file_picker().unwrap().view, expected);
|
||||
if expected == FileView::Tree {
|
||||
assert!(editor.file_picker().unwrap().searching);
|
||||
editor.handle(Input::Escape);
|
||||
}
|
||||
for view in [
|
||||
expected,
|
||||
if expected == FileView::Tree {
|
||||
@@ -1640,6 +1646,8 @@ mod tests {
|
||||
assert_eq!(viewports.offsets[&a_id], before);
|
||||
assert!(screen_text(&terminal).contains("Files"));
|
||||
editor.handle(Input::Escape);
|
||||
assert!(editor.file_picker().unwrap().focused);
|
||||
editor.handle(Input::Escape);
|
||||
terminal
|
||||
.draw(|frame| viewports.draw(frame, &editor))
|
||||
.unwrap();
|
||||
|
||||
Reference in New Issue
Block a user