From a1263830bbefb69cab87810682aeba4ec0c0499b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=80=E1=B4=8D=E1=B4=9B=E1=B4=8F=E1=B4=80=E1=B4=87?= =?UTF-8?q?=CA=80?= Date: Wed, 14 Jan 2026 15:00:30 +0800 Subject: [PATCH] terminal: Fix last character of IME marked text not being deleted (#46224) --- crates/terminal_view/src/terminal_element.rs | 4 ++-- crates/terminal_view/src/terminal_view.rs | 18 ++++++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index fc1c63879cc4bebb476daff2e54a2cb48305f5ad..4608708fb1d08ff6201b330d385f0b5fc1df1494 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -1488,12 +1488,12 @@ impl InputHandler for TerminalInputHandler { &mut self, _range_utf16: Option>, new_text: &str, - new_marked_range: Option>, + _new_marked_range: Option>, _window: &mut Window, cx: &mut App, ) { self.terminal_view.update(cx, |view, view_cx| { - view.set_marked_text(new_text.to_string(), new_marked_range, view_cx); + view.set_marked_text(new_text.to_string(), view_cx); }); } diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index 82203a5b8ee0994885013dba0c58741f32c780b3..21c5a23c7fec324ed273611a24df7a901d85a9f4 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -62,7 +62,6 @@ use std::{ struct ImeState { marked_text: String, - marked_range_utf16: Option>, } const CURSOR_BLINK_INTERVAL: Duration = Duration::from_millis(500); @@ -327,16 +326,11 @@ impl TerminalView { } /// Sets the marked (pre-edit) text from the IME. - pub(crate) fn set_marked_text( - &mut self, - text: String, - range: Option>, - cx: &mut Context, - ) { - self.ime_state = Some(ImeState { - marked_text: text, - marked_range_utf16: range, - }); + pub(crate) fn set_marked_text(&mut self, text: String, cx: &mut Context) { + if text.is_empty() { + return self.clear_marked_text(cx); + } + self.ime_state = Some(ImeState { marked_text: text }); cx.notify(); } @@ -344,7 +338,7 @@ impl TerminalView { pub(crate) fn marked_text_range(&self) -> Option> { self.ime_state .as_ref() - .and_then(|state| state.marked_range_utf16.clone()) + .map(|state| 0..state.marked_text.encode_utf16().count()) } /// Clears the marked (pre-edit) text state.