From f7b946e5254831da7d3de14337b53876890708d7 Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Fri, 22 Aug 2025 16:09:45 +0530 Subject: [PATCH] on agent setting change Co-authored-by: Oleksiy Syvokon --- crates/agent_ui/src/acp/message_editor.rs | 22 ++++++++---- crates/agent_ui/src/message_editor.rs | 14 +++++++- .../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(-) diff --git a/crates/agent_ui/src/acp/message_editor.rs b/crates/agent_ui/src/acp/message_editor.rs index 887346a14ce28970edf4e2911083808163bb4688..123315170b4563679d5adcda5d8c1af483e17983 100644 --- a/crates/agent_ui/src/acp/message_editor.rs +++ b/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::(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, diff --git a/crates/agent_ui/src/message_editor.rs b/crates/agent_ui/src/message_editor.rs index a5f1830e977953ecf1774b3a9e3abc422f8035bf..f066b75dee6e2b2b47ad349853152285696aadc4 100644 --- a/crates/agent_ui/src/message_editor.rs +++ b/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::(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| { diff --git a/crates/debugger_ui/src/session/running/console.rs b/crates/debugger_ui/src/session/running/console.rs index 04f3cb7af5cc58090cc8c106257d098e0ae97c6f..239641c34c0130863acf49a8cf61c7d95716fd6b 100644 --- a/crates/debugger_ui/src/session/running/console.rs +++ b/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 }); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 29e8d26ac7bbcdf01b814d20ef4955fb91e29239..3fd80379841d9a45de34b1e081d20f428f132354 100644 --- a/crates/editor/src/editor.rs +++ b/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, 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) { + 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 for Editor {} diff --git a/crates/repl/src/repl_sessions_ui.rs b/crates/repl/src/repl_sessions_ui.rs index de7cbf2b0e545192a35dc4993dfc02f3e9e52599..8d86ee65685d5ca92effc34cc4512f2890ade5a2 100644 --- a/crates/repl/src/repl_sessions_ui.rs +++ b/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; } diff --git a/crates/rules_library/src/rules_library.rs b/crates/rules_library/src/rules_library.rs index 32c151fab7dd10229c2e6b2e6ed22a84e3067596..fb273c65ee3965d7fc444b3821e193ee2029366d 100644 --- a/crates/rules_library/src/rules_library.rs +++ b/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 { diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index 1681735c5584b7edd39a9f4a8aab4545ff47fd55..cbbb5ce56eb0ca46b753344627e5db23b4d9fdd3 100644 --- a/crates/vim/src/vim.rs +++ b/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) + } }); } _ => {}