From e68ef944d9406adb048dc7bf8d42c2967d6d49c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raphael=20L=C3=BCthy?= Date: Wed, 22 May 2024 12:51:21 +0200 Subject: [PATCH] Separate actions for accepting the inline suggestions and completions (#12094) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Release Notes: - Added `editor::AcceptInlineCompletion` action (bound to Tab by default) for accepting inline completions. ([6788](https://github.com/zed-industries/zed/issues/6788)) --------- Signed-off-by: Raphael Lüthy Co-authored-by: Conrad Irvin --- assets/keymaps/default-linux.json | 6 +++ assets/keymaps/default-macos.json | 6 +++ .../src/copilot_completion_provider.rs | 8 ++-- crates/editor/src/actions.rs | 1 + crates/editor/src/editor.rs | 44 ++++++++----------- crates/editor/src/element.rs | 1 + 6 files changed, 36 insertions(+), 30 deletions(-) diff --git a/assets/keymaps/default-linux.json b/assets/keymaps/default-linux.json index bee4d63381..8e127fecc5 100644 --- a/assets/keymaps/default-linux.json +++ b/assets/keymaps/default-linux.json @@ -501,6 +501,12 @@ "tab": "editor::ConfirmCompletion" } }, + { + "context": "Editor && inline_completion && !showing_completions", + "bindings": { + "tab": "editor::AcceptInlineCompletion" + } + }, { "context": "Editor && showing_code_actions", "bindings": { diff --git a/assets/keymaps/default-macos.json b/assets/keymaps/default-macos.json index 1ef98f53a0..f5c509d543 100644 --- a/assets/keymaps/default-macos.json +++ b/assets/keymaps/default-macos.json @@ -515,6 +515,12 @@ "tab": "editor::ConfirmCompletion" } }, + { + "context": "Editor && inline_completion && !showing_completions", + "bindings": { + "tab": "editor::AcceptInlineCompletion" + } + }, { "context": "Editor && showing_code_actions", "bindings": { diff --git a/crates/copilot/src/copilot_completion_provider.rs b/crates/copilot/src/copilot_completion_provider.rs index e5f2a465c0..314ec0ac08 100644 --- a/crates/copilot/src/copilot_completion_provider.rs +++ b/crates/copilot/src/copilot_completion_provider.rs @@ -492,8 +492,8 @@ mod tests { assert_eq!(editor.display_text(cx), "one.copilot2\ntwo\nthree\n"); assert_eq!(editor.text(cx), "one.co\ntwo\nthree\n"); - // Tabbing when there is an active suggestion inserts it. - editor.tab(&Default::default(), cx); + // AcceptInlineCompletion when there is an active suggestion inserts it. + editor.accept_inline_completion(&Default::default(), cx); assert!(!editor.has_active_inline_completion(cx)); assert_eq!(editor.display_text(cx), "one.copilot2\ntwo\nthree\n"); assert_eq!(editor.text(cx), "one.copilot2\ntwo\nthree\n"); @@ -550,8 +550,8 @@ mod tests { assert_eq!(editor.text(cx), "fn foo() {\n \n}"); assert_eq!(editor.display_text(cx), "fn foo() {\n let x = 4;\n}"); - // Tabbing again accepts the suggestion. - editor.tab(&Default::default(), cx); + // Using AcceptInlineCompletion again accepts the suggestion. + editor.accept_inline_completion(&Default::default(), cx); assert!(!editor.has_active_inline_completion(cx)); assert_eq!(editor.text(cx), "fn foo() {\n let x = 4;\n}"); assert_eq!(editor.display_text(cx), "fn foo() {\n let x = 4;\n}"); diff --git a/crates/editor/src/actions.rs b/crates/editor/src/actions.rs index 9d36f078c2..feeb6f9357 100644 --- a/crates/editor/src/actions.rs +++ b/crates/editor/src/actions.rs @@ -143,6 +143,7 @@ gpui::actions!( editor, [ AcceptPartialCopilotSuggestion, + AcceptInlineCompletion, AcceptPartialInlineCompletion, AddSelectionAbove, AddSelectionBelow, diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 687965ad5a..9c9de92aa3 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -4450,23 +4450,25 @@ impl Editor { } } - fn accept_inline_completion(&mut self, cx: &mut ViewContext) -> bool { - if let Some(completion) = self.take_active_inline_completion(cx) { - if let Some(provider) = self.inline_completion_provider() { - provider.accept(cx); - } - - cx.emit(EditorEvent::InputHandled { - utf16_range_to_replace: None, - text: completion.text.to_string().into(), - }); - self.insert_with_autoindent_mode(&completion.text.to_string(), None, cx); - self.refresh_inline_completion(true, cx); - cx.notify(); - true - } else { - false + pub fn accept_inline_completion( + &mut self, + _: &AcceptInlineCompletion, + cx: &mut ViewContext, + ) { + let Some(completion) = self.take_active_inline_completion(cx) else { + return; + }; + if let Some(provider) = self.inline_completion_provider() { + provider.accept(cx); } + + cx.emit(EditorEvent::InputHandled { + utf16_range_to_replace: None, + text: completion.text.to_string().into(), + }); + self.insert_with_autoindent_mode(&completion.text.to_string(), None, cx); + self.refresh_inline_completion(true, cx); + cx.notify(); } pub fn accept_partial_inline_completion( @@ -4966,16 +4968,6 @@ impl Editor { } } - // Accept copilot completion if there is only one selection and the cursor is not - // in the leading whitespace. - if self.selections.count() == 1 - && cursor.column >= current_indent.len - && self.has_active_inline_completion(cx) - { - self.accept_inline_completion(cx); - return; - } - // Otherwise, insert a hard or soft tab. let settings = buffer.settings_at(cursor, cx); let tab_size = if settings.hard_tabs { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index d919405c84..66ddd12bdc 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -383,6 +383,7 @@ impl EditorElement { register_action(view, cx, Editor::unique_lines_case_insensitive); register_action(view, cx, Editor::unique_lines_case_sensitive); register_action(view, cx, Editor::accept_partial_inline_completion); + register_action(view, cx, Editor::accept_inline_completion); register_action(view, cx, Editor::revert_selected_hunks); register_action(view, cx, Editor::open_active_item_in_terminal) }