From 9206561662e8382e14f4ddf4db9f43ec64cf5972 Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Fri, 30 Aug 2024 10:50:12 +0200 Subject: [PATCH] vim: Don't show inline completions in normal mode (#17137) This fixes an annoying bug I ran into, where supermaven completions would show up in normal mode. cc @ConradIrwin not sure if this is the best way to fix this, but it seems like the neatest? On one hand, I didn't want to touch into Vim from the editor, and on the other I didn't want to add another boolean on the editor that flips on when in normal mode. So instead I extended the Addon interface. Release Notes: - Fixed inline completions (Copilot or Supermaven) showing up in Vim's normal mode. --- crates/editor/src/editor.rs | 8 ++++++++ crates/vim/src/vim.rs | 8 ++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index ce6349b203..a4306297fe 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -470,6 +470,9 @@ struct BufferOffset(usize); // Addons allow storing per-editor state in other crates (e.g. Vim) pub trait Addon: 'static { fn extend_key_context(&self, _: &mut KeyContext, _: &AppContext) {} + fn should_show_inline_completions(&self, _: &AppContext) -> bool { + true + } fn to_any(&self) -> &dyn std::any::Any; } @@ -2340,6 +2343,11 @@ impl Editor { cx: &AppContext, ) -> bool { if let Some(provider) = self.inline_completion_provider() { + for addon in self.addons.values() { + if !addon.should_show_inline_completions(cx) { + return false; + } + } if let Some(show_inline_completions) = self.show_inline_completions_override { show_inline_completions } else { diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index d7015440f4..ab28077487 100644 --- a/crates/vim/src/vim.rs +++ b/crates/vim/src/vim.rs @@ -91,8 +91,7 @@ pub fn init(cx: &mut AppContext) { VimSettings::register(cx); VimGlobals::register(cx); - cx.observe_new_views(|editor: &mut Editor, cx| Vim::register(editor, cx)) - .detach(); + cx.observe_new_views(Vim::register).detach(); cx.observe_new_views(|workspace: &mut Workspace, _| { workspace.register_action(|workspace, _: &ToggleVimMode, cx| { @@ -135,6 +134,11 @@ impl editor::Addon for VimAddon { self.view.read(cx).extend_key_context(key_context) } + fn should_show_inline_completions(&self, cx: &AppContext) -> bool { + let mode = self.view.read(cx).mode; + mode == Mode::Insert || mode == Mode::Replace + } + fn to_any(&self) -> &dyn std::any::Any { self }