Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/editor.rs')
| -rw-r--r-- | helix-view/src/editor.rs | 133 |
1 files changed, 22 insertions, 111 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 7f8cff9c..2e5c60cf 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -221,49 +221,6 @@ impl Default for FilePickerConfig { } } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case", default, deny_unknown_fields)] -pub struct FileExplorerConfig { - /// IgnoreOptions - /// Enables ignoring hidden files. - /// Whether to hide hidden files in file explorer and global search results. Defaults to false. - pub hidden: bool, - /// Enables following symlinks. - /// Whether to follow symbolic links in file picker and file or directory completions. Defaults to false. - pub follow_symlinks: bool, - /// Enables reading ignore files from parent directories. Defaults to false. - pub parents: bool, - /// Enables reading `.ignore` files. - /// Whether to hide files listed in .ignore in file picker and global search results. Defaults to false. - pub ignore: bool, - /// Enables reading `.gitignore` files. - /// Whether to hide files listed in .gitignore in file picker and global search results. Defaults to false. - pub git_ignore: bool, - /// Enables reading global .gitignore, whose path is specified in git's config: `core.excludefile` option. - /// Whether to hide files listed in global .gitignore in file picker and global search results. Defaults to false. - pub git_global: bool, - /// Enables reading `.git/info/exclude` files. - /// Whether to hide files listed in .git/info/exclude in file picker and global search results. Defaults to false. - pub git_exclude: bool, - /// Whether to flatten single-child directories in file explorer. Defaults to true. - pub flatten_dirs: bool, -} - -impl Default for FileExplorerConfig { - fn default() -> Self { - Self { - hidden: false, - follow_symlinks: false, - parents: false, - ignore: false, - git_ignore: false, - git_global: false, - git_exclude: false, - flatten_dirs: true, - } - } -} - fn serialize_alphabet<S>(alphabet: &[char], serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, @@ -321,9 +278,6 @@ pub struct Config { /// either absolute or relative to the current opened document or current working directory (if the buffer is not yet saved). /// Defaults to true. pub path_completion: bool, - /// Configures completion of words from open buffers. - /// Defaults to enabled with a trigger length of 7. - pub word_completion: WordCompletion, /// Automatic formatting on save. Defaults to true. pub auto_format: bool, /// Default register used for yank/paste. Defaults to '"' @@ -361,7 +315,6 @@ pub struct Config { /// Whether to display infoboxes. Defaults to true. pub auto_info: bool, pub file_picker: FilePickerConfig, - pub file_explorer: FileExplorerConfig, /// Configuration of the statusline elements pub statusline: StatusLineConfig, /// Shape for cursor in each mode @@ -392,10 +345,6 @@ pub struct Config { pub default_line_ending: LineEndingConfig, /// Whether to automatically insert a trailing line-ending on write if missing. Defaults to `true`. pub insert_final_newline: bool, - /// Whether to use atomic operations to write documents to disk. - /// This prevents data loss if the editor is interrupted while writing the file, but may - /// confuse some file watching/hot reloading programs. Defaults to `true`. - pub atomic_save: bool, /// Whether to automatically remove all trailing line-endings after the final one on write. /// Defaults to `false`. pub trim_final_newlines: bool, @@ -423,19 +372,6 @@ pub struct Config { /// Whether to read settings from [EditorConfig](https://editorconfig.org) files. Defaults to /// `true`. pub editor_config: bool, - /// Whether to render rainbow colors for matching brackets. Defaults to `false`. - pub rainbow_brackets: bool, - /// Whether to enable Kitty Keyboard Protocol - pub kitty_keyboard_protocol: KittyKeyboardProtocolConfig, -} - -#[derive(Debug, Default, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize, Clone, Copy)] -#[serde(rename_all = "kebab-case")] -pub enum KittyKeyboardProtocolConfig { - #[default] - Auto, - Disabled, - Enabled, } #[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Eq, PartialOrd, Ord)] @@ -685,9 +621,6 @@ pub enum StatusLineElement { /// Indicator for selected register Register, - - /// The base of current working directory - CurrentWorkingDirectory, } // Cursor shape is read and used on every rendered frame and so needs @@ -1037,22 +970,6 @@ pub enum PopupBorderConfig { Menu, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[serde(default, rename_all = "kebab-case", deny_unknown_fields)] -pub struct WordCompletion { - pub enable: bool, - pub trigger_length: NonZeroU8, -} - -impl Default for WordCompletion { - fn default() -> Self { - Self { - enable: true, - trigger_length: NonZeroU8::new(7).unwrap(), - } - } -} - impl Default for Config { fn default() -> Self { Self { @@ -1072,7 +989,6 @@ impl Default for Config { auto_pairs: AutoPairConfig::default(), auto_completion: true, path_completion: true, - word_completion: WordCompletion::default(), auto_format: true, default_yank_register: '"', auto_save: AutoSave::default(), @@ -1082,7 +998,6 @@ impl Default for Config { completion_trigger_len: 2, auto_info: true, file_picker: FilePickerConfig::default(), - file_explorer: FileExplorerConfig::default(), statusline: StatusLineConfig::default(), cursor_shape: CursorShapeConfig::default(), true_color: false, @@ -1105,7 +1020,6 @@ impl Default for Config { workspace_lsp_roots: Vec::new(), default_line_ending: LineEndingConfig::default(), insert_final_newline: true, - atomic_save: true, trim_final_newlines: false, trim_trailing_whitespace: false, smart_tab: Some(SmartTabConfig::default()), @@ -1113,11 +1027,9 @@ impl Default for Config { indent_heuristic: IndentationHeuristic::default(), jump_label_alphabet: ('a'..='z').collect(), inline_diagnostics: InlineDiagnosticsConfig::default(), - end_of_line_diagnostics: DiagnosticFilter::Enable(Severity::Hint), + end_of_line_diagnostics: DiagnosticFilter::Disable, clipboard_provider: ClipboardProvider::default(), editor_config: true, - rainbow_brackets: false, - kitty_keyboard_protocol: Default::default(), } } } @@ -1644,7 +1556,7 @@ impl Editor { doc.language_servers.iter().filter(|(name, doc_ls)| { language_servers .get(*name) - .is_none_or(|ls| ls.id() != doc_ls.id()) + .map_or(true, |ls| ls.id() != doc_ls.id()) }); for (_, language_server) in doc_language_servers_not_in_registry { @@ -1654,7 +1566,7 @@ impl Editor { let language_servers_not_in_doc = language_servers.iter().filter(|(name, ls)| { doc.language_servers .get(*name) - .is_none_or(|doc_ls| ls.id() != doc_ls.id()) + .map_or(true, |doc_ls| ls.id() != doc_ls.id()) }); for (_, language_server) in language_servers_not_in_doc { @@ -2044,29 +1956,28 @@ impl Editor { } pub fn focus(&mut self, view_id: ViewId) { - if self.tree.focus == view_id { - return; - } + let prev_id = std::mem::replace(&mut self.tree.focus, view_id); - // Reset mode to normal and ensure any pending changes are committed in the old document. - self.enter_normal_mode(); - let (view, doc) = current!(self); - doc.append_changes_to_history(view); - self.ensure_cursor_in_view(view_id); - // Update jumplist selections with new document changes. - for (view, _focused) in self.tree.views_mut() { + // if leaving the view: mode should reset and the cursor should be + // within view + if prev_id != view_id { + self.enter_normal_mode(); + self.ensure_cursor_in_view(view_id); + + // Update jumplist selections with new document changes. + for (view, _focused) in self.tree.views_mut() { + let doc = doc_mut!(self, &view.doc); + view.sync_changes(doc); + } + let view = view!(self, view_id); let doc = doc_mut!(self, &view.doc); - view.sync_changes(doc); + doc.mark_as_focused(); + let focus_lost = self.tree.get(prev_id).doc; + dispatch(DocumentFocusLost { + editor: self, + doc: focus_lost, + }); } - - let prev_id = std::mem::replace(&mut self.tree.focus, view_id); - doc_mut!(self).mark_as_focused(); - - let focus_lost = self.tree.get(prev_id).doc; - dispatch(DocumentFocusLost { - editor: self, - doc: focus_lost, - }); } pub fn focus_next(&mut self) { |