From eb7367d8f240971ed5c9d025cbe7485633502520 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Fri, 30 Aug 2024 14:02:38 +0200 Subject: [PATCH] vim: Disable inline completions if not Insert/Replace mode (#17154) This is a follow-up to - https://github.com/zed-industries/zed/pull/17137 - https://github.com/zed-industries/zed/pull/17138 (revert of #17137) and it does what I originally thought I wouldn't have to do: add another boolean to `Editor`. cc @ConradIrwin Release Notes: - Fixed inline completions (Copilot or Supermaven) showing up in Vim's normal mode. --- crates/editor/src/editor.rs | 13 ++++++++++++- crates/vim/src/vim.rs | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index ce6349b203..cc437aa234 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -556,6 +556,9 @@ pub struct Editor { hovered_link_state: Option, inline_completion_provider: Option, active_inline_completion: Option<(Inlay, Option>)>, + // enable_inline_completions is a switch that Vim can use to disable + // inline completions based on its mode. + enable_inline_completions: bool, show_inline_completions_override: Option, inlay_hint_cache: InlayHintCache, expanded_hunks: ExpandedHunks, @@ -1913,6 +1916,7 @@ impl Editor { next_editor_action_id: EditorActionId::default(), editor_actions: Rc::default(), show_inline_completions_override: None, + enable_inline_completions: true, custom_context_menu: None, show_git_blame_gutter: false, show_git_blame_inline: false, @@ -2277,6 +2281,10 @@ impl Editor { self.input_enabled = input_enabled; } + pub fn set_inline_completions_enabled(&mut self, enabled: bool) { + self.enable_inline_completions = enabled; + } + pub fn set_autoindent(&mut self, autoindent: bool) { if autoindent { self.autoindent_mode = Some(AutoindentMode::EachLine); @@ -4977,6 +4985,7 @@ impl Editor { let (buffer, cursor_buffer_position) = self.buffer.read(cx).text_anchor_for_position(cursor, cx)?; if !user_requested + && self.enable_inline_completions && !self.should_show_inline_completions(&buffer, cursor_buffer_position, cx) { self.discard_inline_completion(false, cx); @@ -4997,7 +5006,9 @@ impl Editor { let cursor = self.selections.newest_anchor().head(); let (buffer, cursor_buffer_position) = self.buffer.read(cx).text_anchor_for_position(cursor, cx)?; - if !self.should_show_inline_completions(&buffer, cursor_buffer_position, cx) { + if !self.enable_inline_completions + || !self.should_show_inline_completions(&buffer, cursor_buffer_position, cx) + { return None; } diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index d7015440f4..68403c44bc 100644 --- a/crates/vim/src/vim.rs +++ b/crates/vim/src/vim.rs @@ -1061,6 +1061,7 @@ impl Vim { editor.set_input_enabled(vim.editor_input_enabled()); editor.set_autoindent(vim.should_autoindent()); editor.selections.line_mode = matches!(vim.mode, Mode::VisualLine); + editor.set_inline_completions_enabled(matches!(vim.mode, Mode::Insert | Mode::Replace)); }); cx.notify() }