From 0250898a2bb9760eeb8004f526fc8d8e3f66fb77 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Apr 2023 15:06:49 -0700 Subject: [PATCH 1/5] Enable copilot in all file types by default --- assets/settings/default.json | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/assets/settings/default.json b/assets/settings/default.json index fbb52e00dca9f2ebc83e6eea42864a1dfb269d58..0f663e1b8148eda2c8762957ca5738ba6f0dfea2 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -205,9 +205,7 @@ // Different settings for specific languages. "languages": { "Plain Text": { - "soft_wrap": "preferred_line_length", - // Copilot can be a little strange on non-code files - "copilot": "off" + "soft_wrap": "preferred_line_length" }, "Elixir": { "tab_size": 2 @@ -217,9 +215,7 @@ "hard_tabs": true }, "Markdown": { - "soft_wrap": "preferred_line_length", - // Copilot can be a little strange on non-code files - "copilot": "off" + "soft_wrap": "preferred_line_length" }, "JavaScript": { "tab_size": 2 @@ -232,9 +228,6 @@ }, "YAML": { "tab_size": 2 - }, - "JSON": { - "copilot": "off" } }, // LSP Specific settings. From 48d9c30b0efa648c3905fbe186d19de47aee6d47 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Apr 2023 15:15:42 -0700 Subject: [PATCH 2/5] Remove per-file copilot enable/disable --- assets/keymaps/default.json | 3 +- crates/copilot/src/copilot.rs | 5 +- crates/copilot_button/src/copilot_button.rs | 19 +---- crates/editor/src/editor.rs | 77 +++------------------ 4 files changed, 14 insertions(+), 90 deletions(-) diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json index 1a8350bb536a6fb5a09f977e36de831e7e8745a2..f5446462e6f07433a9a4456faa2f031f28329ae9 100644 --- a/assets/keymaps/default.json +++ b/assets/keymaps/default.json @@ -178,8 +178,7 @@ } ], "alt-]": "copilot::NextSuggestion", - "alt-[": "copilot::PreviousSuggestion", - "alt-\\": "copilot::Toggle" + "alt-[": "copilot::PreviousSuggestion" } }, { diff --git a/crates/copilot/src/copilot.rs b/crates/copilot/src/copilot.rs index 1fb7ee0b5bc830a08f7f89c403a090cb68779b78..0a7851bb0d925a1776f79cc43f662a9f4b8978ea 100644 --- a/crates/copilot/src/copilot.rs +++ b/crates/copilot/src/copilot.rs @@ -32,10 +32,7 @@ const COPILOT_AUTH_NAMESPACE: &'static str = "copilot_auth"; actions!(copilot_auth, [SignIn, SignOut]); const COPILOT_NAMESPACE: &'static str = "copilot"; -actions!( - copilot, - [NextSuggestion, PreviousSuggestion, Toggle, Reinstall] -); +actions!(copilot, [NextSuggestion, PreviousSuggestion, Reinstall]); pub fn init(client: Arc, node_runtime: Arc, cx: &mut MutableAppContext) { let copilot = cx.add_model(|cx| Copilot::start(client.http_client(), node_runtime, cx)); diff --git a/crates/copilot_button/src/copilot_button.rs b/crates/copilot_button/src/copilot_button.rs index ebb09701f6f8860e98652461ee664fb96fd4dc13..62305553a368c7fde455380350c60c1660ec0eab 100644 --- a/crates/copilot_button/src/copilot_button.rs +++ b/crates/copilot_button/src/copilot_button.rs @@ -249,19 +249,6 @@ impl CopilotButton { let mut menu_options = Vec::with_capacity(6); - if let Some((_, view_id)) = self.editor_subscription.as_ref() { - let locally_enabled = self.editor_enabled.unwrap_or(settings.copilot_on(None)); - menu_options.push(ContextMenuItem::item_for_view( - if locally_enabled { - "Pause Copilot for this file" - } else { - "Resume Copilot for this file" - }, - *view_id, - copilot::Toggle, - )); - } - if let Some(language) = &self.language { let language_enabled = settings.copilot_on(Some(language.as_ref())); @@ -334,11 +321,7 @@ impl CopilotButton { self.language = language_name.clone(); - if let Some(enabled) = editor.copilot_state.user_enabled { - self.editor_enabled = Some(enabled); - } else { - self.editor_enabled = Some(settings.copilot_on(language_name.as_deref())); - } + self.editor_enabled = Some(settings.copilot_on(language_name.as_deref())); cx.notify() } diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 067b06bd6eca8ee631c455e317b6cc3532e6ae6f..cf7ff144a4e2ee0ea0a3bdb6a8ce387007fa35ac 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -391,7 +391,6 @@ pub fn init(cx: &mut MutableAppContext) { cx.add_async_action(Editor::find_all_references); cx.add_action(Editor::next_copilot_suggestion); cx.add_action(Editor::previous_copilot_suggestion); - cx.add_action(Editor::toggle_copilot_suggestions); hover_popover::init(cx); link_go_to_definition::init(cx); @@ -1013,7 +1012,6 @@ pub struct CopilotState { pending_refresh: Task>, completions: Vec, active_completion_index: usize, - pub user_enabled: Option, } impl Default for CopilotState { @@ -1023,7 +1021,6 @@ impl Default for CopilotState { pending_refresh: Task::ready(Some(())), completions: Default::default(), active_completion_index: 0, - user_enabled: None, } } } @@ -2780,37 +2777,24 @@ impl Editor { return None; } - let settings = cx.global::(); - - if !self - .copilot_state - .user_enabled - .unwrap_or_else(|| settings.copilot_on(None)) - { - return None; - } - - let snapshot = self.buffer.read(cx).snapshot(cx); let selection = self.selections.newest_anchor(); - - if !self.copilot_state.user_enabled.is_some() { - let language_name = snapshot - .language_at(selection.start) - .map(|language| language.name()); - - let copilot_enabled = settings.copilot_on(language_name.as_deref()); - - if !copilot_enabled { - return None; - } - } + let snapshot = self.buffer.read(cx).snapshot(cx); let cursor = if selection.start == selection.end { selection.start.bias_left(&snapshot) } else { return None; }; - self.refresh_active_copilot_suggestion(cx); + + let language_name = snapshot + .language_at(selection.start) + .map(|language| language.name()); + + let copilot_enabled = cx.global::().copilot_on(language_name.as_deref()); + + if !copilot_enabled { + return None; + } if !copilot.read(cx).status().is_authorized() { return None; @@ -2849,12 +2833,6 @@ impl Editor { } fn next_copilot_suggestion(&mut self, _: &copilot::NextSuggestion, cx: &mut ViewContext) { - // Auto re-enable copilot if you're asking for a suggestion - if self.copilot_state.user_enabled == Some(false) { - cx.notify(); - self.copilot_state.user_enabled = Some(true); - } - if self.copilot_state.completions.is_empty() { self.refresh_copilot_suggestions(cx); return; @@ -2871,12 +2849,6 @@ impl Editor { _: &copilot::PreviousSuggestion, cx: &mut ViewContext, ) { - // Auto re-enable copilot if you're asking for a suggestion - if self.copilot_state.user_enabled == Some(false) { - cx.notify(); - self.copilot_state.user_enabled = Some(true); - } - if self.copilot_state.completions.is_empty() { self.refresh_copilot_suggestions(cx); return; @@ -2892,33 +2864,6 @@ impl Editor { self.refresh_active_copilot_suggestion(cx); } - fn toggle_copilot_suggestions(&mut self, _: &copilot::Toggle, cx: &mut ViewContext) { - self.copilot_state.user_enabled = match self.copilot_state.user_enabled { - Some(enabled) => Some(!enabled), - None => { - let selection = self.selections.newest_anchor().start; - - let language_name = self - .snapshot(cx) - .language_at(selection) - .map(|language| language.name()); - - let copilot_enabled = cx.global::().copilot_on(language_name.as_deref()); - - Some(!copilot_enabled) - } - }; - - // We know this can't be None, as we just set it to Some above - if self.copilot_state.user_enabled == Some(true) { - self.refresh_copilot_suggestions(cx); - } else { - self.clear_copilot_suggestions(cx); - } - - cx.notify(); - } - fn refresh_active_copilot_suggestion(&mut self, cx: &mut ViewContext) { let snapshot = self.buffer.read(cx).snapshot(cx); let cursor = self.selections.newest_anchor().head(); From 2e33f8b2281b68ba708257b9f6c9b828ac992e0e Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Apr 2023 15:21:43 -0700 Subject: [PATCH 3/5] fixup! Remove per-file copilot enable/disable --- crates/editor/src/editor.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index cf7ff144a4e2ee0ea0a3bdb6a8ce387007fa35ac..898e94d82adc9628faa871b0e4d711af92f6c4c9 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -2796,6 +2796,8 @@ impl Editor { return None; } + self.refresh_active_copilot_suggestion(cx); + if !copilot.read(cx).status().is_authorized() { return None; } From bab0e88b6fb6b73996a222cf0b9b7a1aa706f455 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Apr 2023 16:01:04 -0700 Subject: [PATCH 4/5] Fix bug where copilot auth window will only be shown once --- crates/copilot/src/sign_in.rs | 52 +++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/crates/copilot/src/sign_in.rs b/crates/copilot/src/sign_in.rs index 2827aeac2d4fac726f4f6b70019d413784ade2a8..9fee3fcfaaadbc2345712e1e3ec5f07091e0e237 100644 --- a/crates/copilot/src/sign_in.rs +++ b/crates/copilot/src/sign_in.rs @@ -23,28 +23,17 @@ pub fn init(cx: &mut MutableAppContext) { match &status { crate::Status::SigningIn { prompt } => { - if let Some(code_verification) = code_verification.as_ref() { - code_verification.update(cx, |code_verification, cx| { - code_verification.set_status(status, cx) - }); - cx.activate_window(code_verification.window_id()); + if let Some(code_verification_handle) = code_verification.as_mut() { + if cx.has_window(code_verification_handle.window_id()) { + code_verification_handle.update(cx, |code_verification_view, cx| { + code_verification_view.set_status(status, cx) + }); + cx.activate_window(code_verification_handle.window_id()); + } else { + create_copilot_auth_window(cx, &status, &mut code_verification); + } } else if let Some(_prompt) = prompt { - let window_size = cx.global::().theme.copilot.modal.dimensions(); - let window_options = WindowOptions { - bounds: gpui::WindowBounds::Fixed(RectF::new( - Default::default(), - window_size, - )), - titlebar: None, - center: true, - focus: true, - kind: WindowKind::Normal, - is_movable: true, - screen: None, - }; - let (_, view) = - cx.add_window(window_options, |_cx| CopilotCodeVerification::new(status)); - code_verification = Some(view); + create_copilot_auth_window(cx, &status, &mut code_verification); } } Status::Authorized | Status::Unauthorized => { @@ -67,6 +56,27 @@ pub fn init(cx: &mut MutableAppContext) { .detach(); } +fn create_copilot_auth_window( + cx: &mut MutableAppContext, + status: &Status, + code_verification: &mut Option>, +) { + let window_size = cx.global::().theme.copilot.modal.dimensions(); + let window_options = WindowOptions { + bounds: gpui::WindowBounds::Fixed(RectF::new(Default::default(), window_size)), + titlebar: None, + center: true, + focus: true, + kind: WindowKind::Normal, + is_movable: true, + screen: None, + }; + let (_, view) = cx.add_window(window_options, |_cx| { + CopilotCodeVerification::new(status.clone()) + }); + *code_verification = Some(view); +} + pub struct CopilotCodeVerification { status: Status, } From 1627cf7eaeacf76300d281c80641302507e5d7b3 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Apr 2023 16:14:07 -0700 Subject: [PATCH 5/5] Add standard copilot keybinding --- assets/keymaps/default.json | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json index f5446462e6f07433a9a4456faa2f031f28329ae9..1dbfbea61f6a8676e9e7baefcddae95abf99b736 100644 --- a/assets/keymaps/default.json +++ b/assets/keymaps/default.json @@ -177,6 +177,7 @@ "focus": false } ], + "alt-\\": "copilot::NextSuggestion", "alt-]": "copilot::NextSuggestion", "alt-[": "copilot::PreviousSuggestion" }