From d4eab557b269936781fc2b90d249ff34c9ab067c Mon Sep 17 00:00:00 2001
From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com>
Date: Thu, 13 Mar 2025 12:46:22 -0300
Subject: [PATCH] edit prediction: Add eager and subtle modes toggle to menu
(#26680)
Now, users can toggle the display modes for Edit Prediction via the UI.
Release Notes:
- N/A
---
.../src/inline_completion_button.rs | 95 +++++++++++--------
1 file changed, 55 insertions(+), 40 deletions(-)
diff --git a/crates/inline_completion_button/src/inline_completion_button.rs b/crates/inline_completion_button/src/inline_completion_button.rs
index 1a842bf979..5b35807987 100644
--- a/crates/inline_completion_button/src/inline_completion_button.rs
+++ b/crates/inline_completion_button/src/inline_completion_button.rs
@@ -18,7 +18,7 @@ use gpui::{
use indoc::indoc;
use language::{
language_settings::{self, all_language_settings, AllLanguageSettings, EditPredictionProvider},
- File, Language,
+ EditPredictionsMode, File, Language,
};
use regex::Regex;
use settings::{update_settings_file, Settings, SettingsStore};
@@ -456,13 +456,47 @@ impl InlineCompletionButton {
}
let settings = AllLanguageSettings::get_global(cx);
+
let globally_enabled = settings.show_edit_predictions(None, cx);
menu = menu.toggleable_entry("All Files", globally_enabled, IconPosition::Start, None, {
let fs = fs.clone();
move |_, cx| toggle_inline_completions_globally(fs.clone(), cx)
});
- menu = menu.separator().header("Privacy Settings");
+ menu = menu.separator().header("Display Modes");
+ let current_mode = settings.edit_predictions_mode();
+ let subtle_mode = matches!(current_mode, EditPredictionsMode::Subtle);
+ let eager_mode = matches!(current_mode, EditPredictionsMode::Eager);
+
+ menu = menu.item(
+ ContextMenuEntry::new("Eager")
+ .toggleable(IconPosition::Start, eager_mode)
+ .documentation_aside(move |_| {
+ Label::new("Display predictions inline when there are no language server completions available.").into_any_element()
+ })
+ .handler({
+ let fs = fs.clone();
+ move |_, cx| {
+ toggle_edit_prediction_mode(fs.clone(), EditPredictionsMode::Eager, cx)
+ }
+ }),
+ );
+
+ menu = menu.item(
+ ContextMenuEntry::new("Subtle")
+ .toggleable(IconPosition::Start, subtle_mode)
+ .documentation_aside(move |_| {
+ Label::new("Display predictions inline only when holding a modifier key (alt by default).").into_any_element()
+ })
+ .handler({
+ let fs = fs.clone();
+ move |_, cx| {
+ toggle_edit_prediction_mode(fs.clone(), EditPredictionsMode::Subtle, cx)
+ }
+ }),
+ );
+
+ menu = menu.separator().header("Privacy Settings");
if let Some(provider) = &self.edit_prediction_provider {
let data_collection = provider.data_collection_state(cx);
if data_collection.is_supported() {
@@ -590,44 +624,6 @@ impl InlineCompletionButton {
);
}
- if cx.has_flag::() {
- let is_eager_preview_enabled = match settings.edit_predictions_mode() {
- language::EditPredictionsMode::Subtle => false,
- language::EditPredictionsMode::Eager => true,
- };
- menu = menu.separator().toggleable_entry(
- "Eager Preview Mode",
- is_eager_preview_enabled,
- IconPosition::Start,
- None,
- {
- let fs = fs.clone();
- move |_window, cx| {
- update_settings_file::(
- fs.clone(),
- cx,
- move |settings, _cx| {
- let new_mode = match is_eager_preview_enabled {
- true => language::EditPredictionsMode::Subtle,
- false => language::EditPredictionsMode::Eager,
- };
-
- if let Some(edit_predictions) = settings.edit_predictions.as_mut() {
- edit_predictions.mode = new_mode;
- } else {
- settings.edit_predictions =
- Some(language_settings::EditPredictionSettingsContent {
- mode: new_mode,
- ..Default::default()
- });
- }
- },
- );
- }
- },
- );
- }
-
if let Some(editor_focus_handle) = self.editor_focus_handle.clone() {
menu = menu
.separator()
@@ -861,3 +857,22 @@ fn hide_copilot(fs: Arc, cx: &mut App) {
.edit_prediction_provider = Some(EditPredictionProvider::None);
});
}
+
+fn toggle_edit_prediction_mode(fs: Arc, mode: EditPredictionsMode, cx: &mut App) {
+ let settings = AllLanguageSettings::get_global(cx);
+ let current_mode = settings.edit_predictions_mode();
+
+ if current_mode != mode {
+ update_settings_file::(fs, cx, move |settings, _cx| {
+ if let Some(edit_predictions) = settings.edit_predictions.as_mut() {
+ edit_predictions.mode = mode;
+ } else {
+ settings.edit_predictions =
+ Some(language_settings::EditPredictionSettingsContent {
+ mode,
+ ..Default::default()
+ });
+ }
+ });
+ }
+}