内容:
环境
macOS
Squirrel 最新版
Kitty 0.46.2
输入方案:98五笔
复现步骤
在 Kitty 中输入若干字符(如 123)已上屏
用五笔输入编码(如 nih),进入 preedit 状态
连续按退格删除 preedit 编码
当 preedit 从有内容变为空的瞬间,终端里已上屏的字符也被多删一个
拼音方案不复现,系统自带拼音不复现,Terminal.app 不复现。
Kitty --debug-input 日志显示的关键行为:
退格删到最后一个 preedit 字符时(第一次退格):
state: 1 updated pre-edit text: ''
Ignoring key press as IME is active and it generated no text
此时 Kitty 正确地忽略了这次退格,没有发 0x7f 给终端。
但 Squirrel 在调用 setMarkedText: "" 清空 markedText 时,Kitty 将其解释为需要额外执行一次 deleteBackward:,导致终端多删一个字符。
根本原因推测:
Squirrel 在 preedit 清空时调用 setMarkedText: "",而不是 unmarkText。Kitty 对空 markedText 的处理与标准 NSTextInputClient 行为有差异,导致额外触发删除。拼音方案因 preedit 状态转换方式不同,不触发此问题。
kitty.log
内容:
环境
macOS
Squirrel 最新版
Kitty 0.46.2
输入方案:98五笔
复现步骤
在 Kitty 中输入若干字符(如 123)已上屏
用五笔输入编码(如 nih),进入 preedit 状态
连续按退格删除 preedit 编码
当 preedit 从有内容变为空的瞬间,终端里已上屏的字符也被多删一个
拼音方案不复现,系统自带拼音不复现,Terminal.app 不复现。
Kitty --debug-input 日志显示的关键行为:
退格删到最后一个 preedit 字符时(第一次退格):
state: 1 updated pre-edit text: ''
Ignoring key press as IME is active and it generated no text
此时 Kitty 正确地忽略了这次退格,没有发 0x7f 给终端。
但 Squirrel 在调用 setMarkedText: "" 清空 markedText 时,Kitty 将其解释为需要额外执行一次 deleteBackward:,导致终端多删一个字符。
根本原因推测:
Squirrel 在 preedit 清空时调用 setMarkedText: "",而不是 unmarkText。Kitty 对空 markedText 的处理与标准 NSTextInputClient 行为有差异,导致额外触发删除。拼音方案因 preedit 状态转换方式不同,不触发此问题。
kitty.log