on agent setting change

Smit Barmase and Oleksiy Syvokon created

Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>

Change summary

crates/agent_ui/src/acp/message_editor.rs         | 22 +++++++--
crates/agent_ui/src/message_editor.rs             | 14 ++++++
crates/debugger_ui/src/session/running/console.rs |  2 
crates/editor/src/editor.rs                       | 25 ++++++++---
crates/repl/src/repl_sessions_ui.rs               |  2 
crates/rules_library/src/rules_library.rs         |  2 
crates/vim/src/vim.rs                             | 36 +++++++---------
7 files changed, 66 insertions(+), 37 deletions(-)

Detailed changes

crates/agent_ui/src/acp/message_editor.rs 🔗

@@ -5,6 +5,7 @@ use crate::{
 use acp_thread::{MentionUri, selection_name};
 use agent_client_protocol as acp;
 use agent_servers::AgentServer;
+use agent_settings::{AgentEditorMode, AgentSettings};
 use agent2::HistoryStore;
 use anyhow::{Context as _, Result, anyhow};
 use assistant_slash_commands::codeblock_fence_for_path;
@@ -113,12 +114,10 @@ impl MessageEditor {
         });
         let mention_set = MentionSet::default();
 
-        let settings = agent_settings::AgentSettings::get_global(cx);
+        let settings = AgentSettings::get_global(cx);
         let editor_mode = match settings.editor_mode {
-            agent_settings::AgentEditorMode::EditorModeOverride(mode) => mode,
-            agent_settings::AgentEditorMode::Inherit => {
-                vim_mode_setting::EditorModeSetting::get_global(cx).0
-            }
+            AgentEditorMode::EditorModeOverride(mode) => mode,
+            AgentEditorMode::Inherit => vim_mode_setting::EditorModeSetting::get_global(cx).0,
         };
 
         let editor = cx.new(|cx| {
@@ -129,7 +128,7 @@ impl MessageEditor {
             editor.set_placeholder_text(placeholder, cx);
             editor.set_show_indent_guides(false, cx);
             editor.set_soft_wrap();
-            editor.set_default_editor_mode(editor_mode);
+            editor.set_editor_mode(editor_mode, cx);
             editor.set_completion_provider(Some(Rc::new(completion_provider)));
             editor.set_context_menu_options(ContextMenuOptions {
                 min_entries_visible: 12,
@@ -168,6 +167,17 @@ impl MessageEditor {
             }
         }));
 
+        subscriptions.push(cx.observe_global::<AgentSettings>(move |this, cx| {
+            let settings = AgentSettings::get_global(cx);
+            let editor_mode = match settings.editor_mode {
+                AgentEditorMode::EditorModeOverride(mode) => mode,
+                AgentEditorMode::Inherit => vim_mode_setting::EditorModeSetting::get_global(cx).0,
+            };
+            this.editor.update(cx, |editor, cx| {
+                editor.set_editor_mode(editor_mode, cx);
+            });
+        }));
+
         Self {
             editor,
             project,

crates/agent_ui/src/message_editor.rs 🔗

@@ -136,7 +136,7 @@ pub(crate) fn create_editor(
         editor.set_placeholder_text("Message the agent – @ to include context", cx);
         editor.set_show_indent_guides(false, cx);
         editor.set_soft_wrap();
-        editor.set_default_editor_mode(editor_mode);
+        editor.set_editor_mode(editor_mode, cx);
         editor.set_context_menu_options(ContextMenuOptions {
             min_entries_visible: 12,
             max_entries_visible: 12,
@@ -236,6 +236,18 @@ impl MessageEditor {
             cx.observe(&thread.read(cx).action_log().clone(), |_, _, cx| {
                 cx.notify()
             }),
+            cx.observe_global::<AgentSettings>(move |this, cx| {
+                let settings = agent_settings::AgentSettings::get_global(cx);
+                let editor_mode = match settings.editor_mode {
+                    agent_settings::AgentEditorMode::EditorModeOverride(mode) => mode,
+                    agent_settings::AgentEditorMode::Inherit => {
+                        vim_mode_setting::EditorModeSetting::get_global(cx).0
+                    }
+                };
+                this.editor.update(cx, |editor, cx| {
+                    editor.set_editor_mode(editor_mode, cx);
+                });
+            }),
         ];
 
         let model_selector = cx.new(|cx| {

crates/debugger_ui/src/session/running/console.rs 🔗

@@ -75,7 +75,7 @@ impl Console {
             editor.set_show_wrap_guides(false, cx);
             editor.set_show_indent_guides(false, cx);
             editor.set_show_edit_predictions(Some(false), window, cx);
-            editor.set_default_editor_mode(EditorMode::Default);
+            editor.set_editor_mode(EditorMode::Default, cx);
             editor.set_soft_wrap_mode(language::language_settings::SoftWrap::EditorWidth, cx);
             editor
         });

crates/editor/src/editor.rs 🔗

@@ -201,6 +201,7 @@ use ui::{
     IconSize, Indicator, Key, Tooltip, h_flex, prelude::*,
 };
 use util::{RangeExt, ResultExt, TryFutureExt, maybe, post_inc};
+use vim_mode_setting::EditorMode;
 use workspace::{
     CollaboratorId, Item as WorkspaceItem, ItemId, ItemNavHistory, OpenInTerminal, OpenTerminal,
     RestoreOnStartupBehavior, SERIALIZATION_THROTTLE_TIME, SplitDirection, TabBarSettings, Toast,
@@ -1179,7 +1180,7 @@ pub struct Editor {
     next_color_inlay_id: usize,
     colors: Option<LspColorData>,
     folding_newlines: Task<()>,
-    default_editor_mode: vim_mode_setting::EditorMode,
+    editor_mode: vim_mode_setting::EditorMode,
     // editor_mode: EditorMode, <-- while init define which editor,
 
     // agenty subscribe to agen settings
@@ -2293,7 +2294,7 @@ impl Editor {
             display_mode: mode,
             selection_drag_state: SelectionDragState::None,
             folding_newlines: Task::ready(()),
-            default_editor_mode: vim_mode_setting::EditorMode::default(),
+            editor_mode: vim_mode_setting::EditorMode::default(),
         };
 
         if is_minimap {
@@ -3030,12 +3031,19 @@ impl Editor {
         })
     }
 
-    pub fn set_default_editor_mode(&mut self, to: vim_mode_setting::EditorMode) {
-        self.default_editor_mode = to;
+    pub fn set_editor_mode(&mut self, to: vim_mode_setting::EditorMode, cx: &mut Context<Self>) {
+        let from = self.editor_mode;
+        if from != to {
+            self.editor_mode = to;
+            cx.emit(EditorEvent::EditorModeChanged {
+                old_mode: from,
+                new_mode: to,
+            });
+        }
     }
 
-    pub fn default_editor_mode(&self) -> vim_mode_setting::EditorMode {
-        self.default_editor_mode
+    pub fn editor_mode(&self) -> vim_mode_setting::EditorMode {
+        self.editor_mode
     }
 
     fn selections_did_change(
@@ -22937,7 +22945,10 @@ pub enum EditorEvent {
         anchor: Anchor,
         is_deactivate: bool,
     },
-    EditorModeChanged,
+    EditorModeChanged {
+        new_mode: EditorMode,
+        old_mode: EditorMode,
+    },
 }
 
 impl EventEmitter<EditorEvent> for Editor {}

crates/repl/src/repl_sessions_ui.rs 🔗

@@ -75,7 +75,7 @@ pub fn init(cx: &mut App) {
                 return;
             };
 
-            if !editor.default_editor_mode().is_modal() || !editor.buffer().read(cx).is_singleton()
+            if !editor.editor_mode().is_modal() || !editor.buffer().read(cx).is_singleton()
             {
                 return;
             }

crates/rules_library/src/rules_library.rs 🔗

@@ -638,7 +638,7 @@ impl RulesLibrary {
                             editor.set_show_gutter(false, cx);
                             editor.set_show_wrap_guides(false, cx);
                             editor.set_show_indent_guides(false, cx);
-                            editor.set_default_editor_mode(EditorMode::Default);
+                            editor.set_editor_mode(EditorMode::Default, cx);
                             editor.set_current_line_highlight(Some(CurrentLineHighlight::None));
                             editor.set_completion_provider(Some(make_completion_provider()));
                             if focus {

crates/vim/src/vim.rs 🔗

@@ -443,7 +443,7 @@ impl Vim {
             return;
         };
 
-        if !editor.default_editor_mode().is_modal() {
+        if !editor.editor_mode().is_modal() {
             return;
         }
 
@@ -471,7 +471,7 @@ impl Vim {
         let vim = Vim::new(window, cx);
 
         vim.update(cx, |vim, _| {
-            let initial_mode = match editor.default_editor_mode() {
+            let initial_mode = match editor.editor_mode() {
                 EditorMode::Default => return,
                 EditorMode::Vim(modal_mode) => modal_mode,
                 EditorMode::Helix(modal_mode) => modal_mode,
@@ -483,7 +483,7 @@ impl Vim {
             entity: vim.clone(),
         });
 
-        let default_editor_mode = editor.default_editor_mode();
+        let default_editor_mode = editor.editor_mode();
         vim.update(cx, move |_, cx| {
             Vim::action(
                 editor,
@@ -914,23 +914,19 @@ impl Vim {
                     vim.set_mark(mark, vec![*anchor], editor.buffer(), window, cx);
                 });
             }
-            EditorEvent::EditorModeChanged => {
-                self.update_editor(cx, |_vim, _editor, _cx| {
-                    // TODO
-                    // let enabled = editor.default_editor_mode().is_modal();
-                    // if was_enabled == enabled {
-                    //     return;
-                    // }
-                    // if !enabled {
-                    //     editor.set_relative_line_number(None, cx);
-                    // }
-                    // was_enabled = enabled;
-                    // if enabled {
-                    //     Self::activate(editor, window, cx)
-                    // } else {
-                    //     Self::deactivate(editor, cx)
-                    // }
-                    //
+            EditorEvent::EditorModeChanged { new_mode, old_mode } => {
+                self.update_editor(cx, |_vim, editor, cx| {
+                    let enabled = new_mode.is_modal();
+                    let was_enabled = old_mode.is_modal();
+                    if was_enabled == enabled {
+                        return;
+                    }
+                    if enabled {
+                        Self::activate(editor, window, cx)
+                    } else {
+                        editor.set_relative_line_number(None, cx);
+                        Self::deactivate(editor, cx)
+                    }
                 });
             }
             _ => {}