From 46ff4987667cb5073188fad7286d4a1c55204ebe Mon Sep 17 00:00:00 2001 From: Carter Green Date: Mon, 11 Apr 2022 09:43:04 -0500 Subject: [PATCH 01/54] Add command to restart LSP server Useful if LSP configuration changes or crashes --- book/src/generated/typable-cmd.md | 1 + helix-lsp/src/lib.rs | 117 +++++++++++++++++++----------- helix-term/src/commands/typed.rs | 17 +++++ helix-view/src/editor.rs | 17 +++++ 4 files changed, 108 insertions(+), 44 deletions(-) diff --git a/book/src/generated/typable-cmd.md b/book/src/generated/typable-cmd.md index 0b591ba4..5c871928 100644 --- a/book/src/generated/typable-cmd.md +++ b/book/src/generated/typable-cmd.md @@ -62,3 +62,4 @@ | `:config-reload` | Refreshes helix's config. | | `:config-open` | Open the helix config.toml file. | | `:pipe` | Pipe each selection to the shell command. | +| `:lsp-restart` | Restarts the LSP server of the current buffer | diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs index 13ac32ff..84fa3c60 100644 --- a/helix-lsp/src/lib.rs +++ b/helix-lsp/src/lib.rs @@ -12,7 +12,7 @@ use futures_util::stream::select_all::SelectAll; use helix_core::syntax::LanguageConfiguration; use std::{ - collections::{hash_map::Entry, HashMap}, + collections::HashMap, sync::{ atomic::{AtomicUsize, Ordering}, Arc, @@ -343,52 +343,81 @@ impl Registry { None => return Err(Error::LspNotDefined), }; - match self.inner.entry(language_config.scope.clone()) { - Entry::Occupied(entry) => Ok(entry.get().1.clone()), - Entry::Vacant(entry) => { - // initialize a new client - let id = self.counter.fetch_add(1, Ordering::Relaxed); - let (client, incoming, initialize_notify) = Client::start( - &config.command, - &config.args, - language_config.config.clone(), - &language_config.roots, - id, - )?; - self.incoming.push(UnboundedReceiverStream::new(incoming)); - let client = Arc::new(client); - - // Initialize the client asynchronously - let _client = client.clone(); - tokio::spawn(async move { - use futures_util::TryFutureExt; - let value = _client - .capabilities - .get_or_try_init(|| { - _client - .initialize() - .map_ok(|response| response.capabilities) - }) - .await; - - if let Err(e) = value { - log::error!("failed to initialize language server: {}", e); - return; - } - - // next up, notify - _client - .notify::(lsp::InitializedParams {}) - .await - .unwrap(); + if let Some((_, client)) = self.inner.get(&language_config.scope) { + Ok(client.clone()) + } else { + let id = self.counter.fetch_add(1, Ordering::Relaxed); + let client = self.initialize_client(language_config, config, id)?; // initialize a new client + self.inner + .insert(language_config.scope.clone(), (id, client.clone())); + Ok(client) + } + } - initialize_notify.notify_one(); - }); + pub fn restart(&mut self, language_config: &LanguageConfiguration) -> Result> { + let config = language_config + .language_server + .as_ref() + .ok_or(Error::LspNotDefined)?; + let id = self + .inner + .get(&language_config.scope) + .ok_or(Error::LspNotDefined)? + .0; + let new_client = self.initialize_client(language_config, config, id)?; + let (_, client) = self + .inner + .get_mut(&language_config.scope) + .ok_or(Error::LspNotDefined)?; + *client = new_client; + + Ok(client.clone()) + } - entry.insert((id, client.clone())); - Ok(client) + fn initialize_client( + &mut self, + language_config: &LanguageConfiguration, + config: &helix_core::syntax::LanguageServerConfiguration, + id: usize, + ) -> Result> { + let (client, incoming, initialize_notify) = Client::start( + &config.command, + &config.args, + language_config.config.clone(), + &language_config.roots, + id, + )?; + self.incoming.push(UnboundedReceiverStream::new(incoming)); + let client = Arc::new(client); + + // Initialize the client asynchronously + let _client = client.clone(); + tokio::spawn(async move { + use futures_util::TryFutureExt; + let value = _client + .capabilities + .get_or_try_init(|| { + _client + .initialize() + .map_ok(|response| response.capabilities) + }) + .await; + + if let Err(e) = value { + log::error!("failed to initialize language server: {}", e); + return; } - } + + // next up, notify + _client + .notify::(lsp::InitializedParams {}) + .await + .unwrap(); + + initialize_notify.notify_one(); + }); + + Ok(client) } pub fn iter_clients(&self) -> impl Iterator> { diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index 9a5298bb..c0aa32aa 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -1077,6 +1077,16 @@ fn pipe( Ok(()) } +fn lsp_restart( + cx: &mut compositor::Context, + _args: &[Cow], + _event: PromptEvent, +) -> anyhow::Result<()> { + let current_document = doc!(cx.editor).id(); + cx.editor.restart_language_server(current_document); + Ok(()) +} + pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[ TypableCommand { name: "quit", @@ -1512,6 +1522,13 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[ fun: pipe, completer: None, }, + TypableCommand { + name: "lsp-restart", + aliases: &[], + doc: "Restarts the LSP server of the current buffer", + fun: lsp_restart, + completer: None, + }, ]; pub static TYPABLE_COMMAND_MAP: Lazy> = diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index dd805c00..131f46ff 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -475,6 +475,23 @@ impl Editor { Self::launch_language_server(&mut self.language_servers, doc) } + /// Restarts a language server for a given document + pub fn restart_language_server(&mut self, doc_id: DocumentId) -> Option<()> { + let doc = self.documents.get_mut(&doc_id)?; + if let Some(language) = doc.language.as_ref() { + if let Ok(client) = self.language_servers.restart(&*language).map_err(|e| { + log::error!( + "Failed to restart the LSP for `{}` {{ {} }}", + language.scope(), + e + ) + }) { + doc.set_language_server(Some(client)); + } + }; + Some(()) + } + /// Launch a language server for a given document fn launch_language_server(ls: &mut helix_lsp::Registry, doc: &mut Document) -> Option<()> { // if doc doesn't have a URL it's a scratch buffer, ignore it -- 2.38.5 From 21d4bf859bd26ff536b9581ffc76169329c1bedf Mon Sep 17 00:00:00 2001 From: cossonleo Date: Sun, 3 Apr 2022 15:55:08 +0800 Subject: [PATCH 02/54] tree helper and file explorer --- book/src/configuration.md | 11 + book/src/keymap.md | 33 + helix-term/src/commands.rs | 42 +- helix-term/src/keymap/default.rs | 2 + helix-term/src/ui/editor.rs | 34 +- helix-term/src/ui/explore.rs | 867 ++++++++++++++++++++++ helix-term/src/ui/mod.rs | 4 + helix-term/src/ui/tree.rs | 680 +++++++++++++++++ helix-view/src/editor.rs | 66 ++ runtime/themes/autumn.toml | 6 + runtime/themes/base16_default_dark.toml | 6 + runtime/themes/base16_default_light.toml | 6 + runtime/themes/base16_terminal.toml | 6 + runtime/themes/bogster.toml | 6 + runtime/themes/boo_berry.toml | 6 + runtime/themes/dark_plus.toml | 6 + runtime/themes/dracula.toml | 6 + runtime/themes/dracula_at_night.toml | 6 + runtime/themes/everforest_dark.toml | 5 + runtime/themes/everforest_light.toml | 5 + runtime/themes/gruvbox.toml | 6 + runtime/themes/gruvbox_light.toml | 6 + runtime/themes/ingrid.toml | 6 + runtime/themes/monokai.toml | 6 + runtime/themes/monokai_pro.toml | 6 + runtime/themes/monokai_pro_machine.toml | 6 + runtime/themes/monokai_pro_octagon.toml | 6 + runtime/themes/monokai_pro_ristretto.toml | 6 + runtime/themes/monokai_pro_spectrum.toml | 6 + runtime/themes/night_owl.toml | 6 + runtime/themes/nord.toml | 6 + runtime/themes/onedark.toml | 6 + runtime/themes/onelight.toml | 6 + runtime/themes/pop-dark.toml | 6 + runtime/themes/rose_pine.toml | 6 + runtime/themes/rose_pine_dawn.toml | 6 + runtime/themes/serika-dark.toml | 6 + runtime/themes/serika-light.toml | 5 + runtime/themes/solarized_dark.toml | 6 + runtime/themes/solarized_light.toml | 6 + runtime/themes/spacebones_light.toml | 6 + runtime/themes/tokyonight.toml | 6 + runtime/themes/tokyonight_storm.toml | 6 + 43 files changed, 1937 insertions(+), 3 deletions(-) create mode 100644 helix-term/src/ui/explore.rs create mode 100644 helix-term/src/ui/tree.rs diff --git a/book/src/configuration.md b/book/src/configuration.md index 4d7e440a..ce9e96a4 100644 --- a/book/src/configuration.md +++ b/book/src/configuration.md @@ -103,6 +103,8 @@ auto-pairs = false # defaults to `true` The default pairs are (){}[]''""``, but these can be customized by setting `auto-pairs` to a TOML table: +Example + ```toml [editor.auto-pairs] '(' = ')' @@ -167,3 +169,12 @@ nbsp = "⍽" tab = "→" newline = "⏎" ``` + +### `[editor.explorer]` Section +Sets explorer side width and style. + + | Key | Description | Default | + | --- | ----------- | ------- | + | `column-width` | explorer side width | 30 | + | `style` | explorer item style, tree or list | tree | + | `position` | explorer widget position, embed or overlay | overlay | diff --git a/book/src/keymap.md b/book/src/keymap.md index fef76efb..8aecb89c 100644 --- a/book/src/keymap.md +++ b/book/src/keymap.md @@ -252,6 +252,8 @@ This layer is a kludge of mappings, mostly pickers. | `R` | Replace selections by clipboard contents | `replace_selections_with_clipboard` | | `/` | Global search in workspace folder | `global_search` | | `?` | Open command palette | `command_palette` | +| `e` | Open or focus explorer | `toggle_or_focus_explorer` | +| `E` | open explorer recursion | `open_explorer_recursion` | > TIP: Global search displays results in a fuzzy picker, use `space + '` to bring it back up after opening a file. @@ -377,3 +379,34 @@ Keys to use within prompt, Remapping currently not supported. | `BackTab` | Select previous completion item | | `Enter` | Open selected | +# File explorer +Keys to use within explorer, Remapping currently not supported. + +| Key | Description | +| ----- | ------------- | +| `Escape` | Back to editor | +| `Ctrl-c` | Close explorer | +| `Enter` | Open file or toggle dir selected | +| `b` | Back to current root's parent | +| `f` | Filter items | +| `z` | Fold currrent level | +| `k`, `Shift-Tab`, `Up` | select previous item | +| `j`, `Tab`, `Down` | select next item | +| `h` | Scroll left | +| `l` | Scroll right | +| `G` | Move to last item | +| `Ctrl-d` | Move down half page | +| `Ctrl-u` | Move up half page | +| `Shift-d` | Move down a page | +| `Shift-u` | Move up a page | +| `/` | Search item | +| `?` | Search item reverse | +| `n` | Repeat last search | +| `Shift-n` | Repeat last search reverse | +| `gg` | Move to first item | +| `ge` | Move to last item | +| `gc` | Make current dir as root dir | +| `mf` | Create new file under current item's parent | +| `md` | Create new dir under current item's parent | +| `rf` | Remove file selected | +| `rd` | Remove dir selected | diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index c9c8e6a9..037f2197 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -423,7 +423,10 @@ impl MappableCommand { decrement, "Decrement", record_macro, "Record macro", replay_macro, "Replay macro", - command_palette, "Open command palette", + command_palette, "Open command pallete", + toggle_or_focus_explorer, "toggle or focus explorer", + open_explorer_recursion, "open explorer recursion", + close_explorer, "close explorer", ); } @@ -2142,6 +2145,43 @@ fn file_picker_in_current_directory(cx: &mut Context) { cx.push_layer(Box::new(overlayed(picker))); } +fn toggle_or_focus_explorer(cx: &mut Context) { + cx.callback = Some(Box::new( + |compositor: &mut Compositor, cx: &mut compositor::Context| { + if let Some(editor) = compositor.find::() { + match editor.explorer.as_mut() { + Some(explore) => explore.content.focus(), + None => match ui::Explorer::new(cx) { + Ok(explore) => editor.explorer = Some(overlayed(explore)), + Err(err) => cx.editor.set_error(format!("{}", err)), + }, + } + } + }, + )); +} + +fn open_explorer_recursion(cx: &mut Context) { + cx.callback = Some(Box::new( + |compositor: &mut Compositor, cx: &mut compositor::Context| { + if let Some(editor) = compositor.find::() { + match ui::Explorer::new_explorer_recursion() { + Ok(explore) => editor.explorer = Some(overlayed(explore)), + Err(err) => cx.editor.set_error(format!("{}", err)), + } + } + }, + )); +} + +fn close_explorer(cx: &mut Context) { + cx.callback = Some(Box::new(|compositor: &mut Compositor, _| { + if let Some(editor) = compositor.find::() { + editor.explorer.take(); + } + })); +} + fn buffer_picker(cx: &mut Context) { let current = view!(cx.editor).doc; diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 0f0b09dd..26536ec6 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -258,6 +258,8 @@ pub fn default() -> HashMap { "k" => hover, "r" => rename_symbol, "?" => command_palette, + "e" => toggle_or_focus_explorer, + "E" => open_explorer_recursion, }, "z" => { "View" "z" | "c" => align_view_center, diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 192fa180..b5148635 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -3,7 +3,7 @@ use crate::{ compositor::{Component, Context, EventResult}, key, keymap::{KeymapResult, Keymaps}, - ui::{Completion, ProgressSpinners}, + ui::{overlay::Overlay, Completion, Explorer, ProgressSpinners}, }; use helix_core::{ @@ -36,6 +36,7 @@ pub struct EditorView { last_insert: (commands::MappableCommand, Vec), pub(crate) completion: Option, spinners: ProgressSpinners, + pub(crate) explorer: Option>, } #[derive(Debug, Clone)] @@ -59,6 +60,7 @@ impl EditorView { last_insert: (commands::MappableCommand::normal_mode, Vec::new()), completion: None, spinners: ProgressSpinners::default(), + explorer: None, } } @@ -1181,6 +1183,11 @@ impl Component for EditorView { event: Event, context: &mut crate::compositor::Context, ) -> EventResult { + if let Some(explore) = self.explorer.as_mut() { + if let EventResult::Consumed(callback) = explore.handle_event(event, context) { + return EventResult::Consumed(callback); + } + } let mut cx = commands::Context { editor: context.editor, count: None, @@ -1312,7 +1319,11 @@ impl Component for EditorView { surface.set_style(area, cx.editor.theme.get("ui.background")); let config = cx.editor.config(); // if the terminal size suddenly changed, we need to trigger a resize - cx.editor.resize(area.clip_bottom(1)); // -1 from bottom for commandline + let mut editor_area = area.clip_bottom(1); + if self.explorer.is_some() && (config.explorer.is_embed()) { + editor_area = editor_area.clip_left(config.explorer.column_width as u16 + 2); + } + cx.editor.resize(editor_area); // -1 from bottom for commandline for (view, is_focused) in cx.editor.tree.views() { let doc = cx.editor.document(view.doc).unwrap(); @@ -1393,9 +1404,28 @@ impl Component for EditorView { if let Some(completion) = self.completion.as_mut() { completion.render(area, surface, cx); } + + if let Some(explore) = self.explorer.as_mut() { + if config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } else if explore.content.is_focus() { + explore.render(area, surface, cx); + } + } } fn cursor(&self, _area: Rect, editor: &Editor) -> (Option, CursorKind) { + if let Some(explore) = &self.explorer { + if explore.content.is_focus() { + if editor.config().explorer.is_overlay() { + return explore.cursor(_area, editor); + } + let cursor = explore.content.cursor(_area, editor); + if cursor.0.is_some() { + return cursor; + } + } + } match editor.cursor() { // All block cursors are drawn manually (pos, CursorKind::Block) => (pos, CursorKind::Hidden), diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs new file mode 100644 index 00000000..544a1667 --- /dev/null +++ b/helix-term/src/ui/explore.rs @@ -0,0 +1,867 @@ +use super::{Prompt, Tree, TreeItem, TreeOp}; +use crate::{ + compositor::{Component, Compositor, Context, EventResult}, + ctrl, key, shift, ui, +}; +use anyhow::{bail, ensure, Result}; +use crossterm::event::{Event, KeyEvent}; +use helix_core::Position; +use helix_view::{ + editor::Action, + graphics::{CursorKind, Modifier, Rect}, + Editor, +}; +use std::borrow::Cow; +use std::cmp::Ordering; +use std::path::{Path, PathBuf}; +use tui::{ + buffer::Buffer as Surface, + text::{Span, Spans}, + widgets::{Block, Borders, Widget}, +}; + +macro_rules! get_theme { + ($theme: expr, $s1: expr, $s2: expr) => { + $theme.try_get($s1).unwrap_or_else(|| $theme.get($s2)) + }; +} + +#[derive(Debug, Clone, Copy, PartialEq)] +enum FileType { + File, + Dir, + Exe, + Placeholder, + Parent, + Root, +} + +#[derive(Debug, Clone)] +struct FileInfo { + file_type: FileType, + path: PathBuf, +} + +impl FileInfo { + fn new(path: PathBuf, file_type: FileType) -> Self { + Self { path, file_type } + } + + fn root(path: PathBuf) -> Self { + Self { + file_type: FileType::Root, + path, + } + } + + fn parent(path: &Path) -> Self { + let p = path.parent().unwrap_or_else(|| Path::new("")); + Self { + file_type: FileType::Parent, + path: p.to_path_buf(), + } + } + + fn get_text(&self) -> Cow<'static, str> { + match self.file_type { + FileType::Parent => "..".into(), + FileType::Placeholder => "---".into(), + FileType::Root => return format!("{}", self.path.display()).into(), + FileType::File | FileType::Exe | FileType::Dir => self + .path + .file_name() + .map_or("/".into(), |p| p.to_string_lossy().into_owned().into()), + } + } +} + +impl TreeItem for FileInfo { + type Params = State; + fn text(&self, cx: &mut Context, selected: bool, state: &mut State) -> Spans { + let text = self.get_text(); + let theme = &cx.editor.theme; + + let style = match self.file_type { + FileType::Parent | FileType::Dir | FileType::Root => "ui.explorer.dir", + FileType::File | FileType::Exe | FileType::Placeholder => "ui.explorer.file", + }; + let mut style = theme.try_get(style).unwrap_or_else(|| theme.get("ui.text")); + if selected { + let patch = match state.focus { + true => "ui.explorer.focus", + false => "ui.explorer.unfocus", + }; + if let Some(patch) = theme.try_get(patch) { + style = style.patch(patch); + } else { + style = style.add_modifier(Modifier::REVERSED); + } + } + Spans::from(Span::styled(text, style)) + } + + fn is_child(&self, other: &Self) -> bool { + if let FileType::Parent = other.file_type { + return false; + } + if let FileType::Placeholder = self.file_type { + self.path == other.path + } else { + self.path.parent().map_or(false, |p| p == other.path) + } + } + + fn cmp(&self, other: &Self) -> Ordering { + use FileType::*; + match (self.file_type, other.file_type) { + (Parent, _) => return Ordering::Less, + (_, Parent) => return Ordering::Greater, + (Root, _) => return Ordering::Less, + (_, Root) => return Ordering::Greater, + _ => {} + }; + + if self.path == other.path { + match (self.file_type, other.file_type) { + (_, Placeholder) => return Ordering::Less, + (Placeholder, _) => return Ordering::Greater, + _ => {} + }; + } + + if let (Some(p1), Some(p2)) = (self.path.parent(), other.path.parent()) { + if p1 == p2 { + match (self.file_type, other.file_type) { + (Dir, File | Exe) => return Ordering::Less, + (File | Exe, Dir) => return Ordering::Greater, + _ => {} + }; + } + } + self.path.cmp(&other.path) + } + + fn get_childs(&self) -> Result> { + match self.file_type { + FileType::Root | FileType::Dir => {} + _ => return Ok(vec![]), + }; + let mut ret: Vec<_> = std::fs::read_dir(&self.path)? + .filter_map(|entry| entry.ok()) + .filter_map(|entry| { + entry.metadata().ok().map(|meta| { + let is_exe = false; + let file_type = match (meta.is_dir(), is_exe) { + (true, _) => FileType::Dir, + (_, false) => FileType::File, + (_, true) => FileType::Exe, + }; + Self { + file_type, + path: self.path.join(entry.file_name()), + } + }) + }) + .collect(); + if ret.is_empty() { + ret.push(Self { + path: self.path.clone(), + file_type: FileType::Placeholder, + }) + } + Ok(ret) + } + + fn filter(&self, _cx: &mut Context, s: &str, _params: &mut Self::Params) -> bool { + if s.is_empty() { + false + } else { + self.get_text().contains(s) + } + } +} + +// #[derive(Default, Debug, Clone)] +// struct PathState { +// root: PathBuf, +// sub_items: Vec, +// selected: usize, +// save_view: (usize, usize), // (selected, row) +// row: usize, +// col: usize, +// max_len: usize, +// } + +// impl PathState { + +// fn mkdir(&mut self, dir: &str) -> Result<()> { +// self.new_path(dir, FileType::Dir) +// } + +// fn create_file(&mut self, f: &str) -> Result<()> { +// self.new_path(f, FileType::File) +// } + +// fn remove_current_file(&mut self) -> Result<()> { +// let item = &self.sub_items[self.selected]; +// std::fs::remove_file(item.path_with_root(&self.root))?; +// self.sub_items.remove(self.selected); +// if self.selected >= self.sub_items.len() { +// self.selected = self.sub_items.len() - 1; +// } +// Ok(()) +// } + +// } + +#[derive(Clone, Copy, Debug)] +enum PromptAction { + Search(bool), // search next/search pre + Mkdir, + CreateFile, + RemoveDir, + RemoveFile, + Filter, +} + +#[derive(Clone, Debug)] +struct State { + focus: bool, + current_root: PathBuf, +} + +impl State { + fn new(focus: bool, current_root: PathBuf) -> Self { + Self { + focus, + current_root, + } + } +} + +pub struct Explorer { + tree: Tree, + state: State, + prompt: Option<(PromptAction, Prompt)>, + #[allow(clippy::type_complexity)] + on_next_key: Option EventResult>>, + #[allow(clippy::type_complexity)] + repeat_motion: Option>, +} + +impl Explorer { + pub fn new(cx: &mut Context) -> Result { + let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); + let items = Self::get_items(current_root.clone(), cx)?; + Ok(Self { + tree: Tree::build_tree(items).with_enter_fn(Self::toggle_current), + state: State::new(true, current_root), + repeat_motion: None, + prompt: None, + on_next_key: None, + }) + } + + pub fn new_explorer_recursion() -> Result { + let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); + let parent = FileInfo::parent(¤t_root); + let root = FileInfo::root(current_root.clone()); + let mut tree = + Tree::build_from_root(root, usize::MAX / 2)?.with_enter_fn(Self::toggle_current); + tree.insert_current_level(parent); + Ok(Self { + tree, + state: State::new(true, current_root), + repeat_motion: None, + prompt: None, + on_next_key: None, + }) + // let mut root = vec![, FileInfo::root(p)]; + } + + // pub fn new_with_uri(uri: String) -> Result { + // // support remote file? + + // let p = Path::new(&uri); + // ensure!(p.exists(), "path: {uri} is not exist"); + // ensure!(p.is_dir(), "path: {uri} is not dir"); + // Ok(Self::default().with_list(get_sub(p, None)?)) + // } + + pub fn focus(&mut self) { + self.state.focus = true + } + + pub fn unfocus(&mut self) { + self.state.focus = false; + } + + pub fn is_focus(&self) -> bool { + self.state.focus + } + + fn get_items(p: PathBuf, cx: &mut Context) -> Result> { + let mut items = vec![FileInfo::parent(p.as_path())]; + let root = FileInfo::root(p); + let childs = root.get_childs()?; + if cx.editor.config().explorer.is_tree() { + items.push(root) + } + items.extend(childs); + Ok(items) + } + + fn render_preview(&mut self, area: Rect, surface: &mut Surface, editor: &Editor) { + if area.height <= 2 || area.width < 60 { + return; + } + let item = self.tree.current().item(); + if item.file_type == FileType::Placeholder { + return; + } + let head_area = render_block(area.clip_bottom(area.height - 2), surface, Borders::BOTTOM); + let path_str = format!("{}", item.path.display()); + surface.set_stringn( + head_area.x, + head_area.y, + path_str, + head_area.width as usize, + get_theme!(editor.theme, "ui.explorer.dir", "ui.text"), + ); + + let body_area = area.clip_top(2); + let style = editor.theme.get("ui.text"); + if let Ok(preview_content) = get_preview(&item.path, body_area.height as usize) { + preview_content + .into_iter() + .enumerate() + .for_each(|(row, line)| { + surface.set_stringn( + body_area.x, + body_area.y + row as u16, + line, + body_area.width as usize, + style, + ); + }) + } + } + + fn new_search_prompt(&mut self, search_next: bool) { + self.tree.save_view(); + self.prompt = Some(( + PromptAction::Search(search_next), + Prompt::new("search: ".into(), None, ui::completers::none, |_, _, _| {}), + )) + } + + fn new_filter_prompt(&mut self) { + self.tree.save_view(); + self.prompt = Some(( + PromptAction::Filter, + Prompt::new("filter: ".into(), None, ui::completers::none, |_, _, _| {}), + )) + } + + fn new_mkdir_prompt(&mut self) { + self.prompt = Some(( + PromptAction::Mkdir, + Prompt::new("mkdir: ".into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn new_create_file_prompt(&mut self) { + self.prompt = Some(( + PromptAction::CreateFile, + Prompt::new( + "create file: ".into(), + None, + ui::completers::none, + |_, _, _| {}, + ), + )); + } + + fn new_remove_file_prompt(&mut self, cx: &mut Context) { + let item = self.tree.current_item(); + let check = || { + ensure!(item.file_type != FileType::Placeholder, "The path is empty"); + ensure!( + item.file_type != FileType::Parent, + "can not remove parent dir" + ); + ensure!(item.path.is_file(), "The path is not a file"); + let doc = cx.editor.document_by_path(&item.path); + ensure!(doc.is_none(), "The file is opened"); + Ok(()) + }; + if let Err(e) = check() { + cx.editor.set_error(format!("{e}")); + return; + } + let p = format!("remove file: {}, YES? ", item.path.display()); + self.prompt = Some(( + PromptAction::RemoveFile, + Prompt::new(p.into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn new_remove_dir_prompt(&mut self, cx: &mut Context) { + let item = self.tree.current_item(); + let check = || { + ensure!(item.file_type != FileType::Placeholder, "The path is empty"); + ensure!( + item.file_type != FileType::Parent, + "can not remove parent dir" + ); + ensure!(item.path.is_dir(), "The path is not a dir"); + let doc = cx.editor.documents().find(|doc| { + doc.path() + .map(|p| p.starts_with(&item.path)) + .unwrap_or(false) + }); + ensure!(doc.is_none(), "There are files opened under the dir"); + Ok(()) + }; + if let Err(e) = check() { + cx.editor.set_error(format!("{e}")); + return; + } + let p = format!("remove dir: {}, YES? ", item.path.display()); + self.prompt = Some(( + PromptAction::RemoveDir, + Prompt::new(p.into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn toggle_current( + item: &mut FileInfo, + cx: &mut Context, + state: &mut State, + ) -> TreeOp { + if item.file_type == FileType::Placeholder { + return TreeOp::Noop; + } + if item.path == Path::new("") { + return TreeOp::Noop; + } + let meta = match std::fs::metadata(&item.path) { + Ok(meta) => meta, + Err(e) => { + cx.editor.set_error(format!("{e}")); + return TreeOp::Noop; + } + }; + if meta.is_file() { + if let Err(e) = cx.editor.open(item.path.clone(), Action::Replace) { + cx.editor.set_error(format!("{e}")); + } + state.focus = false; + return TreeOp::Noop; + } + + if item.path.is_dir() { + if cx.editor.config().explorer.is_list() || item.file_type == FileType::Parent { + match Self::get_items(item.path.clone(), cx) { + Ok(items) => { + state.current_root = item.path.clone(); + return TreeOp::ReplaceTree(items); + } + Err(e) => cx.editor.set_error(format!("{e}")), + } + } else { + return TreeOp::GetChildsAndInsert; + } + } + cx.editor.set_error("unkonw file type"); + TreeOp::Noop + } + + fn render_float(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + let background = cx.editor.theme.get("ui.background"); + let column_width = cx.editor.config().explorer.column_width as u16; + surface.clear_with(area, background); + let area = render_block(area, surface, Borders::ALL); + + let mut preview_area = area.clip_left(column_width + 1); + if let Some((_, prompt)) = self.prompt.as_mut() { + let area = preview_area.clip_bottom(2); + let promp_area = + render_block(preview_area.clip_top(area.height), surface, Borders::TOP); + prompt.render(promp_area, surface, cx); + preview_area = area; + } + self.render_preview(preview_area, surface, cx.editor); + + let list_area = render_block(area.clip_right(preview_area.width), surface, Borders::RIGHT); + self.tree.render(list_area, surface, cx, &mut self.state); + } + + fn render_embed(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + let config = &cx.editor.config().explorer; + let side_area = area + .with_width(area.width.min(config.column_width as u16 + 2)) + .clip_bottom(1); + let background = cx.editor.theme.get("ui.background"); + surface.clear_with(side_area, background); + + let preview_area = area.clip_left(side_area.width).clip_bottom(2); + let prompt_area = area.clip_top(side_area.height); + + let list_area = + render_block(side_area.clip_left(1), surface, Borders::RIGHT).clip_bottom(1); + self.tree.render(list_area, surface, cx, &mut self.state); + + { + let statusline = if self.is_focus() { + cx.editor.theme.get("ui.statusline") + } else { + cx.editor.theme.get("ui.statusline.inactive") + }; + let area = side_area.clip_top(list_area.height).clip_right(1); + surface.clear_with(area, statusline); + // surface.set_string_truncated( + // area.x, + // area.y, + // &self.path_state.root.to_string_lossy(), + // area.width as usize, + // |_| statusline, + // true, + // true, + // ); + } + + if self.is_focus() { + if preview_area.width < 30 || preview_area.height < 3 { + return; + } + let width = preview_area.width.min(90); + let mut y = self.tree.row().saturating_sub(1) as u16; + let height = (preview_area.height).min(25); + if (height + y) > preview_area.height { + y = preview_area.height - height; + } + let area = Rect::new(preview_area.x, y, width, height); + surface.clear_with(area, background); + let area = render_block(area, surface, Borders::all()); + self.render_preview(area, surface, cx.editor); + } + + if let Some((_, prompt)) = self.prompt.as_mut() { + prompt.render_prompt(prompt_area, surface, cx) + } + } + + fn handle_filter_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + let (action, mut prompt) = self.prompt.take().unwrap(); + match event.into() { + key!(Tab) | key!(Down) | ctrl!('j') => { + self.tree.clean_recycle(); + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Enter) => { + self.tree.clean_recycle(); + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Esc) | ctrl!('c') => self.tree.restore_recycle(), + _ => { + if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + self.tree.filter(prompt.line(), cx, &mut self.state); + } + self.prompt = Some((action, prompt)); + } + }; + EventResult::Consumed(None) + } + + fn handle_search_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + let (action, mut prompt) = self.prompt.take().unwrap(); + let search_next = match action { + PromptAction::Search(search_next) => search_next, + _ => return EventResult::Ignored(None), + }; + match event.into() { + key!(Tab) | key!(Down) | ctrl!('j') => { + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state) + } + key!(Enter) => { + let search_str = prompt.line().clone(); + if !search_str.is_empty() { + self.repeat_motion = Some(Box::new(move |explorer, action, cx| { + if let PromptAction::Search(is_next) = action { + explorer.tree.save_view(); + if is_next == search_next { + explorer + .tree + .search_next(cx, &search_str, &mut explorer.state); + } else { + explorer + .tree + .search_pre(cx, &search_str, &mut explorer.state); + } + } + })) + } else { + self.repeat_motion = None; + } + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Esc) | ctrl!('c') => self.tree.restore_view(), + _ => { + if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + if search_next { + self.tree.search_next(cx, prompt.line(), &mut self.state); + } else { + self.tree.search_pre(cx, prompt.line(), &mut self.state); + } + } + self.prompt = Some((action, prompt)); + } + }; + EventResult::Consumed(None) + } + + fn handle_prompt_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + match &self.prompt { + Some((PromptAction::Search(_), _)) => return self.handle_search_event(event, cx), + Some((PromptAction::Filter, _)) => return self.handle_filter_event(event, cx), + _ => {} + }; + let (action, mut prompt) = match self.prompt.take() { + Some((action, p)) => (action, p), + _ => return EventResult::Ignored(None), + }; + let line = prompt.line(); + match (action, event.into()) { + (PromptAction::Mkdir, key!(Enter)) => { + if let Err(e) = self.new_path(line, true) { + cx.editor.set_error(format!("{e}")) + } + } + (PromptAction::CreateFile, key!(Enter)) => { + if let Err(e) = self.new_path(line, false) { + cx.editor.set_error(format!("{e}")) + } + } + (PromptAction::RemoveDir, key!(Enter)) => { + let item = self.tree.current_item(); + if let Err(e) = std::fs::remove_dir_all(&item.path) { + cx.editor.set_error(format!("{e}")); + } else { + self.tree.fold_current_child(); + self.tree.remove_current(); + } + } + (PromptAction::RemoveFile, key!(Enter)) => { + if line == "YES" { + let item = self.tree.current_item(); + if let Err(e) = std::fs::remove_file(&item.path) { + cx.editor.set_error(format!("{e}")); + } else { + self.tree.remove_current(); + } + } + } + (_, key!(Esc) | ctrl!('c')) => {} + _ => { + prompt.handle_event(Event::Key(event), cx); + self.prompt = Some((action, prompt)); + } + } + EventResult::Consumed(None) + } + + fn new_path(&mut self, file_name: &str, is_dir: bool) -> Result<()> { + let current = self.tree.current_item(); + let current_parent = if current.file_type == FileType::Placeholder { + ¤t.path + } else { + current + .path + .parent() + .ok_or_else(|| anyhow::anyhow!("can not get parent dir"))? + }; + let p = helix_core::path::get_normalized_path(¤t_parent.join(file_name)); + match p.parent() { + Some(p) if p == current_parent => {} + _ => bail!("The file name is not illegal"), + }; + + let f = if is_dir { + std::fs::create_dir(&p)?; + FileInfo::new(p, FileType::Dir) + } else { + let mut fd = std::fs::OpenOptions::new(); + fd.create_new(true).write(true).open(&p)?; + FileInfo::new(p, FileType::File) + }; + if current.file_type == FileType::Placeholder { + self.tree.replace_current(f); + } else { + self.tree.insert_current_level(f); + } + Ok(()) + } +} + +impl Component for Explorer { + /// Process input events, return true if handled. + fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + let key_event = match event { + Event::Key(event) => event, + Event::Resize(..) => return EventResult::Consumed(None), + _ => return EventResult::Ignored(None), + }; + if !self.is_focus() { + return EventResult::Ignored(None); + } + if let Some(mut on_next_key) = self.on_next_key.take() { + return on_next_key(cx, self, key_event); + } + + if let EventResult::Consumed(c) = self.handle_prompt_event(key_event, cx) { + return EventResult::Consumed(c); + } + + let close_fn = EventResult::Consumed(Some(Box::new(|compositor: &mut Compositor, _| { + if let Some(editor) = compositor.find::() { + editor.explorer = None; + } + }))); + + match key_event.into() { + key!(Esc) => self.unfocus(), + ctrl!('c') => return close_fn, + key!('n') => { + if let Some(mut repeat_motion) = self.repeat_motion.take() { + repeat_motion(self, PromptAction::Search(true), cx); + self.repeat_motion = Some(repeat_motion); + } + } + shift!('N') => { + if let Some(mut repeat_motion) = self.repeat_motion.take() { + repeat_motion(self, PromptAction::Search(false), cx); + self.repeat_motion = Some(repeat_motion); + } + } + key!('b') => { + if let Some(p) = self.state.current_root.parent() { + match Self::get_items(p.to_path_buf(), cx) { + Ok(items) => { + self.state.current_root = p.to_path_buf(); + self.tree = Tree::build_tree(items).with_enter_fn(Self::toggle_current); + } + Err(e) => cx.editor.set_error(format!("{e}")), + } + } + } + key!('f') => self.new_filter_prompt(), + key!('/') => self.new_search_prompt(true), + key!('?') => self.new_search_prompt(false), + key!('m') => { + self.on_next_key = Some(Box::new(|_, explorer, event| { + match event.into() { + key!('d') => explorer.new_mkdir_prompt(), + key!('f') => explorer.new_create_file_prompt(), + _ => return EventResult::Ignored(None), + }; + EventResult::Consumed(None) + })); + } + key!('r') => { + self.on_next_key = Some(Box::new(|cx, explorer, event| { + match event.into() { + key!('d') => explorer.new_remove_dir_prompt(cx), + key!('f') => explorer.new_remove_file_prompt(cx), + _ => return EventResult::Ignored(None), + }; + EventResult::Consumed(None) + })); + } + _ => { + self.tree + .handle_event(Event::Key(key_event), cx, &mut self.state); + } + } + + EventResult::Consumed(None) + } + + fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + if area.width < 10 || area.height < 5 { + cx.editor.set_error("explorer render area is too small"); + return; + } + let config = &cx.editor.config().explorer; + if config.is_embed() { + self.render_embed(area, surface, cx); + } else { + self.render_float(area, surface, cx); + } + } + + fn cursor(&self, area: Rect, editor: &Editor) -> (Option, CursorKind) { + let prompt = match self.prompt.as_ref() { + Some((_, prompt)) => prompt, + None => return (None, CursorKind::Hidden), + }; + let config = &editor.config().explorer; + let (x, y) = if config.is_overlay() { + let colw = config.column_width as u16; + if area.width > colw { + (area.x + colw + 2, area.y + area.height - 2) + } else { + return (None, CursorKind::Hidden); + } + } else { + (area.x, area.y + area.height - 1) + }; + prompt.cursor(Rect::new(x, y, area.width, 1), editor) + } +} + +fn get_preview(p: impl AsRef, max_line: usize) -> Result> { + let p = p.as_ref(); + if p.is_dir() { + return Ok(p + .read_dir()? + .filter_map(|entry| entry.ok()) + .take(max_line) + .map(|entry| { + if entry.file_type().map(|ft| ft.is_dir()).unwrap_or(false) { + format!("{}/", entry.file_name().to_string_lossy()) + } else { + format!("{}", entry.file_name().to_string_lossy()) + } + }) + .collect()); + } + + ensure!(p.is_file(), "path: {} is not file or dir", p.display()); + use std::fs::OpenOptions; + use std::io::BufRead; + let mut fd = OpenOptions::new(); + fd.read(true); + let fd = fd.open(p)?; + Ok(std::io::BufReader::new(fd) + .lines() + .take(max_line) + .filter_map(|line| line.ok()) + .map(|line| line.replace('\t', " ")) + .collect()) +} + +fn render_block(area: Rect, surface: &mut Surface, borders: Borders) -> Rect { + let block = Block::default().borders(borders); + let inner = block.inner(area); + block.render(area, surface); + inner +} diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs index 23d0dca0..3e4ca269 100644 --- a/helix-term/src/ui/mod.rs +++ b/helix-term/src/ui/mod.rs @@ -1,5 +1,6 @@ mod completion; pub(crate) mod editor; +mod explore; mod info; mod markdown; pub mod menu; @@ -9,9 +10,11 @@ mod popup; mod prompt; mod spinner; mod text; +mod tree; pub use completion::Completion; pub use editor::EditorView; +pub use explore::Explorer; pub use markdown::Markdown; pub use menu::Menu; pub use picker::{FileLocation, FilePicker, Picker}; @@ -19,6 +22,7 @@ pub use popup::Popup; pub use prompt::{Prompt, PromptEvent}; pub use spinner::{ProgressSpinners, Spinner}; pub use text::Text; +pub use tree::{Tree, TreeItem, TreeOp}; use helix_core::regex::Regex; use helix_core::regex::RegexBuilder; diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs new file mode 100644 index 00000000..4da57ad5 --- /dev/null +++ b/helix-term/src/ui/tree.rs @@ -0,0 +1,680 @@ +use std::cmp::Ordering; +use std::iter::Peekable; + +use anyhow::Result; + +use crate::{ + compositor::{Context, EventResult}, + ctrl, key, shift, +}; +use crossterm::event::{Event, KeyEvent}; +use helix_core::unicode::width::UnicodeWidthStr; +use helix_view::graphics::Rect; +use tui::{buffer::Buffer as Surface, text::Spans}; + +pub trait TreeItem: Sized { + type Params; + + fn text(&self, cx: &mut Context, selected: bool, params: &mut Self::Params) -> Spans; + fn is_child(&self, other: &Self) -> bool; + fn cmp(&self, other: &Self) -> Ordering; + + fn filter(&self, cx: &mut Context, s: &str, params: &mut Self::Params) -> bool { + self.text(cx, false, params) + .0 + .into_iter() + .map(|s| s.content) + .collect::>() + .concat() + .contains(s) + } + + fn get_childs(&self) -> Result> { + Ok(vec![]) + } +} + +fn tree_item_cmp(item1: &T, item2: &T) -> Ordering { + if item1.is_child(item2) { + return Ordering::Greater; + } + if item2.is_child(item1) { + return Ordering::Less; + } + + T::cmp(item1, item2) +} + +fn vec_to_tree(mut items: Vec, level: usize) -> Vec> { + fn get_childs(iter: &mut Peekable, elem: &mut Elem) + where + T: TreeItem, + Iter: Iterator, + { + let level = elem.level + 1; + loop { + if !iter.peek().map_or(false, |next| next.is_child(&elem.item)) { + break; + } + let mut child = Elem::new(iter.next().unwrap(), level); + if iter.peek().map_or(false, |nc| nc.is_child(&child.item)) { + get_childs(iter, &mut child); + } + elem.folded.push(child); + } + } + + items.sort_by(tree_item_cmp); + let mut elems = Vec::with_capacity(items.len()); + let mut iter = items.into_iter().peekable(); + while let Some(item) = iter.next() { + let mut elem = Elem::new(item, level); + if iter.peek().map_or(false, |next| next.is_child(&elem.item)) { + get_childs(&mut iter, &mut elem); + } + expand_elems(&mut elems, elem); + } + elems +} + +// return total elems's count contain self +fn get_elems_recursion(t: &mut Elem, depth: usize) -> Result { + let mut childs = t.item.get_childs()?; + childs.sort_by(tree_item_cmp); + let mut elems = Vec::with_capacity(childs.len()); + let level = t.level + 1; + let mut total = 1; + for child in childs { + let mut elem = Elem::new(child, level); + let count = if depth > 0 { + get_elems_recursion(&mut elem, depth - 1)? + } else { + 1 + }; + elems.push(elem); + total += count; + } + t.folded = elems; + Ok(total) +} + +fn expand_elems(dist: &mut Vec>, mut t: Elem) { + let childs = std::mem::take(&mut t.folded); + dist.push(t); + for child in childs { + expand_elems(dist, child) + } +} + +pub enum TreeOp { + Noop, + Restore, + InsertChild(Vec), + GetChildsAndInsert, + ReplaceTree(Vec), +} + +pub struct Elem { + item: T, + level: usize, + folded: Vec, +} + +impl Clone for Elem { + fn clone(&self) -> Self { + Self { + item: self.item.clone(), + level: self.level, + folded: self.folded.clone(), + } + } +} + +impl Elem { + pub fn new(item: T, level: usize) -> Self { + Self { + item, + level, + folded: vec![], + } + } + + pub fn item(&self) -> &T { + &self.item + } +} + +pub struct Tree { + items: Vec>, + recycle: Option<(String, Vec>)>, + selected: usize, + save_view: (usize, usize), // (selected, row) + row: usize, + col: usize, + max_len: usize, + count: usize, + tree_symbol_style: String, + #[allow(clippy::type_complexity)] + pre_render: Option>, + #[allow(clippy::type_complexity)] + on_opened_fn: + Option TreeOp + 'static>>, + #[allow(clippy::type_complexity)] + on_folded_fn: Option>, + #[allow(clippy::type_complexity)] + on_next_key: Option>, +} + +impl Tree { + pub fn new(items: Vec>) -> Self { + Self { + items, + recycle: None, + selected: 0, + save_view: (0, 0), + row: 0, + col: 0, + max_len: 0, + count: 0, + tree_symbol_style: "ui.text".into(), + pre_render: None, + on_opened_fn: None, + on_folded_fn: None, + on_next_key: None, + } + } + + pub fn replace_with_new_items(&mut self, items: Vec) { + let old = std::mem::replace(self, Self::new(vec_to_tree(items, 0))); + self.on_opened_fn = old.on_opened_fn; + self.on_folded_fn = old.on_folded_fn; + self.tree_symbol_style = old.tree_symbol_style; + } + + pub fn build_tree(items: Vec) -> Self { + Self::new(vec_to_tree(items, 0)) + } + + pub fn build_from_root(t: T, depth: usize) -> Result { + let mut elem = Elem::new(t, 0); + let count = get_elems_recursion(&mut elem, depth)?; + let mut elems = Vec::with_capacity(count); + expand_elems(&mut elems, elem); + Ok(Self::new(elems)) + } + + pub fn with_enter_fn(mut self, f: F) -> Self + where + F: FnMut(&mut T, &mut Context, &mut T::Params) -> TreeOp + 'static, + { + self.on_opened_fn = Some(Box::new(f)); + self + } + + pub fn with_folded_fn(mut self, f: F) -> Self + where + F: FnMut(&mut T, &mut Context, &mut T::Params) + 'static, + { + self.on_folded_fn = Some(Box::new(f)); + self + } + + pub fn tree_symbol_style(mut self, style: String) -> Self { + self.tree_symbol_style = style; + self + } + + fn next_item(&self) -> Option<&Elem> { + self.items.get(self.selected + 1) + } + + fn next_not_descendant_pos(&self, index: usize) -> usize { + let item = &self.items[index]; + self.find(index + 1, false, |n| n.level <= item.level) + .unwrap_or(self.items.len()) + } + + fn find_parent(&self, index: usize) -> Option { + let item = &self.items[index]; + self.find(index, true, |p| p.level < item.level) + } + + // rev start: start - 1 + fn find(&self, start: usize, rev: bool, f: F) -> Option + where + F: FnMut(&Elem) -> bool, + { + let iter = self.items.iter(); + if rev { + iter.take(start).rposition(f) + } else { + iter.skip(start).position(f).map(|p| p + start) + } + } +} + +impl Tree { + pub fn on_enter(&mut self, cx: &mut Context, params: &mut T::Params) { + if self.items.is_empty() { + return; + } + if let Some(next_level) = self.next_item().map(|elem| elem.level) { + let current = &mut self.items[self.selected]; + let current_level = current.level; + if next_level > current_level { + if let Some(mut on_folded_fn) = self.on_folded_fn.take() { + on_folded_fn(&mut current.item, cx, params); + self.on_folded_fn = Some(on_folded_fn); + } + self.fold_current_child(); + return; + } + } + + if let Some(mut on_open_fn) = self.on_opened_fn.take() { + let mut f = || { + let current = &mut self.items[self.selected]; + let items = match on_open_fn(&mut current.item, cx, params) { + TreeOp::Restore => { + let inserts = std::mem::take(&mut current.folded); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + return; + } + TreeOp::InsertChild(items) => items, + TreeOp::GetChildsAndInsert => match current.item.get_childs() { + Ok(items) => items, + Err(e) => return cx.editor.set_error(format!("{e}")), + }, + TreeOp::ReplaceTree(items) => return self.replace_with_new_items(items), + TreeOp::Noop => return, + }; + current.folded = vec![]; + let inserts = vec_to_tree(items, current.level + 1); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + }; + f(); + self.on_opened_fn = Some(on_open_fn) + } else { + let current = &mut self.items[self.selected]; + let inserts = std::mem::take(&mut current.folded); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + } + } + + pub fn fold_current_level(&mut self) { + let start = match self.find_parent(self.selected) { + Some(start) => start, + None => return, + }; + self.selected = start; + self.fold_current_child(); + } + + pub fn fold_current_child(&mut self) { + if self.selected + 1 >= self.items.len() { + return; + } + let pos = self.next_not_descendant_pos(self.selected); + if self.selected < pos { + self.items[self.selected].folded = self.items.drain(self.selected + 1..pos).collect(); + } + } + + pub fn search_next(&mut self, cx: &mut Context, s: &str, params: &mut T::Params) { + let skip = self.save_view.0 + 1; + self.selected = self + .find(skip, false, |e| e.item.filter(cx, s, params)) + .unwrap_or(self.save_view.0); + + self.row = (self.save_view.1 + self.selected).saturating_sub(self.save_view.0); + } + + pub fn search_pre(&mut self, cx: &mut Context, s: &str, params: &mut T::Params) { + let take = self.save_view.0; + self.selected = self + .find(take, true, |e| e.item.filter(cx, s, params)) + .unwrap_or(self.save_view.0); + + self.row = (self.save_view.1 + self.selected).saturating_sub(self.save_view.0); + } + + pub fn move_down(&mut self, rows: usize) { + let len = self.items.len(); + if len > 0 { + self.selected = std::cmp::min(self.selected + rows, len.saturating_sub(1)); + self.row = std::cmp::min(self.selected, self.row + rows); + } + } + + pub fn move_up(&mut self, rows: usize) { + let len = self.items.len(); + if len > 0 { + self.selected = self.selected.saturating_sub(rows); + self.row = std::cmp::min(self.selected, self.row.saturating_sub(rows)); + } + } + + pub fn move_left(&mut self, cols: usize) { + self.col = self.col.saturating_sub(cols); + } + + pub fn move_right(&mut self, cols: usize) { + self.pre_render = Some(Box::new(move |tree: &mut Self, area: Rect| { + let max_scroll = tree.max_len.saturating_sub(area.width as usize); + tree.col = max_scroll.min(tree.col + cols); + })); + } + + pub fn move_down_half_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_down((area.height / 2) as usize); + })); + } + + pub fn move_up_half_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_up((area.height / 2) as usize); + })); + } + + pub fn move_down_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_down((area.height) as usize); + })); + } + + pub fn move_up_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_up((area.height) as usize); + })); + } + + pub fn save_view(&mut self) { + self.save_view = (self.selected, self.row); + } + + pub fn restore_view(&mut self) { + (self.selected, self.row) = self.save_view; + } + + pub fn current(&self) -> &Elem { + &self.items[self.selected] + } + + pub fn current_item(&self) -> &T { + &self.items[self.selected].item + } + + pub fn row(&self) -> usize { + self.row + } + + pub fn remove_current(&mut self) -> T { + let elem = self.items.remove(self.selected); + self.selected = self.selected.saturating_sub(1); + elem.item + } + + pub fn replace_current(&mut self, item: T) { + self.items[self.selected].item = item; + } + + pub fn insert_current_level(&mut self, item: T) { + let current = self.current(); + let level = current.level; + let pos = match current.item.cmp(&item) { + Ordering::Less => self + .find(self.selected + 1, false, |e| { + e.level < level || (e.level == level && e.item.cmp(&item) != Ordering::Less) + }) + .unwrap_or(self.items.len()), + + Ordering::Greater => { + match self.find(self.selected, true, |elem| { + elem.level < level + || (elem.level == level && elem.item.cmp(&item) != Ordering::Greater) + }) { + Some(p) if self.items[p].level == level => self.next_not_descendant_pos(p), + Some(p) => p + 1, + None => 0, + } + } + Ordering::Equal => self.selected + 1, + }; + self.items.insert(pos, Elem::new(item, level)); + } +} + +impl Tree { + pub fn render( + &mut self, + area: Rect, + surface: &mut Surface, + cx: &mut Context, + params: &mut T::Params, + ) { + if let Some(pre_render) = self.pre_render.take() { + pre_render(self, area); + } + + self.max_len = 0; + self.row = std::cmp::min(self.row, area.height.saturating_sub(1) as usize); + let style = cx.editor.theme.get(&self.tree_symbol_style); + let last_item_index = self.items.len().saturating_sub(1); + let skip = self.selected.saturating_sub(self.row); + let iter = self + .items + .iter() + .skip(skip) + .take(area.height as usize) + .enumerate(); + for (index, elem) in iter { + let row = index as u16; + let mut area = Rect::new(area.x, area.y + row, area.width, 1); + let indent = if elem.level > 0 { + if index + skip != last_item_index { + format!("{}├─", "│ ".repeat(elem.level - 1)) + } else { + format!("└─{}", "┴─".repeat(elem.level - 1)) + } + } else { + "".to_string() + }; + + let indent_len = indent.chars().count(); + if indent_len > self.col { + let indent: String = indent.chars().skip(self.col).collect(); + if !indent.is_empty() { + surface.set_stringn(area.x, area.y, &indent, area.width as usize, style); + area = area.clip_left(indent.width() as u16); + } + }; + let mut start_index = self.col.saturating_sub(indent_len); + let mut text = elem.item.text(cx, skip + index == self.selected, params); + self.max_len = self.max_len.max(text.width() + indent.len()); + for span in text.0.iter_mut() { + if area.width == 0 { + return; + } + if start_index == 0 { + surface.set_span(area.x, area.y, span, area.width); + area = area.clip_left(span.width() as u16); + } else { + let span_width = span.width(); + if start_index > span_width { + start_index -= span_width; + } else { + let content: String = span + .content + .chars() + .filter(|c| { + if start_index > 0 { + start_index = start_index.saturating_sub(c.to_string().width()); + false + } else { + true + } + }) + .collect(); + surface.set_string_truncated( + area.x, + area.y, + &content, + area.width as usize, + |_| span.style, + false, + false, + ); + start_index = 0 + } + } + } + } + } + + pub fn handle_event( + &mut self, + event: Event, + cx: &mut Context, + params: &mut T::Params, + ) -> EventResult { + let key_event = match event { + Event::Key(event) => event, + Event::Resize(..) => return EventResult::Consumed(None), + _ => return EventResult::Ignored(None), + }; + if let Some(mut on_next_key) = self.on_next_key.take() { + on_next_key(cx, self, key_event); + return EventResult::Consumed(None); + } + let count = std::mem::replace(&mut self.count, 0); + match key_event.into() { + key!(i @ '0'..='9') => self.count = i.to_digit(10).unwrap() as usize + count * 10, + key!('k') | shift!(Tab) | key!(Up) | ctrl!('k') => self.move_up(1.max(count)), + key!('j') | key!(Tab) | key!(Down) | ctrl!('j') => self.move_down(1.max(count)), + key!('z') => self.fold_current_level(), + key!('h') => self.move_left(1.max(count)), + key!('l') => self.move_right(1.max(count)), + shift!('G') => self.move_down(usize::MAX / 2), + key!(Enter) => self.on_enter(cx, params), + ctrl!('d') => self.move_down_half_page(), + ctrl!('u') => self.move_up_half_page(), + shift!('D') => self.move_down_page(), + shift!('U') => self.move_up_page(), + key!('g') => { + self.on_next_key = Some(Box::new(|_, tree, event| match event.into() { + key!('g') => tree.move_up(usize::MAX / 2), + key!('e') => tree.move_down(usize::MAX / 2), + _ => {} + })); + } + _ => return EventResult::Ignored(None), + } + + EventResult::Consumed(None) + } +} + +impl Tree { + pub fn filter(&mut self, s: &str, cx: &mut Context, params: &mut T::Params) { + fn filter_recursion( + elems: &Vec>, + mut index: usize, + s: &str, + cx: &mut Context, + params: &mut T::Params, + ) -> (Vec>, usize) + where + T: TreeItem + Clone, + { + let mut retain = vec![]; + let elem = &elems[index]; + loop { + let child = match elems.get(index + 1) { + Some(child) if child.item.is_child(&elem.item) => child, + _ => break, + }; + index += 1; + let next = elems.get(index + 1); + if next.map_or(false, |n| n.item.is_child(&child.item)) { + let (sub_retain, current_index) = filter_recursion(elems, index, s, cx, params); + retain.extend(sub_retain); + index = current_index; + } else if child.item.filter(cx, s, params) { + retain.push(child.clone()); + } + } + if !retain.is_empty() || elem.item.filter(cx, s, params) { + retain.insert(0, elem.clone()); + } + (retain, index) + } + + if s.is_empty() { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + self.restore_view(); + return; + } + } + + let mut retain = vec![]; + let mut index = 0; + let items = match &self.recycle { + Some((pre, _)) if pre == s => return, + Some((pre, recycle)) if pre.contains(s) => recycle, + _ => &self.items, + }; + while let Some(elem) = items.get(index) { + let next = items.get(index + 1); + if next.map_or(false, |n| n.item.is_child(&elem.item)) { + let (sub_items, current_index) = filter_recursion(items, index, s, cx, params); + index = current_index; + retain.extend(sub_items); + } else if elem.item.filter(cx, s, params) { + retain.push(elem.clone()) + } + index += 1; + } + + if retain.is_empty() { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + self.restore_view(); + } + return; + } + + let recycle = std::mem::replace(&mut self.items, retain); + if let Some(r) = self.recycle.as_mut() { + r.0 = s.into() + } else { + self.recycle = Some((s.into(), recycle)); + self.save_view(); + } + + self.selected = self + .find(0, false, |elem| elem.item.filter(cx, s, params)) + .unwrap_or(0); + self.row = self.selected; + } + + pub fn clean_recycle(&mut self) { + self.recycle = None; + } + + pub fn restore_recycle(&mut self) { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + } + } +} diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index ac19def1..39421265 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -108,6 +108,69 @@ impl Default for FilePickerConfig { } } +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ExplorerStyle { + Tree, + List, +} + +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ExplorerPosition { + Embed, + Overlay, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case", default, deny_unknown_fields)] +pub struct ExplorerConfig { + pub style: ExplorerStyle, + pub position: ExplorerPosition, + /// explorer column width + pub column_width: usize, +} + +impl ExplorerConfig { + pub fn is_embed(&self) -> bool { + match self.position { + ExplorerPosition::Embed => true, + ExplorerPosition::Overlay => false, + } + } + + pub fn is_overlay(&self) -> bool { + match self.position { + ExplorerPosition::Embed => false, + ExplorerPosition::Overlay => true, + } + } + + pub fn is_list(&self) -> bool { + match self.style { + ExplorerStyle::List => true, + ExplorerStyle::Tree => false, + } + } + + pub fn is_tree(&self) -> bool { + match self.style { + ExplorerStyle::List => false, + ExplorerStyle::Tree => true, + } + } +} + +impl Default for ExplorerConfig { + fn default() -> Self { + Self { + style: ExplorerStyle::Tree, + position: ExplorerPosition::Overlay, + column_width: 30, + } + } +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case", default, deny_unknown_fields)] pub struct Config { @@ -156,6 +219,8 @@ pub struct Config { pub rulers: Vec, #[serde(default)] pub whitespace: WhitespaceConfig, + /// explore config + pub explorer: ExplorerConfig, } #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] @@ -391,6 +456,7 @@ impl Default for Config { lsp: LspConfig::default(), rulers: Vec::new(), whitespace: WhitespaceConfig::default(), + explorer: ExplorerConfig::default(), } } } diff --git a/runtime/themes/autumn.toml b/runtime/themes/autumn.toml index 68e41f5a..1d646d84 100644 --- a/runtime/themes/autumn.toml +++ b/runtime/themes/autumn.toml @@ -63,6 +63,12 @@ "warning" = "my_yellow2" "error" = "my_red" +"ui.explorer.file" = { fg = "my_white" } +"ui.explorer.dir" = { fg = "my_yellow1" } +"ui.explorer.exe" = { fg = "my_green" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { modifiers = ["reversed"] } + [palette] my_gray0 = "#292929" # Default Background my_gray1 = "#2e2e2e" # Ruler diff --git a/runtime/themes/base16_default_dark.toml b/runtime/themes/base16_default_dark.toml index 7516e492..43b54441 100644 --- a/runtime/themes/base16_default_dark.toml +++ b/runtime/themes/base16_default_dark.toml @@ -54,6 +54,12 @@ "warning" = "base09" "error" = "base08" +"ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "base0D" } +"ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base02" } + [palette] base00 = "#181818" # Default Background base01 = "#282828" # Lighter Background (Used for status bars, line number and folding marks) diff --git a/runtime/themes/base16_default_light.toml b/runtime/themes/base16_default_light.toml index 36847459..89be4546 100644 --- a/runtime/themes/base16_default_light.toml +++ b/runtime/themes/base16_default_light.toml @@ -54,6 +54,12 @@ "warning" = "base09" "error" = "base08" +"ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "base0D" } +"ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base02" } + [palette] base00 = "#f8f8f8" # Default Background base01 = "#e8e8e8" # Lighter Background (Used for status bars, line number and folding marks) diff --git a/runtime/themes/base16_terminal.toml b/runtime/themes/base16_terminal.toml index 92848816..c51221da 100644 --- a/runtime/themes/base16_terminal.toml +++ b/runtime/themes/base16_terminal.toml @@ -50,3 +50,9 @@ "debug" = "gray" "warning" = "yellow" "error" = "light-red" + +# "ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "light-blue" } +# "ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-gray" } diff --git a/runtime/themes/bogster.toml b/runtime/themes/bogster.toml index df3a7f31..85e01501 100644 --- a/runtime/themes/bogster.toml +++ b/runtime/themes/bogster.toml @@ -70,3 +70,9 @@ # make diagnostic underlined, to distinguish with selection text. diagnostic = { modifiers = ["underlined"] } + +"ui.explorer.file" = { fg = "#e5ded6" } +"ui.explorer.dir" = { fg = "#59dcd8" } +"ui.explorer.exe" = { fg = "#e5ded6" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#313f4e" } diff --git a/runtime/themes/boo_berry.toml b/runtime/themes/boo_berry.toml index 5cd25397..e5f75d21 100644 --- a/runtime/themes/boo_berry.toml +++ b/runtime/themes/boo_berry.toml @@ -56,6 +56,12 @@ "hint" = { fg = "lilac" } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "lilac" } +"ui.explorer.dir" = { fg = "mint" } +"ui.explorer.exe" = { fg = "lilac" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "berry_saturated" } + [palette] berry = "#3A2A4D" berry_saturated = "#2B1C3D" diff --git a/runtime/themes/dark_plus.toml b/runtime/themes/dark_plus.toml index c785dd38..3c616663 100644 --- a/runtime/themes/dark_plus.toml +++ b/runtime/themes/dark_plus.toml @@ -88,6 +88,12 @@ diagnostic = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "dark_blue2" } + [palette] white = "#ffffff" orange = "#ce9178" diff --git a/runtime/themes/dracula.toml b/runtime/themes/dracula.toml index e32c3117..11cad6d6 100644 --- a/runtime/themes/dracula.toml +++ b/runtime/themes/dracula.toml @@ -50,6 +50,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "secondary_highlight" } + [palette] background = "#282a36" background_dark = "#21222c" diff --git a/runtime/themes/dracula_at_night.toml b/runtime/themes/dracula_at_night.toml index 0a45f024..0be4497c 100644 --- a/runtime/themes/dracula_at_night.toml +++ b/runtime/themes/dracula_at_night.toml @@ -50,6 +50,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "comment" } + [palette] background = "#0e1419" background_dark = "#21222c" diff --git a/runtime/themes/everforest_dark.toml b/runtime/themes/everforest_dark.toml index 5b6d1b7c..5fcdbadf 100644 --- a/runtime/themes/everforest_dark.toml +++ b/runtime/themes/everforest_dark.toml @@ -78,6 +78,11 @@ "error" = "red" "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "grey1" } [palette] diff --git a/runtime/themes/everforest_light.toml b/runtime/themes/everforest_light.toml index b0370165..40e07376 100644 --- a/runtime/themes/everforest_light.toml +++ b/runtime/themes/everforest_light.toml @@ -78,6 +78,11 @@ "error" = "red" "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "grey1" } [palette] diff --git a/runtime/themes/gruvbox.toml b/runtime/themes/gruvbox.toml index 6de35244..98689ada 100644 --- a/runtime/themes/gruvbox.toml +++ b/runtime/themes/gruvbox.toml @@ -64,6 +64,12 @@ "markup.link.text" = "red1" "markup.raw" = "red1" +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "blue0" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#282828" # main background bg1 = "#3c3836" diff --git a/runtime/themes/gruvbox_light.toml b/runtime/themes/gruvbox_light.toml index 2930dff0..676d2b51 100644 --- a/runtime/themes/gruvbox_light.toml +++ b/runtime/themes/gruvbox_light.toml @@ -65,6 +65,12 @@ "markup.link.text" = "red1" "markup.raw" = "red1" +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "blue0" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#fbf1c7" # main background bg1 = "#ebdbb2" diff --git a/runtime/themes/ingrid.toml b/runtime/themes/ingrid.toml index 79b749b1..e4b81172 100644 --- a/runtime/themes/ingrid.toml +++ b/runtime/themes/ingrid.toml @@ -64,3 +64,9 @@ "error" = "#D74E50" "info" = "#839A53" "hint" = "#A6B6CE" + +"ui.explorer.file" = { fg = "#7B91B3" } +"ui.explorer.dir" = { fg = "#89BEB7" } +"ui.explorer.exe" = { fg = "#7B91B3" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#F3EAE9" } diff --git a/runtime/themes/monokai.toml b/runtime/themes/monokai.toml index 3fb1fadc..8dbd443f 100644 --- a/runtime/themes/monokai.toml +++ b/runtime/themes/monokai.toml @@ -85,6 +85,12 @@ diagnostic = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "fn_declaration" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#75715e" } + [palette] type = "#A6E22E" keyword = "#F92672" diff --git a/runtime/themes/monokai_pro.toml b/runtime/themes/monokai_pro.toml index 5580a33c..0b080429 100644 --- a/runtime/themes/monokai_pro.toml +++ b/runtime/themes/monokai_pro.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff6188" diff --git a/runtime/themes/monokai_pro_machine.toml b/runtime/themes/monokai_pro_machine.toml index abbe5bdc..8039b7a7 100644 --- a/runtime/themes/monokai_pro_machine.toml +++ b/runtime/themes/monokai_pro_machine.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff6d7e" diff --git a/runtime/themes/monokai_pro_octagon.toml b/runtime/themes/monokai_pro_octagon.toml index b249cfe2..41cb6da9 100644 --- a/runtime/themes/monokai_pro_octagon.toml +++ b/runtime/themes/monokai_pro_octagon.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff657a" diff --git a/runtime/themes/monokai_pro_ristretto.toml b/runtime/themes/monokai_pro_ristretto.toml index cd4cbd8e..0298c895 100644 --- a/runtime/themes/monokai_pro_ristretto.toml +++ b/runtime/themes/monokai_pro_ristretto.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#fd6883" diff --git a/runtime/themes/monokai_pro_spectrum.toml b/runtime/themes/monokai_pro_spectrum.toml index 4160a15e..53774896 100644 --- a/runtime/themes/monokai_pro_spectrum.toml +++ b/runtime/themes/monokai_pro_spectrum.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#fc618d" diff --git a/runtime/themes/night_owl.toml b/runtime/themes/night_owl.toml index 337fae86..074045e6 100644 --- a/runtime/themes/night_owl.toml +++ b/runtime/themes/night_owl.toml @@ -83,6 +83,12 @@ 'diff.delta' = { fg = 'blue' } 'diff.delta.moved' = { fg = 'blue', modifiers = ['italic'] } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "selection" } + [palette] background = '#011627' background2 = '#112630' diff --git a/runtime/themes/nord.toml b/runtime/themes/nord.toml index a61c1715..da406949 100644 --- a/runtime/themes/nord.toml +++ b/runtime/themes/nord.toml @@ -101,6 +101,12 @@ "diff.delta" = "nord12" "diff.minus" = "nord11" +"ui.explorer.file" = { fg = "nord6" } +"ui.explorer.dir" = { fg = "nord8" } +"ui.explorer.exe" = { fg = "nord6" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "nord2" } + [palette] nord0 = "#2e3440" nord1 = "#3b4252" diff --git a/runtime/themes/onedark.toml b/runtime/themes/onedark.toml index 280f6914..1bcb8702 100644 --- a/runtime/themes/onedark.toml +++ b/runtime/themes/onedark.toml @@ -72,6 +72,12 @@ diagnostic = { modifiers = ["underlined"] } "ui.menu" = { fg = "white", bg = "gray" } "ui.menu.selected" = { fg = "black", bg = "blue" } +"ui.explorer.file" = { fg = "white" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "white" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-gray" } + [palette] yellow = "#E5C07B" diff --git a/runtime/themes/onelight.toml b/runtime/themes/onelight.toml index c89e20f9..27f079d8 100644 --- a/runtime/themes/onelight.toml +++ b/runtime/themes/onelight.toml @@ -98,6 +98,12 @@ "ui.menu" = { fg = "black", bg = "light-white" } "ui.menu.selected" = { fg = "white", bg = "light-blue" } +"ui.explorer.file" = { fg = "black" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "black" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-white" } + [palette] white = "#FAFAFA" yellow = "#A06600" diff --git a/runtime/themes/pop-dark.toml b/runtime/themes/pop-dark.toml index e662f957..1b4b9e6b 100644 --- a/runtime/themes/pop-dark.toml +++ b/runtime/themes/pop-dark.toml @@ -121,6 +121,12 @@ namespace = { fg = 'orangeL' } 'diff.delta' = { fg = '#4d4ddd' } 'diff.delta.moved' = { fg = '#dd4ddd' } +"ui.explorer.file" = { fg = "greyT" } +"ui.explorer.dir" = { fg = "blueL" } +"ui.explorer.exe" = { fg = "greyT" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "greyL" } + [palette] white = '#FFFFFF' greyH = '#CFCFCF' diff --git a/runtime/themes/rose_pine.toml b/runtime/themes/rose_pine.toml index f0575880..88c31de4 100644 --- a/runtime/themes/rose_pine.toml +++ b/runtime/themes/rose_pine.toml @@ -63,6 +63,12 @@ "markup.quote" = { fg = "rose" } "markup.raw" = { fg = "foam" } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "rose" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "highlight" } + [palette] base = "#191724" surface = "#1f1d2e" diff --git a/runtime/themes/rose_pine_dawn.toml b/runtime/themes/rose_pine_dawn.toml index 5ad304e3..1778bde0 100644 --- a/runtime/themes/rose_pine_dawn.toml +++ b/runtime/themes/rose_pine_dawn.toml @@ -63,6 +63,12 @@ "markup.quote" = { fg = "rose" } "markup.raw" = { fg = "foam" } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "rose" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "highlight" } + [palette] base = "#faf4ed" surface = "#fffaf3" diff --git a/runtime/themes/serika-dark.toml b/runtime/themes/serika-dark.toml index 3dd982d1..86c69d02 100644 --- a/runtime/themes/serika-dark.toml +++ b/runtime/themes/serika-dark.toml @@ -71,6 +71,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#323437" diff --git a/runtime/themes/serika-light.toml b/runtime/themes/serika-light.toml index 67c8328b..9f15421e 100644 --- a/runtime/themes/serika-light.toml +++ b/runtime/themes/serika-light.toml @@ -71,6 +71,11 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } [palette] diff --git a/runtime/themes/solarized_dark.toml b/runtime/themes/solarized_dark.toml index f15e1fa0..03e158e8 100644 --- a/runtime/themes/solarized_dark.toml +++ b/runtime/themes/solarized_dark.toml @@ -91,6 +91,12 @@ "hint" = { fg = "base01", modifiers= ["bold", "underlined"] } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "base1" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base0175" } + [palette] # 深色 越来越深 base03 = "#002b36" diff --git a/runtime/themes/solarized_light.toml b/runtime/themes/solarized_light.toml index eec4220d..cad9a385 100644 --- a/runtime/themes/solarized_light.toml +++ b/runtime/themes/solarized_light.toml @@ -107,6 +107,12 @@ "hint" = { fg = "base01", modifiers= ["bold", "underlined"] } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "base1" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base0175" } + [palette] red = '#dc322f' green = '#859900' diff --git a/runtime/themes/spacebones_light.toml b/runtime/themes/spacebones_light.toml index 80a19375..3209df41 100644 --- a/runtime/themes/spacebones_light.toml +++ b/runtime/themes/spacebones_light.toml @@ -68,6 +68,12 @@ "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "#715ab1" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#fbf8ef" bg1 = "#efeae9" diff --git a/runtime/themes/tokyonight.toml b/runtime/themes/tokyonight.toml index 14cc40e2..6bc505df 100644 --- a/runtime/themes/tokyonight.toml +++ b/runtime/themes/tokyonight.toml @@ -62,6 +62,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "cyan" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "background_highlight" } + [palette] red = "#f7768e" orange = "#ff9e64" diff --git a/runtime/themes/tokyonight_storm.toml b/runtime/themes/tokyonight_storm.toml index 6c6fd9c8..16849041 100644 --- a/runtime/themes/tokyonight_storm.toml +++ b/runtime/themes/tokyonight_storm.toml @@ -62,6 +62,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "cyan" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "background_highlight" } + [palette] red = "#f7768e" orange = "#ff9e64" -- 2.38.5 From 06a5bca79bb81aeb97b96e5f493204bdf04dc3ba Mon Sep 17 00:00:00 2001 From: cossonleo Date: Mon, 30 May 2022 14:41:50 +0800 Subject: [PATCH 03/54] optimize tree explore render --- helix-term/src/ui/editor.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index b5148635..a23429d8 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -1325,6 +1325,12 @@ impl Component for EditorView { } cx.editor.resize(editor_area); // -1 from bottom for commandline + if let Some(explore) = self.explorer.as_mut() { + if !explore.content.is_focus() && config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } + } + for (view, is_focused) in cx.editor.tree.views() { let doc = cx.editor.document(view.doc).unwrap(); self.render_view(cx.editor, doc, view, area, surface, is_focused); @@ -1406,10 +1412,12 @@ impl Component for EditorView { } if let Some(explore) = self.explorer.as_mut() { - if config.explorer.is_embed() { - explore.content.render(area, surface, cx); - } else if explore.content.is_focus() { - explore.render(area, surface, cx); + if explore.content.is_focus() { + if config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } else { + explore.render(area, surface, cx); + } } } } -- 2.38.5 From 10cd4c56c9d863efc8012529179a6d366cdd9fc7 Mon Sep 17 00:00:00 2001 From: cossonleo Date: Sun, 3 Apr 2022 15:55:08 +0800 Subject: [PATCH 04/54] tree helper and file explorer --- book/src/configuration.md | 10 + book/src/keymap.md | 33 + helix-term/src/commands.rs | 42 +- helix-term/src/keymap/default.rs | 2 + helix-term/src/ui/editor.rs | 34 +- helix-term/src/ui/explore.rs | 867 ++++++++++++++++++++++ helix-term/src/ui/mod.rs | 4 + helix-term/src/ui/tree.rs | 680 +++++++++++++++++ helix-view/src/editor.rs | 66 ++ runtime/themes/autumn.toml | 6 + runtime/themes/base16_default_dark.toml | 6 + runtime/themes/base16_default_light.toml | 6 + runtime/themes/base16_terminal.toml | 6 + runtime/themes/bogster.toml | 6 + runtime/themes/boo_berry.toml | 6 + runtime/themes/dark_plus.toml | 6 + runtime/themes/dracula.toml | 6 + runtime/themes/dracula_at_night.toml | 6 + runtime/themes/everforest_dark.toml | 5 + runtime/themes/everforest_light.toml | 5 + runtime/themes/gruvbox.toml | 6 + runtime/themes/gruvbox_light.toml | 6 + runtime/themes/ingrid.toml | 6 + runtime/themes/monokai.toml | 6 + runtime/themes/monokai_pro.toml | 6 + runtime/themes/monokai_pro_machine.toml | 6 + runtime/themes/monokai_pro_octagon.toml | 6 + runtime/themes/monokai_pro_ristretto.toml | 6 + runtime/themes/monokai_pro_spectrum.toml | 6 + runtime/themes/night_owl.toml | 6 + runtime/themes/nord.toml | 6 + runtime/themes/onedark.toml | 6 + runtime/themes/onelight.toml | 6 + runtime/themes/pop-dark.toml | 6 + runtime/themes/rose_pine.toml | 6 + runtime/themes/rose_pine_dawn.toml | 6 + runtime/themes/serika-dark.toml | 6 + runtime/themes/serika-light.toml | 5 + runtime/themes/solarized_dark.toml | 6 + runtime/themes/solarized_light.toml | 6 + runtime/themes/spacebones_light.toml | 6 + runtime/themes/tokyonight.toml | 6 + runtime/themes/tokyonight_storm.toml | 6 + 43 files changed, 1936 insertions(+), 3 deletions(-) create mode 100644 helix-term/src/ui/explore.rs create mode 100644 helix-term/src/ui/tree.rs diff --git a/book/src/configuration.md b/book/src/configuration.md index 1cc8602a..ad6d9331 100644 --- a/book/src/configuration.md +++ b/book/src/configuration.md @@ -105,6 +105,8 @@ auto-pairs = false # defaults to `true` The default pairs are (){}[]''""``, but these can be customized by setting `auto-pairs` to a TOML table: +Example + ```toml [editor.auto-pairs] '(' = ')' @@ -186,3 +188,11 @@ Example: render = true character = "╎" ``` +### `[editor.explorer]` Section +Sets explorer side width and style. + + | Key | Description | Default | + | --- | ----------- | ------- | + | `column-width` | explorer side width | 30 | + | `style` | explorer item style, tree or list | tree | + | `position` | explorer widget position, embed or overlay | overlay | diff --git a/book/src/keymap.md b/book/src/keymap.md index 5daeec3f..0d062300 100644 --- a/book/src/keymap.md +++ b/book/src/keymap.md @@ -254,6 +254,8 @@ This layer is a kludge of mappings, mostly pickers. | `R` | Replace selections by clipboard contents | `replace_selections_with_clipboard` | | `/` | Global search in workspace folder | `global_search` | | `?` | Open command palette | `command_palette` | +| `e` | Open or focus explorer | `toggle_or_focus_explorer` | +| `E` | open explorer recursion | `open_explorer_recursion` | > TIP: Global search displays results in a fuzzy picker, use `space + '` to bring it back up after opening a file. @@ -381,3 +383,34 @@ Keys to use within prompt, Remapping currently not supported. | `BackTab` | Select previous completion item | | `Enter` | Open selected | +# File explorer +Keys to use within explorer, Remapping currently not supported. + +| Key | Description | +| ----- | ------------- | +| `Escape` | Back to editor | +| `Ctrl-c` | Close explorer | +| `Enter` | Open file or toggle dir selected | +| `b` | Back to current root's parent | +| `f` | Filter items | +| `z` | Fold currrent level | +| `k`, `Shift-Tab`, `Up` | select previous item | +| `j`, `Tab`, `Down` | select next item | +| `h` | Scroll left | +| `l` | Scroll right | +| `G` | Move to last item | +| `Ctrl-d` | Move down half page | +| `Ctrl-u` | Move up half page | +| `Shift-d` | Move down a page | +| `Shift-u` | Move up a page | +| `/` | Search item | +| `?` | Search item reverse | +| `n` | Repeat last search | +| `Shift-n` | Repeat last search reverse | +| `gg` | Move to first item | +| `ge` | Move to last item | +| `gc` | Make current dir as root dir | +| `mf` | Create new file under current item's parent | +| `md` | Create new dir under current item's parent | +| `rf` | Remove file selected | +| `rd` | Remove dir selected | diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 193d5d40..ac2c4f36 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -430,7 +430,10 @@ impl MappableCommand { decrement, "Decrement", record_macro, "Record macro", replay_macro, "Replay macro", - command_palette, "Open command palette", + command_palette, "Open command pallete", + toggle_or_focus_explorer, "toggle or focus explorer", + open_explorer_recursion, "open explorer recursion", + close_explorer, "close explorer", ); } @@ -2190,6 +2193,43 @@ fn file_picker_in_current_directory(cx: &mut Context) { cx.push_layer(Box::new(overlayed(picker))); } +fn toggle_or_focus_explorer(cx: &mut Context) { + cx.callback = Some(Box::new( + |compositor: &mut Compositor, cx: &mut compositor::Context| { + if let Some(editor) = compositor.find::() { + match editor.explorer.as_mut() { + Some(explore) => explore.content.focus(), + None => match ui::Explorer::new(cx) { + Ok(explore) => editor.explorer = Some(overlayed(explore)), + Err(err) => cx.editor.set_error(format!("{}", err)), + }, + } + } + }, + )); +} + +fn open_explorer_recursion(cx: &mut Context) { + cx.callback = Some(Box::new( + |compositor: &mut Compositor, cx: &mut compositor::Context| { + if let Some(editor) = compositor.find::() { + match ui::Explorer::new_explorer_recursion() { + Ok(explore) => editor.explorer = Some(overlayed(explore)), + Err(err) => cx.editor.set_error(format!("{}", err)), + } + } + }, + )); +} + +fn close_explorer(cx: &mut Context) { + cx.callback = Some(Box::new(|compositor: &mut Compositor, _| { + if let Some(editor) = compositor.find::() { + editor.explorer.take(); + } + })); +} + fn buffer_picker(cx: &mut Context) { let current = view!(cx.editor).doc; diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 9b144758..9b98a6a5 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -263,6 +263,8 @@ pub fn default() -> HashMap { "r" => rename_symbol, "h" => select_references_to_symbol_under_cursor, "?" => command_palette, + "e" => toggle_or_focus_explorer, + "E" => open_explorer_recursion, }, "z" => { "View" "z" | "c" => align_view_center, diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index a7c67a21..9caf5052 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -3,7 +3,7 @@ use crate::{ compositor::{Component, Context, EventResult}, key, keymap::{KeymapResult, Keymaps}, - ui::{Completion, ProgressSpinners}, + ui::{overlay::Overlay, Completion, Explorer, ProgressSpinners}, }; use helix_core::{ @@ -35,6 +35,7 @@ pub struct EditorView { last_insert: (commands::MappableCommand, Vec), pub(crate) completion: Option, spinners: ProgressSpinners, + pub(crate) explorer: Option>, } #[derive(Debug, Clone)] @@ -58,6 +59,7 @@ impl EditorView { last_insert: (commands::MappableCommand::normal_mode, Vec::new()), completion: None, spinners: ProgressSpinners::default(), + explorer: None, } } @@ -1241,6 +1243,11 @@ impl Component for EditorView { event: Event, context: &mut crate::compositor::Context, ) -> EventResult { + if let Some(explore) = self.explorer.as_mut() { + if let EventResult::Consumed(callback) = explore.handle_event(event, context) { + return EventResult::Consumed(callback); + } + } let mut cx = commands::Context { editor: context.editor, count: None, @@ -1372,7 +1379,11 @@ impl Component for EditorView { surface.set_style(area, cx.editor.theme.get("ui.background")); let config = cx.editor.config(); // if the terminal size suddenly changed, we need to trigger a resize - cx.editor.resize(area.clip_bottom(1)); // -1 from bottom for commandline + let mut editor_area = area.clip_bottom(1); + if self.explorer.is_some() && (config.explorer.is_embed()) { + editor_area = editor_area.clip_left(config.explorer.column_width as u16 + 2); + } + cx.editor.resize(editor_area); // -1 from bottom for commandline for (view, is_focused) in cx.editor.tree.views() { let doc = cx.editor.document(view.doc).unwrap(); @@ -1448,9 +1459,28 @@ impl Component for EditorView { if let Some(completion) = self.completion.as_mut() { completion.render(area, surface, cx); } + + if let Some(explore) = self.explorer.as_mut() { + if config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } else if explore.content.is_focus() { + explore.render(area, surface, cx); + } + } } fn cursor(&self, _area: Rect, editor: &Editor) -> (Option, CursorKind) { + if let Some(explore) = &self.explorer { + if explore.content.is_focus() { + if editor.config().explorer.is_overlay() { + return explore.cursor(_area, editor); + } + let cursor = explore.content.cursor(_area, editor); + if cursor.0.is_some() { + return cursor; + } + } + } match editor.cursor() { // All block cursors are drawn manually (pos, CursorKind::Block) => (pos, CursorKind::Hidden), diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs new file mode 100644 index 00000000..544a1667 --- /dev/null +++ b/helix-term/src/ui/explore.rs @@ -0,0 +1,867 @@ +use super::{Prompt, Tree, TreeItem, TreeOp}; +use crate::{ + compositor::{Component, Compositor, Context, EventResult}, + ctrl, key, shift, ui, +}; +use anyhow::{bail, ensure, Result}; +use crossterm::event::{Event, KeyEvent}; +use helix_core::Position; +use helix_view::{ + editor::Action, + graphics::{CursorKind, Modifier, Rect}, + Editor, +}; +use std::borrow::Cow; +use std::cmp::Ordering; +use std::path::{Path, PathBuf}; +use tui::{ + buffer::Buffer as Surface, + text::{Span, Spans}, + widgets::{Block, Borders, Widget}, +}; + +macro_rules! get_theme { + ($theme: expr, $s1: expr, $s2: expr) => { + $theme.try_get($s1).unwrap_or_else(|| $theme.get($s2)) + }; +} + +#[derive(Debug, Clone, Copy, PartialEq)] +enum FileType { + File, + Dir, + Exe, + Placeholder, + Parent, + Root, +} + +#[derive(Debug, Clone)] +struct FileInfo { + file_type: FileType, + path: PathBuf, +} + +impl FileInfo { + fn new(path: PathBuf, file_type: FileType) -> Self { + Self { path, file_type } + } + + fn root(path: PathBuf) -> Self { + Self { + file_type: FileType::Root, + path, + } + } + + fn parent(path: &Path) -> Self { + let p = path.parent().unwrap_or_else(|| Path::new("")); + Self { + file_type: FileType::Parent, + path: p.to_path_buf(), + } + } + + fn get_text(&self) -> Cow<'static, str> { + match self.file_type { + FileType::Parent => "..".into(), + FileType::Placeholder => "---".into(), + FileType::Root => return format!("{}", self.path.display()).into(), + FileType::File | FileType::Exe | FileType::Dir => self + .path + .file_name() + .map_or("/".into(), |p| p.to_string_lossy().into_owned().into()), + } + } +} + +impl TreeItem for FileInfo { + type Params = State; + fn text(&self, cx: &mut Context, selected: bool, state: &mut State) -> Spans { + let text = self.get_text(); + let theme = &cx.editor.theme; + + let style = match self.file_type { + FileType::Parent | FileType::Dir | FileType::Root => "ui.explorer.dir", + FileType::File | FileType::Exe | FileType::Placeholder => "ui.explorer.file", + }; + let mut style = theme.try_get(style).unwrap_or_else(|| theme.get("ui.text")); + if selected { + let patch = match state.focus { + true => "ui.explorer.focus", + false => "ui.explorer.unfocus", + }; + if let Some(patch) = theme.try_get(patch) { + style = style.patch(patch); + } else { + style = style.add_modifier(Modifier::REVERSED); + } + } + Spans::from(Span::styled(text, style)) + } + + fn is_child(&self, other: &Self) -> bool { + if let FileType::Parent = other.file_type { + return false; + } + if let FileType::Placeholder = self.file_type { + self.path == other.path + } else { + self.path.parent().map_or(false, |p| p == other.path) + } + } + + fn cmp(&self, other: &Self) -> Ordering { + use FileType::*; + match (self.file_type, other.file_type) { + (Parent, _) => return Ordering::Less, + (_, Parent) => return Ordering::Greater, + (Root, _) => return Ordering::Less, + (_, Root) => return Ordering::Greater, + _ => {} + }; + + if self.path == other.path { + match (self.file_type, other.file_type) { + (_, Placeholder) => return Ordering::Less, + (Placeholder, _) => return Ordering::Greater, + _ => {} + }; + } + + if let (Some(p1), Some(p2)) = (self.path.parent(), other.path.parent()) { + if p1 == p2 { + match (self.file_type, other.file_type) { + (Dir, File | Exe) => return Ordering::Less, + (File | Exe, Dir) => return Ordering::Greater, + _ => {} + }; + } + } + self.path.cmp(&other.path) + } + + fn get_childs(&self) -> Result> { + match self.file_type { + FileType::Root | FileType::Dir => {} + _ => return Ok(vec![]), + }; + let mut ret: Vec<_> = std::fs::read_dir(&self.path)? + .filter_map(|entry| entry.ok()) + .filter_map(|entry| { + entry.metadata().ok().map(|meta| { + let is_exe = false; + let file_type = match (meta.is_dir(), is_exe) { + (true, _) => FileType::Dir, + (_, false) => FileType::File, + (_, true) => FileType::Exe, + }; + Self { + file_type, + path: self.path.join(entry.file_name()), + } + }) + }) + .collect(); + if ret.is_empty() { + ret.push(Self { + path: self.path.clone(), + file_type: FileType::Placeholder, + }) + } + Ok(ret) + } + + fn filter(&self, _cx: &mut Context, s: &str, _params: &mut Self::Params) -> bool { + if s.is_empty() { + false + } else { + self.get_text().contains(s) + } + } +} + +// #[derive(Default, Debug, Clone)] +// struct PathState { +// root: PathBuf, +// sub_items: Vec, +// selected: usize, +// save_view: (usize, usize), // (selected, row) +// row: usize, +// col: usize, +// max_len: usize, +// } + +// impl PathState { + +// fn mkdir(&mut self, dir: &str) -> Result<()> { +// self.new_path(dir, FileType::Dir) +// } + +// fn create_file(&mut self, f: &str) -> Result<()> { +// self.new_path(f, FileType::File) +// } + +// fn remove_current_file(&mut self) -> Result<()> { +// let item = &self.sub_items[self.selected]; +// std::fs::remove_file(item.path_with_root(&self.root))?; +// self.sub_items.remove(self.selected); +// if self.selected >= self.sub_items.len() { +// self.selected = self.sub_items.len() - 1; +// } +// Ok(()) +// } + +// } + +#[derive(Clone, Copy, Debug)] +enum PromptAction { + Search(bool), // search next/search pre + Mkdir, + CreateFile, + RemoveDir, + RemoveFile, + Filter, +} + +#[derive(Clone, Debug)] +struct State { + focus: bool, + current_root: PathBuf, +} + +impl State { + fn new(focus: bool, current_root: PathBuf) -> Self { + Self { + focus, + current_root, + } + } +} + +pub struct Explorer { + tree: Tree, + state: State, + prompt: Option<(PromptAction, Prompt)>, + #[allow(clippy::type_complexity)] + on_next_key: Option EventResult>>, + #[allow(clippy::type_complexity)] + repeat_motion: Option>, +} + +impl Explorer { + pub fn new(cx: &mut Context) -> Result { + let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); + let items = Self::get_items(current_root.clone(), cx)?; + Ok(Self { + tree: Tree::build_tree(items).with_enter_fn(Self::toggle_current), + state: State::new(true, current_root), + repeat_motion: None, + prompt: None, + on_next_key: None, + }) + } + + pub fn new_explorer_recursion() -> Result { + let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); + let parent = FileInfo::parent(¤t_root); + let root = FileInfo::root(current_root.clone()); + let mut tree = + Tree::build_from_root(root, usize::MAX / 2)?.with_enter_fn(Self::toggle_current); + tree.insert_current_level(parent); + Ok(Self { + tree, + state: State::new(true, current_root), + repeat_motion: None, + prompt: None, + on_next_key: None, + }) + // let mut root = vec![, FileInfo::root(p)]; + } + + // pub fn new_with_uri(uri: String) -> Result { + // // support remote file? + + // let p = Path::new(&uri); + // ensure!(p.exists(), "path: {uri} is not exist"); + // ensure!(p.is_dir(), "path: {uri} is not dir"); + // Ok(Self::default().with_list(get_sub(p, None)?)) + // } + + pub fn focus(&mut self) { + self.state.focus = true + } + + pub fn unfocus(&mut self) { + self.state.focus = false; + } + + pub fn is_focus(&self) -> bool { + self.state.focus + } + + fn get_items(p: PathBuf, cx: &mut Context) -> Result> { + let mut items = vec![FileInfo::parent(p.as_path())]; + let root = FileInfo::root(p); + let childs = root.get_childs()?; + if cx.editor.config().explorer.is_tree() { + items.push(root) + } + items.extend(childs); + Ok(items) + } + + fn render_preview(&mut self, area: Rect, surface: &mut Surface, editor: &Editor) { + if area.height <= 2 || area.width < 60 { + return; + } + let item = self.tree.current().item(); + if item.file_type == FileType::Placeholder { + return; + } + let head_area = render_block(area.clip_bottom(area.height - 2), surface, Borders::BOTTOM); + let path_str = format!("{}", item.path.display()); + surface.set_stringn( + head_area.x, + head_area.y, + path_str, + head_area.width as usize, + get_theme!(editor.theme, "ui.explorer.dir", "ui.text"), + ); + + let body_area = area.clip_top(2); + let style = editor.theme.get("ui.text"); + if let Ok(preview_content) = get_preview(&item.path, body_area.height as usize) { + preview_content + .into_iter() + .enumerate() + .for_each(|(row, line)| { + surface.set_stringn( + body_area.x, + body_area.y + row as u16, + line, + body_area.width as usize, + style, + ); + }) + } + } + + fn new_search_prompt(&mut self, search_next: bool) { + self.tree.save_view(); + self.prompt = Some(( + PromptAction::Search(search_next), + Prompt::new("search: ".into(), None, ui::completers::none, |_, _, _| {}), + )) + } + + fn new_filter_prompt(&mut self) { + self.tree.save_view(); + self.prompt = Some(( + PromptAction::Filter, + Prompt::new("filter: ".into(), None, ui::completers::none, |_, _, _| {}), + )) + } + + fn new_mkdir_prompt(&mut self) { + self.prompt = Some(( + PromptAction::Mkdir, + Prompt::new("mkdir: ".into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn new_create_file_prompt(&mut self) { + self.prompt = Some(( + PromptAction::CreateFile, + Prompt::new( + "create file: ".into(), + None, + ui::completers::none, + |_, _, _| {}, + ), + )); + } + + fn new_remove_file_prompt(&mut self, cx: &mut Context) { + let item = self.tree.current_item(); + let check = || { + ensure!(item.file_type != FileType::Placeholder, "The path is empty"); + ensure!( + item.file_type != FileType::Parent, + "can not remove parent dir" + ); + ensure!(item.path.is_file(), "The path is not a file"); + let doc = cx.editor.document_by_path(&item.path); + ensure!(doc.is_none(), "The file is opened"); + Ok(()) + }; + if let Err(e) = check() { + cx.editor.set_error(format!("{e}")); + return; + } + let p = format!("remove file: {}, YES? ", item.path.display()); + self.prompt = Some(( + PromptAction::RemoveFile, + Prompt::new(p.into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn new_remove_dir_prompt(&mut self, cx: &mut Context) { + let item = self.tree.current_item(); + let check = || { + ensure!(item.file_type != FileType::Placeholder, "The path is empty"); + ensure!( + item.file_type != FileType::Parent, + "can not remove parent dir" + ); + ensure!(item.path.is_dir(), "The path is not a dir"); + let doc = cx.editor.documents().find(|doc| { + doc.path() + .map(|p| p.starts_with(&item.path)) + .unwrap_or(false) + }); + ensure!(doc.is_none(), "There are files opened under the dir"); + Ok(()) + }; + if let Err(e) = check() { + cx.editor.set_error(format!("{e}")); + return; + } + let p = format!("remove dir: {}, YES? ", item.path.display()); + self.prompt = Some(( + PromptAction::RemoveDir, + Prompt::new(p.into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn toggle_current( + item: &mut FileInfo, + cx: &mut Context, + state: &mut State, + ) -> TreeOp { + if item.file_type == FileType::Placeholder { + return TreeOp::Noop; + } + if item.path == Path::new("") { + return TreeOp::Noop; + } + let meta = match std::fs::metadata(&item.path) { + Ok(meta) => meta, + Err(e) => { + cx.editor.set_error(format!("{e}")); + return TreeOp::Noop; + } + }; + if meta.is_file() { + if let Err(e) = cx.editor.open(item.path.clone(), Action::Replace) { + cx.editor.set_error(format!("{e}")); + } + state.focus = false; + return TreeOp::Noop; + } + + if item.path.is_dir() { + if cx.editor.config().explorer.is_list() || item.file_type == FileType::Parent { + match Self::get_items(item.path.clone(), cx) { + Ok(items) => { + state.current_root = item.path.clone(); + return TreeOp::ReplaceTree(items); + } + Err(e) => cx.editor.set_error(format!("{e}")), + } + } else { + return TreeOp::GetChildsAndInsert; + } + } + cx.editor.set_error("unkonw file type"); + TreeOp::Noop + } + + fn render_float(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + let background = cx.editor.theme.get("ui.background"); + let column_width = cx.editor.config().explorer.column_width as u16; + surface.clear_with(area, background); + let area = render_block(area, surface, Borders::ALL); + + let mut preview_area = area.clip_left(column_width + 1); + if let Some((_, prompt)) = self.prompt.as_mut() { + let area = preview_area.clip_bottom(2); + let promp_area = + render_block(preview_area.clip_top(area.height), surface, Borders::TOP); + prompt.render(promp_area, surface, cx); + preview_area = area; + } + self.render_preview(preview_area, surface, cx.editor); + + let list_area = render_block(area.clip_right(preview_area.width), surface, Borders::RIGHT); + self.tree.render(list_area, surface, cx, &mut self.state); + } + + fn render_embed(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + let config = &cx.editor.config().explorer; + let side_area = area + .with_width(area.width.min(config.column_width as u16 + 2)) + .clip_bottom(1); + let background = cx.editor.theme.get("ui.background"); + surface.clear_with(side_area, background); + + let preview_area = area.clip_left(side_area.width).clip_bottom(2); + let prompt_area = area.clip_top(side_area.height); + + let list_area = + render_block(side_area.clip_left(1), surface, Borders::RIGHT).clip_bottom(1); + self.tree.render(list_area, surface, cx, &mut self.state); + + { + let statusline = if self.is_focus() { + cx.editor.theme.get("ui.statusline") + } else { + cx.editor.theme.get("ui.statusline.inactive") + }; + let area = side_area.clip_top(list_area.height).clip_right(1); + surface.clear_with(area, statusline); + // surface.set_string_truncated( + // area.x, + // area.y, + // &self.path_state.root.to_string_lossy(), + // area.width as usize, + // |_| statusline, + // true, + // true, + // ); + } + + if self.is_focus() { + if preview_area.width < 30 || preview_area.height < 3 { + return; + } + let width = preview_area.width.min(90); + let mut y = self.tree.row().saturating_sub(1) as u16; + let height = (preview_area.height).min(25); + if (height + y) > preview_area.height { + y = preview_area.height - height; + } + let area = Rect::new(preview_area.x, y, width, height); + surface.clear_with(area, background); + let area = render_block(area, surface, Borders::all()); + self.render_preview(area, surface, cx.editor); + } + + if let Some((_, prompt)) = self.prompt.as_mut() { + prompt.render_prompt(prompt_area, surface, cx) + } + } + + fn handle_filter_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + let (action, mut prompt) = self.prompt.take().unwrap(); + match event.into() { + key!(Tab) | key!(Down) | ctrl!('j') => { + self.tree.clean_recycle(); + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Enter) => { + self.tree.clean_recycle(); + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Esc) | ctrl!('c') => self.tree.restore_recycle(), + _ => { + if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + self.tree.filter(prompt.line(), cx, &mut self.state); + } + self.prompt = Some((action, prompt)); + } + }; + EventResult::Consumed(None) + } + + fn handle_search_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + let (action, mut prompt) = self.prompt.take().unwrap(); + let search_next = match action { + PromptAction::Search(search_next) => search_next, + _ => return EventResult::Ignored(None), + }; + match event.into() { + key!(Tab) | key!(Down) | ctrl!('j') => { + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state) + } + key!(Enter) => { + let search_str = prompt.line().clone(); + if !search_str.is_empty() { + self.repeat_motion = Some(Box::new(move |explorer, action, cx| { + if let PromptAction::Search(is_next) = action { + explorer.tree.save_view(); + if is_next == search_next { + explorer + .tree + .search_next(cx, &search_str, &mut explorer.state); + } else { + explorer + .tree + .search_pre(cx, &search_str, &mut explorer.state); + } + } + })) + } else { + self.repeat_motion = None; + } + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Esc) | ctrl!('c') => self.tree.restore_view(), + _ => { + if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + if search_next { + self.tree.search_next(cx, prompt.line(), &mut self.state); + } else { + self.tree.search_pre(cx, prompt.line(), &mut self.state); + } + } + self.prompt = Some((action, prompt)); + } + }; + EventResult::Consumed(None) + } + + fn handle_prompt_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + match &self.prompt { + Some((PromptAction::Search(_), _)) => return self.handle_search_event(event, cx), + Some((PromptAction::Filter, _)) => return self.handle_filter_event(event, cx), + _ => {} + }; + let (action, mut prompt) = match self.prompt.take() { + Some((action, p)) => (action, p), + _ => return EventResult::Ignored(None), + }; + let line = prompt.line(); + match (action, event.into()) { + (PromptAction::Mkdir, key!(Enter)) => { + if let Err(e) = self.new_path(line, true) { + cx.editor.set_error(format!("{e}")) + } + } + (PromptAction::CreateFile, key!(Enter)) => { + if let Err(e) = self.new_path(line, false) { + cx.editor.set_error(format!("{e}")) + } + } + (PromptAction::RemoveDir, key!(Enter)) => { + let item = self.tree.current_item(); + if let Err(e) = std::fs::remove_dir_all(&item.path) { + cx.editor.set_error(format!("{e}")); + } else { + self.tree.fold_current_child(); + self.tree.remove_current(); + } + } + (PromptAction::RemoveFile, key!(Enter)) => { + if line == "YES" { + let item = self.tree.current_item(); + if let Err(e) = std::fs::remove_file(&item.path) { + cx.editor.set_error(format!("{e}")); + } else { + self.tree.remove_current(); + } + } + } + (_, key!(Esc) | ctrl!('c')) => {} + _ => { + prompt.handle_event(Event::Key(event), cx); + self.prompt = Some((action, prompt)); + } + } + EventResult::Consumed(None) + } + + fn new_path(&mut self, file_name: &str, is_dir: bool) -> Result<()> { + let current = self.tree.current_item(); + let current_parent = if current.file_type == FileType::Placeholder { + ¤t.path + } else { + current + .path + .parent() + .ok_or_else(|| anyhow::anyhow!("can not get parent dir"))? + }; + let p = helix_core::path::get_normalized_path(¤t_parent.join(file_name)); + match p.parent() { + Some(p) if p == current_parent => {} + _ => bail!("The file name is not illegal"), + }; + + let f = if is_dir { + std::fs::create_dir(&p)?; + FileInfo::new(p, FileType::Dir) + } else { + let mut fd = std::fs::OpenOptions::new(); + fd.create_new(true).write(true).open(&p)?; + FileInfo::new(p, FileType::File) + }; + if current.file_type == FileType::Placeholder { + self.tree.replace_current(f); + } else { + self.tree.insert_current_level(f); + } + Ok(()) + } +} + +impl Component for Explorer { + /// Process input events, return true if handled. + fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + let key_event = match event { + Event::Key(event) => event, + Event::Resize(..) => return EventResult::Consumed(None), + _ => return EventResult::Ignored(None), + }; + if !self.is_focus() { + return EventResult::Ignored(None); + } + if let Some(mut on_next_key) = self.on_next_key.take() { + return on_next_key(cx, self, key_event); + } + + if let EventResult::Consumed(c) = self.handle_prompt_event(key_event, cx) { + return EventResult::Consumed(c); + } + + let close_fn = EventResult::Consumed(Some(Box::new(|compositor: &mut Compositor, _| { + if let Some(editor) = compositor.find::() { + editor.explorer = None; + } + }))); + + match key_event.into() { + key!(Esc) => self.unfocus(), + ctrl!('c') => return close_fn, + key!('n') => { + if let Some(mut repeat_motion) = self.repeat_motion.take() { + repeat_motion(self, PromptAction::Search(true), cx); + self.repeat_motion = Some(repeat_motion); + } + } + shift!('N') => { + if let Some(mut repeat_motion) = self.repeat_motion.take() { + repeat_motion(self, PromptAction::Search(false), cx); + self.repeat_motion = Some(repeat_motion); + } + } + key!('b') => { + if let Some(p) = self.state.current_root.parent() { + match Self::get_items(p.to_path_buf(), cx) { + Ok(items) => { + self.state.current_root = p.to_path_buf(); + self.tree = Tree::build_tree(items).with_enter_fn(Self::toggle_current); + } + Err(e) => cx.editor.set_error(format!("{e}")), + } + } + } + key!('f') => self.new_filter_prompt(), + key!('/') => self.new_search_prompt(true), + key!('?') => self.new_search_prompt(false), + key!('m') => { + self.on_next_key = Some(Box::new(|_, explorer, event| { + match event.into() { + key!('d') => explorer.new_mkdir_prompt(), + key!('f') => explorer.new_create_file_prompt(), + _ => return EventResult::Ignored(None), + }; + EventResult::Consumed(None) + })); + } + key!('r') => { + self.on_next_key = Some(Box::new(|cx, explorer, event| { + match event.into() { + key!('d') => explorer.new_remove_dir_prompt(cx), + key!('f') => explorer.new_remove_file_prompt(cx), + _ => return EventResult::Ignored(None), + }; + EventResult::Consumed(None) + })); + } + _ => { + self.tree + .handle_event(Event::Key(key_event), cx, &mut self.state); + } + } + + EventResult::Consumed(None) + } + + fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + if area.width < 10 || area.height < 5 { + cx.editor.set_error("explorer render area is too small"); + return; + } + let config = &cx.editor.config().explorer; + if config.is_embed() { + self.render_embed(area, surface, cx); + } else { + self.render_float(area, surface, cx); + } + } + + fn cursor(&self, area: Rect, editor: &Editor) -> (Option, CursorKind) { + let prompt = match self.prompt.as_ref() { + Some((_, prompt)) => prompt, + None => return (None, CursorKind::Hidden), + }; + let config = &editor.config().explorer; + let (x, y) = if config.is_overlay() { + let colw = config.column_width as u16; + if area.width > colw { + (area.x + colw + 2, area.y + area.height - 2) + } else { + return (None, CursorKind::Hidden); + } + } else { + (area.x, area.y + area.height - 1) + }; + prompt.cursor(Rect::new(x, y, area.width, 1), editor) + } +} + +fn get_preview(p: impl AsRef, max_line: usize) -> Result> { + let p = p.as_ref(); + if p.is_dir() { + return Ok(p + .read_dir()? + .filter_map(|entry| entry.ok()) + .take(max_line) + .map(|entry| { + if entry.file_type().map(|ft| ft.is_dir()).unwrap_or(false) { + format!("{}/", entry.file_name().to_string_lossy()) + } else { + format!("{}", entry.file_name().to_string_lossy()) + } + }) + .collect()); + } + + ensure!(p.is_file(), "path: {} is not file or dir", p.display()); + use std::fs::OpenOptions; + use std::io::BufRead; + let mut fd = OpenOptions::new(); + fd.read(true); + let fd = fd.open(p)?; + Ok(std::io::BufReader::new(fd) + .lines() + .take(max_line) + .filter_map(|line| line.ok()) + .map(|line| line.replace('\t', " ")) + .collect()) +} + +fn render_block(area: Rect, surface: &mut Surface, borders: Borders) -> Rect { + let block = Block::default().borders(borders); + let inner = block.inner(area); + block.render(area, surface); + inner +} diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs index ca4cedb5..e8d59b7e 100644 --- a/helix-term/src/ui/mod.rs +++ b/helix-term/src/ui/mod.rs @@ -1,5 +1,6 @@ mod completion; pub(crate) mod editor; +mod explore; mod info; mod markdown; pub mod menu; @@ -9,9 +10,11 @@ mod popup; mod prompt; mod spinner; mod text; +mod tree; pub use completion::Completion; pub use editor::EditorView; +pub use explore::Explorer; pub use markdown::Markdown; pub use menu::Menu; pub use picker::{FileLocation, FilePicker, Picker}; @@ -19,6 +22,7 @@ pub use popup::Popup; pub use prompt::{Prompt, PromptEvent}; pub use spinner::{ProgressSpinners, Spinner}; pub use text::Text; +pub use tree::{Tree, TreeItem, TreeOp}; use helix_core::regex::Regex; use helix_core::regex::RegexBuilder; diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs new file mode 100644 index 00000000..4da57ad5 --- /dev/null +++ b/helix-term/src/ui/tree.rs @@ -0,0 +1,680 @@ +use std::cmp::Ordering; +use std::iter::Peekable; + +use anyhow::Result; + +use crate::{ + compositor::{Context, EventResult}, + ctrl, key, shift, +}; +use crossterm::event::{Event, KeyEvent}; +use helix_core::unicode::width::UnicodeWidthStr; +use helix_view::graphics::Rect; +use tui::{buffer::Buffer as Surface, text::Spans}; + +pub trait TreeItem: Sized { + type Params; + + fn text(&self, cx: &mut Context, selected: bool, params: &mut Self::Params) -> Spans; + fn is_child(&self, other: &Self) -> bool; + fn cmp(&self, other: &Self) -> Ordering; + + fn filter(&self, cx: &mut Context, s: &str, params: &mut Self::Params) -> bool { + self.text(cx, false, params) + .0 + .into_iter() + .map(|s| s.content) + .collect::>() + .concat() + .contains(s) + } + + fn get_childs(&self) -> Result> { + Ok(vec![]) + } +} + +fn tree_item_cmp(item1: &T, item2: &T) -> Ordering { + if item1.is_child(item2) { + return Ordering::Greater; + } + if item2.is_child(item1) { + return Ordering::Less; + } + + T::cmp(item1, item2) +} + +fn vec_to_tree(mut items: Vec, level: usize) -> Vec> { + fn get_childs(iter: &mut Peekable, elem: &mut Elem) + where + T: TreeItem, + Iter: Iterator, + { + let level = elem.level + 1; + loop { + if !iter.peek().map_or(false, |next| next.is_child(&elem.item)) { + break; + } + let mut child = Elem::new(iter.next().unwrap(), level); + if iter.peek().map_or(false, |nc| nc.is_child(&child.item)) { + get_childs(iter, &mut child); + } + elem.folded.push(child); + } + } + + items.sort_by(tree_item_cmp); + let mut elems = Vec::with_capacity(items.len()); + let mut iter = items.into_iter().peekable(); + while let Some(item) = iter.next() { + let mut elem = Elem::new(item, level); + if iter.peek().map_or(false, |next| next.is_child(&elem.item)) { + get_childs(&mut iter, &mut elem); + } + expand_elems(&mut elems, elem); + } + elems +} + +// return total elems's count contain self +fn get_elems_recursion(t: &mut Elem, depth: usize) -> Result { + let mut childs = t.item.get_childs()?; + childs.sort_by(tree_item_cmp); + let mut elems = Vec::with_capacity(childs.len()); + let level = t.level + 1; + let mut total = 1; + for child in childs { + let mut elem = Elem::new(child, level); + let count = if depth > 0 { + get_elems_recursion(&mut elem, depth - 1)? + } else { + 1 + }; + elems.push(elem); + total += count; + } + t.folded = elems; + Ok(total) +} + +fn expand_elems(dist: &mut Vec>, mut t: Elem) { + let childs = std::mem::take(&mut t.folded); + dist.push(t); + for child in childs { + expand_elems(dist, child) + } +} + +pub enum TreeOp { + Noop, + Restore, + InsertChild(Vec), + GetChildsAndInsert, + ReplaceTree(Vec), +} + +pub struct Elem { + item: T, + level: usize, + folded: Vec, +} + +impl Clone for Elem { + fn clone(&self) -> Self { + Self { + item: self.item.clone(), + level: self.level, + folded: self.folded.clone(), + } + } +} + +impl Elem { + pub fn new(item: T, level: usize) -> Self { + Self { + item, + level, + folded: vec![], + } + } + + pub fn item(&self) -> &T { + &self.item + } +} + +pub struct Tree { + items: Vec>, + recycle: Option<(String, Vec>)>, + selected: usize, + save_view: (usize, usize), // (selected, row) + row: usize, + col: usize, + max_len: usize, + count: usize, + tree_symbol_style: String, + #[allow(clippy::type_complexity)] + pre_render: Option>, + #[allow(clippy::type_complexity)] + on_opened_fn: + Option TreeOp + 'static>>, + #[allow(clippy::type_complexity)] + on_folded_fn: Option>, + #[allow(clippy::type_complexity)] + on_next_key: Option>, +} + +impl Tree { + pub fn new(items: Vec>) -> Self { + Self { + items, + recycle: None, + selected: 0, + save_view: (0, 0), + row: 0, + col: 0, + max_len: 0, + count: 0, + tree_symbol_style: "ui.text".into(), + pre_render: None, + on_opened_fn: None, + on_folded_fn: None, + on_next_key: None, + } + } + + pub fn replace_with_new_items(&mut self, items: Vec) { + let old = std::mem::replace(self, Self::new(vec_to_tree(items, 0))); + self.on_opened_fn = old.on_opened_fn; + self.on_folded_fn = old.on_folded_fn; + self.tree_symbol_style = old.tree_symbol_style; + } + + pub fn build_tree(items: Vec) -> Self { + Self::new(vec_to_tree(items, 0)) + } + + pub fn build_from_root(t: T, depth: usize) -> Result { + let mut elem = Elem::new(t, 0); + let count = get_elems_recursion(&mut elem, depth)?; + let mut elems = Vec::with_capacity(count); + expand_elems(&mut elems, elem); + Ok(Self::new(elems)) + } + + pub fn with_enter_fn(mut self, f: F) -> Self + where + F: FnMut(&mut T, &mut Context, &mut T::Params) -> TreeOp + 'static, + { + self.on_opened_fn = Some(Box::new(f)); + self + } + + pub fn with_folded_fn(mut self, f: F) -> Self + where + F: FnMut(&mut T, &mut Context, &mut T::Params) + 'static, + { + self.on_folded_fn = Some(Box::new(f)); + self + } + + pub fn tree_symbol_style(mut self, style: String) -> Self { + self.tree_symbol_style = style; + self + } + + fn next_item(&self) -> Option<&Elem> { + self.items.get(self.selected + 1) + } + + fn next_not_descendant_pos(&self, index: usize) -> usize { + let item = &self.items[index]; + self.find(index + 1, false, |n| n.level <= item.level) + .unwrap_or(self.items.len()) + } + + fn find_parent(&self, index: usize) -> Option { + let item = &self.items[index]; + self.find(index, true, |p| p.level < item.level) + } + + // rev start: start - 1 + fn find(&self, start: usize, rev: bool, f: F) -> Option + where + F: FnMut(&Elem) -> bool, + { + let iter = self.items.iter(); + if rev { + iter.take(start).rposition(f) + } else { + iter.skip(start).position(f).map(|p| p + start) + } + } +} + +impl Tree { + pub fn on_enter(&mut self, cx: &mut Context, params: &mut T::Params) { + if self.items.is_empty() { + return; + } + if let Some(next_level) = self.next_item().map(|elem| elem.level) { + let current = &mut self.items[self.selected]; + let current_level = current.level; + if next_level > current_level { + if let Some(mut on_folded_fn) = self.on_folded_fn.take() { + on_folded_fn(&mut current.item, cx, params); + self.on_folded_fn = Some(on_folded_fn); + } + self.fold_current_child(); + return; + } + } + + if let Some(mut on_open_fn) = self.on_opened_fn.take() { + let mut f = || { + let current = &mut self.items[self.selected]; + let items = match on_open_fn(&mut current.item, cx, params) { + TreeOp::Restore => { + let inserts = std::mem::take(&mut current.folded); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + return; + } + TreeOp::InsertChild(items) => items, + TreeOp::GetChildsAndInsert => match current.item.get_childs() { + Ok(items) => items, + Err(e) => return cx.editor.set_error(format!("{e}")), + }, + TreeOp::ReplaceTree(items) => return self.replace_with_new_items(items), + TreeOp::Noop => return, + }; + current.folded = vec![]; + let inserts = vec_to_tree(items, current.level + 1); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + }; + f(); + self.on_opened_fn = Some(on_open_fn) + } else { + let current = &mut self.items[self.selected]; + let inserts = std::mem::take(&mut current.folded); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + } + } + + pub fn fold_current_level(&mut self) { + let start = match self.find_parent(self.selected) { + Some(start) => start, + None => return, + }; + self.selected = start; + self.fold_current_child(); + } + + pub fn fold_current_child(&mut self) { + if self.selected + 1 >= self.items.len() { + return; + } + let pos = self.next_not_descendant_pos(self.selected); + if self.selected < pos { + self.items[self.selected].folded = self.items.drain(self.selected + 1..pos).collect(); + } + } + + pub fn search_next(&mut self, cx: &mut Context, s: &str, params: &mut T::Params) { + let skip = self.save_view.0 + 1; + self.selected = self + .find(skip, false, |e| e.item.filter(cx, s, params)) + .unwrap_or(self.save_view.0); + + self.row = (self.save_view.1 + self.selected).saturating_sub(self.save_view.0); + } + + pub fn search_pre(&mut self, cx: &mut Context, s: &str, params: &mut T::Params) { + let take = self.save_view.0; + self.selected = self + .find(take, true, |e| e.item.filter(cx, s, params)) + .unwrap_or(self.save_view.0); + + self.row = (self.save_view.1 + self.selected).saturating_sub(self.save_view.0); + } + + pub fn move_down(&mut self, rows: usize) { + let len = self.items.len(); + if len > 0 { + self.selected = std::cmp::min(self.selected + rows, len.saturating_sub(1)); + self.row = std::cmp::min(self.selected, self.row + rows); + } + } + + pub fn move_up(&mut self, rows: usize) { + let len = self.items.len(); + if len > 0 { + self.selected = self.selected.saturating_sub(rows); + self.row = std::cmp::min(self.selected, self.row.saturating_sub(rows)); + } + } + + pub fn move_left(&mut self, cols: usize) { + self.col = self.col.saturating_sub(cols); + } + + pub fn move_right(&mut self, cols: usize) { + self.pre_render = Some(Box::new(move |tree: &mut Self, area: Rect| { + let max_scroll = tree.max_len.saturating_sub(area.width as usize); + tree.col = max_scroll.min(tree.col + cols); + })); + } + + pub fn move_down_half_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_down((area.height / 2) as usize); + })); + } + + pub fn move_up_half_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_up((area.height / 2) as usize); + })); + } + + pub fn move_down_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_down((area.height) as usize); + })); + } + + pub fn move_up_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_up((area.height) as usize); + })); + } + + pub fn save_view(&mut self) { + self.save_view = (self.selected, self.row); + } + + pub fn restore_view(&mut self) { + (self.selected, self.row) = self.save_view; + } + + pub fn current(&self) -> &Elem { + &self.items[self.selected] + } + + pub fn current_item(&self) -> &T { + &self.items[self.selected].item + } + + pub fn row(&self) -> usize { + self.row + } + + pub fn remove_current(&mut self) -> T { + let elem = self.items.remove(self.selected); + self.selected = self.selected.saturating_sub(1); + elem.item + } + + pub fn replace_current(&mut self, item: T) { + self.items[self.selected].item = item; + } + + pub fn insert_current_level(&mut self, item: T) { + let current = self.current(); + let level = current.level; + let pos = match current.item.cmp(&item) { + Ordering::Less => self + .find(self.selected + 1, false, |e| { + e.level < level || (e.level == level && e.item.cmp(&item) != Ordering::Less) + }) + .unwrap_or(self.items.len()), + + Ordering::Greater => { + match self.find(self.selected, true, |elem| { + elem.level < level + || (elem.level == level && elem.item.cmp(&item) != Ordering::Greater) + }) { + Some(p) if self.items[p].level == level => self.next_not_descendant_pos(p), + Some(p) => p + 1, + None => 0, + } + } + Ordering::Equal => self.selected + 1, + }; + self.items.insert(pos, Elem::new(item, level)); + } +} + +impl Tree { + pub fn render( + &mut self, + area: Rect, + surface: &mut Surface, + cx: &mut Context, + params: &mut T::Params, + ) { + if let Some(pre_render) = self.pre_render.take() { + pre_render(self, area); + } + + self.max_len = 0; + self.row = std::cmp::min(self.row, area.height.saturating_sub(1) as usize); + let style = cx.editor.theme.get(&self.tree_symbol_style); + let last_item_index = self.items.len().saturating_sub(1); + let skip = self.selected.saturating_sub(self.row); + let iter = self + .items + .iter() + .skip(skip) + .take(area.height as usize) + .enumerate(); + for (index, elem) in iter { + let row = index as u16; + let mut area = Rect::new(area.x, area.y + row, area.width, 1); + let indent = if elem.level > 0 { + if index + skip != last_item_index { + format!("{}├─", "│ ".repeat(elem.level - 1)) + } else { + format!("└─{}", "┴─".repeat(elem.level - 1)) + } + } else { + "".to_string() + }; + + let indent_len = indent.chars().count(); + if indent_len > self.col { + let indent: String = indent.chars().skip(self.col).collect(); + if !indent.is_empty() { + surface.set_stringn(area.x, area.y, &indent, area.width as usize, style); + area = area.clip_left(indent.width() as u16); + } + }; + let mut start_index = self.col.saturating_sub(indent_len); + let mut text = elem.item.text(cx, skip + index == self.selected, params); + self.max_len = self.max_len.max(text.width() + indent.len()); + for span in text.0.iter_mut() { + if area.width == 0 { + return; + } + if start_index == 0 { + surface.set_span(area.x, area.y, span, area.width); + area = area.clip_left(span.width() as u16); + } else { + let span_width = span.width(); + if start_index > span_width { + start_index -= span_width; + } else { + let content: String = span + .content + .chars() + .filter(|c| { + if start_index > 0 { + start_index = start_index.saturating_sub(c.to_string().width()); + false + } else { + true + } + }) + .collect(); + surface.set_string_truncated( + area.x, + area.y, + &content, + area.width as usize, + |_| span.style, + false, + false, + ); + start_index = 0 + } + } + } + } + } + + pub fn handle_event( + &mut self, + event: Event, + cx: &mut Context, + params: &mut T::Params, + ) -> EventResult { + let key_event = match event { + Event::Key(event) => event, + Event::Resize(..) => return EventResult::Consumed(None), + _ => return EventResult::Ignored(None), + }; + if let Some(mut on_next_key) = self.on_next_key.take() { + on_next_key(cx, self, key_event); + return EventResult::Consumed(None); + } + let count = std::mem::replace(&mut self.count, 0); + match key_event.into() { + key!(i @ '0'..='9') => self.count = i.to_digit(10).unwrap() as usize + count * 10, + key!('k') | shift!(Tab) | key!(Up) | ctrl!('k') => self.move_up(1.max(count)), + key!('j') | key!(Tab) | key!(Down) | ctrl!('j') => self.move_down(1.max(count)), + key!('z') => self.fold_current_level(), + key!('h') => self.move_left(1.max(count)), + key!('l') => self.move_right(1.max(count)), + shift!('G') => self.move_down(usize::MAX / 2), + key!(Enter) => self.on_enter(cx, params), + ctrl!('d') => self.move_down_half_page(), + ctrl!('u') => self.move_up_half_page(), + shift!('D') => self.move_down_page(), + shift!('U') => self.move_up_page(), + key!('g') => { + self.on_next_key = Some(Box::new(|_, tree, event| match event.into() { + key!('g') => tree.move_up(usize::MAX / 2), + key!('e') => tree.move_down(usize::MAX / 2), + _ => {} + })); + } + _ => return EventResult::Ignored(None), + } + + EventResult::Consumed(None) + } +} + +impl Tree { + pub fn filter(&mut self, s: &str, cx: &mut Context, params: &mut T::Params) { + fn filter_recursion( + elems: &Vec>, + mut index: usize, + s: &str, + cx: &mut Context, + params: &mut T::Params, + ) -> (Vec>, usize) + where + T: TreeItem + Clone, + { + let mut retain = vec![]; + let elem = &elems[index]; + loop { + let child = match elems.get(index + 1) { + Some(child) if child.item.is_child(&elem.item) => child, + _ => break, + }; + index += 1; + let next = elems.get(index + 1); + if next.map_or(false, |n| n.item.is_child(&child.item)) { + let (sub_retain, current_index) = filter_recursion(elems, index, s, cx, params); + retain.extend(sub_retain); + index = current_index; + } else if child.item.filter(cx, s, params) { + retain.push(child.clone()); + } + } + if !retain.is_empty() || elem.item.filter(cx, s, params) { + retain.insert(0, elem.clone()); + } + (retain, index) + } + + if s.is_empty() { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + self.restore_view(); + return; + } + } + + let mut retain = vec![]; + let mut index = 0; + let items = match &self.recycle { + Some((pre, _)) if pre == s => return, + Some((pre, recycle)) if pre.contains(s) => recycle, + _ => &self.items, + }; + while let Some(elem) = items.get(index) { + let next = items.get(index + 1); + if next.map_or(false, |n| n.item.is_child(&elem.item)) { + let (sub_items, current_index) = filter_recursion(items, index, s, cx, params); + index = current_index; + retain.extend(sub_items); + } else if elem.item.filter(cx, s, params) { + retain.push(elem.clone()) + } + index += 1; + } + + if retain.is_empty() { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + self.restore_view(); + } + return; + } + + let recycle = std::mem::replace(&mut self.items, retain); + if let Some(r) = self.recycle.as_mut() { + r.0 = s.into() + } else { + self.recycle = Some((s.into(), recycle)); + self.save_view(); + } + + self.selected = self + .find(0, false, |elem| elem.item.filter(cx, s, params)) + .unwrap_or(0); + self.row = self.selected; + } + + pub fn clean_recycle(&mut self) { + self.recycle = None; + } + + pub fn restore_recycle(&mut self) { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + } + } +} diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index a2943af9..f3e031fb 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -109,6 +109,69 @@ impl Default for FilePickerConfig { } } +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ExplorerStyle { + Tree, + List, +} + +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ExplorerPosition { + Embed, + Overlay, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case", default, deny_unknown_fields)] +pub struct ExplorerConfig { + pub style: ExplorerStyle, + pub position: ExplorerPosition, + /// explorer column width + pub column_width: usize, +} + +impl ExplorerConfig { + pub fn is_embed(&self) -> bool { + match self.position { + ExplorerPosition::Embed => true, + ExplorerPosition::Overlay => false, + } + } + + pub fn is_overlay(&self) -> bool { + match self.position { + ExplorerPosition::Embed => false, + ExplorerPosition::Overlay => true, + } + } + + pub fn is_list(&self) -> bool { + match self.style { + ExplorerStyle::List => true, + ExplorerStyle::Tree => false, + } + } + + pub fn is_tree(&self) -> bool { + match self.style { + ExplorerStyle::List => false, + ExplorerStyle::Tree => true, + } + } +} + +impl Default for ExplorerConfig { + fn default() -> Self { + Self { + style: ExplorerStyle::Tree, + position: ExplorerPosition::Overlay, + column_width: 30, + } + } +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case", default, deny_unknown_fields)] pub struct Config { @@ -163,6 +226,8 @@ pub struct Config { pub indent_guides: IndentGuidesConfig, /// Whether to color modes with different colors. Defaults to `false`. pub color_modes: bool, + /// explore config + pub explorer: ExplorerConfig, } #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] @@ -417,6 +482,7 @@ impl Default for Config { whitespace: WhitespaceConfig::default(), indent_guides: IndentGuidesConfig::default(), color_modes: false, + explorer: ExplorerConfig::default(), } } } diff --git a/runtime/themes/autumn.toml b/runtime/themes/autumn.toml index 024ca650..eb96775c 100644 --- a/runtime/themes/autumn.toml +++ b/runtime/themes/autumn.toml @@ -68,6 +68,12 @@ "warning" = "my_yellow2" "error" = "my_red" +"ui.explorer.file" = { fg = "my_white" } +"ui.explorer.dir" = { fg = "my_yellow1" } +"ui.explorer.exe" = { fg = "my_green" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { modifiers = ["reversed"] } + [palette] my_black = "#212121" # Cursorline my_gray0 = "#262626" # Default Background diff --git a/runtime/themes/base16_default_dark.toml b/runtime/themes/base16_default_dark.toml index 33252330..9da85989 100644 --- a/runtime/themes/base16_default_dark.toml +++ b/runtime/themes/base16_default_dark.toml @@ -54,6 +54,12 @@ "warning" = "base09" "error" = "base08" +"ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "base0D" } +"ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base02" } + [palette] base00 = "#181818" # Default Background base01 = "#282828" # Lighter Background (Used for status bars, line number and folding marks) diff --git a/runtime/themes/base16_default_light.toml b/runtime/themes/base16_default_light.toml index bc2b8e67..0e5b7eee 100644 --- a/runtime/themes/base16_default_light.toml +++ b/runtime/themes/base16_default_light.toml @@ -54,6 +54,12 @@ "warning" = "base09" "error" = "base08" +"ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "base0D" } +"ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base02" } + [palette] base00 = "#f8f8f8" # Default Background base01 = "#e8e8e8" # Lighter Background (Used for status bars, line number and folding marks) diff --git a/runtime/themes/base16_terminal.toml b/runtime/themes/base16_terminal.toml index 3a1d4845..fd6d84fa 100644 --- a/runtime/themes/base16_terminal.toml +++ b/runtime/themes/base16_terminal.toml @@ -50,3 +50,9 @@ "debug" = "gray" "warning" = "yellow" "error" = "light-red" + +# "ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "light-blue" } +# "ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-gray" } diff --git a/runtime/themes/bogster.toml b/runtime/themes/bogster.toml index 76e24648..a57f6451 100644 --- a/runtime/themes/bogster.toml +++ b/runtime/themes/bogster.toml @@ -70,3 +70,9 @@ # make diagnostic underlined, to distinguish with selection text. diagnostic = { modifiers = ["underlined"] } + +"ui.explorer.file" = { fg = "#e5ded6" } +"ui.explorer.dir" = { fg = "#59dcd8" } +"ui.explorer.exe" = { fg = "#e5ded6" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#313f4e" } diff --git a/runtime/themes/boo_berry.toml b/runtime/themes/boo_berry.toml index a79b75c5..9a81fc84 100644 --- a/runtime/themes/boo_berry.toml +++ b/runtime/themes/boo_berry.toml @@ -56,6 +56,12 @@ "hint" = { fg = "lilac" } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "lilac" } +"ui.explorer.dir" = { fg = "mint" } +"ui.explorer.exe" = { fg = "lilac" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "berry_saturated" } + [palette] berry = "#3A2A4D" berry_saturated = "#2B1C3D" diff --git a/runtime/themes/dark_plus.toml b/runtime/themes/dark_plus.toml index 957ca61d..137f8e77 100644 --- a/runtime/themes/dark_plus.toml +++ b/runtime/themes/dark_plus.toml @@ -88,6 +88,12 @@ diagnostic = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "dark_blue2" } + [palette] white = "#ffffff" orange = "#ce9178" diff --git a/runtime/themes/dracula.toml b/runtime/themes/dracula.toml index 6cc037b8..a3533564 100644 --- a/runtime/themes/dracula.toml +++ b/runtime/themes/dracula.toml @@ -51,6 +51,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "secondary_highlight" } + [palette] background = "#282a36" background_dark = "#21222c" diff --git a/runtime/themes/dracula_at_night.toml b/runtime/themes/dracula_at_night.toml index 0a45f024..0be4497c 100644 --- a/runtime/themes/dracula_at_night.toml +++ b/runtime/themes/dracula_at_night.toml @@ -50,6 +50,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "comment" } + [palette] background = "#0e1419" background_dark = "#21222c" diff --git a/runtime/themes/everforest_dark.toml b/runtime/themes/everforest_dark.toml index ef74ea9e..892da1b2 100644 --- a/runtime/themes/everforest_dark.toml +++ b/runtime/themes/everforest_dark.toml @@ -78,6 +78,11 @@ "error" = "red" "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "grey1" } [palette] diff --git a/runtime/themes/everforest_light.toml b/runtime/themes/everforest_light.toml index 60557ba0..bf52688c 100644 --- a/runtime/themes/everforest_light.toml +++ b/runtime/themes/everforest_light.toml @@ -78,6 +78,11 @@ "error" = "red" "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "grey1" } [palette] diff --git a/runtime/themes/gruvbox.toml b/runtime/themes/gruvbox.toml index 48fb14fa..013feea5 100644 --- a/runtime/themes/gruvbox.toml +++ b/runtime/themes/gruvbox.toml @@ -64,6 +64,12 @@ "markup.link.text" = "red1" "markup.raw" = "red1" +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "blue0" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#282828" # main background bg1 = "#3c3836" diff --git a/runtime/themes/gruvbox_light.toml b/runtime/themes/gruvbox_light.toml index 02a32dec..4288089a 100644 --- a/runtime/themes/gruvbox_light.toml +++ b/runtime/themes/gruvbox_light.toml @@ -65,6 +65,12 @@ "markup.link.text" = "red1" "markup.raw" = "red1" +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "blue0" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#fbf1c7" # main background bg1 = "#ebdbb2" diff --git a/runtime/themes/ingrid.toml b/runtime/themes/ingrid.toml index 58713704..6487567b 100644 --- a/runtime/themes/ingrid.toml +++ b/runtime/themes/ingrid.toml @@ -64,3 +64,9 @@ "error" = "#D74E50" "info" = "#839A53" "hint" = "#A6B6CE" + +"ui.explorer.file" = { fg = "#7B91B3" } +"ui.explorer.dir" = { fg = "#89BEB7" } +"ui.explorer.exe" = { fg = "#7B91B3" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#F3EAE9" } diff --git a/runtime/themes/monokai.toml b/runtime/themes/monokai.toml index 5a890615..7488597c 100644 --- a/runtime/themes/monokai.toml +++ b/runtime/themes/monokai.toml @@ -85,6 +85,12 @@ diagnostic = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "fn_declaration" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#75715e" } + [palette] type = "#A6E22E" keyword = "#F92672" diff --git a/runtime/themes/monokai_pro.toml b/runtime/themes/monokai_pro.toml index 7c457d45..4ac2649f 100644 --- a/runtime/themes/monokai_pro.toml +++ b/runtime/themes/monokai_pro.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff6188" diff --git a/runtime/themes/monokai_pro_machine.toml b/runtime/themes/monokai_pro_machine.toml index bfc7031d..bfa7bbdf 100644 --- a/runtime/themes/monokai_pro_machine.toml +++ b/runtime/themes/monokai_pro_machine.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff6d7e" diff --git a/runtime/themes/monokai_pro_octagon.toml b/runtime/themes/monokai_pro_octagon.toml index 889e7624..bf291e1e 100644 --- a/runtime/themes/monokai_pro_octagon.toml +++ b/runtime/themes/monokai_pro_octagon.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff657a" diff --git a/runtime/themes/monokai_pro_ristretto.toml b/runtime/themes/monokai_pro_ristretto.toml index f8ad8422..1d4c3962 100644 --- a/runtime/themes/monokai_pro_ristretto.toml +++ b/runtime/themes/monokai_pro_ristretto.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#fd6883" diff --git a/runtime/themes/monokai_pro_spectrum.toml b/runtime/themes/monokai_pro_spectrum.toml index 9f5864fc..ae8a87c6 100644 --- a/runtime/themes/monokai_pro_spectrum.toml +++ b/runtime/themes/monokai_pro_spectrum.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#fc618d" diff --git a/runtime/themes/night_owl.toml b/runtime/themes/night_owl.toml index 825bd412..857919d0 100644 --- a/runtime/themes/night_owl.toml +++ b/runtime/themes/night_owl.toml @@ -88,6 +88,12 @@ 'diff.delta' = { fg = 'blue' } 'diff.delta.moved' = { fg = 'blue', modifiers = ['italic'] } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "selection" } + [palette] background = '#011627' background2 = '#112630' diff --git a/runtime/themes/nord.toml b/runtime/themes/nord.toml index 11195ece..51074128 100644 --- a/runtime/themes/nord.toml +++ b/runtime/themes/nord.toml @@ -102,6 +102,12 @@ "diff.delta" = "nord12" "diff.minus" = "nord11" +"ui.explorer.file" = { fg = "nord6" } +"ui.explorer.dir" = { fg = "nord8" } +"ui.explorer.exe" = { fg = "nord6" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "nord2" } + [palette] nord0 = "#2e3440" nord1 = "#3b4252" diff --git a/runtime/themes/onedark.toml b/runtime/themes/onedark.toml index b4cc6f8b..ac1a7341 100644 --- a/runtime/themes/onedark.toml +++ b/runtime/themes/onedark.toml @@ -76,6 +76,12 @@ diagnostic = { modifiers = ["underlined"] } "ui.menu.selected" = { fg = "black", bg = "blue" } "ui.menu.scroll" = { fg = "white", bg = "light-gray" } +"ui.explorer.file" = { fg = "white" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "white" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-gray" } + [palette] yellow = "#E5C07B" diff --git a/runtime/themes/onelight.toml b/runtime/themes/onelight.toml index 82121108..d2bb6cdc 100644 --- a/runtime/themes/onelight.toml +++ b/runtime/themes/onelight.toml @@ -102,6 +102,12 @@ "ui.menu" = { fg = "black", bg = "grey-200" } "ui.menu.selected" = { fg = "white", bg = "light-blue" } +"ui.explorer.file" = { fg = "black" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "black" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-white" } + [palette] white = "#FAFAFA" yellow = "#A06600" diff --git a/runtime/themes/pop-dark.toml b/runtime/themes/pop-dark.toml index 172e8391..475e9e74 100644 --- a/runtime/themes/pop-dark.toml +++ b/runtime/themes/pop-dark.toml @@ -121,6 +121,12 @@ namespace = { fg = 'orangeL' } 'diff.delta' = { fg = '#4d4ddd' } 'diff.delta.moved' = { fg = '#dd4ddd' } +"ui.explorer.file" = { fg = "greyT" } +"ui.explorer.dir" = { fg = "blueL" } +"ui.explorer.exe" = { fg = "greyT" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "greyL" } + [palette] white = '#FFFFFF' greyH = '#CFCFCF' diff --git a/runtime/themes/rose_pine.toml b/runtime/themes/rose_pine.toml index fd53abd5..3f64a996 100644 --- a/runtime/themes/rose_pine.toml +++ b/runtime/themes/rose_pine.toml @@ -66,6 +66,12 @@ "markup.quote" = { fg = "rose" } "markup.raw" = { fg = "foam" } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "rose" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "highlight" } + [palette] base = "#191724" surface = "#1f1d2e" diff --git a/runtime/themes/rose_pine_dawn.toml b/runtime/themes/rose_pine_dawn.toml index 9ba0959d..c497a724 100644 --- a/runtime/themes/rose_pine_dawn.toml +++ b/runtime/themes/rose_pine_dawn.toml @@ -63,6 +63,12 @@ "markup.quote" = { fg = "rose" } "markup.raw" = { fg = "foam" } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "rose" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "highlight" } + [palette] base = "#faf4ed" surface = "#fffaf3" diff --git a/runtime/themes/serika-dark.toml b/runtime/themes/serika-dark.toml index 3b4bc60f..678d7fb3 100644 --- a/runtime/themes/serika-dark.toml +++ b/runtime/themes/serika-dark.toml @@ -71,6 +71,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#323437" diff --git a/runtime/themes/serika-light.toml b/runtime/themes/serika-light.toml index 3b0f8fb4..7e62ae13 100644 --- a/runtime/themes/serika-light.toml +++ b/runtime/themes/serika-light.toml @@ -71,6 +71,11 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } [palette] diff --git a/runtime/themes/solarized_dark.toml b/runtime/themes/solarized_dark.toml index aa6dbbf8..1bc5f82e 100644 --- a/runtime/themes/solarized_dark.toml +++ b/runtime/themes/solarized_dark.toml @@ -101,6 +101,12 @@ "hint" = { fg = "base01", modifiers= ["bold", "underlined"] } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "base1" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base0175" } + [palette] # 深色 越来越深 base03 = "#002b36" diff --git a/runtime/themes/solarized_light.toml b/runtime/themes/solarized_light.toml index 79fd8364..d22d6381 100644 --- a/runtime/themes/solarized_light.toml +++ b/runtime/themes/solarized_light.toml @@ -118,6 +118,12 @@ "hint" = { fg = "base01", modifiers= ["bold", "underlined"] } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "base1" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base0175" } + [palette] red = '#dc322f' green = '#859900' diff --git a/runtime/themes/spacebones_light.toml b/runtime/themes/spacebones_light.toml index b088e2d3..d16da51b 100644 --- a/runtime/themes/spacebones_light.toml +++ b/runtime/themes/spacebones_light.toml @@ -68,6 +68,12 @@ "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "#715ab1" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#fbf8ef" bg1 = "#efeae9" diff --git a/runtime/themes/tokyonight.toml b/runtime/themes/tokyonight.toml index 4f1ea1cf..b6c16458 100644 --- a/runtime/themes/tokyonight.toml +++ b/runtime/themes/tokyonight.toml @@ -63,6 +63,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "cyan" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "background_highlight" } + [palette] red = "#f7768e" orange = "#ff9e64" diff --git a/runtime/themes/tokyonight_storm.toml b/runtime/themes/tokyonight_storm.toml index c47ac54b..9da56546 100644 --- a/runtime/themes/tokyonight_storm.toml +++ b/runtime/themes/tokyonight_storm.toml @@ -63,6 +63,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "cyan" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "background_highlight" } + [palette] red = "#f7768e" orange = "#ff9e64" -- 2.38.5 From 0f4cfa0fe7747c9ede5bacc5fe60e9d642125448 Mon Sep 17 00:00:00 2001 From: cossonleo Date: Mon, 30 May 2022 14:41:50 +0800 Subject: [PATCH 05/54] optimize tree explore render --- helix-term/src/ui/editor.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 9caf5052..434b24bc 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -1385,6 +1385,12 @@ impl Component for EditorView { } cx.editor.resize(editor_area); // -1 from bottom for commandline + if let Some(explore) = self.explorer.as_mut() { + if !explore.content.is_focus() && config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } + } + for (view, is_focused) in cx.editor.tree.views() { let doc = cx.editor.document(view.doc).unwrap(); self.render_view(cx.editor, doc, view, area, surface, is_focused); @@ -1461,10 +1467,12 @@ impl Component for EditorView { } if let Some(explore) = self.explorer.as_mut() { - if config.explorer.is_embed() { - explore.content.render(area, surface, cx); - } else if explore.content.is_focus() { - explore.render(area, surface, cx); + if explore.content.is_focus() { + if config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } else { + explore.render(area, surface, cx); + } } } } -- 2.38.5 From e1bf96f25fcc149b049facae4d30057f7dcffa6e Mon Sep 17 00:00:00 2001 From: Igor Cohanovschi Date: Sun, 10 Jul 2022 22:24:39 +0200 Subject: [PATCH 06/54] fixed compilation issue --- helix-term/src/ui/explore.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs index 544a1667..4d255ece 100644 --- a/helix-term/src/ui/explore.rs +++ b/helix-term/src/ui/explore.rs @@ -453,7 +453,7 @@ impl Explorer { } }; if meta.is_file() { - if let Err(e) = cx.editor.open(item.path.clone(), Action::Replace) { + if let Err(e) = cx.editor.open(&item.path.clone(), Action::Replace) { cx.editor.set_error(format!("{e}")); } state.focus = false; -- 2.38.5 From 9bd9e4cc427be33c5ea33c1b86318cd21e8a80c6 Mon Sep 17 00:00:00 2001 From: Igor Cohanovschi Date: Sun, 17 Jul 2022 13:17:52 +0200 Subject: [PATCH 07/54] Added icons and light styling to tree_explorer --- helix-term/src/ui/explore.rs | 131 ++++++++++++++++++++++++++++++----- helix-term/src/ui/tree.rs | 32 +++++++-- 2 files changed, 140 insertions(+), 23 deletions(-) diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs index 4d255ece..d0739ca0 100644 --- a/helix-term/src/ui/explore.rs +++ b/helix-term/src/ui/explore.rs @@ -26,6 +26,27 @@ macro_rules! get_theme { }; } +const ICONS: &'static [&'static str] = + &["", "", "", "", "", "ﰟ", "", "", "", "ﯤ", "", "ﬥ"]; + +const ICONS_EXT: &'static [&'static str] = &[ + ".rs", ".md", ".js", ".c", ".png", ".svg", ".css", ".html", ".lua", ".ts", ".py", ".json", +]; + +const ICONS_COLORS: &'static [helix_view::theme::Color] = &[ + helix_view::theme::Color::Rgb(227, 134, 84), + helix_view::theme::Color::LightCyan, + helix_view::theme::Color::Yellow, + helix_view::theme::Color::Blue, + helix_view::theme::Color::Yellow, + helix_view::theme::Color::Yellow, + helix_view::theme::Color::Green, + helix_view::theme::Color::Blue, + helix_view::theme::Color::Red, + helix_view::theme::Color::Blue, + helix_view::theme::Color::Red, +]; + #[derive(Debug, Clone, Copy, PartialEq)] enum FileType { File, @@ -39,18 +60,24 @@ enum FileType { #[derive(Debug, Clone)] struct FileInfo { file_type: FileType, + expanded: bool, path: PathBuf, } impl FileInfo { fn new(path: PathBuf, file_type: FileType) -> Self { - Self { path, file_type } + Self { + path, + file_type, + expanded: false, + } } fn root(path: PathBuf) -> Self { Self { file_type: FileType::Root, path, + expanded: true, } } @@ -59,6 +86,7 @@ impl FileInfo { Self { file_type: FileType::Parent, path: p.to_path_buf(), + expanded: false, } } @@ -159,6 +187,7 @@ impl TreeItem for FileInfo { Self { file_type, path: self.path.join(entry.file_name()), + expanded: false, } }) }) @@ -167,6 +196,7 @@ impl TreeItem for FileInfo { ret.push(Self { path: self.path.clone(), file_type: FileType::Placeholder, + expanded: false, }) } Ok(ret) @@ -179,6 +209,33 @@ impl TreeItem for FileInfo { self.get_text().contains(s) } } + + fn icon(&self) -> Option<(&'static str, &'static helix_view::theme::Color)> { + return match self.file_type { + FileType::Dir => { + if self.expanded { + //Some(("", &helix_view::theme::Color::Yellow)) + Some(("", &helix_view::theme::Color::Yellow)) + } else { + // Some(("", &helix_view::theme::Color::Yellow)) + Some(("", &helix_view::theme::Color::Yellow)) + } + } + FileType::File => { + for (i, ext) in ICONS_EXT.iter().enumerate() { + if self.get_text().ends_with(ext) { + let color = ICONS_COLORS + .iter() + .nth(i) + .unwrap_or(&helix_view::theme::Color::Blue); + return ICONS.iter().nth(i).map(|c| (*c, color)); + } + } + return Some(("", &helix_view::theme::Color::LightBlue)); + } + _ => None, + }; + } } // #[derive(Default, Debug, Clone)] @@ -254,7 +311,9 @@ impl Explorer { let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); let items = Self::get_items(current_root.clone(), cx)?; Ok(Self { - tree: Tree::build_tree(items).with_enter_fn(Self::toggle_current), + tree: Tree::build_tree(items) + .with_enter_fn(Self::toggle_current) + .with_folded_fn(Self::fold_current), state: State::new(true, current_root), repeat_motion: None, prompt: None, @@ -266,8 +325,9 @@ impl Explorer { let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); let parent = FileInfo::parent(¤t_root); let root = FileInfo::root(current_root.clone()); - let mut tree = - Tree::build_from_root(root, usize::MAX / 2)?.with_enter_fn(Self::toggle_current); + let mut tree = Tree::build_from_root(root, usize::MAX / 2)? + .with_enter_fn(Self::toggle_current) + .with_folded_fn(Self::fold_current); tree.insert_current_level(parent); Ok(Self { tree, @@ -319,7 +379,12 @@ impl Explorer { if item.file_type == FileType::Placeholder { return; } - let head_area = render_block(area.clip_bottom(area.height - 2), surface, Borders::BOTTOM); + let head_area = render_block( + area.clip_bottom(area.height - 2), + surface, + Borders::BOTTOM, + None, + ); let path_str = format!("{}", item.path.display()); surface.set_stringn( head_area.x, @@ -434,6 +499,12 @@ impl Explorer { )); } + fn fold_current(item: &mut FileInfo, cx: &mut Context, state: &mut State) { + if item.path.is_dir() { + item.expanded = false; + } + } + fn toggle_current( item: &mut FileInfo, cx: &mut Context, @@ -461,6 +532,7 @@ impl Explorer { } if item.path.is_dir() { + item.expanded = true; if cx.editor.config().explorer.is_list() || item.file_type == FileType::Parent { match Self::get_items(item.path.clone(), cx) { Ok(items) => { @@ -481,19 +553,28 @@ impl Explorer { let background = cx.editor.theme.get("ui.background"); let column_width = cx.editor.config().explorer.column_width as u16; surface.clear_with(area, background); - let area = render_block(area, surface, Borders::ALL); + let area = render_block(area, surface, Borders::ALL, None); let mut preview_area = area.clip_left(column_width + 1); if let Some((_, prompt)) = self.prompt.as_mut() { let area = preview_area.clip_bottom(2); - let promp_area = - render_block(preview_area.clip_top(area.height), surface, Borders::TOP); + let promp_area = render_block( + preview_area.clip_top(area.height), + surface, + Borders::TOP, + None, + ); prompt.render(promp_area, surface, cx); preview_area = area; } self.render_preview(preview_area, surface, cx.editor); - let list_area = render_block(area.clip_right(preview_area.width), surface, Borders::RIGHT); + let list_area = render_block( + area.clip_right(preview_area.width), + surface, + Borders::RIGHT, + None, + ); self.tree.render(list_area, surface, cx, &mut self.state); } @@ -502,14 +583,21 @@ impl Explorer { let side_area = area .with_width(area.width.min(config.column_width as u16 + 2)) .clip_bottom(1); - let background = cx.editor.theme.get("ui.background"); + + let background = cx.editor.theme.get("ui.statusline"); surface.clear_with(side_area, background); let preview_area = area.clip_left(side_area.width).clip_bottom(2); let prompt_area = area.clip_top(side_area.height); - let list_area = - render_block(side_area.clip_left(1), surface, Borders::RIGHT).clip_bottom(1); + let border_style = cx.editor.theme.get("ui.explore.border"); + let list_area = render_block( + side_area.clip_left(1), + surface, + Borders::RIGHT, + Some(border_style), + ) + .clip_bottom(1); self.tree.render(list_area, surface, cx, &mut self.state); { @@ -543,7 +631,7 @@ impl Explorer { } let area = Rect::new(preview_area.x, y, width, height); surface.clear_with(area, background); - let area = render_block(area, surface, Borders::all()); + let area = render_block(area, surface, Borders::all(), None); self.render_preview(area, surface, cx.editor); } @@ -757,7 +845,9 @@ impl Component for Explorer { match Self::get_items(p.to_path_buf(), cx) { Ok(items) => { self.state.current_root = p.to_path_buf(); - self.tree = Tree::build_tree(items).with_enter_fn(Self::toggle_current); + self.tree = Tree::build_tree(items) + .with_enter_fn(Self::toggle_current) + .with_folded_fn(Self::fold_current); } Err(e) => cx.editor.set_error(format!("{e}")), } @@ -859,8 +949,17 @@ fn get_preview(p: impl AsRef, max_line: usize) -> Result> { .collect()) } -fn render_block(area: Rect, surface: &mut Surface, borders: Borders) -> Rect { - let block = Block::default().borders(borders); +fn render_block( + area: Rect, + surface: &mut Surface, + borders: Borders, + border_style: Option, +) -> Rect { + let mut block = Block::default().borders(borders); + if let Some(style) = border_style { + block = block.border_style(style); + } + //let block = Block::default(); let inner = block.inner(area); block.render(area, surface); inner diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs index 4da57ad5..6945bb38 100644 --- a/helix-term/src/ui/tree.rs +++ b/helix-term/src/ui/tree.rs @@ -18,6 +18,7 @@ pub trait TreeItem: Sized { fn text(&self, cx: &mut Context, selected: bool, params: &mut Self::Params) -> Spans; fn is_child(&self, other: &Self) -> bool; fn cmp(&self, other: &Self) -> Ordering; + fn icon(&self) -> Option<(&'static str, &'static helix_view::theme::Color)>; fn filter(&self, cx: &mut Context, s: &str, params: &mut Self::Params) -> bool { self.text(cx, false, params) @@ -117,12 +118,14 @@ pub enum TreeOp { pub struct Elem { item: T, level: usize, + expanded: bool, folded: Vec, } impl Clone for Elem { fn clone(&self) -> Self { Self { + expanded: false, item: self.item.clone(), level: self.level, folded: self.folded.clone(), @@ -135,6 +138,7 @@ impl Elem { Self { item, level, + expanded: false, folded: vec![], } } @@ -176,7 +180,7 @@ impl Tree { col: 0, max_len: 0, count: 0, - tree_symbol_style: "ui.text".into(), + tree_symbol_style: "ui.explore.guide".into(), pre_render: None, on_opened_fn: None, on_folded_fn: None, @@ -264,6 +268,7 @@ impl Tree { if next_level > current_level { if let Some(mut on_folded_fn) = self.on_folded_fn.take() { on_folded_fn(&mut current.item, cx, params); + self.on_folded_fn = Some(on_folded_fn); } self.fold_current_child(); @@ -469,6 +474,8 @@ impl Tree { self.max_len = 0; self.row = std::cmp::min(self.row, area.height.saturating_sub(1) as usize); let style = cx.editor.theme.get(&self.tree_symbol_style); + let line_style = cx.editor.theme.get("ui.virtual.ruler"); + let folder_style = cx.editor.theme.get("special"); let last_item_index = self.items.len().saturating_sub(1); let skip = self.selected.saturating_sub(self.row); let iter = self @@ -477,14 +484,17 @@ impl Tree { .skip(skip) .take(area.height as usize) .enumerate(); + for (index, elem) in iter { let row = index as u16; let mut area = Rect::new(area.x, area.y + row, area.width, 1); let indent = if elem.level > 0 { if index + skip != last_item_index { - format!("{}├─", "│ ".repeat(elem.level - 1)) + //format!("{}├─", "│ ".repeat(elem.level - 1)) + format!("{}", "│ ".repeat(elem.level - 1)) } else { - format!("└─{}", "┴─".repeat(elem.level - 1)) + //format!("└─{}", "┴─".repeat(elem.level - 1)) + format!("{}", "".repeat(elem.level - 1)) } } else { "".to_string() @@ -500,14 +510,19 @@ impl Tree { }; let mut start_index = self.col.saturating_sub(indent_len); let mut text = elem.item.text(cx, skip + index == self.selected, params); - self.max_len = self.max_len.max(text.width() + indent.len()); + self.max_len = self.max_len.max(text.width() + indent.len() - 2); for span in text.0.iter_mut() { if area.width == 0 { return; } if start_index == 0 { - surface.set_span(area.x, area.y, span, area.width); - area = area.clip_left(span.width() as u16); + //let expanded = elem.folded.len() > 0; + if let Some((icon, color)) = elem.item.icon() { + let style = folder_style.fg(*color); + surface.set_string(area.x, area.y, icon, style); + } + surface.set_span(area.x + 2, area.y, span, area.width - 2); + area = area.clip_left((span.width() - 2) as u16); } else { let span_width = span.width(); if start_index > span_width { @@ -525,10 +540,13 @@ impl Tree { } }) .collect(); + let mut cont = String::new(); + cont.push_str(""); + cont.push_str(&content); surface.set_string_truncated( area.x, area.y, - &content, + &cont, area.width as usize, |_| span.style, false, -- 2.38.5 From 9c15d4faded949a409edbd1fb3d4b6c4ebf30792 Mon Sep 17 00:00:00 2001 From: Igor Cohanovschi Date: Sun, 17 Jul 2022 18:06:05 +0200 Subject: [PATCH 08/54] Removed unused fields. Renamed style names to be in line with other ui.editor styles --- helix-term/src/ui/explore.rs | 4 ++-- helix-term/src/ui/tree.rs | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs index d0739ca0..8b4f6437 100644 --- a/helix-term/src/ui/explore.rs +++ b/helix-term/src/ui/explore.rs @@ -499,7 +499,7 @@ impl Explorer { )); } - fn fold_current(item: &mut FileInfo, cx: &mut Context, state: &mut State) { + fn fold_current(item: &mut FileInfo, _cx: &mut Context, _state: &mut State) { if item.path.is_dir() { item.expanded = false; } @@ -590,7 +590,7 @@ impl Explorer { let preview_area = area.clip_left(side_area.width).clip_bottom(2); let prompt_area = area.clip_top(side_area.height); - let border_style = cx.editor.theme.get("ui.explore.border"); + let border_style = cx.editor.theme.get("ui.explorer.border"); let list_area = render_block( side_area.clip_left(1), surface, diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs index 6945bb38..711c3c2a 100644 --- a/helix-term/src/ui/tree.rs +++ b/helix-term/src/ui/tree.rs @@ -118,14 +118,12 @@ pub enum TreeOp { pub struct Elem { item: T, level: usize, - expanded: bool, folded: Vec, } impl Clone for Elem { fn clone(&self) -> Self { Self { - expanded: false, item: self.item.clone(), level: self.level, folded: self.folded.clone(), @@ -138,7 +136,6 @@ impl Elem { Self { item, level, - expanded: false, folded: vec![], } } @@ -180,7 +177,7 @@ impl Tree { col: 0, max_len: 0, count: 0, - tree_symbol_style: "ui.explore.guide".into(), + tree_symbol_style: "ui.explorer.guide".into(), pre_render: None, on_opened_fn: None, on_folded_fn: None, @@ -474,7 +471,6 @@ impl Tree { self.max_len = 0; self.row = std::cmp::min(self.row, area.height.saturating_sub(1) as usize); let style = cx.editor.theme.get(&self.tree_symbol_style); - let line_style = cx.editor.theme.get("ui.virtual.ruler"); let folder_style = cx.editor.theme.get("special"); let last_item_index = self.items.len().saturating_sub(1); let skip = self.selected.saturating_sub(self.row); @@ -490,10 +486,8 @@ impl Tree { let mut area = Rect::new(area.x, area.y + row, area.width, 1); let indent = if elem.level > 0 { if index + skip != last_item_index { - //format!("{}├─", "│ ".repeat(elem.level - 1)) format!("{}", "│ ".repeat(elem.level - 1)) } else { - //format!("└─{}", "┴─".repeat(elem.level - 1)) format!("{}", "".repeat(elem.level - 1)) } } else { @@ -516,13 +510,14 @@ impl Tree { return; } if start_index == 0 { - //let expanded = elem.folded.len() > 0; + let mut icon_offset = 0; if let Some((icon, color)) = elem.item.icon() { let style = folder_style.fg(*color); surface.set_string(area.x, area.y, icon, style); + icon_offset = 2; } - surface.set_span(area.x + 2, area.y, span, area.width - 2); - area = area.clip_left((span.width() - 2) as u16); + surface.set_span(area.x + icon_offset, area.y, span, area.width - icon_offset); + area = area.clip_left((span.width() - icon_offset as usize) as u16); } else { let span_width = span.width(); if start_index > span_width { -- 2.38.5 From 90d40b70e8f8c0ed6f398b49b4c413e9fe1c7fd0 Mon Sep 17 00:00:00 2001 From: MDeiml Date: Fri, 22 Jul 2022 00:40:09 +0200 Subject: [PATCH 09/54] Add workspace command picker --- helix-lsp/src/client.rs | 3 +++ helix-term/src/commands.rs | 1 + helix-term/src/commands/lsp.rs | 36 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs index f6cec6aa..42b83e05 100644 --- a/helix-lsp/src/client.rs +++ b/helix-lsp/src/client.rs @@ -295,6 +295,9 @@ impl Client { }), workspace_folders: Some(true), apply_edit: Some(true), + execute_command: Some(lsp::DynamicRegistrationClientCapabilities { + dynamic_registration: Some(false), + }), ..Default::default() }), text_document: Some(lsp::TextDocumentClientCapabilities { diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 3ee75f6a..123e54eb 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -263,6 +263,7 @@ impl MappableCommand { file_picker, "Open file picker", file_picker_in_current_directory, "Open file picker at current working directory", code_action, "Perform code action", + workspace_command_picker, "Open workspace command picker", buffer_picker, "Open buffer picker", symbol_picker, "Open symbol picker", select_references_to_symbol_under_cursor, "Select symbol references", diff --git a/helix-term/src/commands/lsp.rs b/helix-term/src/commands/lsp.rs index 1785a50c..34d1dcbc 100644 --- a/helix-term/src/commands/lsp.rs +++ b/helix-term/src/commands/lsp.rs @@ -497,6 +497,42 @@ pub fn code_action(cx: &mut Context) { }, ) } + +impl ui::menu::Item for lsp::Command { + type Data = (); + fn label(&self, _data: &Self::Data) -> Spans { + self.title.as_str().into() + } +} + +pub fn workspace_command_picker(cx: &mut Context) { + let (_, doc) = current!(cx.editor); + + let language_server = language_server!(cx.editor, doc); + + let execute_command_provider = match &language_server.capabilities().execute_command_provider { + Some(p) => p, + None => return, + }; + let commands = execute_command_provider + .commands + .iter() + .map(|command| lsp::Command { + title: command.clone(), + command: command.clone(), + arguments: None, + }) + .collect::>(); + cx.callback = Some(Box::new( + move |compositor: &mut Compositor, _cx: &mut compositor::Context| { + let picker = ui::Picker::new(commands, (), move |cx, command, _action| { + execute_lsp_command(cx.editor, command.clone()); + }); + compositor.push(Box::new(overlayed(picker))) + }, + )); +} + pub fn execute_lsp_command(editor: &mut Editor, cmd: lsp::Command) { let doc = doc!(editor); let language_server = language_server!(editor, doc); -- 2.38.5 From 117e3b3b553e58279932a9bbd104a7c3076300e2 Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 23 Aug 2022 14:10:19 +0200 Subject: [PATCH 10/54] Update tree explore with new helix event types Signed-off-by: trivernis --- helix-term/src/ui/explore.rs | 2 +- helix-term/src/ui/tree.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs index f7adedb2..bfa95c82 100644 --- a/helix-term/src/ui/explore.rs +++ b/helix-term/src/ui/explore.rs @@ -4,8 +4,8 @@ use crate::{ ctrl, key, shift, ui, }; use anyhow::{bail, ensure, Result}; -use crossterm::event::{Event, KeyEvent}; use helix_core::Position; +use helix_view::input::{Event, KeyEvent}; use helix_view::{ editor::Action, graphics::{CursorKind, Modifier, Rect}, diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs index 4da57ad5..41ac74ff 100644 --- a/helix-term/src/ui/tree.rs +++ b/helix-term/src/ui/tree.rs @@ -7,9 +7,9 @@ use crate::{ compositor::{Context, EventResult}, ctrl, key, shift, }; -use crossterm::event::{Event, KeyEvent}; use helix_core::unicode::width::UnicodeWidthStr; -use helix_view::graphics::Rect; +use helix_view::input::Event; +use helix_view::{graphics::Rect, input::KeyEvent}; use tui::{buffer::Buffer as Surface, text::Spans}; pub trait TreeItem: Sized { -- 2.38.5 From 0e04c4c93caadb704c11a72bcf626b1f10ff2d98 Mon Sep 17 00:00:00 2001 From: cossonleo Date: Sun, 3 Apr 2022 15:55:08 +0800 Subject: [PATCH 11/54] tree helper and file explorer --- book/src/configuration.md | 11 + book/src/keymap.md | 34 + helix-term/src/commands.rs | 42 +- helix-term/src/keymap/default.rs | 2 + helix-term/src/ui/editor.rs | 42 +- helix-term/src/ui/explore.rs | 867 ++++++++++++++++++++++ helix-term/src/ui/mod.rs | 4 + helix-term/src/ui/tree.rs | 682 +++++++++++++++++ helix-view/src/editor.rs | 66 ++ runtime/themes/autumn.toml | 6 + runtime/themes/base16_default_dark.toml | 6 + runtime/themes/base16_default_light.toml | 6 + runtime/themes/base16_terminal.toml | 6 + runtime/themes/bogster.toml | 6 + runtime/themes/boo_berry.toml | 6 + runtime/themes/dark_plus.toml | 6 + runtime/themes/dracula.toml | 6 + runtime/themes/dracula_at_night.toml | 6 + runtime/themes/everforest_dark.toml | 5 + runtime/themes/everforest_light.toml | 5 + runtime/themes/gruvbox.toml | 6 + runtime/themes/gruvbox_light.toml | 6 + runtime/themes/ingrid.toml | 6 + runtime/themes/monokai.toml | 6 + runtime/themes/monokai_pro.toml | 6 + runtime/themes/monokai_pro_machine.toml | 6 + runtime/themes/monokai_pro_octagon.toml | 6 + runtime/themes/monokai_pro_ristretto.toml | 6 + runtime/themes/monokai_pro_spectrum.toml | 6 + runtime/themes/night_owl.toml | 6 + runtime/themes/nord.toml | 6 + runtime/themes/onedark.toml | 6 + runtime/themes/onelight.toml | 6 + runtime/themes/pop-dark.toml | 6 + runtime/themes/rose_pine.toml | 6 + runtime/themes/rose_pine_dawn.toml | 6 + runtime/themes/serika-dark.toml | 6 + runtime/themes/serika-light.toml | 5 + runtime/themes/solarized_dark.toml | 6 + runtime/themes/solarized_light.toml | 6 + runtime/themes/spacebones_light.toml | 6 + runtime/themes/tokyonight.toml | 6 + runtime/themes/tokyonight_storm.toml | 6 + 43 files changed, 1948 insertions(+), 3 deletions(-) create mode 100644 helix-term/src/ui/explore.rs create mode 100644 helix-term/src/ui/tree.rs diff --git a/book/src/configuration.md b/book/src/configuration.md index affd497c..003420c0 100644 --- a/book/src/configuration.md +++ b/book/src/configuration.md @@ -147,6 +147,8 @@ auto-pairs = false # defaults to `true` The default pairs are (){}[]''""``, but these can be customized by setting `auto-pairs` to a TOML table: +Example + ```toml [editor.auto-pairs] '(' = ')' @@ -229,3 +231,12 @@ Example: render = true character = "╎" ``` + +### `[editor.explorer]` Section +Sets explorer side width and style. + + | Key | Description | Default | + | --- | ----------- | ------- | + | `column-width` | explorer side width | 30 | + | `style` | explorer item style, tree or list | tree | + | `position` | explorer widget position, embed or overlay | overlay | diff --git a/book/src/keymap.md b/book/src/keymap.md index f84393ac..1fd20bed 100644 --- a/book/src/keymap.md +++ b/book/src/keymap.md @@ -275,6 +275,8 @@ This layer is a kludge of mappings, mostly pickers. | `R` | Replace selections by clipboard contents | `replace_selections_with_clipboard` | | `/` | Global search in workspace folder | `global_search` | | `?` | Open command palette | `command_palette` | +| `e` | Open or focus explorer | `toggle_or_focus_explorer` | +| `E` | open explorer recursion | `open_explorer_recursion` | > TIP: Global search displays results in a fuzzy picker, use `space + '` to bring it back up after opening a file. @@ -402,3 +404,35 @@ Keys to use within prompt, Remapping currently not supported. | `Tab` | Select next completion item | | `BackTab` | Select previous completion item | | `Enter` | Open selected | + +# File explorer +Keys to use within explorer, Remapping currently not supported. + +| Key | Description | +| ----- | ------------- | +| `Escape` | Back to editor | +| `Ctrl-c` | Close explorer | +| `Enter` | Open file or toggle dir selected | +| `b` | Back to current root's parent | +| `f` | Filter items | +| `z` | Fold currrent level | +| `k`, `Shift-Tab`, `Up` | select previous item | +| `j`, `Tab`, `Down` | select next item | +| `h` | Scroll left | +| `l` | Scroll right | +| `G` | Move to last item | +| `Ctrl-d` | Move down half page | +| `Ctrl-u` | Move up half page | +| `Shift-d` | Move down a page | +| `Shift-u` | Move up a page | +| `/` | Search item | +| `?` | Search item reverse | +| `n` | Repeat last search | +| `Shift-n` | Repeat last search reverse | +| `gg` | Move to first item | +| `ge` | Move to last item | +| `gc` | Make current dir as root dir | +| `mf` | Create new file under current item's parent | +| `md` | Create new dir under current item's parent | +| `rf` | Remove file selected | +| `rd` | Remove dir selected | diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 16f7e601..a036407c 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -432,7 +432,10 @@ impl MappableCommand { decrement, "Decrement item under cursor", record_macro, "Record macro", replay_macro, "Replay macro", - command_palette, "Open command palette", + command_palette, "Open command pallete", + toggle_or_focus_explorer, "toggle or focus explorer", + open_explorer_recursion, "open explorer recursion", + close_explorer, "close explorer", ); } @@ -2213,6 +2216,43 @@ fn file_picker_in_current_directory(cx: &mut Context) { cx.push_layer(Box::new(overlayed(picker))); } +fn toggle_or_focus_explorer(cx: &mut Context) { + cx.callback = Some(Box::new( + |compositor: &mut Compositor, cx: &mut compositor::Context| { + if let Some(editor) = compositor.find::() { + match editor.explorer.as_mut() { + Some(explore) => explore.content.focus(), + None => match ui::Explorer::new(cx) { + Ok(explore) => editor.explorer = Some(overlayed(explore)), + Err(err) => cx.editor.set_error(format!("{}", err)), + }, + } + } + }, + )); +} + +fn open_explorer_recursion(cx: &mut Context) { + cx.callback = Some(Box::new( + |compositor: &mut Compositor, cx: &mut compositor::Context| { + if let Some(editor) = compositor.find::() { + match ui::Explorer::new_explorer_recursion() { + Ok(explore) => editor.explorer = Some(overlayed(explore)), + Err(err) => cx.editor.set_error(format!("{}", err)), + } + } + }, + )); +} + +fn close_explorer(cx: &mut Context) { + cx.callback = Some(Box::new(|compositor: &mut Compositor, _| { + if let Some(editor) = compositor.find::() { + editor.explorer.take(); + } + })); +} + fn buffer_picker(cx: &mut Context) { let current = view!(cx.editor).doc; diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 8a16dc1b..71f0f154 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -264,6 +264,8 @@ pub fn default() -> HashMap { "r" => rename_symbol, "h" => select_references_to_symbol_under_cursor, "?" => command_palette, + "e" => toggle_or_focus_explorer, + "E" => open_explorer_recursion, }, "z" => { "View" "z" | "c" => align_view_center, diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 60cab905..07b27f59 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -3,7 +3,7 @@ use crate::{ compositor::{Component, Context, Event, EventResult}, job, key, keymap::{KeymapResult, Keymaps}, - ui::{Completion, ProgressSpinners}, + ui::{overlay::Overlay, Completion, Explorer, ProgressSpinners}, }; use helix_core::{ @@ -36,6 +36,7 @@ pub struct EditorView { last_insert: (commands::MappableCommand, Vec), pub(crate) completion: Option, spinners: ProgressSpinners, + pub(crate) explorer: Option>, } #[derive(Debug, Clone)] @@ -59,6 +60,7 @@ impl EditorView { last_insert: (commands::MappableCommand::normal_mode, Vec::new()), completion: None, spinners: ProgressSpinners::default(), + explorer: None, } } @@ -1118,6 +1120,11 @@ impl Component for EditorView { event: Event, context: &mut crate::compositor::Context, ) -> EventResult { + if let Some(explore) = self.explorer.as_mut() { + if let EventResult::Consumed(callback) = explore.handle_event(event, context) { + return EventResult::Consumed(callback); + } + } let mut cx = commands::Context { editor: context.editor, count: None, @@ -1260,7 +1267,17 @@ impl Component for EditorView { surface.set_style(area, cx.editor.theme.get("ui.background")); let config = cx.editor.config(); // if the terminal size suddenly changed, we need to trigger a resize - cx.editor.resize(area.clip_bottom(1)); // -1 from bottom for commandline + let mut editor_area = area.clip_bottom(1); + if self.explorer.is_some() && (config.explorer.is_embed()) { + editor_area = editor_area.clip_left(config.explorer.column_width as u16 + 2); + } + cx.editor.resize(editor_area); // -1 from bottom for commandline + + if let Some(explore) = self.explorer.as_mut() { + if !explore.content.is_focus() && config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } + } for (view, is_focused) in cx.editor.tree.views() { let doc = cx.editor.document(view.doc).unwrap(); @@ -1336,9 +1353,30 @@ impl Component for EditorView { if let Some(completion) = self.completion.as_mut() { completion.render(area, surface, cx); } + + if let Some(explore) = self.explorer.as_mut() { + if explore.content.is_focus() { + if config.explorer.is_embed() { + explore.content.render(area, surface, cx); + } else { + explore.render(area, surface, cx); + } + } + } } fn cursor(&self, _area: Rect, editor: &Editor) -> (Option, CursorKind) { + if let Some(explore) = &self.explorer { + if explore.content.is_focus() { + if editor.config().explorer.is_overlay() { + return explore.cursor(_area, editor); + } + let cursor = explore.content.cursor(_area, editor); + if cursor.0.is_some() { + return cursor; + } + } + } match editor.cursor() { // All block cursors are drawn manually (pos, CursorKind::Block) => (pos, CursorKind::Hidden), diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs new file mode 100644 index 00000000..d2978c8b --- /dev/null +++ b/helix-term/src/ui/explore.rs @@ -0,0 +1,867 @@ +use super::{Prompt, Tree, TreeItem, TreeOp}; +use crate::{ + compositor::{Component, Compositor, Context, EventResult}, + ctrl, key, shift, ui, +}; +use anyhow::{bail, ensure, Result}; +use helix_core::Position; +use helix_view::{ + editor::Action, + graphics::{CursorKind, Modifier, Rect}, + input::{Event, KeyEvent}, + Editor, +}; +use std::borrow::Cow; +use std::cmp::Ordering; +use std::path::{Path, PathBuf}; +use tui::{ + buffer::Buffer as Surface, + text::{Span, Spans}, + widgets::{Block, Borders, Widget}, +}; + +macro_rules! get_theme { + ($theme: expr, $s1: expr, $s2: expr) => { + $theme.try_get($s1).unwrap_or_else(|| $theme.get($s2)) + }; +} + +#[derive(Debug, Clone, Copy, PartialEq)] +enum FileType { + File, + Dir, + Exe, + Placeholder, + Parent, + Root, +} + +#[derive(Debug, Clone)] +struct FileInfo { + file_type: FileType, + path: PathBuf, +} + +impl FileInfo { + fn new(path: PathBuf, file_type: FileType) -> Self { + Self { path, file_type } + } + + fn root(path: PathBuf) -> Self { + Self { + file_type: FileType::Root, + path, + } + } + + fn parent(path: &Path) -> Self { + let p = path.parent().unwrap_or_else(|| Path::new("")); + Self { + file_type: FileType::Parent, + path: p.to_path_buf(), + } + } + + fn get_text(&self) -> Cow<'static, str> { + match self.file_type { + FileType::Parent => "..".into(), + FileType::Placeholder => "---".into(), + FileType::Root => return format!("{}", self.path.display()).into(), + FileType::File | FileType::Exe | FileType::Dir => self + .path + .file_name() + .map_or("/".into(), |p| p.to_string_lossy().into_owned().into()), + } + } +} + +impl TreeItem for FileInfo { + type Params = State; + fn text(&self, cx: &mut Context, selected: bool, state: &mut State) -> Spans { + let text = self.get_text(); + let theme = &cx.editor.theme; + + let style = match self.file_type { + FileType::Parent | FileType::Dir | FileType::Root => "ui.explorer.dir", + FileType::File | FileType::Exe | FileType::Placeholder => "ui.explorer.file", + }; + let mut style = theme.try_get(style).unwrap_or_else(|| theme.get("ui.text")); + if selected { + let patch = match state.focus { + true => "ui.explorer.focus", + false => "ui.explorer.unfocus", + }; + if let Some(patch) = theme.try_get(patch) { + style = style.patch(patch); + } else { + style = style.add_modifier(Modifier::REVERSED); + } + } + Spans::from(Span::styled(text, style)) + } + + fn is_child(&self, other: &Self) -> bool { + if let FileType::Parent = other.file_type { + return false; + } + if let FileType::Placeholder = self.file_type { + self.path == other.path + } else { + self.path.parent().map_or(false, |p| p == other.path) + } + } + + fn cmp(&self, other: &Self) -> Ordering { + use FileType::*; + match (self.file_type, other.file_type) { + (Parent, _) => return Ordering::Less, + (_, Parent) => return Ordering::Greater, + (Root, _) => return Ordering::Less, + (_, Root) => return Ordering::Greater, + _ => {} + }; + + if self.path == other.path { + match (self.file_type, other.file_type) { + (_, Placeholder) => return Ordering::Less, + (Placeholder, _) => return Ordering::Greater, + _ => {} + }; + } + + if let (Some(p1), Some(p2)) = (self.path.parent(), other.path.parent()) { + if p1 == p2 { + match (self.file_type, other.file_type) { + (Dir, File | Exe) => return Ordering::Less, + (File | Exe, Dir) => return Ordering::Greater, + _ => {} + }; + } + } + self.path.cmp(&other.path) + } + + fn get_childs(&self) -> Result> { + match self.file_type { + FileType::Root | FileType::Dir => {} + _ => return Ok(vec![]), + }; + let mut ret: Vec<_> = std::fs::read_dir(&self.path)? + .filter_map(|entry| entry.ok()) + .filter_map(|entry| { + entry.metadata().ok().map(|meta| { + let is_exe = false; + let file_type = match (meta.is_dir(), is_exe) { + (true, _) => FileType::Dir, + (_, false) => FileType::File, + (_, true) => FileType::Exe, + }; + Self { + file_type, + path: self.path.join(entry.file_name()), + } + }) + }) + .collect(); + if ret.is_empty() { + ret.push(Self { + path: self.path.clone(), + file_type: FileType::Placeholder, + }) + } + Ok(ret) + } + + fn filter(&self, _cx: &mut Context, s: &str, _params: &mut Self::Params) -> bool { + if s.is_empty() { + false + } else { + self.get_text().contains(s) + } + } +} + +// #[derive(Default, Debug, Clone)] +// struct PathState { +// root: PathBuf, +// sub_items: Vec, +// selected: usize, +// save_view: (usize, usize), // (selected, row) +// row: usize, +// col: usize, +// max_len: usize, +// } + +// impl PathState { + +// fn mkdir(&mut self, dir: &str) -> Result<()> { +// self.new_path(dir, FileType::Dir) +// } + +// fn create_file(&mut self, f: &str) -> Result<()> { +// self.new_path(f, FileType::File) +// } + +// fn remove_current_file(&mut self) -> Result<()> { +// let item = &self.sub_items[self.selected]; +// std::fs::remove_file(item.path_with_root(&self.root))?; +// self.sub_items.remove(self.selected); +// if self.selected >= self.sub_items.len() { +// self.selected = self.sub_items.len() - 1; +// } +// Ok(()) +// } + +// } + +#[derive(Clone, Copy, Debug)] +enum PromptAction { + Search(bool), // search next/search pre + Mkdir, + CreateFile, + RemoveDir, + RemoveFile, + Filter, +} + +#[derive(Clone, Debug)] +struct State { + focus: bool, + current_root: PathBuf, +} + +impl State { + fn new(focus: bool, current_root: PathBuf) -> Self { + Self { + focus, + current_root, + } + } +} + +pub struct Explorer { + tree: Tree, + state: State, + prompt: Option<(PromptAction, Prompt)>, + #[allow(clippy::type_complexity)] + on_next_key: Option EventResult>>, + #[allow(clippy::type_complexity)] + repeat_motion: Option>, +} + +impl Explorer { + pub fn new(cx: &mut Context) -> Result { + let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); + let items = Self::get_items(current_root.clone(), cx)?; + Ok(Self { + tree: Tree::build_tree(items).with_enter_fn(Self::toggle_current), + state: State::new(true, current_root), + repeat_motion: None, + prompt: None, + on_next_key: None, + }) + } + + pub fn new_explorer_recursion() -> Result { + let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); + let parent = FileInfo::parent(¤t_root); + let root = FileInfo::root(current_root.clone()); + let mut tree = + Tree::build_from_root(root, usize::MAX / 2)?.with_enter_fn(Self::toggle_current); + tree.insert_current_level(parent); + Ok(Self { + tree, + state: State::new(true, current_root), + repeat_motion: None, + prompt: None, + on_next_key: None, + }) + // let mut root = vec![, FileInfo::root(p)]; + } + + // pub fn new_with_uri(uri: String) -> Result { + // // support remote file? + + // let p = Path::new(&uri); + // ensure!(p.exists(), "path: {uri} is not exist"); + // ensure!(p.is_dir(), "path: {uri} is not dir"); + // Ok(Self::default().with_list(get_sub(p, None)?)) + // } + + pub fn focus(&mut self) { + self.state.focus = true + } + + pub fn unfocus(&mut self) { + self.state.focus = false; + } + + pub fn is_focus(&self) -> bool { + self.state.focus + } + + fn get_items(p: PathBuf, cx: &mut Context) -> Result> { + let mut items = vec![FileInfo::parent(p.as_path())]; + let root = FileInfo::root(p); + let childs = root.get_childs()?; + if cx.editor.config().explorer.is_tree() { + items.push(root) + } + items.extend(childs); + Ok(items) + } + + fn render_preview(&mut self, area: Rect, surface: &mut Surface, editor: &Editor) { + if area.height <= 2 || area.width < 60 { + return; + } + let item = self.tree.current().item(); + if item.file_type == FileType::Placeholder { + return; + } + let head_area = render_block(area.clip_bottom(area.height - 2), surface, Borders::BOTTOM); + let path_str = format!("{}", item.path.display()); + surface.set_stringn( + head_area.x, + head_area.y, + path_str, + head_area.width as usize, + get_theme!(editor.theme, "ui.explorer.dir", "ui.text"), + ); + + let body_area = area.clip_top(2); + let style = editor.theme.get("ui.text"); + if let Ok(preview_content) = get_preview(&item.path, body_area.height as usize) { + preview_content + .into_iter() + .enumerate() + .for_each(|(row, line)| { + surface.set_stringn( + body_area.x, + body_area.y + row as u16, + line, + body_area.width as usize, + style, + ); + }) + } + } + + fn new_search_prompt(&mut self, search_next: bool) { + self.tree.save_view(); + self.prompt = Some(( + PromptAction::Search(search_next), + Prompt::new("search: ".into(), None, ui::completers::none, |_, _, _| {}), + )) + } + + fn new_filter_prompt(&mut self) { + self.tree.save_view(); + self.prompt = Some(( + PromptAction::Filter, + Prompt::new("filter: ".into(), None, ui::completers::none, |_, _, _| {}), + )) + } + + fn new_mkdir_prompt(&mut self) { + self.prompt = Some(( + PromptAction::Mkdir, + Prompt::new("mkdir: ".into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn new_create_file_prompt(&mut self) { + self.prompt = Some(( + PromptAction::CreateFile, + Prompt::new( + "create file: ".into(), + None, + ui::completers::none, + |_, _, _| {}, + ), + )); + } + + fn new_remove_file_prompt(&mut self, cx: &mut Context) { + let item = self.tree.current_item(); + let check = || { + ensure!(item.file_type != FileType::Placeholder, "The path is empty"); + ensure!( + item.file_type != FileType::Parent, + "can not remove parent dir" + ); + ensure!(item.path.is_file(), "The path is not a file"); + let doc = cx.editor.document_by_path(&item.path); + ensure!(doc.is_none(), "The file is opened"); + Ok(()) + }; + if let Err(e) = check() { + cx.editor.set_error(format!("{e}")); + return; + } + let p = format!("remove file: {}, YES? ", item.path.display()); + self.prompt = Some(( + PromptAction::RemoveFile, + Prompt::new(p.into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn new_remove_dir_prompt(&mut self, cx: &mut Context) { + let item = self.tree.current_item(); + let check = || { + ensure!(item.file_type != FileType::Placeholder, "The path is empty"); + ensure!( + item.file_type != FileType::Parent, + "can not remove parent dir" + ); + ensure!(item.path.is_dir(), "The path is not a dir"); + let doc = cx.editor.documents().find(|doc| { + doc.path() + .map(|p| p.starts_with(&item.path)) + .unwrap_or(false) + }); + ensure!(doc.is_none(), "There are files opened under the dir"); + Ok(()) + }; + if let Err(e) = check() { + cx.editor.set_error(format!("{e}")); + return; + } + let p = format!("remove dir: {}, YES? ", item.path.display()); + self.prompt = Some(( + PromptAction::RemoveDir, + Prompt::new(p.into(), None, ui::completers::none, |_, _, _| {}), + )); + } + + fn toggle_current( + item: &mut FileInfo, + cx: &mut Context, + state: &mut State, + ) -> TreeOp { + if item.file_type == FileType::Placeholder { + return TreeOp::Noop; + } + if item.path == Path::new("") { + return TreeOp::Noop; + } + let meta = match std::fs::metadata(&item.path) { + Ok(meta) => meta, + Err(e) => { + cx.editor.set_error(format!("{e}")); + return TreeOp::Noop; + } + }; + if meta.is_file() { + if let Err(e) = cx.editor.open(&item.path, Action::Replace) { + cx.editor.set_error(format!("{e}")); + } + state.focus = false; + return TreeOp::Noop; + } + + if item.path.is_dir() { + if cx.editor.config().explorer.is_list() || item.file_type == FileType::Parent { + match Self::get_items(item.path.clone(), cx) { + Ok(items) => { + state.current_root = item.path.clone(); + return TreeOp::ReplaceTree(items); + } + Err(e) => cx.editor.set_error(format!("{e}")), + } + } else { + return TreeOp::GetChildsAndInsert; + } + } + cx.editor.set_error("unkonw file type"); + TreeOp::Noop + } + + fn render_float(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + let background = cx.editor.theme.get("ui.background"); + let column_width = cx.editor.config().explorer.column_width as u16; + surface.clear_with(area, background); + let area = render_block(area, surface, Borders::ALL); + + let mut preview_area = area.clip_left(column_width + 1); + if let Some((_, prompt)) = self.prompt.as_mut() { + let area = preview_area.clip_bottom(2); + let promp_area = + render_block(preview_area.clip_top(area.height), surface, Borders::TOP); + prompt.render(promp_area, surface, cx); + preview_area = area; + } + self.render_preview(preview_area, surface, cx.editor); + + let list_area = render_block(area.clip_right(preview_area.width), surface, Borders::RIGHT); + self.tree.render(list_area, surface, cx, &mut self.state); + } + + fn render_embed(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + let config = &cx.editor.config().explorer; + let side_area = area + .with_width(area.width.min(config.column_width as u16 + 2)) + .clip_bottom(1); + let background = cx.editor.theme.get("ui.background"); + surface.clear_with(side_area, background); + + let preview_area = area.clip_left(side_area.width).clip_bottom(2); + let prompt_area = area.clip_top(side_area.height); + + let list_area = + render_block(side_area.clip_left(1), surface, Borders::RIGHT).clip_bottom(1); + self.tree.render(list_area, surface, cx, &mut self.state); + + { + let statusline = if self.is_focus() { + cx.editor.theme.get("ui.statusline") + } else { + cx.editor.theme.get("ui.statusline.inactive") + }; + let area = side_area.clip_top(list_area.height).clip_right(1); + surface.clear_with(area, statusline); + // surface.set_string_truncated( + // area.x, + // area.y, + // &self.path_state.root.to_string_lossy(), + // area.width as usize, + // |_| statusline, + // true, + // true, + // ); + } + + if self.is_focus() { + if preview_area.width < 30 || preview_area.height < 3 { + return; + } + let width = preview_area.width.min(90); + let mut y = self.tree.row().saturating_sub(1) as u16; + let height = (preview_area.height).min(25); + if (height + y) > preview_area.height { + y = preview_area.height - height; + } + let area = Rect::new(preview_area.x, y, width, height); + surface.clear_with(area, background); + let area = render_block(area, surface, Borders::all()); + self.render_preview(area, surface, cx.editor); + } + + if let Some((_, prompt)) = self.prompt.as_mut() { + prompt.render_prompt(prompt_area, surface, cx) + } + } + + fn handle_filter_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + let (action, mut prompt) = self.prompt.take().unwrap(); + match event.into() { + key!(Tab) | key!(Down) | ctrl!('j') => { + self.tree.clean_recycle(); + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Enter) => { + self.tree.clean_recycle(); + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Esc) | ctrl!('c') => self.tree.restore_recycle(), + _ => { + if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + self.tree.filter(prompt.line(), cx, &mut self.state); + } + self.prompt = Some((action, prompt)); + } + }; + EventResult::Consumed(None) + } + + fn handle_search_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + let (action, mut prompt) = self.prompt.take().unwrap(); + let search_next = match action { + PromptAction::Search(search_next) => search_next, + _ => return EventResult::Ignored(None), + }; + match event.into() { + key!(Tab) | key!(Down) | ctrl!('j') => { + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state) + } + key!(Enter) => { + let search_str = prompt.line().clone(); + if !search_str.is_empty() { + self.repeat_motion = Some(Box::new(move |explorer, action, cx| { + if let PromptAction::Search(is_next) = action { + explorer.tree.save_view(); + if is_next == search_next { + explorer + .tree + .search_next(cx, &search_str, &mut explorer.state); + } else { + explorer + .tree + .search_pre(cx, &search_str, &mut explorer.state); + } + } + })) + } else { + self.repeat_motion = None; + } + return self + .tree + .handle_event(Event::Key(event), cx, &mut self.state); + } + key!(Esc) | ctrl!('c') => self.tree.restore_view(), + _ => { + if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + if search_next { + self.tree.search_next(cx, prompt.line(), &mut self.state); + } else { + self.tree.search_pre(cx, prompt.line(), &mut self.state); + } + } + self.prompt = Some((action, prompt)); + } + }; + EventResult::Consumed(None) + } + + fn handle_prompt_event(&mut self, event: KeyEvent, cx: &mut Context) -> EventResult { + match &self.prompt { + Some((PromptAction::Search(_), _)) => return self.handle_search_event(event, cx), + Some((PromptAction::Filter, _)) => return self.handle_filter_event(event, cx), + _ => {} + }; + let (action, mut prompt) = match self.prompt.take() { + Some((action, p)) => (action, p), + _ => return EventResult::Ignored(None), + }; + let line = prompt.line(); + match (action, event.into()) { + (PromptAction::Mkdir, key!(Enter)) => { + if let Err(e) = self.new_path(line, true) { + cx.editor.set_error(format!("{e}")) + } + } + (PromptAction::CreateFile, key!(Enter)) => { + if let Err(e) = self.new_path(line, false) { + cx.editor.set_error(format!("{e}")) + } + } + (PromptAction::RemoveDir, key!(Enter)) => { + let item = self.tree.current_item(); + if let Err(e) = std::fs::remove_dir_all(&item.path) { + cx.editor.set_error(format!("{e}")); + } else { + self.tree.fold_current_child(); + self.tree.remove_current(); + } + } + (PromptAction::RemoveFile, key!(Enter)) => { + if line == "YES" { + let item = self.tree.current_item(); + if let Err(e) = std::fs::remove_file(&item.path) { + cx.editor.set_error(format!("{e}")); + } else { + self.tree.remove_current(); + } + } + } + (_, key!(Esc) | ctrl!('c')) => {} + _ => { + prompt.handle_event(Event::Key(event), cx); + self.prompt = Some((action, prompt)); + } + } + EventResult::Consumed(None) + } + + fn new_path(&mut self, file_name: &str, is_dir: bool) -> Result<()> { + let current = self.tree.current_item(); + let current_parent = if current.file_type == FileType::Placeholder { + ¤t.path + } else { + current + .path + .parent() + .ok_or_else(|| anyhow::anyhow!("can not get parent dir"))? + }; + let p = helix_core::path::get_normalized_path(¤t_parent.join(file_name)); + match p.parent() { + Some(p) if p == current_parent => {} + _ => bail!("The file name is not illegal"), + }; + + let f = if is_dir { + std::fs::create_dir(&p)?; + FileInfo::new(p, FileType::Dir) + } else { + let mut fd = std::fs::OpenOptions::new(); + fd.create_new(true).write(true).open(&p)?; + FileInfo::new(p, FileType::File) + }; + if current.file_type == FileType::Placeholder { + self.tree.replace_current(f); + } else { + self.tree.insert_current_level(f); + } + Ok(()) + } +} + +impl Component for Explorer { + /// Process input events, return true if handled. + fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + let key_event = match event { + Event::Key(event) => event, + Event::Resize(..) => return EventResult::Consumed(None), + _ => return EventResult::Ignored(None), + }; + if !self.is_focus() { + return EventResult::Ignored(None); + } + if let Some(mut on_next_key) = self.on_next_key.take() { + return on_next_key(cx, self, key_event); + } + + if let EventResult::Consumed(c) = self.handle_prompt_event(key_event, cx) { + return EventResult::Consumed(c); + } + + let close_fn = EventResult::Consumed(Some(Box::new(|compositor: &mut Compositor, _| { + if let Some(editor) = compositor.find::() { + editor.explorer = None; + } + }))); + + match key_event.into() { + key!(Esc) => self.unfocus(), + ctrl!('c') => return close_fn, + key!('n') => { + if let Some(mut repeat_motion) = self.repeat_motion.take() { + repeat_motion(self, PromptAction::Search(true), cx); + self.repeat_motion = Some(repeat_motion); + } + } + shift!('N') => { + if let Some(mut repeat_motion) = self.repeat_motion.take() { + repeat_motion(self, PromptAction::Search(false), cx); + self.repeat_motion = Some(repeat_motion); + } + } + key!('b') => { + if let Some(p) = self.state.current_root.parent() { + match Self::get_items(p.to_path_buf(), cx) { + Ok(items) => { + self.state.current_root = p.to_path_buf(); + self.tree = Tree::build_tree(items).with_enter_fn(Self::toggle_current); + } + Err(e) => cx.editor.set_error(format!("{e}")), + } + } + } + key!('f') => self.new_filter_prompt(), + key!('/') => self.new_search_prompt(true), + key!('?') => self.new_search_prompt(false), + key!('m') => { + self.on_next_key = Some(Box::new(|_, explorer, event| { + match event.into() { + key!('d') => explorer.new_mkdir_prompt(), + key!('f') => explorer.new_create_file_prompt(), + _ => return EventResult::Ignored(None), + }; + EventResult::Consumed(None) + })); + } + key!('r') => { + self.on_next_key = Some(Box::new(|cx, explorer, event| { + match event.into() { + key!('d') => explorer.new_remove_dir_prompt(cx), + key!('f') => explorer.new_remove_file_prompt(cx), + _ => return EventResult::Ignored(None), + }; + EventResult::Consumed(None) + })); + } + _ => { + self.tree + .handle_event(Event::Key(key_event), cx, &mut self.state); + } + } + + EventResult::Consumed(None) + } + + fn render(&mut self, area: Rect, surface: &mut Surface, cx: &mut Context) { + if area.width < 10 || area.height < 5 { + cx.editor.set_error("explorer render area is too small"); + return; + } + let config = &cx.editor.config().explorer; + if config.is_embed() { + self.render_embed(area, surface, cx); + } else { + self.render_float(area, surface, cx); + } + } + + fn cursor(&self, area: Rect, editor: &Editor) -> (Option, CursorKind) { + let prompt = match self.prompt.as_ref() { + Some((_, prompt)) => prompt, + None => return (None, CursorKind::Hidden), + }; + let config = &editor.config().explorer; + let (x, y) = if config.is_overlay() { + let colw = config.column_width as u16; + if area.width > colw { + (area.x + colw + 2, area.y + area.height - 2) + } else { + return (None, CursorKind::Hidden); + } + } else { + (area.x, area.y + area.height - 1) + }; + prompt.cursor(Rect::new(x, y, area.width, 1), editor) + } +} + +fn get_preview(p: impl AsRef, max_line: usize) -> Result> { + let p = p.as_ref(); + if p.is_dir() { + return Ok(p + .read_dir()? + .filter_map(|entry| entry.ok()) + .take(max_line) + .map(|entry| { + if entry.file_type().map(|ft| ft.is_dir()).unwrap_or(false) { + format!("{}/", entry.file_name().to_string_lossy()) + } else { + format!("{}", entry.file_name().to_string_lossy()) + } + }) + .collect()); + } + + ensure!(p.is_file(), "path: {} is not file or dir", p.display()); + use std::fs::OpenOptions; + use std::io::BufRead; + let mut fd = OpenOptions::new(); + fd.read(true); + let fd = fd.open(p)?; + Ok(std::io::BufReader::new(fd) + .lines() + .take(max_line) + .filter_map(|line| line.ok()) + .map(|line| line.replace('\t', " ")) + .collect()) +} + +fn render_block(area: Rect, surface: &mut Surface, borders: Borders) -> Rect { + let block = Block::default().borders(borders); + let inner = block.inner(area); + block.render(area, surface); + inner +} diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs index 560e9155..046ca26d 100644 --- a/helix-term/src/ui/mod.rs +++ b/helix-term/src/ui/mod.rs @@ -1,5 +1,6 @@ mod completion; pub(crate) mod editor; +mod explore; mod info; pub mod lsp; mod markdown; @@ -11,9 +12,11 @@ mod prompt; mod spinner; mod statusline; mod text; +mod tree; pub use completion::Completion; pub use editor::EditorView; +pub use explore::Explorer; pub use markdown::Markdown; pub use menu::Menu; pub use picker::{FileLocation, FilePicker, Picker}; @@ -21,6 +24,7 @@ pub use popup::Popup; pub use prompt::{Prompt, PromptEvent}; pub use spinner::{ProgressSpinners, Spinner}; pub use text::Text; +pub use tree::{Tree, TreeItem, TreeOp}; use helix_core::regex::Regex; use helix_core::regex::RegexBuilder; diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs new file mode 100644 index 00000000..fd2af8c6 --- /dev/null +++ b/helix-term/src/ui/tree.rs @@ -0,0 +1,682 @@ +use std::cmp::Ordering; +use std::iter::Peekable; + +use anyhow::Result; + +use crate::{ + compositor::{Context, EventResult}, + ctrl, key, shift, +}; +use helix_core::unicode::width::UnicodeWidthStr; +use helix_view::{ + graphics::Rect, + input::{Event, KeyEvent}, +}; +use tui::{buffer::Buffer as Surface, text::Spans}; + +pub trait TreeItem: Sized { + type Params; + + fn text(&self, cx: &mut Context, selected: bool, params: &mut Self::Params) -> Spans; + fn is_child(&self, other: &Self) -> bool; + fn cmp(&self, other: &Self) -> Ordering; + + fn filter(&self, cx: &mut Context, s: &str, params: &mut Self::Params) -> bool { + self.text(cx, false, params) + .0 + .into_iter() + .map(|s| s.content) + .collect::>() + .concat() + .contains(s) + } + + fn get_childs(&self) -> Result> { + Ok(vec![]) + } +} + +fn tree_item_cmp(item1: &T, item2: &T) -> Ordering { + if item1.is_child(item2) { + return Ordering::Greater; + } + if item2.is_child(item1) { + return Ordering::Less; + } + + T::cmp(item1, item2) +} + +fn vec_to_tree(mut items: Vec, level: usize) -> Vec> { + fn get_childs(iter: &mut Peekable, elem: &mut Elem) + where + T: TreeItem, + Iter: Iterator, + { + let level = elem.level + 1; + loop { + if !iter.peek().map_or(false, |next| next.is_child(&elem.item)) { + break; + } + let mut child = Elem::new(iter.next().unwrap(), level); + if iter.peek().map_or(false, |nc| nc.is_child(&child.item)) { + get_childs(iter, &mut child); + } + elem.folded.push(child); + } + } + + items.sort_by(tree_item_cmp); + let mut elems = Vec::with_capacity(items.len()); + let mut iter = items.into_iter().peekable(); + while let Some(item) = iter.next() { + let mut elem = Elem::new(item, level); + if iter.peek().map_or(false, |next| next.is_child(&elem.item)) { + get_childs(&mut iter, &mut elem); + } + expand_elems(&mut elems, elem); + } + elems +} + +// return total elems's count contain self +fn get_elems_recursion(t: &mut Elem, depth: usize) -> Result { + let mut childs = t.item.get_childs()?; + childs.sort_by(tree_item_cmp); + let mut elems = Vec::with_capacity(childs.len()); + let level = t.level + 1; + let mut total = 1; + for child in childs { + let mut elem = Elem::new(child, level); + let count = if depth > 0 { + get_elems_recursion(&mut elem, depth - 1)? + } else { + 1 + }; + elems.push(elem); + total += count; + } + t.folded = elems; + Ok(total) +} + +fn expand_elems(dist: &mut Vec>, mut t: Elem) { + let childs = std::mem::take(&mut t.folded); + dist.push(t); + for child in childs { + expand_elems(dist, child) + } +} + +pub enum TreeOp { + Noop, + Restore, + InsertChild(Vec), + GetChildsAndInsert, + ReplaceTree(Vec), +} + +pub struct Elem { + item: T, + level: usize, + folded: Vec, +} + +impl Clone for Elem { + fn clone(&self) -> Self { + Self { + item: self.item.clone(), + level: self.level, + folded: self.folded.clone(), + } + } +} + +impl Elem { + pub fn new(item: T, level: usize) -> Self { + Self { + item, + level, + folded: vec![], + } + } + + pub fn item(&self) -> &T { + &self.item + } +} + +pub struct Tree { + items: Vec>, + recycle: Option<(String, Vec>)>, + selected: usize, + save_view: (usize, usize), // (selected, row) + row: usize, + col: usize, + max_len: usize, + count: usize, + tree_symbol_style: String, + #[allow(clippy::type_complexity)] + pre_render: Option>, + #[allow(clippy::type_complexity)] + on_opened_fn: + Option TreeOp + 'static>>, + #[allow(clippy::type_complexity)] + on_folded_fn: Option>, + #[allow(clippy::type_complexity)] + on_next_key: Option>, +} + +impl Tree { + pub fn new(items: Vec>) -> Self { + Self { + items, + recycle: None, + selected: 0, + save_view: (0, 0), + row: 0, + col: 0, + max_len: 0, + count: 0, + tree_symbol_style: "ui.text".into(), + pre_render: None, + on_opened_fn: None, + on_folded_fn: None, + on_next_key: None, + } + } + + pub fn replace_with_new_items(&mut self, items: Vec) { + let old = std::mem::replace(self, Self::new(vec_to_tree(items, 0))); + self.on_opened_fn = old.on_opened_fn; + self.on_folded_fn = old.on_folded_fn; + self.tree_symbol_style = old.tree_symbol_style; + } + + pub fn build_tree(items: Vec) -> Self { + Self::new(vec_to_tree(items, 0)) + } + + pub fn build_from_root(t: T, depth: usize) -> Result { + let mut elem = Elem::new(t, 0); + let count = get_elems_recursion(&mut elem, depth)?; + let mut elems = Vec::with_capacity(count); + expand_elems(&mut elems, elem); + Ok(Self::new(elems)) + } + + pub fn with_enter_fn(mut self, f: F) -> Self + where + F: FnMut(&mut T, &mut Context, &mut T::Params) -> TreeOp + 'static, + { + self.on_opened_fn = Some(Box::new(f)); + self + } + + pub fn with_folded_fn(mut self, f: F) -> Self + where + F: FnMut(&mut T, &mut Context, &mut T::Params) + 'static, + { + self.on_folded_fn = Some(Box::new(f)); + self + } + + pub fn tree_symbol_style(mut self, style: String) -> Self { + self.tree_symbol_style = style; + self + } + + fn next_item(&self) -> Option<&Elem> { + self.items.get(self.selected + 1) + } + + fn next_not_descendant_pos(&self, index: usize) -> usize { + let item = &self.items[index]; + self.find(index + 1, false, |n| n.level <= item.level) + .unwrap_or(self.items.len()) + } + + fn find_parent(&self, index: usize) -> Option { + let item = &self.items[index]; + self.find(index, true, |p| p.level < item.level) + } + + // rev start: start - 1 + fn find(&self, start: usize, rev: bool, f: F) -> Option + where + F: FnMut(&Elem) -> bool, + { + let iter = self.items.iter(); + if rev { + iter.take(start).rposition(f) + } else { + iter.skip(start).position(f).map(|p| p + start) + } + } +} + +impl Tree { + pub fn on_enter(&mut self, cx: &mut Context, params: &mut T::Params) { + if self.items.is_empty() { + return; + } + if let Some(next_level) = self.next_item().map(|elem| elem.level) { + let current = &mut self.items[self.selected]; + let current_level = current.level; + if next_level > current_level { + if let Some(mut on_folded_fn) = self.on_folded_fn.take() { + on_folded_fn(&mut current.item, cx, params); + self.on_folded_fn = Some(on_folded_fn); + } + self.fold_current_child(); + return; + } + } + + if let Some(mut on_open_fn) = self.on_opened_fn.take() { + let mut f = || { + let current = &mut self.items[self.selected]; + let items = match on_open_fn(&mut current.item, cx, params) { + TreeOp::Restore => { + let inserts = std::mem::take(&mut current.folded); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + return; + } + TreeOp::InsertChild(items) => items, + TreeOp::GetChildsAndInsert => match current.item.get_childs() { + Ok(items) => items, + Err(e) => return cx.editor.set_error(format!("{e}")), + }, + TreeOp::ReplaceTree(items) => return self.replace_with_new_items(items), + TreeOp::Noop => return, + }; + current.folded = vec![]; + let inserts = vec_to_tree(items, current.level + 1); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + }; + f(); + self.on_opened_fn = Some(on_open_fn) + } else { + let current = &mut self.items[self.selected]; + let inserts = std::mem::take(&mut current.folded); + let _: Vec<_> = self + .items + .splice(self.selected + 1..self.selected + 1, inserts) + .collect(); + } + } + + pub fn fold_current_level(&mut self) { + let start = match self.find_parent(self.selected) { + Some(start) => start, + None => return, + }; + self.selected = start; + self.fold_current_child(); + } + + pub fn fold_current_child(&mut self) { + if self.selected + 1 >= self.items.len() { + return; + } + let pos = self.next_not_descendant_pos(self.selected); + if self.selected < pos { + self.items[self.selected].folded = self.items.drain(self.selected + 1..pos).collect(); + } + } + + pub fn search_next(&mut self, cx: &mut Context, s: &str, params: &mut T::Params) { + let skip = self.save_view.0 + 1; + self.selected = self + .find(skip, false, |e| e.item.filter(cx, s, params)) + .unwrap_or(self.save_view.0); + + self.row = (self.save_view.1 + self.selected).saturating_sub(self.save_view.0); + } + + pub fn search_pre(&mut self, cx: &mut Context, s: &str, params: &mut T::Params) { + let take = self.save_view.0; + self.selected = self + .find(take, true, |e| e.item.filter(cx, s, params)) + .unwrap_or(self.save_view.0); + + self.row = (self.save_view.1 + self.selected).saturating_sub(self.save_view.0); + } + + pub fn move_down(&mut self, rows: usize) { + let len = self.items.len(); + if len > 0 { + self.selected = std::cmp::min(self.selected + rows, len.saturating_sub(1)); + self.row = std::cmp::min(self.selected, self.row + rows); + } + } + + pub fn move_up(&mut self, rows: usize) { + let len = self.items.len(); + if len > 0 { + self.selected = self.selected.saturating_sub(rows); + self.row = std::cmp::min(self.selected, self.row.saturating_sub(rows)); + } + } + + pub fn move_left(&mut self, cols: usize) { + self.col = self.col.saturating_sub(cols); + } + + pub fn move_right(&mut self, cols: usize) { + self.pre_render = Some(Box::new(move |tree: &mut Self, area: Rect| { + let max_scroll = tree.max_len.saturating_sub(area.width as usize); + tree.col = max_scroll.min(tree.col + cols); + })); + } + + pub fn move_down_half_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_down((area.height / 2) as usize); + })); + } + + pub fn move_up_half_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_up((area.height / 2) as usize); + })); + } + + pub fn move_down_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_down((area.height) as usize); + })); + } + + pub fn move_up_page(&mut self) { + self.pre_render = Some(Box::new(|tree: &mut Self, area: Rect| { + tree.move_up((area.height) as usize); + })); + } + + pub fn save_view(&mut self) { + self.save_view = (self.selected, self.row); + } + + pub fn restore_view(&mut self) { + (self.selected, self.row) = self.save_view; + } + + pub fn current(&self) -> &Elem { + &self.items[self.selected] + } + + pub fn current_item(&self) -> &T { + &self.items[self.selected].item + } + + pub fn row(&self) -> usize { + self.row + } + + pub fn remove_current(&mut self) -> T { + let elem = self.items.remove(self.selected); + self.selected = self.selected.saturating_sub(1); + elem.item + } + + pub fn replace_current(&mut self, item: T) { + self.items[self.selected].item = item; + } + + pub fn insert_current_level(&mut self, item: T) { + let current = self.current(); + let level = current.level; + let pos = match current.item.cmp(&item) { + Ordering::Less => self + .find(self.selected + 1, false, |e| { + e.level < level || (e.level == level && e.item.cmp(&item) != Ordering::Less) + }) + .unwrap_or(self.items.len()), + + Ordering::Greater => { + match self.find(self.selected, true, |elem| { + elem.level < level + || (elem.level == level && elem.item.cmp(&item) != Ordering::Greater) + }) { + Some(p) if self.items[p].level == level => self.next_not_descendant_pos(p), + Some(p) => p + 1, + None => 0, + } + } + Ordering::Equal => self.selected + 1, + }; + self.items.insert(pos, Elem::new(item, level)); + } +} + +impl Tree { + pub fn render( + &mut self, + area: Rect, + surface: &mut Surface, + cx: &mut Context, + params: &mut T::Params, + ) { + if let Some(pre_render) = self.pre_render.take() { + pre_render(self, area); + } + + self.max_len = 0; + self.row = std::cmp::min(self.row, area.height.saturating_sub(1) as usize); + let style = cx.editor.theme.get(&self.tree_symbol_style); + let last_item_index = self.items.len().saturating_sub(1); + let skip = self.selected.saturating_sub(self.row); + let iter = self + .items + .iter() + .skip(skip) + .take(area.height as usize) + .enumerate(); + for (index, elem) in iter { + let row = index as u16; + let mut area = Rect::new(area.x, area.y + row, area.width, 1); + let indent = if elem.level > 0 { + if index + skip != last_item_index { + format!("{}├─", "│ ".repeat(elem.level - 1)) + } else { + format!("└─{}", "┴─".repeat(elem.level - 1)) + } + } else { + "".to_string() + }; + + let indent_len = indent.chars().count(); + if indent_len > self.col { + let indent: String = indent.chars().skip(self.col).collect(); + if !indent.is_empty() { + surface.set_stringn(area.x, area.y, &indent, area.width as usize, style); + area = area.clip_left(indent.width() as u16); + } + }; + let mut start_index = self.col.saturating_sub(indent_len); + let mut text = elem.item.text(cx, skip + index == self.selected, params); + self.max_len = self.max_len.max(text.width() + indent.len()); + for span in text.0.iter_mut() { + if area.width == 0 { + return; + } + if start_index == 0 { + surface.set_span(area.x, area.y, span, area.width); + area = area.clip_left(span.width() as u16); + } else { + let span_width = span.width(); + if start_index > span_width { + start_index -= span_width; + } else { + let content: String = span + .content + .chars() + .filter(|c| { + if start_index > 0 { + start_index = start_index.saturating_sub(c.to_string().width()); + false + } else { + true + } + }) + .collect(); + surface.set_string_truncated( + area.x, + area.y, + &content, + area.width as usize, + |_| span.style, + false, + false, + ); + start_index = 0 + } + } + } + } + } + + pub fn handle_event( + &mut self, + event: Event, + cx: &mut Context, + params: &mut T::Params, + ) -> EventResult { + let key_event = match event { + Event::Key(event) => event, + Event::Resize(..) => return EventResult::Consumed(None), + _ => return EventResult::Ignored(None), + }; + if let Some(mut on_next_key) = self.on_next_key.take() { + on_next_key(cx, self, key_event); + return EventResult::Consumed(None); + } + let count = std::mem::replace(&mut self.count, 0); + match key_event.into() { + key!(i @ '0'..='9') => self.count = i.to_digit(10).unwrap() as usize + count * 10, + key!('k') | shift!(Tab) | key!(Up) | ctrl!('k') => self.move_up(1.max(count)), + key!('j') | key!(Tab) | key!(Down) | ctrl!('j') => self.move_down(1.max(count)), + key!('z') => self.fold_current_level(), + key!('h') => self.move_left(1.max(count)), + key!('l') => self.move_right(1.max(count)), + shift!('G') => self.move_down(usize::MAX / 2), + key!(Enter) => self.on_enter(cx, params), + ctrl!('d') => self.move_down_half_page(), + ctrl!('u') => self.move_up_half_page(), + shift!('D') => self.move_down_page(), + shift!('U') => self.move_up_page(), + key!('g') => { + self.on_next_key = Some(Box::new(|_, tree, event| match event.into() { + key!('g') => tree.move_up(usize::MAX / 2), + key!('e') => tree.move_down(usize::MAX / 2), + _ => {} + })); + } + _ => return EventResult::Ignored(None), + } + + EventResult::Consumed(None) + } +} + +impl Tree { + pub fn filter(&mut self, s: &str, cx: &mut Context, params: &mut T::Params) { + fn filter_recursion( + elems: &Vec>, + mut index: usize, + s: &str, + cx: &mut Context, + params: &mut T::Params, + ) -> (Vec>, usize) + where + T: TreeItem + Clone, + { + let mut retain = vec![]; + let elem = &elems[index]; + loop { + let child = match elems.get(index + 1) { + Some(child) if child.item.is_child(&elem.item) => child, + _ => break, + }; + index += 1; + let next = elems.get(index + 1); + if next.map_or(false, |n| n.item.is_child(&child.item)) { + let (sub_retain, current_index) = filter_recursion(elems, index, s, cx, params); + retain.extend(sub_retain); + index = current_index; + } else if child.item.filter(cx, s, params) { + retain.push(child.clone()); + } + } + if !retain.is_empty() || elem.item.filter(cx, s, params) { + retain.insert(0, elem.clone()); + } + (retain, index) + } + + if s.is_empty() { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + self.restore_view(); + return; + } + } + + let mut retain = vec![]; + let mut index = 0; + let items = match &self.recycle { + Some((pre, _)) if pre == s => return, + Some((pre, recycle)) if pre.contains(s) => recycle, + _ => &self.items, + }; + while let Some(elem) = items.get(index) { + let next = items.get(index + 1); + if next.map_or(false, |n| n.item.is_child(&elem.item)) { + let (sub_items, current_index) = filter_recursion(items, index, s, cx, params); + index = current_index; + retain.extend(sub_items); + } else if elem.item.filter(cx, s, params) { + retain.push(elem.clone()) + } + index += 1; + } + + if retain.is_empty() { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + self.restore_view(); + } + return; + } + + let recycle = std::mem::replace(&mut self.items, retain); + if let Some(r) = self.recycle.as_mut() { + r.0 = s.into() + } else { + self.recycle = Some((s.into(), recycle)); + self.save_view(); + } + + self.selected = self + .find(0, false, |elem| elem.item.filter(cx, s, params)) + .unwrap_or(0); + self.row = self.selected; + } + + pub fn clean_recycle(&mut self) { + self.recycle = None; + } + + pub fn restore_recycle(&mut self) { + if let Some((_, recycle)) = self.recycle.take() { + self.items = recycle; + } + } +} diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 520a425c..bc549249 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -109,6 +109,69 @@ impl Default for FilePickerConfig { } } +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ExplorerStyle { + Tree, + List, +} + +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum ExplorerPosition { + Embed, + Overlay, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case", default, deny_unknown_fields)] +pub struct ExplorerConfig { + pub style: ExplorerStyle, + pub position: ExplorerPosition, + /// explorer column width + pub column_width: usize, +} + +impl ExplorerConfig { + pub fn is_embed(&self) -> bool { + match self.position { + ExplorerPosition::Embed => true, + ExplorerPosition::Overlay => false, + } + } + + pub fn is_overlay(&self) -> bool { + match self.position { + ExplorerPosition::Embed => false, + ExplorerPosition::Overlay => true, + } + } + + pub fn is_list(&self) -> bool { + match self.style { + ExplorerStyle::List => true, + ExplorerStyle::Tree => false, + } + } + + pub fn is_tree(&self) -> bool { + match self.style { + ExplorerStyle::List => false, + ExplorerStyle::Tree => true, + } + } +} + +impl Default for ExplorerConfig { + fn default() -> Self { + Self { + style: ExplorerStyle::Tree, + position: ExplorerPosition::Overlay, + column_width: 30, + } + } +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case", default, deny_unknown_fields)] pub struct Config { @@ -166,6 +229,8 @@ pub struct Config { pub indent_guides: IndentGuidesConfig, /// Whether to color modes with different colors. Defaults to `false`. pub color_modes: bool, + /// explore config + pub explorer: ExplorerConfig, } #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] @@ -549,6 +614,7 @@ impl Default for Config { whitespace: WhitespaceConfig::default(), indent_guides: IndentGuidesConfig::default(), color_modes: false, + explorer: ExplorerConfig::default(), } } } diff --git a/runtime/themes/autumn.toml b/runtime/themes/autumn.toml index d9c2f8a6..b0a8c5e1 100644 --- a/runtime/themes/autumn.toml +++ b/runtime/themes/autumn.toml @@ -68,6 +68,12 @@ "warning" = "my_yellow2" "error" = "my_red" +"ui.explorer.file" = { fg = "my_white" } +"ui.explorer.dir" = { fg = "my_yellow1" } +"ui.explorer.exe" = { fg = "my_green" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { modifiers = ["reversed"] } + [palette] my_black = "#212121" # Cursorline my_gray0 = "#262626" # Default Background diff --git a/runtime/themes/base16_default_dark.toml b/runtime/themes/base16_default_dark.toml index 460e7363..b8b2108a 100644 --- a/runtime/themes/base16_default_dark.toml +++ b/runtime/themes/base16_default_dark.toml @@ -54,6 +54,12 @@ "warning" = "base09" "error" = "base08" +"ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "base0D" } +"ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base02" } + [palette] base00 = "#181818" # Default Background base01 = "#282828" # Lighter Background (Used for status bars, line number and folding marks) diff --git a/runtime/themes/base16_default_light.toml b/runtime/themes/base16_default_light.toml index 6874c39e..e23bafeb 100644 --- a/runtime/themes/base16_default_light.toml +++ b/runtime/themes/base16_default_light.toml @@ -54,6 +54,12 @@ "warning" = "base09" "error" = "base08" +"ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "base0D" } +"ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base02" } + [palette] base00 = "#f8f8f8" # Default Background base01 = "#e8e8e8" # Lighter Background (Used for status bars, line number and folding marks) diff --git a/runtime/themes/base16_terminal.toml b/runtime/themes/base16_terminal.toml index 1f5328dc..f08a2c83 100644 --- a/runtime/themes/base16_terminal.toml +++ b/runtime/themes/base16_terminal.toml @@ -50,3 +50,9 @@ "debug" = "gray" "warning" = "yellow" "error" = "light-red" + +# "ui.explorer.file" = { fg = "base05" } +"ui.explorer.dir" = { fg = "light-blue" } +# "ui.explorer.exe" = { fg = "base05" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-gray" } diff --git a/runtime/themes/bogster.toml b/runtime/themes/bogster.toml index 76e24648..a57f6451 100644 --- a/runtime/themes/bogster.toml +++ b/runtime/themes/bogster.toml @@ -70,3 +70,9 @@ # make diagnostic underlined, to distinguish with selection text. diagnostic = { modifiers = ["underlined"] } + +"ui.explorer.file" = { fg = "#e5ded6" } +"ui.explorer.dir" = { fg = "#59dcd8" } +"ui.explorer.exe" = { fg = "#e5ded6" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#313f4e" } diff --git a/runtime/themes/boo_berry.toml b/runtime/themes/boo_berry.toml index 1509a1dc..a7536b06 100644 --- a/runtime/themes/boo_berry.toml +++ b/runtime/themes/boo_berry.toml @@ -57,6 +57,12 @@ "hint" = { fg = "lilac" } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "lilac" } +"ui.explorer.dir" = { fg = "mint" } +"ui.explorer.exe" = { fg = "lilac" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "berry_saturated" } + [palette] berry = "#3A2A4D" berry_saturated = "#2B1C3D" diff --git a/runtime/themes/dark_plus.toml b/runtime/themes/dark_plus.toml index 451c28b5..c0588194 100644 --- a/runtime/themes/dark_plus.toml +++ b/runtime/themes/dark_plus.toml @@ -90,6 +90,12 @@ diagnostic = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "dark_blue2" } + [palette] white = "#ffffff" orange = "#ce9178" diff --git a/runtime/themes/dracula.toml b/runtime/themes/dracula.toml index e3f5c625..139d9c67 100644 --- a/runtime/themes/dracula.toml +++ b/runtime/themes/dracula.toml @@ -54,6 +54,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "secondary_highlight" } + [palette] background = "#282a36" background_dark = "#21222c" diff --git a/runtime/themes/dracula_at_night.toml b/runtime/themes/dracula_at_night.toml index 776641a7..59ec273a 100644 --- a/runtime/themes/dracula_at_night.toml +++ b/runtime/themes/dracula_at_night.toml @@ -53,6 +53,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "foreground" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "comment" } + [palette] background = "#0e1419" background_dark = "#21222c" diff --git a/runtime/themes/everforest_dark.toml b/runtime/themes/everforest_dark.toml index ef74ea9e..892da1b2 100644 --- a/runtime/themes/everforest_dark.toml +++ b/runtime/themes/everforest_dark.toml @@ -78,6 +78,11 @@ "error" = "red" "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "grey1" } [palette] diff --git a/runtime/themes/everforest_light.toml b/runtime/themes/everforest_light.toml index 60557ba0..bf52688c 100644 --- a/runtime/themes/everforest_light.toml +++ b/runtime/themes/everforest_light.toml @@ -78,6 +78,11 @@ "error" = "red" "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "grey1" } [palette] diff --git a/runtime/themes/gruvbox.toml b/runtime/themes/gruvbox.toml index 00ec2a8c..54955942 100644 --- a/runtime/themes/gruvbox.toml +++ b/runtime/themes/gruvbox.toml @@ -67,6 +67,12 @@ "markup.link.text" = "red1" "markup.raw" = "red1" +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "blue0" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#282828" # main background bg1 = "#3c3836" diff --git a/runtime/themes/gruvbox_light.toml b/runtime/themes/gruvbox_light.toml index a4817b48..c2c32c53 100644 --- a/runtime/themes/gruvbox_light.toml +++ b/runtime/themes/gruvbox_light.toml @@ -68,6 +68,12 @@ "markup.link.text" = "red1" "markup.raw" = "red1" +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "blue0" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#fbf1c7" # main background bg1 = "#ebdbb2" diff --git a/runtime/themes/ingrid.toml b/runtime/themes/ingrid.toml index 58713704..6487567b 100644 --- a/runtime/themes/ingrid.toml +++ b/runtime/themes/ingrid.toml @@ -64,3 +64,9 @@ "error" = "#D74E50" "info" = "#839A53" "hint" = "#A6B6CE" + +"ui.explorer.file" = { fg = "#7B91B3" } +"ui.explorer.dir" = { fg = "#89BEB7" } +"ui.explorer.exe" = { fg = "#7B91B3" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#F3EAE9" } diff --git a/runtime/themes/monokai.toml b/runtime/themes/monokai.toml index 2d11601c..6462bc16 100644 --- a/runtime/themes/monokai.toml +++ b/runtime/themes/monokai.toml @@ -85,6 +85,12 @@ diagnostic = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "fn_declaration" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "#75715e" } + [palette] type = "#A6E22E" keyword = "#F92672" diff --git a/runtime/themes/monokai_pro.toml b/runtime/themes/monokai_pro.toml index 7c457d45..4ac2649f 100644 --- a/runtime/themes/monokai_pro.toml +++ b/runtime/themes/monokai_pro.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff6188" diff --git a/runtime/themes/monokai_pro_machine.toml b/runtime/themes/monokai_pro_machine.toml index bfc7031d..bfa7bbdf 100644 --- a/runtime/themes/monokai_pro_machine.toml +++ b/runtime/themes/monokai_pro_machine.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff6d7e" diff --git a/runtime/themes/monokai_pro_octagon.toml b/runtime/themes/monokai_pro_octagon.toml index 889e7624..bf291e1e 100644 --- a/runtime/themes/monokai_pro_octagon.toml +++ b/runtime/themes/monokai_pro_octagon.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#ff657a" diff --git a/runtime/themes/monokai_pro_ristretto.toml b/runtime/themes/monokai_pro_ristretto.toml index f8ad8422..1d4c3962 100644 --- a/runtime/themes/monokai_pro_ristretto.toml +++ b/runtime/themes/monokai_pro_ristretto.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#fd6883" diff --git a/runtime/themes/monokai_pro_spectrum.toml b/runtime/themes/monokai_pro_spectrum.toml index 9f5864fc..ae8a87c6 100644 --- a/runtime/themes/monokai_pro_spectrum.toml +++ b/runtime/themes/monokai_pro_spectrum.toml @@ -95,6 +95,12 @@ diagnostic = { modifiers = ["underlined"] } "markup.link.text" = "yellow" "markup.quote" = "green" +"ui.explorer.file" = { fg = "base8" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base8" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base4" } + [palette] # primary colors "red" = "#fc618d" diff --git a/runtime/themes/night_owl.toml b/runtime/themes/night_owl.toml index 55b09fbc..ba52e3cd 100644 --- a/runtime/themes/night_owl.toml +++ b/runtime/themes/night_owl.toml @@ -87,6 +87,12 @@ 'diff.delta' = { fg = 'blue' } 'diff.delta.moved' = { fg = 'blue', modifiers = ['italic'] } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "selection" } + [palette] background = '#011627' background2 = '#112630' diff --git a/runtime/themes/nord.toml b/runtime/themes/nord.toml index 2df30814..4e0636c6 100644 --- a/runtime/themes/nord.toml +++ b/runtime/themes/nord.toml @@ -105,6 +105,12 @@ "diff.delta" = "nord12" "diff.minus" = "nord11" +"ui.explorer.file" = { fg = "nord6" } +"ui.explorer.dir" = { fg = "nord8" } +"ui.explorer.exe" = { fg = "nord6" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "nord2" } + [palette] nord0 = "#2e3440" nord1 = "#3b4252" diff --git a/runtime/themes/onedark.toml b/runtime/themes/onedark.toml index 3beb962f..16eab897 100644 --- a/runtime/themes/onedark.toml +++ b/runtime/themes/onedark.toml @@ -78,6 +78,12 @@ diagnostic = { modifiers = ["underlined"] } "ui.menu.selected" = { fg = "black", bg = "blue" } "ui.menu.scroll" = { fg = "white", bg = "light-gray" } +"ui.explorer.file" = { fg = "white" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "white" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-gray" } + [palette] yellow = "#E5C07B" diff --git a/runtime/themes/onelight.toml b/runtime/themes/onelight.toml index a21c8ba2..07f58342 100644 --- a/runtime/themes/onelight.toml +++ b/runtime/themes/onelight.toml @@ -106,6 +106,12 @@ "ui.menu" = { fg = "black", bg = "light-white" } "ui.menu.selected" = { fg = "white", bg = "light-blue" } +"ui.explorer.file" = { fg = "black" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "black" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "light-white" } + [palette] white = "#FAFAFA" yellow = "#A06600" diff --git a/runtime/themes/pop-dark.toml b/runtime/themes/pop-dark.toml index 4d501a20..f730c3ce 100644 --- a/runtime/themes/pop-dark.toml +++ b/runtime/themes/pop-dark.toml @@ -120,6 +120,12 @@ namespace = { fg = 'orangeL' } 'diff.delta' = { fg = '#4d4ddd' } 'diff.delta.moved' = { fg = '#dd4ddd' } +"ui.explorer.file" = { fg = "greyT" } +"ui.explorer.dir" = { fg = "blueL" } +"ui.explorer.exe" = { fg = "greyT" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "greyL" } + [palette] white = '#FFFFFF' greyH = '#CFCFCF' diff --git a/runtime/themes/rose_pine.toml b/runtime/themes/rose_pine.toml index 1e494946..81feff11 100644 --- a/runtime/themes/rose_pine.toml +++ b/runtime/themes/rose_pine.toml @@ -65,6 +65,12 @@ "markup.quote" = { fg = "rose" } "markup.raw" = { fg = "foam" } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "rose" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "highlight" } + [palette] base = "#191724" surface = "#1f1d2e" diff --git a/runtime/themes/rose_pine_dawn.toml b/runtime/themes/rose_pine_dawn.toml index b28f6412..ccf088fc 100644 --- a/runtime/themes/rose_pine_dawn.toml +++ b/runtime/themes/rose_pine_dawn.toml @@ -62,6 +62,12 @@ "markup.quote" = { fg = "rose" } "markup.raw" = { fg = "foam" } +"ui.explorer.file" = { fg = "text" } +"ui.explorer.dir" = { fg = "rose" } +"ui.explorer.exe" = { fg = "text" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "highlight" } + [palette] base = "#faf4ed" surface = "#fffaf3" diff --git a/runtime/themes/serika-dark.toml b/runtime/themes/serika-dark.toml index e13c2f87..a2f292ab 100644 --- a/runtime/themes/serika-dark.toml +++ b/runtime/themes/serika-dark.toml @@ -70,6 +70,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "fg" } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] bg0 = "#323437" diff --git a/runtime/themes/serika-light.toml b/runtime/themes/serika-light.toml index c0a4b8d8..58ef86f4 100644 --- a/runtime/themes/serika-light.toml +++ b/runtime/themes/serika-light.toml @@ -70,6 +70,11 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "fg" } +"ui.explorer.file" = { fg = "fg" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "fg" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } [palette] diff --git a/runtime/themes/solarized_dark.toml b/runtime/themes/solarized_dark.toml index aa6dbbf8..1bc5f82e 100644 --- a/runtime/themes/solarized_dark.toml +++ b/runtime/themes/solarized_dark.toml @@ -101,6 +101,12 @@ "hint" = { fg = "base01", modifiers= ["bold", "underlined"] } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "base1" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base0175" } + [palette] # 深色 越来越深 base03 = "#002b36" diff --git a/runtime/themes/solarized_light.toml b/runtime/themes/solarized_light.toml index 79fd8364..d22d6381 100644 --- a/runtime/themes/solarized_light.toml +++ b/runtime/themes/solarized_light.toml @@ -118,6 +118,12 @@ "hint" = { fg = "base01", modifiers= ["bold", "underlined"] } "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "base1" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "base1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "base0175" } + [palette] red = '#dc322f' green = '#859900' diff --git a/runtime/themes/spacebones_light.toml b/runtime/themes/spacebones_light.toml index e12ef285..30de53cf 100644 --- a/runtime/themes/spacebones_light.toml +++ b/runtime/themes/spacebones_light.toml @@ -73,6 +73,12 @@ "diagnostic" = { modifiers = ["underlined"] } +"ui.explorer.file" = { fg = "fg1" } +"ui.explorer.dir" = { fg = "#715ab1" } +"ui.explorer.exe" = { fg = "fg1" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "bg3" } + [palette] base = "#655370" base-dim = "#a094a2" diff --git a/runtime/themes/tokyonight.toml b/runtime/themes/tokyonight.toml index 4f1ea1cf..b6c16458 100644 --- a/runtime/themes/tokyonight.toml +++ b/runtime/themes/tokyonight.toml @@ -63,6 +63,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "cyan" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "background_highlight" } + [palette] red = "#f7768e" orange = "#ff9e64" diff --git a/runtime/themes/tokyonight_storm.toml b/runtime/themes/tokyonight_storm.toml index c47ac54b..9da56546 100644 --- a/runtime/themes/tokyonight_storm.toml +++ b/runtime/themes/tokyonight_storm.toml @@ -63,6 +63,12 @@ "markup.quote" = { fg = "yellow", modifiers = ["italic"] } "markup.raw" = { fg = "cyan" } +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "blue" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "background_highlight" } + [palette] red = "#f7768e" orange = "#ff9e64" -- 2.38.5 From aec001ad84e50d3e1eb52136b024052c1360a49f Mon Sep 17 00:00:00 2001 From: cossonleo Date: Sat, 10 Sep 2022 22:53:32 +0800 Subject: [PATCH 12/54] completion fix --- helix-term/src/commands.rs | 83 ++++++++++++++++++++++++--------- helix-term/src/ui/completion.rs | 10 ++++ helix-term/src/ui/editor.rs | 23 ++++----- helix-view/src/document.rs | 9 ++-- helix-view/src/editor.rs | 4 ++ 5 files changed, 90 insertions(+), 39 deletions(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index e869446e..87bac766 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -2887,13 +2887,11 @@ pub mod insert { super::completion(cx); } - fn language_server_completion(cx: &mut Context, ch: char) { + pub fn is_server_trigger_char(doc: &Document, ch: char) -> bool { use helix_lsp::lsp; - // if ch matches completion char, trigger completion - let doc = doc_mut!(cx.editor); let language_server = match doc.language_server() { Some(language_server) => language_server, - None => return, + None => return false, }; let capabilities = language_server.capabilities(); @@ -2903,11 +2901,35 @@ pub mod insert { .. }) = &capabilities.completion_provider { - // TODO: what if trigger is multiple chars long - if triggers.iter().any(|trigger| trigger.contains(ch)) { - cx.editor.clear_idle_timer(); - super::completion(cx); + triggers.iter().any(|trigger| trigger.contains(ch)) + } else { + false + } + } + + fn language_server_completion(cx: &mut Context, ch: char) { + use helix_core::chars::char_is_word; + + let config = cx.editor.config(); + if !config.auto_completion { + return; + } + let (view, doc) = current_ref!(cx.editor); + if char_is_word(ch) && doc.savepoint.is_none() { + let text = doc.text().slice(..); + let cursor = doc.selection(view.id).primary().cursor(text); + let mut iter = text.chars_at(cursor); + iter.reverse(); + for _ in 0..config.completion_trigger_len { + if iter.next().map_or(true, |c| !char_is_word(c)) { + return; + } } + cx.editor.reset_idle_timer(); + return; + } + if is_server_trigger_char(doc, ch) { + cx.editor.reset_idle_timer_zero(); } } @@ -3819,6 +3841,13 @@ pub fn completion(cx: &mut Context) { let pos = pos_to_lsp_pos(doc.text(), cursor, offset_encoding); let future = language_server.completion(doc.identifier(), pos, None); + let future = async move { + match future.await { + Ok(v) => Ok(v), + Err(helix_lsp::Error::Timeout) => Ok(serde_json::Value::Null), + Err(e) => Err(e), + } + }; let trigger_offset = cursor; @@ -3832,11 +3861,21 @@ pub fn completion(cx: &mut Context) { let start_offset = cursor.saturating_sub(offset); let prefix = text.slice(start_offset..cursor).to_string(); + doc.savepoint(); + let trigger_version = doc.version(); cx.callback( future, move |editor, compositor, response: Option| { + let doc = doc_mut!(editor); + let savepoint = match doc.savepoint.take() { + Some(s) => s, + None => return, + }; if editor.mode != Mode::Insert { - // we're not in insert mode anymore + return; + } + if savepoint.0 != trigger_version { + doc.savepoint = Some(savepoint); return; } @@ -3847,25 +3886,27 @@ pub fn completion(cx: &mut Context) { is_incomplete: _is_incomplete, items, })) => items, - None => Vec::new(), + None => { + editor.set_status( + "The completion response is none and will request server again", + ); + editor.reset_idle_timer(); + return; + } }; if !prefix.is_empty() { - items = items - .into_iter() - .filter(|item| { - item.filter_text - .as_ref() - .unwrap_or(&item.label) - .starts_with(&prefix) - }) - .collect(); - } + items.retain(|item| match &item.filter_text { + Some(t) => t.starts_with(&prefix), + None => item.label.starts_with(&prefix), + }); + }; if items.is_empty() { - // editor.set_error("No completion available"); + // editor.set_error("No completion available".to_string()); return; } + doc.savepoint = Some(savepoint); let size = compositor.size(); let ui = compositor.find::().unwrap(); ui.set_completion( diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs index 2d7d4f92..a2d71ca4 100644 --- a/helix-term/src/ui/completion.rs +++ b/helix-term/src/ui/completion.rs @@ -394,6 +394,16 @@ impl Component for Completion { height = rel_height.min(height); } Rect::new(x, y, width, height) + } else if popup_x > 30 { + let mut height = area.height.saturating_sub(popup_y); + let mut width = popup_x; + if let Some((rel_width, rel_height)) = markdown_doc.required_size((width, height)) { + width = rel_width.min(width); + height = rel_height.min(height); + } + let x = popup_x - width; + let y = popup_y; + Rect::new(x, y, width, height) } else { let half = area.height / 2; let height = 15.min(half); diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 7cb29c3b..eeeb9a9f 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -851,7 +851,7 @@ impl EditorView { } (Mode::Insert, Mode::Normal) => { // if exiting insert mode, remove completion - self.completion = None; + self.clear_completion(cxt.editor); // TODO: Use an on_mode_change hook to remove signature help cxt.jobs.callback(async { @@ -985,9 +985,6 @@ impl EditorView { return; } - // Immediately initialize a savepoint - doc_mut!(editor).savepoint(); - editor.last_completion = None; self.last_insert.1.push(InsertEvent::TriggerCompletion); @@ -1006,23 +1003,20 @@ impl EditorView { } pub fn handle_idle_timeout(&mut self, cx: &mut crate::compositor::Context) -> EventResult { - if self.completion.is_some() - || cx.editor.mode != Mode::Insert - || !cx.editor.config().auto_completion - { + let config = cx.editor.config(); + if cx.editor.mode != Mode::Insert || !config.auto_completion { return EventResult::Ignored(None); } - let mut cx = commands::Context { + self.clear_completion(cx.editor); + commands::completion(&mut commands::Context { register: None, editor: cx.editor, jobs: cx.jobs, count: None, callback: None, on_next_key_callback: None, - }; - crate::commands::insert::idle_completion(&mut cx); - + }); EventResult::Consumed(None) } } @@ -1246,7 +1240,7 @@ impl Component for EditorView { EventResult::Consumed(None) } Event::Key(mut key) => { - cx.editor.reset_idle_timer(); + cx.editor.clear_idle_timer(); canonicalize_key(&mut key); // clear status @@ -1298,7 +1292,8 @@ impl Component for EditorView { if let Some(completion) = &mut self.completion { completion.update(&mut cx); if completion.is_empty() { - self.clear_completion(cx.editor); + self.completion = None; + doc_mut!(cx.editor).savepoint = None; } } } diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 8ebc9002..4b7f89b1 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -112,7 +112,7 @@ pub struct Document { // be more troublesome. pub history: Cell, - pub savepoint: Option, + pub savepoint: Option<(i32, Transaction)>, last_saved_revision: usize, version: i32, // should be usize? @@ -768,7 +768,8 @@ impl Document { if self.savepoint.is_some() { take_with(&mut self.savepoint, |prev_revert| { let revert = transaction.invert(&old_doc); - Some(revert.compose(prev_revert.unwrap())) + let (version, prev_revert) = prev_revert.unwrap(); + Some((version, revert.compose(prev_revert))) }); } @@ -856,11 +857,11 @@ impl Document { } pub fn savepoint(&mut self) { - self.savepoint = Some(Transaction::new(self.text())); + self.savepoint = Some((self.version, Transaction::new(self.text()))); } pub fn restore(&mut self, view_id: ViewId) { - if let Some(revert) = self.savepoint.take() { + if let Some((_, revert)) = self.savepoint.take() { self.apply(&revert, view_id); } } diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 5eff9983..fc8c0c11 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -763,6 +763,10 @@ impl Editor { .reset(Instant::now() + config.idle_timeout); } + pub fn reset_idle_timer_zero(&mut self) { + self.idle_timer.as_mut().reset(Instant::now()); + } + pub fn clear_status(&mut self) { self.status_msg = None; } -- 2.38.5 From 3cec10e1b1cd5938d59b1107e9435e60e1e52414 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 17 Sep 2022 16:19:36 +0200 Subject: [PATCH 13/54] Fix missing error variant --- helix-lsp/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs index aec6b3e6..b5f5eace 100644 --- a/helix-lsp/src/lib.rs +++ b/helix-lsp/src/lib.rs @@ -38,6 +38,8 @@ pub enum Error { Timeout, #[error("server closed the stream")] StreamClosed, + #[error("LPS not defined")] + LspNotDefined, #[error("Unhandled")] Unhandled, #[error(transparent)] -- 2.38.5 From 233aa1c023ede6dd408a34f214a9f2dfe1a562fa Mon Sep 17 00:00:00 2001 From: trivernis Date: Mon, 19 Sep 2022 17:48:39 +0200 Subject: [PATCH 14/54] Change keybinds of workspace command picker --- helix-term/src/keymap/default.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 5dbdefff..07d0913e 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -232,7 +232,8 @@ pub fn default() -> HashMap { "e" => dap_enable_exceptions, "E" => dap_disable_exceptions, }, - "w" => { "Window" + "w" => workspace_command_picker, + "v" => { "Window" "C-w" | "w" => rotate_view, "C-s" | "s" => hsplit, "C-v" | "v" => vsplit, -- 2.38.5 From 6d245dd3d69e0e8b72f3adca91a1a9e25d29a19a Mon Sep 17 00:00:00 2001 From: trivernis Date: Mon, 19 Sep 2022 17:55:20 +0200 Subject: [PATCH 15/54] Update README Signed-off-by: trivernis --- README.md | 4 +++- helix-term/src/keymap/default.rs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ff0699c6..193f6de8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Helix +# Helix Plus + +

This is an unstable fork of helix with some PRs merged and some merge conflicts resolved

[![Build status](https://github.com/helix-editor/helix/actions/workflows/build.yml/badge.svg)](https://github.com/helix-editor/helix/actions) diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 07d0913e..563b9bde 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -169,7 +169,7 @@ pub fn default() -> HashMap { "C-u" => half_page_up, "C-d" => half_page_down, - "C-w" => { "Window" + "C-v" => { "View" "C-w" | "w" => rotate_view, "C-s" | "s" => hsplit, "C-v" | "v" => vsplit, @@ -233,7 +233,7 @@ pub fn default() -> HashMap { "E" => dap_disable_exceptions, }, "w" => workspace_command_picker, - "v" => { "Window" + "v" => { "View" "C-w" | "w" => rotate_view, "C-s" | "s" => hsplit, "C-v" | "v" => vsplit, -- 2.38.5 From 63a879d156f75d58e4912805a6c838d545b39502 Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 20 Sep 2022 19:29:56 +0200 Subject: [PATCH 16/54] Add hint to README --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 193f6de8..aab3fb84 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,15 @@

This is an unstable fork of helix with some PRs merged and some merge conflicts resolved

+# Merged PRs + + - [File explorer and tree helper](https://github.com/helix-editor/helix/pull/2377) + - [Add LSP workspace command picker](https://github.com/helix-editor/helix/pull/3140) + +And others I forgot about... + +- - - + [![Build status](https://github.com/helix-editor/helix/actions/workflows/build.yml/badge.svg)](https://github.com/helix-editor/helix/actions) ![Screenshot](./screenshot.png) -- 2.38.5 From eec845cc34075b3fe99f096b7de18a5fdad930ac Mon Sep 17 00:00:00 2001 From: Roland Singer Date: Wed, 21 Sep 2022 10:20:40 +0200 Subject: [PATCH 17/54] adjusted explorer to new helix code --- helix-term/src/ui/explore.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs index d2978c8b..8ef51d43 100644 --- a/helix-term/src/ui/explore.rs +++ b/helix-term/src/ui/explore.rs @@ -569,7 +569,7 @@ impl Explorer { } key!(Esc) | ctrl!('c') => self.tree.restore_recycle(), _ => { - if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + if let EventResult::Consumed(_) = prompt.handle_event(&Event::Key(event), cx) { self.tree.filter(prompt.line(), cx, &mut self.state); } self.prompt = Some((action, prompt)); @@ -616,7 +616,7 @@ impl Explorer { } key!(Esc) | ctrl!('c') => self.tree.restore_view(), _ => { - if let EventResult::Consumed(_) = prompt.handle_event(Event::Key(event), cx) { + if let EventResult::Consumed(_) = prompt.handle_event(&Event::Key(event), cx) { if search_next { self.tree.search_next(cx, prompt.line(), &mut self.state); } else { @@ -672,7 +672,7 @@ impl Explorer { } (_, key!(Esc) | ctrl!('c')) => {} _ => { - prompt.handle_event(Event::Key(event), cx); + prompt.handle_event(&Event::Key(event), cx); self.prompt = Some((action, prompt)); } } @@ -714,9 +714,9 @@ impl Explorer { impl Component for Explorer { /// Process input events, return true if handled. - fn handle_event(&mut self, event: Event, cx: &mut Context) -> EventResult { + fn handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult { let key_event = match event { - Event::Key(event) => event, + Event::Key(event) => *event, Event::Resize(..) => return EventResult::Consumed(None), _ => return EventResult::Ignored(None), }; -- 2.38.5 From 3d987c07035d014344d44c974896a8eeb61aaa6a Mon Sep 17 00:00:00 2001 From: Roland Singer Date: Wed, 21 Sep 2022 12:13:31 +0200 Subject: [PATCH 18/54] removed match --- helix-view/src/editor.rs | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 61bb96e2..dc71e65a 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -134,31 +134,19 @@ pub struct ExplorerConfig { impl ExplorerConfig { pub fn is_embed(&self) -> bool { - match self.position { - ExplorerPosition::Embed => true, - ExplorerPosition::Overlay => false, - } + return self.position == ExplorerPosition::Embed; } pub fn is_overlay(&self) -> bool { - match self.position { - ExplorerPosition::Embed => false, - ExplorerPosition::Overlay => true, - } + return self.position == ExplorerPosition::Overlay; } pub fn is_list(&self) -> bool { - match self.style { - ExplorerStyle::List => true, - ExplorerStyle::Tree => false, - } + return self.style == ExplorerStyle::List; } pub fn is_tree(&self) -> bool { - match self.style { - ExplorerStyle::List => false, - ExplorerStyle::Tree => true, - } + return self.style == ExplorerStyle::Tree; } } -- 2.38.5 From 83f81c730aa63b947b161ba601ae140daf787d07 Mon Sep 17 00:00:00 2001 From: trivernis Date: Wed, 21 Sep 2022 18:42:26 +0200 Subject: [PATCH 19/54] Fix README indentation Signed-off-by: trivernis --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bffedff4..8a980e7f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ # Merged PRs - [File explorer and tree helper](https://github.com/helix-editor/helix/pull/2377) - - [with Icons](https://github.com/r0l1/helix/tree/tree_explorer_icons) + - [with Icons](https://github.com/r0l1/helix/tree/tree_explorer_icons) - [Add LSP workspace command picker](https://github.com/helix-editor/helix/pull/3140) And others I forgot about... -- 2.38.5 From 4487f144bddbbab4061284c404537984e4fac4b2 Mon Sep 17 00:00:00 2001 From: trivernis Date: Wed, 21 Sep 2022 18:45:45 +0200 Subject: [PATCH 20/54] Swap screenshot in README Signed-off-by: trivernis --- helix-lsp/src/lib.rs.orig | 621 ------- helix-term/src/commands/typed.rs.orig | 2130 ------------------------- screenshot.png | Bin 367553 -> 277444 bytes 3 files changed, 2751 deletions(-) delete mode 100644 helix-lsp/src/lib.rs.orig delete mode 100644 helix-term/src/commands/typed.rs.orig diff --git a/helix-lsp/src/lib.rs.orig b/helix-lsp/src/lib.rs.orig deleted file mode 100644 index 697ff719..00000000 --- a/helix-lsp/src/lib.rs.orig +++ /dev/null @@ -1,621 +0,0 @@ -mod client; -pub mod jsonrpc; -mod transport; - -pub use client::Client; -pub use futures_executor::block_on; -pub use jsonrpc::Call; -pub use lsp::{Position, Url}; -pub use lsp_types as lsp; - -use futures_util::stream::select_all::SelectAll; -use helix_core::syntax::LanguageConfiguration; - -use std::{ - collections::HashMap, - sync::{ - atomic::{AtomicUsize, Ordering}, - Arc, - }, -}; - -use serde::{Deserialize, Serialize}; -use thiserror::Error; -use tokio_stream::wrappers::UnboundedReceiverStream; - -pub type Result = core::result::Result; -type LanguageId = String; - -#[derive(Error, Debug)] -pub enum Error { - #[error("protocol error: {0}")] - Rpc(#[from] jsonrpc::Error), - #[error("failed to parse: {0}")] - Parse(#[from] serde_json::Error), - #[error("IO Error: {0}")] - IO(#[from] std::io::Error), - #[error("request timed out")] - Timeout, - #[error("server closed the stream")] - StreamClosed, - #[error("LSP not defined")] - LspNotDefined, - #[error("Unhandled")] - Unhandled, - #[error(transparent)] - Other(#[from] anyhow::Error), -} - -#[derive(Clone, Copy, Debug, Serialize, Deserialize)] -pub enum OffsetEncoding { - /// UTF-8 code units aka bytes - #[serde(rename = "utf-8")] - Utf8, - /// UTF-16 code units - #[serde(rename = "utf-16")] - Utf16, -} - -pub mod util { - use super::*; - use helix_core::{Range, Rope, Transaction}; - - /// Converts a diagnostic in the document to [`lsp::Diagnostic`]. - /// - /// Panics when [`pos_to_lsp_pos`] would for an invalid range on the diagnostic. - pub fn diagnostic_to_lsp_diagnostic( - doc: &Rope, - diag: &helix_core::diagnostic::Diagnostic, - offset_encoding: OffsetEncoding, - ) -> lsp::Diagnostic { - use helix_core::diagnostic::Severity::*; - - let range = Range::new(diag.range.start, diag.range.end); - let severity = diag.severity.map(|s| match s { - Hint => lsp::DiagnosticSeverity::HINT, - Info => lsp::DiagnosticSeverity::INFORMATION, - Warning => lsp::DiagnosticSeverity::WARNING, - Error => lsp::DiagnosticSeverity::ERROR, - }); - - // TODO: add support for Diagnostic.data - lsp::Diagnostic::new( - range_to_lsp_range(doc, range, offset_encoding), - severity, - None, - None, - diag.message.to_owned(), - None, - None, - ) - } - - /// Converts [`lsp::Position`] to a position in the document. - /// - /// Returns `None` if position exceeds document length or an operation overflows. - pub fn lsp_pos_to_pos( - doc: &Rope, - pos: lsp::Position, - offset_encoding: OffsetEncoding, - ) -> Option { - let pos_line = pos.line as usize; - if pos_line > doc.len_lines() - 1 { - return None; - } - - match offset_encoding { - OffsetEncoding::Utf8 => { - let line = doc.line_to_char(pos_line); - let pos = line.checked_add(pos.character as usize)?; - if pos <= doc.len_chars() { - Some(pos) - } else { - None - } - } - OffsetEncoding::Utf16 => { - let line = doc.line_to_char(pos_line); - let line_start = doc.char_to_utf16_cu(line); - let pos = line_start.checked_add(pos.character as usize)?; - doc.try_utf16_cu_to_char(pos).ok() - } - } - } - - /// Converts position in the document to [`lsp::Position`]. - /// - /// Panics when `pos` is out of `doc` bounds or operation overflows. - pub fn pos_to_lsp_pos( - doc: &Rope, - pos: usize, - offset_encoding: OffsetEncoding, - ) -> lsp::Position { - match offset_encoding { - OffsetEncoding::Utf8 => { - let line = doc.char_to_line(pos); - let line_start = doc.line_to_char(line); - let col = pos - line_start; - - lsp::Position::new(line as u32, col as u32) - } - OffsetEncoding::Utf16 => { - let line = doc.char_to_line(pos); - let line_start = doc.char_to_utf16_cu(doc.line_to_char(line)); - let col = doc.char_to_utf16_cu(pos) - line_start; - - lsp::Position::new(line as u32, col as u32) - } - } - } - - /// Converts a range in the document to [`lsp::Range`]. - pub fn range_to_lsp_range( - doc: &Rope, - range: Range, - offset_encoding: OffsetEncoding, - ) -> lsp::Range { - let start = pos_to_lsp_pos(doc, range.from(), offset_encoding); - let end = pos_to_lsp_pos(doc, range.to(), offset_encoding); - - lsp::Range::new(start, end) - } - - pub fn lsp_range_to_range( - doc: &Rope, - range: lsp::Range, - offset_encoding: OffsetEncoding, - ) -> Option { - let start = lsp_pos_to_pos(doc, range.start, offset_encoding)?; - let end = lsp_pos_to_pos(doc, range.end, offset_encoding)?; - - Some(Range::new(start, end)) - } - - pub fn generate_transaction_from_edits( - doc: &Rope, - mut edits: Vec, - offset_encoding: OffsetEncoding, - ) -> Transaction { - // Sort edits by start range, since some LSPs (Omnisharp) send them - // in reverse order. - edits.sort_unstable_by_key(|edit| edit.range.start); - - Transaction::change( - doc, - edits.into_iter().map(|edit| { - // simplify "" into None for cleaner changesets - let replacement = if !edit.new_text.is_empty() { - Some(edit.new_text.into()) - } else { - None - }; - - let start = - if let Some(start) = lsp_pos_to_pos(doc, edit.range.start, offset_encoding) { - start - } else { - return (0, 0, None); - }; - let end = if let Some(end) = lsp_pos_to_pos(doc, edit.range.end, offset_encoding) { - end - } else { - return (0, 0, None); - }; - (start, end, replacement) - }), - ) - } - - /// The result of asking the language server to format the document. This can be turned into a - /// `Transaction`, but the advantage of not doing that straight away is that this one is - /// `Send` and `Sync`. - #[derive(Clone, Debug)] - pub struct LspFormatting { - pub doc: Rope, - pub edits: Vec, - pub offset_encoding: OffsetEncoding, - } - - impl From for Transaction { - fn from(fmt: LspFormatting) -> Transaction { - generate_transaction_from_edits(&fmt.doc, fmt.edits, fmt.offset_encoding) - } - } -} - -#[derive(Debug, PartialEq, Clone)] -pub enum MethodCall { - WorkDoneProgressCreate(lsp::WorkDoneProgressCreateParams), - ApplyWorkspaceEdit(lsp::ApplyWorkspaceEditParams), - WorkspaceFolders, - WorkspaceConfiguration(lsp::ConfigurationParams), -} - -impl MethodCall { - pub fn parse(method: &str, params: jsonrpc::Params) -> Result { - use lsp::request::Request; - let request = match method { - lsp::request::WorkDoneProgressCreate::METHOD => { - let params: lsp::WorkDoneProgressCreateParams = params.parse()?; - Self::WorkDoneProgressCreate(params) - } - lsp::request::ApplyWorkspaceEdit::METHOD => { - let params: lsp::ApplyWorkspaceEditParams = params.parse()?; - Self::ApplyWorkspaceEdit(params) - } - lsp::request::WorkspaceFoldersRequest::METHOD => Self::WorkspaceFolders, - lsp::request::WorkspaceConfiguration::METHOD => { - let params: lsp::ConfigurationParams = params.parse()?; - Self::WorkspaceConfiguration(params) - } - _ => { - return Err(Error::Unhandled); - } - }; - Ok(request) - } -} - -#[derive(Debug, PartialEq, Clone)] -pub enum Notification { - // we inject this notification to signal the LSP is ready - Initialized, - PublishDiagnostics(lsp::PublishDiagnosticsParams), - ShowMessage(lsp::ShowMessageParams), - LogMessage(lsp::LogMessageParams), - ProgressMessage(lsp::ProgressParams), -} - -impl Notification { - pub fn parse(method: &str, params: jsonrpc::Params) -> Result { - use lsp::notification::Notification as _; - - let notification = match method { - lsp::notification::Initialized::METHOD => Self::Initialized, - lsp::notification::PublishDiagnostics::METHOD => { - let params: lsp::PublishDiagnosticsParams = params.parse()?; - Self::PublishDiagnostics(params) - } - - lsp::notification::ShowMessage::METHOD => { - let params: lsp::ShowMessageParams = params.parse()?; - Self::ShowMessage(params) - } - lsp::notification::LogMessage::METHOD => { - let params: lsp::LogMessageParams = params.parse()?; - Self::LogMessage(params) - } - lsp::notification::Progress::METHOD => { - let params: lsp::ProgressParams = params.parse()?; - Self::ProgressMessage(params) - } - _ => { - return Err(Error::Unhandled); - } - }; - - Ok(notification) - } -} - -#[derive(Debug)] -pub struct Registry { - inner: HashMap)>, - - counter: AtomicUsize, - pub incoming: SelectAll>, -} - -impl Default for Registry { - fn default() -> Self { - Self::new() - } -} - -impl Registry { - pub fn new() -> Self { - Self { - inner: HashMap::new(), - counter: AtomicUsize::new(0), - incoming: SelectAll::new(), - } - } - - pub fn get_by_id(&self, id: usize) -> Option<&Client> { - self.inner - .values() - .find(|(client_id, _)| client_id == &id) - .map(|(_, client)| client.as_ref()) - } - - pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result> { - let config = match &language_config.language_server { - Some(config) => config, - None => return Err(Error::LspNotDefined), - }; - -<<<<<<< HEAD - match self.inner.entry(language_config.scope.clone()) { - Entry::Occupied(entry) => Ok(entry.get().1.clone()), - Entry::Vacant(entry) => { - // initialize a new client - let id = self.counter.fetch_add(1, Ordering::Relaxed); - let (client, incoming, initialize_notify) = Client::start( - &config.command, - &config.args, - language_config.config.clone(), - &language_config.roots, - id, - config.timeout, - )?; - self.incoming.push(UnboundedReceiverStream::new(incoming)); - let client = Arc::new(client); - - // Initialize the client asynchronously - let _client = client.clone(); - tokio::spawn(async move { - use futures_util::TryFutureExt; - let value = _client - .capabilities - .get_or_try_init(|| { - _client - .initialize() - .map_ok(|response| response.capabilities) - }) - .await; - - if let Err(e) = value { - log::error!("failed to initialize language server: {}", e); - return; - } - - // next up, notify - _client - .notify::(lsp::InitializedParams {}) - .await - .unwrap(); - - initialize_notify.notify_one(); - }); - - entry.insert((id, client.clone())); - Ok(client) - } -||||||| 4b1fe367 - match self.inner.entry(language_config.scope.clone()) { - Entry::Occupied(entry) => Ok(entry.get().1.clone()), - Entry::Vacant(entry) => { - // initialize a new client - let id = self.counter.fetch_add(1, Ordering::Relaxed); - let (client, incoming, initialize_notify) = Client::start( - &config.command, - &config.args, - language_config.config.clone(), - &language_config.roots, - id, - )?; - self.incoming.push(UnboundedReceiverStream::new(incoming)); - let client = Arc::new(client); - - // Initialize the client asynchronously - let _client = client.clone(); - tokio::spawn(async move { - use futures_util::TryFutureExt; - let value = _client - .capabilities - .get_or_try_init(|| { - _client - .initialize() - .map_ok(|response| response.capabilities) - }) - .await; - - if let Err(e) = value { - log::error!("failed to initialize language server: {}", e); - return; - } - - // next up, notify - _client - .notify::(lsp::InitializedParams {}) - .await - .unwrap(); - - initialize_notify.notify_one(); - }); - - entry.insert((id, client.clone())); - Ok(client) - } -======= - if let Some((_, client)) = self.inner.get(&language_config.scope) { - Ok(client.clone()) - } else { - let id = self.counter.fetch_add(1, Ordering::Relaxed); - let client = self.initialize_client(language_config, config, id)?; // initialize a new client - self.inner - .insert(language_config.scope.clone(), (id, client.clone())); - Ok(client) ->>>>>>> lsp-restart - } - } - - pub fn restart(&mut self, language_config: &LanguageConfiguration) -> Result> { - let config = language_config - .language_server - .as_ref() - .ok_or(Error::LspNotDefined)?; - let id = self - .inner - .get(&language_config.scope) - .ok_or(Error::LspNotDefined)? - .0; - let new_client = self.initialize_client(language_config, config, id)?; - let (_, client) = self - .inner - .get_mut(&language_config.scope) - .ok_or(Error::LspNotDefined)?; - *client = new_client; - - Ok(client.clone()) - } - - fn initialize_client( - &mut self, - language_config: &LanguageConfiguration, - config: &helix_core::syntax::LanguageServerConfiguration, - id: usize, - ) -> Result> { - let (client, incoming, initialize_notify) = Client::start( - &config.command, - &config.args, - language_config.config.clone(), - &language_config.roots, - id, - )?; - self.incoming.push(UnboundedReceiverStream::new(incoming)); - let client = Arc::new(client); - - // Initialize the client asynchronously - let _client = client.clone(); - tokio::spawn(async move { - use futures_util::TryFutureExt; - let value = _client - .capabilities - .get_or_try_init(|| { - _client - .initialize() - .map_ok(|response| response.capabilities) - }) - .await; - - if let Err(e) = value { - log::error!("failed to initialize language server: {}", e); - return; - } - - // next up, notify - _client - .notify::(lsp::InitializedParams {}) - .await - .unwrap(); - - initialize_notify.notify_one(); - }); - - Ok(client) - } - - pub fn iter_clients(&self) -> impl Iterator> { - self.inner.values().map(|(_, client)| client) - } -} - -#[derive(Debug)] -pub enum ProgressStatus { - Created, - Started(lsp::WorkDoneProgress), -} - -impl ProgressStatus { - pub fn progress(&self) -> Option<&lsp::WorkDoneProgress> { - match &self { - ProgressStatus::Created => None, - ProgressStatus::Started(progress) => Some(progress), - } - } -} - -#[derive(Default, Debug)] -/// Acts as a container for progress reported by language servers. Each server -/// has a unique id assigned at creation through [`Registry`]. This id is then used -/// to store the progress in this map. -pub struct LspProgressMap(HashMap>); - -impl LspProgressMap { - pub fn new() -> Self { - Self::default() - } - - /// Returns a map of all tokens corresponding to the language server with `id`. - pub fn progress_map(&self, id: usize) -> Option<&HashMap> { - self.0.get(&id) - } - - pub fn is_progressing(&self, id: usize) -> bool { - self.0.get(&id).map(|it| !it.is_empty()).unwrap_or_default() - } - - /// Returns last progress status for a given server with `id` and `token`. - pub fn progress(&self, id: usize, token: &lsp::ProgressToken) -> Option<&ProgressStatus> { - self.0.get(&id).and_then(|values| values.get(token)) - } - - /// Checks if progress `token` for server with `id` is created. - pub fn is_created(&mut self, id: usize, token: &lsp::ProgressToken) -> bool { - self.0 - .get(&id) - .map(|values| values.get(token).is_some()) - .unwrap_or_default() - } - - pub fn create(&mut self, id: usize, token: lsp::ProgressToken) { - self.0 - .entry(id) - .or_default() - .insert(token, ProgressStatus::Created); - } - - /// Ends the progress by removing the `token` from server with `id`, if removed returns the value. - pub fn end_progress( - &mut self, - id: usize, - token: &lsp::ProgressToken, - ) -> Option { - self.0.get_mut(&id).and_then(|vals| vals.remove(token)) - } - - /// Updates the progress of `token` for server with `id` to `status`, returns the value replaced or `None`. - pub fn update( - &mut self, - id: usize, - token: lsp::ProgressToken, - status: lsp::WorkDoneProgress, - ) -> Option { - self.0 - .entry(id) - .or_default() - .insert(token, ProgressStatus::Started(status)) - } -} - -#[cfg(test)] -mod tests { - use super::{lsp, util::*, OffsetEncoding}; - use helix_core::Rope; - - #[test] - fn converts_lsp_pos_to_pos() { - macro_rules! test_case { - ($doc:expr, ($x:expr, $y:expr) => $want:expr) => { - let doc = Rope::from($doc); - let pos = lsp::Position::new($x, $y); - assert_eq!($want, lsp_pos_to_pos(&doc, pos, OffsetEncoding::Utf16)); - assert_eq!($want, lsp_pos_to_pos(&doc, pos, OffsetEncoding::Utf8)) - }; - } - - test_case!("", (0, 0) => Some(0)); - test_case!("", (0, 1) => None); - test_case!("", (1, 0) => None); - test_case!("\n\n", (0, 0) => Some(0)); - test_case!("\n\n", (1, 0) => Some(1)); - test_case!("\n\n", (1, 1) => Some(2)); - test_case!("\n\n", (2, 0) => Some(2)); - test_case!("\n\n", (3, 0) => None); - test_case!("test\n\n\n\ncase", (4, 3) => Some(11)); - test_case!("test\n\n\n\ncase", (4, 4) => Some(12)); - test_case!("test\n\n\n\ncase", (4, 5) => None); - test_case!("", (u32::MAX, u32::MAX) => None); - } -} diff --git a/helix-term/src/commands/typed.rs.orig b/helix-term/src/commands/typed.rs.orig deleted file mode 100644 index ece2bd29..00000000 --- a/helix-term/src/commands/typed.rs.orig +++ /dev/null @@ -1,2130 +0,0 @@ -use std::ops::Deref; - -use super::*; - -use helix_view::editor::{Action, ConfigEvent}; -use ui::completers::{self, Completer}; - -#[derive(Clone)] -pub struct TypableCommand { - pub name: &'static str, - pub aliases: &'static [&'static str], - pub doc: &'static str, - // params, flags, helper, completer - pub fun: fn(&mut compositor::Context, &[Cow], PromptEvent) -> anyhow::Result<()>, - pub completer: Option, -} - -fn quit(cx: &mut compositor::Context, args: &[Cow], event: PromptEvent) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(args.is_empty(), ":quit takes no arguments"); - - // last view and we have unsaved changes - if cx.editor.tree.views().count() == 1 { - buffers_remaining_impl(cx.editor)? - } - - cx.editor.close(view!(cx.editor).id); - - Ok(()) -} - -fn force_quit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(args.is_empty(), ":quit! takes no arguments"); - - cx.editor.close(view!(cx.editor).id); - - Ok(()) -} - -fn open(cx: &mut compositor::Context, args: &[Cow], event: PromptEvent) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(!args.is_empty(), "wrong argument count"); - for arg in args { - let (path, pos) = args::parse_file(arg); - let _ = cx.editor.open(&path, Action::Replace)?; - let (view, doc) = current!(cx.editor); - let pos = Selection::point(pos_at_coords(doc.text().slice(..), pos, true)); - doc.set_selection(view.id, pos); - // does not affect opening a buffer without pos - align_view(doc, view, Align::Center); - } - Ok(()) -} - -fn buffer_close_by_ids_impl( - editor: &mut Editor, - doc_ids: &[DocumentId], - force: bool, -) -> anyhow::Result<()> { - for &doc_id in doc_ids { - editor.close_document(doc_id, force)?; - } - - Ok(()) -} - -fn buffer_gather_paths_impl(editor: &mut Editor, args: &[Cow]) -> Vec { - // No arguments implies current document - if args.is_empty() { - let doc_id = view!(editor).doc; - return vec![doc_id]; - } - - let mut nonexistent_buffers = vec![]; - let mut document_ids = vec![]; - for arg in args { - let doc_id = editor.documents().find_map(|doc| { - let arg_path = Some(Path::new(arg.as_ref())); - if doc.path().map(|p| p.as_path()) == arg_path - || doc.relative_path().as_deref() == arg_path - { - Some(doc.id()) - } else { - None - } - }); - - match doc_id { - Some(doc_id) => document_ids.push(doc_id), - None => nonexistent_buffers.push(format!("'{}'", arg)), - } - } - - if !nonexistent_buffers.is_empty() { - editor.set_error(format!( - "cannot close non-existent buffers: {}", - nonexistent_buffers.join(", ") - )); - } - - document_ids -} - -fn buffer_close( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let document_ids = buffer_gather_paths_impl(cx.editor, args); - buffer_close_by_ids_impl(cx.editor, &document_ids, false) -} - -fn force_buffer_close( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let document_ids = buffer_gather_paths_impl(cx.editor, args); - buffer_close_by_ids_impl(cx.editor, &document_ids, true) -} - -fn buffer_gather_others_impl(editor: &mut Editor) -> Vec { - let current_document = &doc!(editor).id(); - editor - .documents() - .map(|doc| doc.id()) - .filter(|doc_id| doc_id != current_document) - .collect() -} - -fn buffer_close_others( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let document_ids = buffer_gather_others_impl(cx.editor); - buffer_close_by_ids_impl(cx.editor, &document_ids, false) -} - -fn force_buffer_close_others( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let document_ids = buffer_gather_others_impl(cx.editor); - buffer_close_by_ids_impl(cx.editor, &document_ids, true) -} - -fn buffer_gather_all_impl(editor: &mut Editor) -> Vec { - editor.documents().map(|doc| doc.id()).collect() -} - -fn buffer_close_all( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let document_ids = buffer_gather_all_impl(cx.editor); - buffer_close_by_ids_impl(cx.editor, &document_ids, false) -} - -fn force_buffer_close_all( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let document_ids = buffer_gather_all_impl(cx.editor); - buffer_close_by_ids_impl(cx.editor, &document_ids, true) -} - -fn buffer_next( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - goto_buffer(cx.editor, Direction::Forward); - Ok(()) -} - -fn buffer_previous( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - goto_buffer(cx.editor, Direction::Backward); - Ok(()) -} - -fn write_impl( - cx: &mut compositor::Context, - path: Option<&Cow>, - force: bool, -) -> anyhow::Result<()> { - let auto_format = cx.editor.config().auto_format; - let jobs = &mut cx.jobs; - let doc = doc_mut!(cx.editor); - - if let Some(ref path) = path { - doc.set_path(Some(path.as_ref().as_ref())) - .context("invalid filepath")?; - } - if doc.path().is_none() { - bail!("cannot write a buffer without a filename"); - } - let fmt = if auto_format { - doc.auto_format().map(|fmt| { - let shared = fmt.shared(); - let callback = make_format_callback( - doc.id(), - doc.version(), - Modified::SetUnmodified, - shared.clone(), - ); - jobs.callback(callback); - shared - }) - } else { - None - }; - let future = doc.format_and_save(fmt, force); - cx.jobs.add(Job::new(future).wait_before_exiting()); - - if path.is_some() { - let id = doc.id(); - doc.detect_language(cx.editor.syn_loader.clone()); - let _ = cx.editor.refresh_language_server(id); - } - - Ok(()) -} - -fn write( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - write_impl(cx, args.first(), false) -} - -fn force_write( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - write_impl(cx, args.first(), true) -} - -fn new_file( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - cx.editor.new_file(Action::Replace); - - Ok(()) -} - -fn format( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let doc = doc!(cx.editor); - if let Some(format) = doc.format() { - let callback = - make_format_callback(doc.id(), doc.version(), Modified::LeaveModified, format); - cx.jobs.callback(callback); - } - - Ok(()) -} -fn set_indent_style( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - use IndentStyle::*; - - // If no argument, report current indent style. - if args.is_empty() { - let style = doc!(cx.editor).indent_style; - cx.editor.set_status(match style { - Tabs => "tabs".to_owned(), - Spaces(1) => "1 space".to_owned(), - Spaces(n) if (2..=8).contains(&n) => format!("{} spaces", n), - _ => unreachable!(), // Shouldn't happen. - }); - return Ok(()); - } - - // Attempt to parse argument as an indent style. - let style = match args.get(0) { - Some(arg) if "tabs".starts_with(&arg.to_lowercase()) => Some(Tabs), - Some(Cow::Borrowed("0")) => Some(Tabs), - Some(arg) => arg - .parse::() - .ok() - .filter(|n| (1..=8).contains(n)) - .map(Spaces), - _ => None, - }; - - let style = style.context("invalid indent style")?; - let doc = doc_mut!(cx.editor); - doc.indent_style = style; - - Ok(()) -} - -/// Sets or reports the current document's line ending setting. -fn set_line_ending( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - use LineEnding::*; - - // If no argument, report current line ending setting. - if args.is_empty() { - let line_ending = doc!(cx.editor).line_ending; - cx.editor.set_status(match line_ending { - Crlf => "crlf", - LF => "line feed", - #[cfg(feature = "unicode-lines")] - FF => "form feed", - #[cfg(feature = "unicode-lines")] - CR => "carriage return", - #[cfg(feature = "unicode-lines")] - Nel => "next line", - - // These should never be a document's default line ending. - #[cfg(feature = "unicode-lines")] - VT | LS | PS => "error", - }); - - return Ok(()); - } - - let arg = args - .get(0) - .context("argument missing")? - .to_ascii_lowercase(); - - // Attempt to parse argument as a line ending. - let line_ending = match arg { - arg if arg.starts_with("crlf") => Crlf, - arg if arg.starts_with("lf") => LF, - #[cfg(feature = "unicode-lines")] - arg if arg.starts_with("cr") => CR, - #[cfg(feature = "unicode-lines")] - arg if arg.starts_with("ff") => FF, - #[cfg(feature = "unicode-lines")] - arg if arg.starts_with("nel") => Nel, - _ => bail!("invalid line ending"), - }; - let (view, doc) = current!(cx.editor); - doc.line_ending = line_ending; - - let mut pos = 0; - let transaction = Transaction::change( - doc.text(), - doc.text().lines().filter_map(|line| { - pos += line.len_chars(); - match helix_core::line_ending::get_line_ending(&line) { - Some(ending) if ending != line_ending => { - let start = pos - ending.len_chars(); - let end = pos; - Some((start, end, Some(line_ending.as_str().into()))) - } - _ => None, - } - }), - ); - doc.apply(&transaction, view.id); - doc.append_changes_to_history(view.id); - - Ok(()) -} - -fn earlier( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let uk = args.join(" ").parse::().map_err(|s| anyhow!(s))?; - - let (view, doc) = current!(cx.editor); - let success = doc.earlier(view.id, uk); - if !success { - cx.editor.set_status("Already at oldest change"); - } - - Ok(()) -} - -fn later( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let uk = args.join(" ").parse::().map_err(|s| anyhow!(s))?; - let (view, doc) = current!(cx.editor); - let success = doc.later(view.id, uk); - if !success { - cx.editor.set_status("Already at newest change"); - } - - Ok(()) -} - -fn write_quit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - write_impl(cx, args.first(), false)?; - helix_lsp::block_on(cx.jobs.finish())?; - quit(cx, &[], event) -} - -fn force_write_quit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - write_impl(cx, args.first(), true)?; - force_quit(cx, &[], event) -} - -/// Results an error if there are modified buffers remaining and sets editor error, -/// otherwise returns `Ok(())` -pub(super) fn buffers_remaining_impl(editor: &mut Editor) -> anyhow::Result<()> { - let modified: Vec<_> = editor - .documents() - .filter(|doc| doc.is_modified()) - .map(|doc| { - doc.relative_path() - .map(|path| path.to_string_lossy().to_string()) - .unwrap_or_else(|| SCRATCH_BUFFER_NAME.into()) - }) - .collect(); - if !modified.is_empty() { - bail!( - "{} unsaved buffer(s) remaining: {:?}", - modified.len(), - modified - ); - } - Ok(()) -} - -fn write_all_impl( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, - quit: bool, - force: bool, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let mut errors = String::new(); - let auto_format = cx.editor.config().auto_format; - let jobs = &mut cx.jobs; - // save all documents - for doc in &mut cx.editor.documents.values_mut() { - if doc.path().is_none() { - errors.push_str("cannot write a buffer without a filename\n"); - continue; - } - - if !doc.is_modified() { - continue; - } - - let fmt = if auto_format { - doc.auto_format().map(|fmt| { - let shared = fmt.shared(); - let callback = make_format_callback( - doc.id(), - doc.version(), - Modified::SetUnmodified, - shared.clone(), - ); - jobs.callback(callback); - shared - }) - } else { - None - }; - let future = doc.format_and_save(fmt, force); - jobs.add(Job::new(future).wait_before_exiting()); - } - - if quit { - if !force { - buffers_remaining_impl(cx.editor)?; - } - - // close all views - let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect(); - for view_id in views { - cx.editor.close(view_id); - } - } - - bail!(errors) -} - -fn write_all( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - write_all_impl(cx, args, event, false, false) -} - -fn write_all_quit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - write_all_impl(cx, args, event, true, false) -} - -fn force_write_all_quit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - write_all_impl(cx, args, event, true, true) -} - -fn quit_all_impl(editor: &mut Editor, force: bool) -> anyhow::Result<()> { - if !force { - buffers_remaining_impl(editor)?; - } - - // close all views - let views: Vec<_> = editor.tree.views().map(|(view, _)| view.id).collect(); - for view_id in views { - editor.close(view_id); - } - - Ok(()) -} - -fn quit_all( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - quit_all_impl(cx.editor, false) -} - -fn force_quit_all( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - quit_all_impl(cx.editor, true) -} - -fn cquit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let exit_code = args - .first() - .and_then(|code| code.parse::().ok()) - .unwrap_or(1); - cx.editor.exit_code = exit_code; - - quit_all_impl(cx.editor, false) -} - -fn force_cquit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let exit_code = args - .first() - .and_then(|code| code.parse::().ok()) - .unwrap_or(1); - cx.editor.exit_code = exit_code; - - quit_all_impl(cx.editor, true) -} - -fn theme( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - let true_color = cx.editor.config.load().true_color || crate::true_color(); - match event { - PromptEvent::Abort => { - cx.editor.unset_theme_preview(); - } - PromptEvent::Update => { - if let Some(theme_name) = args.first() { - if let Ok(theme) = cx.editor.theme_loader.load(theme_name) { - if !(true_color || theme.is_16_color()) { - bail!("Unsupported theme: theme requires true color support"); - } - cx.editor.set_theme_preview(theme); - }; - }; - } - PromptEvent::Validate => { - let theme_name = args.first().with_context(|| "Theme name not provided")?; - let theme = cx - .editor - .theme_loader - .load(theme_name) - .with_context(|| "Theme does not exist")?; - if !(true_color || theme.is_16_color()) { - bail!("Unsupported theme: theme requires true color support"); - } - cx.editor.set_theme(theme); - } - }; - - Ok(()) -} - -fn yank_main_selection_to_clipboard( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - yank_main_selection_to_clipboard_impl(cx.editor, ClipboardType::Clipboard) -} - -fn yank_joined_to_clipboard( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let doc = doc!(cx.editor); - let default_sep = Cow::Borrowed(doc.line_ending.as_str()); - let separator = args.first().unwrap_or(&default_sep); - yank_joined_to_clipboard_impl(cx.editor, separator, ClipboardType::Clipboard) -} - -fn yank_main_selection_to_primary_clipboard( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - yank_main_selection_to_clipboard_impl(cx.editor, ClipboardType::Selection) -} - -fn yank_joined_to_primary_clipboard( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let doc = doc!(cx.editor); - let default_sep = Cow::Borrowed(doc.line_ending.as_str()); - let separator = args.first().unwrap_or(&default_sep); - yank_joined_to_clipboard_impl(cx.editor, separator, ClipboardType::Selection) -} - -fn paste_clipboard_after( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - paste_clipboard_impl(cx.editor, Paste::After, ClipboardType::Clipboard, 1) -} - -fn paste_clipboard_before( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - paste_clipboard_impl(cx.editor, Paste::Before, ClipboardType::Clipboard, 1) -} - -fn paste_primary_clipboard_after( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - paste_clipboard_impl(cx.editor, Paste::After, ClipboardType::Selection, 1) -} - -fn paste_primary_clipboard_before( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - paste_clipboard_impl(cx.editor, Paste::Before, ClipboardType::Selection, 1) -} - -fn replace_selections_with_clipboard_impl( - cx: &mut compositor::Context, - clipboard_type: ClipboardType, -) -> anyhow::Result<()> { - let (view, doc) = current!(cx.editor); - - match cx.editor.clipboard_provider.get_contents(clipboard_type) { - Ok(contents) => { - let selection = doc.selection(view.id); - let transaction = Transaction::change_by_selection(doc.text(), selection, |range| { - (range.from(), range.to(), Some(contents.as_str().into())) - }); - - doc.apply(&transaction, view.id); - doc.append_changes_to_history(view.id); - Ok(()) - } - Err(e) => Err(e.context("Couldn't get system clipboard contents")), - } -} - -fn replace_selections_with_clipboard( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - replace_selections_with_clipboard_impl(cx, ClipboardType::Clipboard) -} - -fn replace_selections_with_primary_clipboard( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - replace_selections_with_clipboard_impl(cx, ClipboardType::Selection) -} - -fn show_clipboard_provider( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - cx.editor - .set_status(cx.editor.clipboard_provider.name().to_string()); - Ok(()) -} - -fn change_current_directory( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let dir = helix_core::path::expand_tilde( - args.first() - .context("target directory not provided")? - .as_ref() - .as_ref(), - ); - - if let Err(e) = std::env::set_current_dir(dir) { - bail!("Couldn't change the current working directory: {}", e); - } - - let cwd = std::env::current_dir().context("Couldn't get the new working directory")?; - cx.editor.set_status(format!( - "Current working directory is now {}", - cwd.display() - )); - Ok(()) -} - -fn show_current_directory( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let cwd = std::env::current_dir().context("Couldn't get the new working directory")?; - cx.editor - .set_status(format!("Current working directory is {}", cwd.display())); - Ok(()) -} - -/// Sets the [`Document`]'s encoding.. -fn set_encoding( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let doc = doc_mut!(cx.editor); - if let Some(label) = args.first() { - doc.set_encoding(label) - } else { - let encoding = doc.encoding().name().to_owned(); - cx.editor.set_status(encoding); - Ok(()) - } -} - -/// Reload the [`Document`] from its source file. -fn reload( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let scrolloff = cx.editor.config().scrolloff; - let (view, doc) = current!(cx.editor); - doc.reload(view.id).map(|_| { - view.ensure_cursor_in_view(doc, scrolloff); - }) -} - -fn tree_sitter_scopes( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let (view, doc) = current!(cx.editor); - let text = doc.text().slice(..); - - let pos = doc.selection(view.id).primary().cursor(text); - let scopes = indent::get_scopes(doc.syntax(), text, pos); - cx.editor.set_status(format!("scopes: {:?}", &scopes)); - Ok(()) -} - -fn vsplit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let id = view!(cx.editor).doc; - - if args.is_empty() { - cx.editor.switch(id, Action::VerticalSplit); - } else { - for arg in args { - cx.editor - .open(&PathBuf::from(arg.as_ref()), Action::VerticalSplit)?; - } - } - - Ok(()) -} - -fn hsplit( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let id = view!(cx.editor).doc; - - if args.is_empty() { - cx.editor.switch(id, Action::HorizontalSplit); - } else { - for arg in args { - cx.editor - .open(&PathBuf::from(arg.as_ref()), Action::HorizontalSplit)?; - } - } - - Ok(()) -} - -fn vsplit_new( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - cx.editor.new_file(Action::VerticalSplit); - - Ok(()) -} - -fn hsplit_new( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - cx.editor.new_file(Action::HorizontalSplit); - - Ok(()) -} - -fn debug_eval( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - if let Some(debugger) = cx.editor.debugger.as_mut() { - let (frame, thread_id) = match (debugger.active_frame, debugger.thread_id) { - (Some(frame), Some(thread_id)) => (frame, thread_id), - _ => { - bail!("Cannot find current stack frame to access variables") - } - }; - - // TODO: support no frame_id - - let frame_id = debugger.stack_frames[&thread_id][frame].id; - let response = helix_lsp::block_on(debugger.eval(args.join(" "), Some(frame_id)))?; - cx.editor.set_status(response.result); - } - Ok(()) -} - -fn debug_start( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let mut args = args.to_owned(); - let name = match args.len() { - 0 => None, - _ => Some(args.remove(0)), - }; - dap_start_impl(cx, name.as_deref(), None, Some(args)) -} - -fn debug_remote( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let mut args = args.to_owned(); - let address = match args.len() { - 0 => None, - _ => Some(args.remove(0).parse()?), - }; - let name = match args.len() { - 0 => None, - _ => Some(args.remove(0)), - }; - dap_start_impl(cx, name.as_deref(), address, Some(args)) -} - -fn tutor( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let path = helix_loader::runtime_dir().join("tutor.txt"); - cx.editor.open(&path, Action::Replace)?; - // Unset path to prevent accidentally saving to the original tutor file. - doc_mut!(cx.editor).set_path(None)?; - Ok(()) -} - -pub(super) fn goto_line_number( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(!args.is_empty(), "Line number required"); - - let line = args[0].parse::()?; - - goto_line_impl(cx.editor, NonZeroUsize::new(line)); - - let (view, doc) = current!(cx.editor); - - view.ensure_cursor_in_view(doc, line); - Ok(()) -} - -// Fetch the current value of a config option and output as status. -fn get_option( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - if args.len() != 1 { - anyhow::bail!("Bad arguments. Usage: `:get key`"); - } - - let key = &args[0].to_lowercase(); - let key_error = || anyhow::anyhow!("Unknown key `{}`", key); - - let config = serde_json::json!(cx.editor.config().deref()); - let pointer = format!("/{}", key.replace('.', "/")); - let value = config.pointer(&pointer).ok_or_else(key_error)?; - - cx.editor.set_status(value.to_string()); - Ok(()) -} - -/// Change config at runtime. Access nested values by dot syntax, for -/// example to disable smart case search, use `:set search.smart-case false`. -fn set_option( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - if args.len() != 2 { - anyhow::bail!("Bad arguments. Usage: `:set key field`"); - } - let (key, arg) = (&args[0].to_lowercase(), &args[1]); - - let key_error = || anyhow::anyhow!("Unknown key `{}`", key); - let field_error = |_| anyhow::anyhow!("Could not parse field `{}`", arg); - - let mut config = serde_json::json!(&cx.editor.config().deref()); - let pointer = format!("/{}", key.replace('.', "/")); - let value = config.pointer_mut(&pointer).ok_or_else(key_error)?; - - *value = if value.is_string() { - // JSON strings require quotes, so we can't .parse() directly - serde_json::Value::String(arg.to_string()) - } else { - arg.parse().map_err(field_error)? - }; - let config = serde_json::from_value(config).map_err(field_error)?; - - cx.editor - .config_events - .0 - .send(ConfigEvent::Update(config))?; - Ok(()) -} - -/// Change the language of the current buffer at runtime. -fn language( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - if args.len() != 1 { - anyhow::bail!("Bad arguments. Usage: `:set-language language`"); - } - - let doc = doc_mut!(cx.editor); - doc.set_language_by_language_id(&args[0], cx.editor.syn_loader.clone()); - - let id = doc.id(); - cx.editor.refresh_language_server(id); - Ok(()) -} - -fn sort(cx: &mut compositor::Context, args: &[Cow], event: PromptEvent) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - sort_impl(cx, args, false) -} - -fn sort_reverse( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - sort_impl(cx, args, true) -} - -fn sort_impl( - cx: &mut compositor::Context, - _args: &[Cow], - reverse: bool, -) -> anyhow::Result<()> { - let (view, doc) = current!(cx.editor); - let text = doc.text().slice(..); - - let selection = doc.selection(view.id); - - let mut fragments: Vec<_> = selection - .fragments(text) - .map(|fragment| Tendril::from(fragment.as_ref())) - .collect(); - - fragments.sort_by(match reverse { - true => |a: &Tendril, b: &Tendril| b.cmp(a), - false => |a: &Tendril, b: &Tendril| a.cmp(b), - }); - - let transaction = Transaction::change( - doc.text(), - selection - .into_iter() - .zip(fragments) - .map(|(s, fragment)| (s.from(), s.to(), Some(fragment))), - ); - - doc.apply(&transaction, view.id); - doc.append_changes_to_history(view.id); - - Ok(()) -} - -fn reflow( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let (view, doc) = current!(cx.editor); - - const DEFAULT_MAX_LEN: usize = 79; - - // Find the max line length by checking the following sources in order: - // - The passed argument in `args` - // - The configured max_line_len for this language in languages.toml - // - The const default we set above - let max_line_len: usize = args - .get(0) - .map(|num| num.parse::()) - .transpose()? - .or_else(|| { - doc.language_config() - .and_then(|config| config.max_line_length) - }) - .unwrap_or(DEFAULT_MAX_LEN); - - let rope = doc.text(); - - let selection = doc.selection(view.id); - let transaction = Transaction::change_by_selection(rope, selection, |range| { - let fragment = range.fragment(rope.slice(..)); - let reflowed_text = helix_core::wrap::reflow_hard_wrap(&fragment, max_line_len); - - (range.from(), range.to(), Some(reflowed_text)) - }); - - doc.apply(&transaction, view.id); - doc.append_changes_to_history(view.id); - - Ok(()) -} - -fn tree_sitter_subtree( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let (view, doc) = current!(cx.editor); - - if let Some(syntax) = doc.syntax() { - let primary_selection = doc.selection(view.id).primary(); - let text = doc.text(); - let from = text.char_to_byte(primary_selection.from()); - let to = text.char_to_byte(primary_selection.to()); - if let Some(selected_node) = syntax - .tree() - .root_node() - .descendant_for_byte_range(from, to) - { - let contents = format!("```tsq\n{}\n```", selected_node.to_sexp()); - - let callback = async move { - let call: job::Callback = - Box::new(move |editor: &mut Editor, compositor: &mut Compositor| { - let contents = ui::Markdown::new(contents, editor.syn_loader.clone()); - let popup = Popup::new("hover", contents).auto_close(true); - compositor.replace_or_push("hover", popup); - }); - Ok(call) - }; - - cx.jobs.callback(callback); - } - } - - Ok(()) -} - -fn open_config( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - cx.editor - .open(&helix_loader::config_file(), Action::Replace)?; - Ok(()) -} - -fn open_log( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - cx.editor.open(&helix_loader::log_file(), Action::Replace)?; - Ok(()) -} - -fn refresh_config( - cx: &mut compositor::Context, - _args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - cx.editor.config_events.0.send(ConfigEvent::Refresh)?; - Ok(()) -} - -fn append_output( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(!args.is_empty(), "Shell command required"); - shell(cx, &args.join(" "), &ShellBehavior::Append); - Ok(()) -} - -fn insert_output( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(!args.is_empty(), "Shell command required"); - shell(cx, &args.join(" "), &ShellBehavior::Insert); - Ok(()) -} - -fn pipe(cx: &mut compositor::Context, args: &[Cow], event: PromptEvent) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - ensure!(!args.is_empty(), "Shell command required"); - shell(cx, &args.join(" "), &ShellBehavior::Replace); - Ok(()) -} - -<<<<<<< HEAD -fn run_shell_command( - cx: &mut compositor::Context, - args: &[Cow], - event: PromptEvent, -) -> anyhow::Result<()> { - if event != PromptEvent::Validate { - return Ok(()); - } - - let shell = &cx.editor.config().shell; - let (output, success) = shell_impl(shell, &args.join(" "), None)?; - if success { - cx.editor.set_status("Command succeed"); - } else { - cx.editor.set_error("Command failed"); - } - - if !output.is_empty() { - let callback = async move { - let call: job::Callback = - Box::new(move |editor: &mut Editor, compositor: &mut Compositor| { - let contents = ui::Markdown::new( - format!("```sh\n{}\n```", output), - editor.syn_loader.clone(), - ); - let popup = Popup::new("shell", contents).position(Some( - helix_core::Position::new(editor.cursor().0.unwrap_or_default().row, 2), - )); - compositor.replace_or_push("shell", popup); - }); - Ok(call) - }; - - cx.jobs.callback(callback); - } - - Ok(()) -} - -||||||| 4b1fe367 -======= -fn lsp_restart( - cx: &mut compositor::Context, - _args: &[Cow], - _event: PromptEvent, -) -> anyhow::Result<()> { - let current_document = doc!(cx.editor).id(); - cx.editor.restart_language_server(current_document); - Ok(()) -} - ->>>>>>> lsp-restart -pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[ - TypableCommand { - name: "quit", - aliases: &["q"], - doc: "Close the current view.", - fun: quit, - completer: None, - }, - TypableCommand { - name: "quit!", - aliases: &["q!"], - doc: "Close the current view forcefully (ignoring unsaved changes).", - fun: force_quit, - completer: None, - }, - TypableCommand { - name: "open", - aliases: &["o"], - doc: "Open a file from disk into the current view.", - fun: open, - completer: Some(completers::filename), - }, - TypableCommand { - name: "buffer-close", - aliases: &["bc", "bclose"], - doc: "Close the current buffer.", - fun: buffer_close, - completer: Some(completers::buffer), - }, - TypableCommand { - name: "buffer-close!", - aliases: &["bc!", "bclose!"], - doc: "Close the current buffer forcefully (ignoring unsaved changes).", - fun: force_buffer_close, - completer: Some(completers::buffer), - }, - TypableCommand { - name: "buffer-close-others", - aliases: &["bco", "bcloseother"], - doc: "Close all buffers but the currently focused one.", - fun: buffer_close_others, - completer: None, - }, - TypableCommand { - name: "buffer-close-others!", - aliases: &["bco!", "bcloseother!"], - doc: "Close all buffers but the currently focused one.", - fun: force_buffer_close_others, - completer: None, - }, - TypableCommand { - name: "buffer-close-all", - aliases: &["bca", "bcloseall"], - doc: "Close all buffers, without quitting.", - fun: buffer_close_all, - completer: None, - }, - TypableCommand { - name: "buffer-close-all!", - aliases: &["bca!", "bcloseall!"], - doc: "Close all buffers forcefully (ignoring unsaved changes), without quitting.", - fun: force_buffer_close_all, - completer: None, - }, - TypableCommand { - name: "buffer-next", - aliases: &["bn", "bnext"], - doc: "Go to next buffer.", - fun: buffer_next, - completer: None, - }, - TypableCommand { - name: "buffer-previous", - aliases: &["bp", "bprev"], - doc: "Go to previous buffer.", - fun: buffer_previous, - completer: None, - }, - TypableCommand { - name: "write", - aliases: &["w"], - doc: "Write changes to disk. Accepts an optional path (:write some/path.txt)", - fun: write, - completer: Some(completers::filename), - }, - TypableCommand { - name: "write!", - aliases: &["w!"], - doc: "Write changes to disk forcefully (creating necessary subdirectories). Accepts an optional path (:write some/path.txt)", - fun: force_write, - completer: Some(completers::filename), - }, - TypableCommand { - name: "new", - aliases: &["n"], - doc: "Create a new scratch buffer.", - fun: new_file, - completer: Some(completers::filename), - }, - TypableCommand { - name: "format", - aliases: &["fmt"], - doc: "Format the file using the LSP formatter.", - fun: format, - completer: None, - }, - TypableCommand { - name: "indent-style", - aliases: &[], - doc: "Set the indentation style for editing. ('t' for tabs or 1-8 for number of spaces.)", - fun: set_indent_style, - completer: None, - }, - TypableCommand { - name: "line-ending", - aliases: &[], - #[cfg(not(feature = "unicode-lines"))] - doc: "Set the document's default line ending. Options: crlf, lf.", - #[cfg(feature = "unicode-lines")] - doc: "Set the document's default line ending. Options: crlf, lf, cr, ff, nel.", - fun: set_line_ending, - completer: None, - }, - TypableCommand { - name: "earlier", - aliases: &["ear"], - doc: "Jump back to an earlier point in edit history. Accepts a number of steps or a time span.", - fun: earlier, - completer: None, - }, - TypableCommand { - name: "later", - aliases: &["lat"], - doc: "Jump to a later point in edit history. Accepts a number of steps or a time span.", - fun: later, - completer: None, - }, - TypableCommand { - name: "write-quit", - aliases: &["wq", "x"], - doc: "Write changes to disk and close the current view. Accepts an optional path (:wq some/path.txt)", - fun: write_quit, - completer: Some(completers::filename), - }, - TypableCommand { - name: "write-quit!", - aliases: &["wq!", "x!"], - doc: "Write changes to disk and close the current view forcefully. Accepts an optional path (:wq! some/path.txt)", - fun: force_write_quit, - completer: Some(completers::filename), - }, - TypableCommand { - name: "write-all", - aliases: &["wa"], - doc: "Write changes from all buffers to disk.", - fun: write_all, - completer: None, - }, - TypableCommand { - name: "write-quit-all", - aliases: &["wqa", "xa"], - doc: "Write changes from all buffers to disk and close all views.", - fun: write_all_quit, - completer: None, - }, - TypableCommand { - name: "write-quit-all!", - aliases: &["wqa!", "xa!"], - doc: "Write changes from all buffers to disk and close all views forcefully (ignoring unsaved changes).", - fun: force_write_all_quit, - completer: None, - }, - TypableCommand { - name: "quit-all", - aliases: &["qa"], - doc: "Close all views.", - fun: quit_all, - completer: None, - }, - TypableCommand { - name: "quit-all!", - aliases: &["qa!"], - doc: "Close all views forcefully (ignoring unsaved changes).", - fun: force_quit_all, - completer: None, - }, - TypableCommand { - name: "cquit", - aliases: &["cq"], - doc: "Quit with exit code (default 1). Accepts an optional integer exit code (:cq 2).", - fun: cquit, - completer: None, - }, - TypableCommand { - name: "cquit!", - aliases: &["cq!"], - doc: "Quit with exit code (default 1) forcefully (ignoring unsaved changes). Accepts an optional integer exit code (:cq! 2).", - fun: force_cquit, - completer: None, - }, - TypableCommand { - name: "theme", - aliases: &[], - doc: "Change the editor theme.", - fun: theme, - completer: Some(completers::theme), - }, - TypableCommand { - name: "clipboard-yank", - aliases: &[], - doc: "Yank main selection into system clipboard.", - fun: yank_main_selection_to_clipboard, - completer: None, - }, - TypableCommand { - name: "clipboard-yank-join", - aliases: &[], - doc: "Yank joined selections into system clipboard. A separator can be provided as first argument. Default value is newline.", // FIXME: current UI can't display long doc. - fun: yank_joined_to_clipboard, - completer: None, - }, - TypableCommand { - name: "primary-clipboard-yank", - aliases: &[], - doc: "Yank main selection into system primary clipboard.", - fun: yank_main_selection_to_primary_clipboard, - completer: None, - }, - TypableCommand { - name: "primary-clipboard-yank-join", - aliases: &[], - doc: "Yank joined selections into system primary clipboard. A separator can be provided as first argument. Default value is newline.", // FIXME: current UI can't display long doc. - fun: yank_joined_to_primary_clipboard, - completer: None, - }, - TypableCommand { - name: "clipboard-paste-after", - aliases: &[], - doc: "Paste system clipboard after selections.", - fun: paste_clipboard_after, - completer: None, - }, - TypableCommand { - name: "clipboard-paste-before", - aliases: &[], - doc: "Paste system clipboard before selections.", - fun: paste_clipboard_before, - completer: None, - }, - TypableCommand { - name: "clipboard-paste-replace", - aliases: &[], - doc: "Replace selections with content of system clipboard.", - fun: replace_selections_with_clipboard, - completer: None, - }, - TypableCommand { - name: "primary-clipboard-paste-after", - aliases: &[], - doc: "Paste primary clipboard after selections.", - fun: paste_primary_clipboard_after, - completer: None, - }, - TypableCommand { - name: "primary-clipboard-paste-before", - aliases: &[], - doc: "Paste primary clipboard before selections.", - fun: paste_primary_clipboard_before, - completer: None, - }, - TypableCommand { - name: "primary-clipboard-paste-replace", - aliases: &[], - doc: "Replace selections with content of system primary clipboard.", - fun: replace_selections_with_primary_clipboard, - completer: None, - }, - TypableCommand { - name: "show-clipboard-provider", - aliases: &[], - doc: "Show clipboard provider name in status bar.", - fun: show_clipboard_provider, - completer: None, - }, - TypableCommand { - name: "change-current-directory", - aliases: &["cd"], - doc: "Change the current working directory.", - fun: change_current_directory, - completer: Some(completers::directory), - }, - TypableCommand { - name: "show-directory", - aliases: &["pwd"], - doc: "Show the current working directory.", - fun: show_current_directory, - completer: None, - }, - TypableCommand { - name: "encoding", - aliases: &[], - doc: "Set encoding based on `https://encoding.spec.whatwg.org`", - fun: set_encoding, - completer: None, - }, - TypableCommand { - name: "reload", - aliases: &[], - doc: "Discard changes and reload from the source file.", - fun: reload, - completer: None, - }, - TypableCommand { - name: "tree-sitter-scopes", - aliases: &[], - doc: "Display tree sitter scopes, primarily for theming and development.", - fun: tree_sitter_scopes, - completer: None, - }, - TypableCommand { - name: "debug-start", - aliases: &["dbg"], - doc: "Start a debug session from a given template with given parameters.", - fun: debug_start, - completer: None, - }, - TypableCommand { - name: "debug-remote", - aliases: &["dbg-tcp"], - doc: "Connect to a debug adapter by TCP address and start a debugging session from a given template with given parameters.", - fun: debug_remote, - completer: None, - }, - TypableCommand { - name: "debug-eval", - aliases: &[], - doc: "Evaluate expression in current debug context.", - fun: debug_eval, - completer: None, - }, - TypableCommand { - name: "vsplit", - aliases: &["vs"], - doc: "Open the file in a vertical split.", - fun: vsplit, - completer: Some(completers::filename), - }, - TypableCommand { - name: "vsplit-new", - aliases: &["vnew"], - doc: "Open a scratch buffer in a vertical split.", - fun: vsplit_new, - completer: None, - }, - TypableCommand { - name: "hsplit", - aliases: &["hs", "sp"], - doc: "Open the file in a horizontal split.", - fun: hsplit, - completer: Some(completers::filename), - }, - TypableCommand { - name: "hsplit-new", - aliases: &["hnew"], - doc: "Open a scratch buffer in a horizontal split.", - fun: hsplit_new, - completer: None, - }, - TypableCommand { - name: "tutor", - aliases: &[], - doc: "Open the tutorial.", - fun: tutor, - completer: None, - }, - TypableCommand { - name: "goto", - aliases: &["g"], - doc: "Go to line number.", - fun: goto_line_number, - completer: None, - }, - TypableCommand { - name: "set-language", - aliases: &["lang"], - doc: "Set the language of current buffer.", - fun: language, - completer: Some(completers::language), - }, - TypableCommand { - name: "set-option", - aliases: &["set"], - doc: "Set a config option at runtime.\nFor example to disable smart case search, use `:set search.smart-case false`.", - fun: set_option, - completer: Some(completers::setting), - }, - TypableCommand { - name: "get-option", - aliases: &["get"], - doc: "Get the current value of a config option.", - fun: get_option, - completer: Some(completers::setting), - }, - TypableCommand { - name: "sort", - aliases: &[], - doc: "Sort ranges in selection.", - fun: sort, - completer: None, - }, - TypableCommand { - name: "rsort", - aliases: &[], - doc: "Sort ranges in selection in reverse order.", - fun: sort_reverse, - completer: None, - }, - TypableCommand { - name: "reflow", - aliases: &[], - doc: "Hard-wrap the current selection of lines to a given width.", - fun: reflow, - completer: None, - }, - TypableCommand { - name: "tree-sitter-subtree", - aliases: &["ts-subtree"], - doc: "Display tree sitter subtree under cursor, primarily for debugging queries.", - fun: tree_sitter_subtree, - completer: None, - }, - TypableCommand { - name: "config-reload", - aliases: &[], - doc: "Refreshes helix's config.", - fun: refresh_config, - completer: None, - }, - TypableCommand { - name: "config-open", - aliases: &[], - doc: "Open the helix config.toml file.", - fun: open_config, - completer: None, - }, - TypableCommand { - name: "log-open", - aliases: &[], - doc: "Open the helix log file.", - fun: open_log, - completer: None, - }, - TypableCommand { - name: "insert-output", - aliases: &[], - doc: "Run shell command, inserting output after each selection.", - fun: insert_output, - completer: None, - }, - TypableCommand { - name: "append-output", - aliases: &[], - doc: "Run shell command, appending output after each selection.", - fun: append_output, - completer: None, - }, - TypableCommand { - name: "pipe", - aliases: &[], - doc: "Pipe each selection to the shell command.", - fun: pipe, - completer: None, - }, -<<<<<<< HEAD - TypableCommand { - name: "run-shell-command", - aliases: &["sh"], - doc: "Run a shell command", - fun: run_shell_command, - completer: Some(completers::directory), - }, -||||||| 4b1fe367 -======= - TypableCommand { - name: "lsp-restart", - aliases: &[], - doc: "Restarts the LSP server of the current buffer", - fun: lsp_restart, - completer: None, - }, ->>>>>>> lsp-restart - ]; - -pub static TYPABLE_COMMAND_MAP: Lazy> = - Lazy::new(|| { - TYPABLE_COMMAND_LIST - .iter() - .flat_map(|cmd| { - std::iter::once((cmd.name, cmd)) - .chain(cmd.aliases.iter().map(move |&alias| (alias, cmd))) - }) - .collect() - }); - -pub fn command_mode(cx: &mut Context) { - let mut prompt = Prompt::new( - ":".into(), - Some(':'), - |editor: &Editor, input: &str| { - static FUZZY_MATCHER: Lazy = - Lazy::new(fuzzy_matcher::skim::SkimMatcherV2::default); - - // we use .this over split_whitespace() because we care about empty segments - let parts = input.split(' ').collect::>(); - - // simple heuristic: if there's no just one part, complete command name. - // if there's a space, per command completion kicks in. - if parts.len() <= 1 { - let mut matches: Vec<_> = typed::TYPABLE_COMMAND_LIST - .iter() - .filter_map(|command| { - FUZZY_MATCHER - .fuzzy_match(command.name, input) - .map(|score| (command.name, score)) - }) - .collect(); - - matches.sort_unstable_by_key(|(_file, score)| std::cmp::Reverse(*score)); - matches - .into_iter() - .map(|(name, _)| (0.., name.into())) - .collect() - } else { - let part = parts.last().unwrap(); - - if let Some(typed::TypableCommand { - completer: Some(completer), - .. - }) = typed::TYPABLE_COMMAND_MAP.get(parts[0]) - { - completer(editor, part) - .into_iter() - .map(|(range, file)| { - // offset ranges to input - let offset = input.len() - part.len(); - let range = (range.start + offset)..; - (range, file) - }) - .collect() - } else { - Vec::new() - } - } - }, // completion - move |cx: &mut compositor::Context, input: &str, event: PromptEvent| { - let parts = input.split_whitespace().collect::>(); - if parts.is_empty() { - return; - } - - // If command is numeric, interpret as line number and go there. - if parts.len() == 1 && parts[0].parse::().ok().is_some() { - if let Err(e) = typed::goto_line_number(cx, &[Cow::from(parts[0])], event) { - cx.editor.set_error(format!("{}", e)); - } - return; - } - - // Handle typable commands - if let Some(cmd) = typed::TYPABLE_COMMAND_MAP.get(parts[0]) { - let args = shellwords::shellwords(input); - - if let Err(e) = (cmd.fun)(cx, &args[1..], event) { - cx.editor.set_error(format!("{}", e)); - } - } else if event == PromptEvent::Validate { - cx.editor - .set_error(format!("no such command: '{}'", parts[0])); - } - }, - ); - prompt.doc_fn = Box::new(|input: &str| { - let part = input.split(' ').next().unwrap_or_default(); - - if let Some(typed::TypableCommand { doc, aliases, .. }) = - typed::TYPABLE_COMMAND_MAP.get(part) - { - if aliases.is_empty() { - return Some((*doc).into()); - } - return Some(format!("{}\nAliases: {}", doc, aliases.join(", ")).into()); - } - - None - }); - - // Calculate initial completion - prompt.recalculate_completion(cx.editor); - cx.push_layer(Box::new(prompt)); -} diff --git a/screenshot.png b/screenshot.png index 5fb72dcc5cea7ede7fb0f323e833d090088e6f38..0dff1feb53d63058d17da769a0b34c06cb7d6a28 100644 GIT binary patch literal 277444 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

Z0U0viZZEnHYvE@8Ux~C01_QU3- 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ļ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�UKqm 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 z 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 literal 367553 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�{WyrZ_9Hfsk^COjZZb8no8X)n0{hwC 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

;4v_P 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 Zc|!hX1f&n8JN&! Date: Wed, 21 Sep 2022 19:07:32 +0200 Subject: [PATCH 21/54] Change some default config values and default theme Signed-off-by: trivernis --- helix-term/src/keymap/default.rs | 2 + helix-view/src/editor.rs | 23 ++-- runtime/themes/dracula-purple.toml | 80 ++++++++++++++ theme.toml | 168 +++++++++++++---------------- 4 files changed, 170 insertions(+), 103 deletions(-) create mode 100644 runtime/themes/dracula-purple.toml diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 563b9bde..62f8dca3 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -10,6 +10,8 @@ pub fn default() -> HashMap { "j" | "down" => move_line_down, "k" | "up" => move_line_up, "l" | "right" => move_char_right, + "C-j" => half_page_down, + "C-k" => half_page_up, "t" => find_till_char, "f" => find_next_char, diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index c38733d0..d5154dde 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -154,7 +154,7 @@ impl Default for ExplorerConfig { fn default() -> Self { Self { style: ExplorerStyle::Tree, - position: ExplorerPosition::Overlay, + position: ExplorerPosition::Embed, column_width: 30, } } @@ -322,7 +322,16 @@ impl Default for StatusLineConfig { Self { left: vec![E::Mode, E::Spinner, E::FileName], center: vec![], - right: vec![E::Diagnostics, E::Selections, E::Position, E::FileEncoding], + right: vec![ + E::Diagnostics, + E::Selections, + E::Position, + E::PositionPercentage, + E::Separator, + E::FileEncoding, + E::FileLineEnding, + E::FileType, + ], separator: String::from("│"), } } @@ -418,7 +427,7 @@ impl std::ops::Deref for CursorShapeConfig { impl Default for CursorShapeConfig { fn default() -> Self { - Self([CursorKind::Block; 3]) + Self([CursorKind::Block, CursorKind::Underline, CursorKind::Bar]) } } @@ -591,7 +600,7 @@ pub struct IndentGuidesConfig { impl Default for IndentGuidesConfig { fn default() -> Self { Self { - render: false, + render: true, character: '│', } } @@ -609,7 +618,7 @@ impl Default for Config { vec!["sh".to_owned(), "-c".to_owned()] }, line_number: LineNumber::Absolute, - cursorline: false, + cursorline: true, gutters: vec![GutterType::Diagnostics, GutterType::LineNumbers], middle_click_paste: true, auto_pairs: AutoPairConfig::default(), @@ -625,11 +634,11 @@ impl Default for Config { search: SearchConfig::default(), lsp: LspConfig::default(), terminal: get_terminal_provider(), - rulers: Vec::new(), + rulers: vec![120], whitespace: WhitespaceConfig::default(), bufferline: BufferLine::default(), indent_guides: IndentGuidesConfig::default(), - color_modes: false, + color_modes: true, explorer: ExplorerConfig::default(), } } diff --git a/runtime/themes/dracula-purple.toml b/runtime/themes/dracula-purple.toml new file mode 100644 index 00000000..64c86a07 --- /dev/null +++ b/runtime/themes/dracula-purple.toml @@ -0,0 +1,80 @@ +# Author : Sam Sartor , Trivernis +# A port of https://github.com/bceskavich/dracula-at-night +"comment" = { fg = "comment" } +"constant" = { fg = "purple" } +"constant.character.escape" = { fg = "pink" } +"function" = { fg = "green" } +"keyword" = { fg = "pink" } +"operator" = { fg = "pink" } +"special" = { fg = "yellow" } +"punctuation" = { fg = "foreground" } +"string" = { fg = "yellow" } +"string.regexp" = { fg = "red" } +"tag" = { fg = "pink" } +"attribute" = { fg = "cyan" } +"type" = { fg = "cyan", modifiers = ["italic"] } +"type.enum.variant" = { fg = "foreground", modifiers = ["italic"] } +"variable" = { fg = "foreground" } +"variable.builtin" = { fg = "cyan", modifiers = ["italic"] } +"variable.parameter" = { fg ="orange", modifiers = ["italic"] } + +"diff.plus" = { fg = "green" } +"diff.delta" = { fg = "orange" } +"diff.minus" = { fg = "red" } + +"ui.background" = { fg = "foreground", bg = "background" } +"ui.cursor" = { fg = "background", bg = "orange", modifiers = ["dim"] } +"ui.cursor.match" = { fg = "green", modifiers = ["underlined"] } +"ui.cursor.primary" = { fg = "background", bg = "cyan", modifier = ["dim"] } +"ui.cursorline" = {bg = "background_dark"} +"ui.help" = { fg = "foreground", bg = "background_dark" } +"ui.linenr" = { fg = "comment" } +"ui.linenr.selected" = { fg = "foreground" } +"ui.menu" = { fg = "foreground", bg = "background_dark" } +"ui.menu.selected" = { fg = "cyan", bg = "background_dark" } +"ui.popup" = { fg = "foreground", bg = "background_dark" } +"ui.selection" = { fg = "background", bg = "purple", modifiers = ["dim"] } +"ui.selection.primary" = { fg = "background", bg = "pink" } +"ui.text" = { fg = "foreground" } +"ui.text.focus" = { fg = "cyan" } +"ui.window" = { fg = "foreground" } +"ui.virtual.ruler" = { bg = "ruler" } +"ui.virtual.indent-guide" = { fg = "ruler" } + +"ui.statusline" = { fg = "foreground", bg = "background_dark" } +"ui.statusline.inactive" = { fg = "comment", bg = "background_dark" } +"ui.statusline.normal" = { fg = "background_dark", bg = "purple"} +"ui.statusline.insert" = { fg = "background_dark", bg = "pink"} +"ui.statusline.select" = { fg = "background_dark", bg = "cyan"} + +"error" = { fg = "red" } +"warning" = { fg = "cyan" } + +"markup.heading" = { fg = "purple", modifiers = ["bold"] } +"markup.list" = "cyan" +"markup.bold" = { fg = "orange", modifiers = ["bold"] } +"markup.italic" = { fg = "yellow", modifiers = ["italic"] } +"markup.link.url" = "cyan" +"markup.link.text" = "pink" +"markup.quote" = { fg = "yellow", modifiers = ["italic"] } +"markup.raw" = { fg = "foreground" } + +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "comment" } + +[palette] +background = "#3A2A4D" +background_dark = "#2B1C3D" +foreground = "#f8f8f2" +ruler = "#453254" +comment = "#886C9C" +red = "#ff5555" +orange = "#ffb86c" +yellow = "#f1fa8c" +green = "#50fa7b" +purple = "#bd93f9" +cyan = "#8be9fd" +pink = "#ff79c6" \ No newline at end of file diff --git a/theme.toml b/theme.toml index ab7c995a..64c86a07 100644 --- a/theme.toml +++ b/theme.toml @@ -1,104 +1,80 @@ -attribute = "lilac" -keyword = "almond" -"keyword.directive" = "lilac" # -- preprocessor comments (#if in C) -namespace = "lilac" -punctuation = "lavender" -"punctuation.delimiter" = "lavender" -operator = "lilac" -special = "honey" -"variable.other.member" = "white" -variable = "lavender" -# variable = "almond" # TODO: metavariables only -# "variable.parameter" = { fg = "lavender", modifiers = ["underlined"] } -"variable.parameter" = { fg = "lavender" } -"variable.builtin" = "mint" -type = "white" -"type.builtin" = "white" # TODO: distinguish? -constructor = "lilac" -function = "white" -"function.macro" = "lilac" -"function.builtin" = "white" -tag = "almond" -comment = "sirocco" -constant = "white" -"constant.builtin" = "white" -string = "silver" -"constant.numeric" = "chamois" -"constant.character.escape" = "honey" -# used for lifetimes -label = "honey" +# Author : Sam Sartor , Trivernis +# A port of https://github.com/bceskavich/dracula-at-night +"comment" = { fg = "comment" } +"constant" = { fg = "purple" } +"constant.character.escape" = { fg = "pink" } +"function" = { fg = "green" } +"keyword" = { fg = "pink" } +"operator" = { fg = "pink" } +"special" = { fg = "yellow" } +"punctuation" = { fg = "foreground" } +"string" = { fg = "yellow" } +"string.regexp" = { fg = "red" } +"tag" = { fg = "pink" } +"attribute" = { fg = "cyan" } +"type" = { fg = "cyan", modifiers = ["italic"] } +"type.enum.variant" = { fg = "foreground", modifiers = ["italic"] } +"variable" = { fg = "foreground" } +"variable.builtin" = { fg = "cyan", modifiers = ["italic"] } +"variable.parameter" = { fg ="orange", modifiers = ["italic"] } -"markup.heading" = "lilac" -"markup.bold" = { modifiers = ["bold"] } -"markup.italic" = { modifiers = ["italic"] } -"markup.link.url" = { fg = "silver", modifiers = ["underlined"] } -"markup.link.text" = "almond" -"markup.raw" = "almond" +"diff.plus" = { fg = "green" } +"diff.delta" = { fg = "orange" } +"diff.minus" = { fg = "red" } -"diff.plus" = "#35bf86" -"diff.minus" = "#f22c86" -"diff.delta" = "#6f44f0" +"ui.background" = { fg = "foreground", bg = "background" } +"ui.cursor" = { fg = "background", bg = "orange", modifiers = ["dim"] } +"ui.cursor.match" = { fg = "green", modifiers = ["underlined"] } +"ui.cursor.primary" = { fg = "background", bg = "cyan", modifier = ["dim"] } +"ui.cursorline" = {bg = "background_dark"} +"ui.help" = { fg = "foreground", bg = "background_dark" } +"ui.linenr" = { fg = "comment" } +"ui.linenr.selected" = { fg = "foreground" } +"ui.menu" = { fg = "foreground", bg = "background_dark" } +"ui.menu.selected" = { fg = "cyan", bg = "background_dark" } +"ui.popup" = { fg = "foreground", bg = "background_dark" } +"ui.selection" = { fg = "background", bg = "purple", modifiers = ["dim"] } +"ui.selection.primary" = { fg = "background", bg = "pink" } +"ui.text" = { fg = "foreground" } +"ui.text.focus" = { fg = "cyan" } +"ui.window" = { fg = "foreground" } +"ui.virtual.ruler" = { bg = "ruler" } +"ui.virtual.indent-guide" = { fg = "ruler" } -# TODO: diferentiate doc comment -# concat (ERROR) @error.syntax and "MISSING ;" selectors for errors +"ui.statusline" = { fg = "foreground", bg = "background_dark" } +"ui.statusline.inactive" = { fg = "comment", bg = "background_dark" } +"ui.statusline.normal" = { fg = "background_dark", bg = "purple"} +"ui.statusline.insert" = { fg = "background_dark", bg = "pink"} +"ui.statusline.select" = { fg = "background_dark", bg = "cyan"} -"ui.background" = { bg = "midnight" } -"ui.background.separator" = { fg = "comet" } -"ui.linenr" = { fg = "comet" } -"ui.linenr.selected" = { fg = "lilac" } -"ui.statusline" = { fg = "lilac", bg = "revolver" } -"ui.statusline.inactive" = { fg = "lavender", bg = "revolver" } -"ui.popup" = { bg = "revolver" } -"ui.window" = { fg = "bossanova" } -"ui.help" = { bg = "#7958DC", fg = "#171452" } +"error" = { fg = "red" } +"warning" = { fg = "cyan" } -"ui.text" = { fg = "lavender" } -"ui.text.focus" = { fg = "white" } -"ui.virtual" = { fg = "comet" } +"markup.heading" = { fg = "purple", modifiers = ["bold"] } +"markup.list" = "cyan" +"markup.bold" = { fg = "orange", modifiers = ["bold"] } +"markup.italic" = { fg = "yellow", modifiers = ["italic"] } +"markup.link.url" = "cyan" +"markup.link.text" = "pink" +"markup.quote" = { fg = "yellow", modifiers = ["italic"] } +"markup.raw" = { fg = "foreground" } -"ui.virtual.indent-guide" = { fg = "comet" } - -"ui.selection" = { bg = "#540099" } -"ui.selection.primary" = { bg = "#540099" } -# TODO: namespace ui.cursor as ui.selection.cursor? -"ui.cursor.select" = { bg = "delta" } -"ui.cursor.insert" = { bg = "white" } -"ui.cursor.match" = { fg = "#212121", bg = "#6C6999" } -"ui.cursor" = { modifiers = ["reversed"] } -"ui.cursorline.primary" = { bg = "bossanova" } -"ui.highlight" = { bg = "bossanova" } - -"ui.menu" = { fg = "lavender", bg = "revolver" } -"ui.menu.selected" = { fg = "revolver", bg = "white" } -"ui.menu.scroll" = { fg = "lavender", bg = "comet" } - -diagnostic = { modifiers = ["underlined"] } -# "diagnostic.hint" = { fg = "revolver", bg = "lilac" } -# "diagnostic.info" = { fg = "revolver", bg = "lavender" } -# "diagnostic.warning" = { fg = "revolver", bg = "honey" } -# "diagnostic.error" = { fg = "revolver", bg = "apricot" } - -warning = "lightning" -error = "apricot" -info = "delta" -hint = "silver" +"ui.explorer.file" = { fg = "foreground" } +"ui.explorer.dir" = { fg = "cyan" } +"ui.explorer.exe" = { fg = "foreground" } +"ui.explorer.focus" = { modifiers = ["reversed"] } +"ui.explorer.unfocus" = { bg = "comment" } [palette] -white = "#ffffff" -lilac = "#dbbfef" -lavender = "#a4a0e8" -comet = "#5a5977" -bossanova = "#452859" -midnight = "#3b224c" -revolver = "#281733" - -silver = "#cccccc" -sirocco = "#697C81" -mint = "#9ff28f" -almond = "#eccdba" -chamois = "#E8DCA0" -honey = "#efba5d" - -apricot = "#f47868" -lightning = "#ffcd1c" -delta = "#6F44F0" +background = "#3A2A4D" +background_dark = "#2B1C3D" +foreground = "#f8f8f2" +ruler = "#453254" +comment = "#886C9C" +red = "#ff5555" +orange = "#ffb86c" +yellow = "#f1fa8c" +green = "#50fa7b" +purple = "#bd93f9" +cyan = "#8be9fd" +pink = "#ff79c6" \ No newline at end of file -- 2.38.5 From c77120433f0da437159627dc6f4f4a5d1b703647 Mon Sep 17 00:00:00 2001 From: trivernis Date: Wed, 21 Sep 2022 19:08:49 +0200 Subject: [PATCH 22/54] Modify workflows --- .github/workflows/build.yml | 2 +- .github/workflows/cachix.yml | 26 --------------------- .github/workflows/gh-pages.yml | 41 ---------------------------------- 3 files changed, 1 insertion(+), 68 deletions(-) delete mode 100644 .github/workflows/cachix.yml delete mode 100644 .github/workflows/gh-pages.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef47a277..3c58f3ab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ on: pull_request: push: branches: - - master + - main schedule: - cron: '00 01 * * *' diff --git a/.github/workflows/cachix.yml b/.github/workflows/cachix.yml deleted file mode 100644 index 2d37b36a..00000000 --- a/.github/workflows/cachix.yml +++ /dev/null @@ -1,26 +0,0 @@ -# Publish the Nix flake outputs to Cachix -name: Cachix -on: - push: - branches: - - master - -jobs: - publish: - name: Publish Flake - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - - name: Install nix - uses: cachix/install-nix-action@v17 - - - name: Authenticate with Cachix - uses: cachix/cachix-action@v10 - with: - name: helix - authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} - - - name: Build nix flake - run: nix build -L diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml deleted file mode 100644 index 223f8450..00000000 --- a/.github/workflows/gh-pages.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Github Pages - -on: - push: - branches: - - master - tags: - - '*' - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Setup mdBook - uses: peaceiris/actions-mdbook@v1 - with: - mdbook-version: 'latest' - # mdbook-version: '0.4.8' - - - run: mdbook build book - - - name: Set output directory - run: | - OUTDIR=$(basename ${{ github.ref }}) - echo "OUTDIR=$OUTDIR" >> $GITHUB_ENV - - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./book/book - destination_dir: ./${{ env.OUTDIR }} - - - name: Deploy stable - uses: peaceiris/actions-gh-pages@v3 - if: startswith(github.ref, 'refs/tags/') - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./book/book -- 2.38.5 From dbebd266615a8b43239f7224c0bc405b990f00ad Mon Sep 17 00:00:00 2001 From: trivernis Date: Fri, 30 Sep 2022 20:27:31 +0200 Subject: [PATCH 23/54] Update README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8a980e7f..024db631 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ - [File explorer and tree helper](https://github.com/helix-editor/helix/pull/2377) - [with Icons](https://github.com/r0l1/helix/tree/tree_explorer_icons) - [Add LSP workspace command picker](https://github.com/helix-editor/helix/pull/3140) + - [completion fix](https://github.com/helix-editor/helix/pull/1819) And others I forgot about... -- 2.38.5 From 423435d12a3268b6b3aa60bbaea3d4efd1a5f2fa Mon Sep 17 00:00:00 2001 From: trivernis Date: Fri, 30 Sep 2022 21:16:43 +0200 Subject: [PATCH 24/54] Add auto-select of tree explorer nodes when jumping between buffers --- README.md | 7 +++++++ helix-term/src/ui/editor.rs | 5 +++++ helix-term/src/ui/explore.rs | 10 ++++++++++ helix-term/src/ui/tree.rs | 13 +++++++++++++ 4 files changed, 35 insertions(+) diff --git a/README.md b/README.md index 024db631..56e7d4f2 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,13 @@ And others I forgot about... + +# Applied Changes + +- Changed opening the window popup from `ctrl + w` to `ctrl + v` +- Added an auto select for files in the tree explorer when jumping through opened buffers +- Changed some default settings (enabling bufferline, indent guides, the embedded explorer, cursor modes etc.) + - - - [![Build status](https://github.com/helix-editor/helix/actions/workflows/build.yml/badge.svg)](https://github.com/helix-editor/helix/actions) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index fbab360c..b94e01ad 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -1370,6 +1370,11 @@ impl Component for EditorView { if let Some(explore) = self.explorer.as_mut() { if !explore.content.is_focus() && config.explorer.is_embed() { + let current_doc = view!(cx.editor).doc; + let current_doc = cx.editor.document(current_doc).unwrap(); + if let Some(path) = current_doc.path() { + explore.content.set_selection(&path); + } explore.content.render(area, surface, cx); } } diff --git a/helix-term/src/ui/explore.rs b/helix-term/src/ui/explore.rs index 951a2ebc..929cccf4 100644 --- a/helix-term/src/ui/explore.rs +++ b/helix-term/src/ui/explore.rs @@ -321,6 +321,16 @@ impl Explorer { }) } + pub fn set_selection(&mut self, path: &Path) { + let info = if path.is_file() { + FileInfo::new(path.into(), FileType::File) + } else { + FileInfo::new(path.into(), FileType::Dir) + }; + self.tree.select(&info); + self.tree.save_view(); + } + pub fn new_explorer_recursion() -> Result { let current_root = std::env::current_dir().unwrap_or_else(|_| "./".into()); let parent = FileInfo::parent(¤t_root); diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs index 1a3ec01d..4379bbac 100644 --- a/helix-term/src/ui/tree.rs +++ b/helix-term/src/ui/tree.rs @@ -431,6 +431,19 @@ impl Tree { self.items[self.selected].item = item; } + pub fn select(&mut self, select_item: &T) { + let selected = self + .items + .iter() + .enumerate() + .filter(|(_, i)| i.item.cmp(select_item) == Ordering::Equal) + .next(); + if let Some((idx, _)) = selected { + self.selected = idx; + self.row = idx; + } + } + pub fn insert_current_level(&mut self, item: T) { let current = self.current(); let level = current.level; -- 2.38.5 From a864b63b0fb34233d95fac25e4d5badd44123b81 Mon Sep 17 00:00:00 2001 From: trivernis Date: Fri, 30 Sep 2022 21:25:41 +0200 Subject: [PATCH 25/54] Add space to open files in the explorer as an alternative to enter --- helix-term/src/ui/tree.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/helix-term/src/ui/tree.rs b/helix-term/src/ui/tree.rs index 4379bbac..6ad7c3b1 100644 --- a/helix-term/src/ui/tree.rs +++ b/helix-term/src/ui/tree.rs @@ -592,6 +592,7 @@ impl Tree { key!('l') => self.move_right(1.max(count)), shift!('G') => self.move_down(usize::MAX / 2), key!(Enter) => self.on_enter(cx, params), + key!(' ') => self.on_enter(cx, params), ctrl!('d') => self.move_down_half_page(), ctrl!('u') => self.move_up_half_page(), shift!('D') => self.move_down_page(), -- 2.38.5 From a27c384dd23bfe97734944843bff2862214bd78e Mon Sep 17 00:00:00 2001 From: s0LA1337 Date: Sat, 1 Oct 2022 00:44:35 +0000 Subject: [PATCH 26/54] Initial implementation of colored indentation guides --- book/src/configuration.md | 10 ++++++---- helix-term/src/ui/editor.rs | 20 +++++++++++++++++--- helix-view/src/editor.rs | 2 ++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/book/src/configuration.md b/book/src/configuration.md index fdabe768..3a5ab4a2 100644 --- a/book/src/configuration.md +++ b/book/src/configuration.md @@ -218,10 +218,11 @@ tabpad = "·" # Tabs will look like "→···" (depending on tab width) Options for rendering vertical indent guides. -| Key | Description | Default | -| --- | --- | --- | -| `render` | Whether to render indent guides. | `false` | -| `character` | Literal character to use for rendering the indent guide | `│` | +| Key | Description | Default | +| --- | --- | --- | +| `render` | Whether to render indent guides. | `false` | +| `character` | Literal character to use for rendering the indent guide | `│` | +| `rainbow` | Whether or not the indent guides shall have changing colors. | `false` | Example: @@ -229,4 +230,5 @@ Example: [editor.indent-guides] render = true character = "╎" +rainbow = true ``` diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 7cb29c3b..69e565e1 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -421,17 +421,26 @@ impl EditorView { let text_style = theme.get("ui.text"); let whitespace_style = theme.get("ui.virtual.whitespace"); + let indent_rainbow_colors = [ + helix_view::graphics::Color::Red, + helix_view::graphics::Color::Yellow, + helix_view::graphics::Color::Green, + helix_view::graphics::Color::Cyan, + helix_view::graphics::Color::Blue, + helix_view::graphics::Color::Magenta, + ]; + let mut is_in_indent_area = true; - let mut last_line_indent_level = 0; + let mut last_line_indent_level: u16 = 0; // use whitespace style as fallback for indent-guide - let indent_guide_style = text_style.patch( + let mut indent_guide_style = text_style.patch( theme .try_get("ui.virtual.indent-guide") .unwrap_or_else(|| theme.get("ui.virtual.whitespace")), ); - let draw_indent_guides = |indent_level, line, surface: &mut Surface| { + let mut draw_indent_guides = |indent_level, line, surface: &mut Surface| { if !config.indent_guides.render { return; } @@ -441,6 +450,11 @@ impl EditorView { // extra loops if the code is deeply nested. for i in starting_indent..(indent_level / tab_width as u16) { + if config.indent_guides.rainbow { + let color_index: usize = i as usize % indent_rainbow_colors.len(); + indent_guide_style.fg = Some(indent_rainbow_colors[color_index]); + } + surface.set_string( viewport.x + (i * tab_width as u16) - offset.col as u16, viewport.y + line, diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 5eff9983..5acbc5b7 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -533,6 +533,7 @@ impl Default for WhitespaceCharacters { pub struct IndentGuidesConfig { pub render: bool, pub character: char, + pub rainbow: bool, } impl Default for IndentGuidesConfig { @@ -540,6 +541,7 @@ impl Default for IndentGuidesConfig { Self { render: false, character: '│', + rainbow: false, } } } -- 2.38.5 From 9bbc12d7b67dcb2ea97a6202391004c77bd5f214 Mon Sep 17 00:00:00 2001 From: s0LA1337 Date: Sat, 1 Oct 2022 01:20:04 +0000 Subject: [PATCH 27/54] Remove unnecessary typing --- helix-term/src/ui/editor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 69e565e1..e28a95d9 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -431,7 +431,7 @@ impl EditorView { ]; let mut is_in_indent_area = true; - let mut last_line_indent_level: u16 = 0; + let mut last_line_indent_level = 0; // use whitespace style as fallback for indent-guide let mut indent_guide_style = text_style.patch( -- 2.38.5 From 0725aa104602f46ec70ad8db08f9fe3876a6d4ff Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 1 Oct 2022 10:46:09 +0200 Subject: [PATCH 28/54] Add flag to open the file explorer on startup Signed-off-by: trivernis --- README.md | 3 ++- helix-term/src/application.rs | 18 +++++++++++++++--- helix-term/src/args.rs | 2 ++ helix-term/src/main.rs | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 56e7d4f2..b939caac 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,9 @@ And others I forgot about... # Applied Changes - Changed opening the window popup from `ctrl + w` to `ctrl + v` -- Added an auto select for files in the tree explorer when jumping through opened buffers +- Added an auto highlight for files in the tree explorer when jumping through opened buffers - Changed some default settings (enabling bufferline, indent guides, the embedded explorer, cursor modes etc.) +- Added a `--show-explorer` cli flag to open the file explorer on startup (useful for embedded explorer mode) - - - diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index cd499f1c..8dd4f1ed 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -12,11 +12,11 @@ use serde_json::json; use crate::{ args::Args, commands::apply_workspace_edit, - compositor::{Compositor, Event}, + compositor::{self, Compositor, Event}, config::Config, job::Jobs, keymap::Keymaps, - ui::{self, overlay::overlayed}, + ui::{self, overlay::overlayed, Explorer}, }; use log::{error, warn}; @@ -153,7 +153,19 @@ 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))); + + if args.show_explorer { + let mut jobs = Jobs::new(); + 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(overlayed(explorer)); + } compositor.push(editor_view); if args.load_tutor { diff --git a/helix-term/src/args.rs b/helix-term/src/args.rs index 48c86633..b72e9172 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" => args.split = Some(Layout::Vertical), "--hsplit" => args.split = Some(Layout::Horizontal), "--health" => { diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index 726bf9e3..6f69e318 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -72,6 +72,7 @@ FLAGS: -V, --version Prints version information --vsplit Splits all given files vertically into different windows --hsplit Splits all given files horizontally into different windows + --show-explorer Opens the explorer on startup ", env!("CARGO_PKG_NAME"), env!("VERSION_AND_GIT_HASH"), -- 2.38.5 From 092163bd8fc31e382ee57f4f5909762699a36bcd Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 1 Oct 2022 19:52:04 +0200 Subject: [PATCH 29/54] Add command to delete the file of the current buffer --- README.md | 1 + helix-term/src/commands/typed.rs | 31 +++++++++++++++++++++++++++++++ helix-view/src/document.rs | 15 +++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/README.md b/README.md index b939caac..f6a52cfd 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ And others I forgot about... - Added an auto highlight for files in the tree explorer when jumping through opened buffers - Changed some default settings (enabling bufferline, indent guides, the embedded explorer, cursor modes etc.) - Added a `--show-explorer` cli flag to open the file explorer on startup (useful for embedded explorer mode) +- Added a `delete` (aliases `rm`, `del`) command to delete the file associated with the current buffer - - - diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index 3ee5324d..f2063b0f 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -232,6 +232,30 @@ fn buffer_previous( Ok(()) } +fn delete( + cx: &mut compositor::Context, + _args: &[Cow], + event: PromptEvent, +) -> anyhow::Result<()> { + if event != PromptEvent::Validate { + return Ok(()); + } + + let doc = doc_mut!(cx.editor); + + if doc.path().is_none() { + bail!("cannot delete a buffer with no associated file on the disk"); + } + + let future = doc.delete(); + cx.jobs.add(Job::new(future)); + + let doc_id = view!(cx.editor).doc; + cx.editor.close_document(doc_id, true)?; + + Ok(()) +} + fn write_impl( cx: &mut compositor::Context, path: Option<&Cow>, @@ -1658,6 +1682,13 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[ fun: new_file, completer: Some(completers::filename), }, + TypableCommand { + name: "delete", + aliases: &["remove", "rm", "del"], + doc: "Deletes the file associated with the current buffer", + fun: delete, + completer: None, + }, TypableCommand { name: "format", aliases: &["fmt"], diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 6dfa26bc..9eb89931 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -491,6 +491,21 @@ impl Document { Some(fut.boxed()) } + /// Deletes the file associated with this document + pub fn delete(&mut self) -> impl Future> { + let path = self + .path() + .expect("Cannot delete with no path set!") + .clone(); + + async move { + use tokio::fs; + fs::remove_file(path).await?; + + Ok(()) + } + } + pub fn save(&mut self, force: bool) -> impl Future> { self.save_impl::>(None, force) } -- 2.38.5 From 817c2a7e6d36af6fd03b10810eb601cc12acf7a0 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 1 Oct 2022 19:56:30 +0200 Subject: [PATCH 30/54] Add blocking on file deletion Signed-off-by: trivernis --- helix-term/src/commands/typed.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index f2063b0f..91fa3cfc 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -250,6 +250,7 @@ fn delete( let future = doc.delete(); cx.jobs.add(Job::new(future)); + helix_lsp::block_on(cx.jobs.finish())?; let doc_id = view!(cx.editor).doc; cx.editor.close_document(doc_id, true)?; -- 2.38.5 From 1daf0c35c78fddc21b0418eb33dac8ea734c90d5 Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Mon, 11 Jul 2022 19:10:57 -0500 Subject: [PATCH 31/54] Parse rainbow style array in themes This change adds a field to the schema of themes which takes a list of styles. rainbow = ["red", "orange", "yellow", { modifiers = ["reversed"] }] [palette] red = "#ff0000" orange = "#ffa500" yellow = "#fff000" Normal style rules apply for each element in `rainbows`: you can use definitions from the palette and the full fg/bg/modifiers notation. Themes written with `rainbow` keys are not backwards compatible. Parsing errors will be generated for older versions of Helix attempting to use themes with `rainbow` keys. A default rainbow is provided with base16 colors. This change is made with rainbow pair characters (parens, brackets, etc.) in mind but it could also be used for other rainbow cosmetic elements like rainbow indent-guides. --- book/src/themes.md | 11 +++++ helix-view/src/theme.rs | 103 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/book/src/themes.md b/book/src/themes.md index 9908456f..ea516959 100644 --- a/book/src/themes.md +++ b/book/src/themes.md @@ -89,6 +89,17 @@ Less common modifiers might not be supported by your terminal emulator. | `hidden` | | `crossed_out` | +### Rainbow + +The `rainbow` key is used for rainbow highlight for matching brackets. +The key is a list of styles. + +```toml +rainbow = ["#ff0000", "#ffa500", "#fff000", { fg = "#00ff00", modifiers = ["bold"] }] +``` + +Colors from the palette and modifiers may be used. + ### Scopes The following is a list of scopes available to use for styling. diff --git a/helix-view/src/theme.rs b/helix-view/src/theme.rs index fa5fa702..8472ec64 100644 --- a/helix-view/src/theme.rs +++ b/helix-view/src/theme.rs @@ -103,6 +103,7 @@ pub struct Theme { // tree-sitter highlight styles are stored in a Vec to optimize lookups scopes: Vec, highlights: Vec