diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 3e6da5bb..a3b8aa56 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -25,11 +25,11 @@ use tui::backend::Backend; use crate::{ args::Args, commands::apply_workspace_edit, - compositor::{Compositor, Event}, + compositor::{self, Compositor, Event}, config::Config, job::Jobs, keymap::Keymaps, - ui::{self, overlay::overlaid}, + ui::{self, overlay::overlaid, Explorer}, }; use log::{debug, error, warn}; @@ -153,7 +153,21 @@ impl Application { let keys = Box::new(Map::new(Arc::clone(&config), |config: &Config| { &config.keys })); - let editor_view = Box::new(ui::EditorView::new(Keymaps::new(keys))); + let mut editor_view = Box::new(ui::EditorView::new(Keymaps::new(keys))); + + let mut jobs = Jobs::new(); + + if args.show_explorer { + let mut context = compositor::Context { + editor: &mut editor, + scroll: None, + jobs: &mut jobs, + }; + let mut explorer = Explorer::new(&mut context)?; + explorer.unfocus(); + editor_view.explorer = Some(explorer); + } + compositor.push(editor_view); if args.load_tutor { @@ -243,7 +257,7 @@ impl Application { syn_loader, signals, - jobs: Jobs::new(), + jobs, lsp_progress: LspProgressMap::new(), }; diff --git a/helix-term/src/args.rs b/helix-term/src/args.rs index dd787f1f..597a4688 100644 --- a/helix-term/src/args.rs +++ b/helix-term/src/args.rs @@ -17,6 +17,7 @@ pub struct Args { pub log_file: Option, pub config_file: Option, pub files: Vec<(PathBuf, Position)>, + pub show_explorer: bool, } impl Args { @@ -32,6 +33,7 @@ impl Args { "--version" => args.display_version = true, "--help" => args.display_help = true, "--tutor" => args.load_tutor = true, + "--show-explorer" => args.show_explorer = true, "--vsplit" => match args.split { Some(_) => anyhow::bail!("can only set a split once of a specific type"), None => args.split = Some(Layout::Vertical), diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index c5c407db..a9500f75 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -1533,12 +1533,32 @@ impl Component for EditorView { if let Some(explore) = self.explorer.as_mut() { if explore.is_focus() { - let area = if use_bufferline { - area.clip_top(1) - } else { - area + let needs_update = explore.is_focus() || { + if let Some(current_document_path) = doc!(cx.editor).path().cloned() { + if let Some(current_explore_path) = explore.current_file() { + if *current_explore_path != current_document_path { + let _ = explore.reveal_file(current_document_path); + + true + } else { + false + } + } else { + let _ = explore.reveal_file(current_document_path); + true + } + } else { + false + } }; - explore.render(area, surface, cx); + if needs_update { + let area = if use_bufferline { + area.clip_top(1) + } else { + area + }; + explore.render(area, surface, cx); + } } } } diff --git a/helix-term/src/ui/explorer.rs b/helix-term/src/ui/explorer.rs index 76c43751..91b18684 100644 --- a/helix-term/src/ui/explorer.rs +++ b/helix-term/src/ui/explorer.rs @@ -266,7 +266,7 @@ impl Explorer { self.state.open = true; } - fn unfocus(&mut self) { + pub fn unfocus(&mut self) { self.state.focus = false; } @@ -605,6 +605,11 @@ impl Explorer { } } + /// Returns the current file in the tree view + pub fn current_file(&self) -> Option<&PathBuf> { + self.tree.current_item().ok().map(|c| &c.path) + } + pub fn is_opened(&self) -> bool { self.state.open }