squirrel icon indicating copy to clipboard operation
squirrel copied to clipboard

当inline_preedit为false时,光标处会产生奇怪的字符。

Open nb5p opened this issue 4 years ago • 12 comments

测试时使用配置为默认配置(即删掉所有配置文件后,重新部署),在此基础上仅增加增加一条inline_preedit: false

问题一,效果如图所示。经过确认此空白符号为U+3000

如果此时输入框失焦,这个空白符号会直接上屏。

问题二,同样是这个配置,在VSCode里打中文并删除,会在删除后残存一个不可见的符号。此不可见符号会被静态检查工具识别并提示(下图所示代码的第二行最后一个字符)。经过确认此不可见为U+0008

请问这两种情况是否正常,我该如何配置以便不产生这类符号?

nb5p avatar Jan 22 '21 16:01 nb5p

第一種是爲了解決兼容性問題而特意添加的,代碼在這裏: https://github.com/rime/squirrel/blob/cf9c4ab1d35a54ac09e8b03fc45968ae8478a16a/SquirrelInputController.m#L523 時間比較久了。可以重新測試一下適用情況。

第二個問題,我偶爾遇到但不容易重現,所以一直沒有找到原因。U+0008這是個有用的線索。看樣子結果是把刪除鍵直接提交進去了。

lotem avatar Jan 23 '21 13:01 lotem

重新測試了一下。第一處添加的佔位字符仍是必要的,否則一些程序如Terminal.app不知道輸入法正在編輯文字,會搶先處理BackSpace等功能鍵。

lotem avatar Jan 23 '21 13:01 lotem

第二個場景我也測試了,沒能重現問題。最好找到重現步驟。

lotem avatar Jan 23 '21 13:01 lotem

第二個場景我也測試了,沒能重現問題。最好找到重現步驟。

感谢您的回复。对于问题二,我会在找到高复现的方法后,重新进行反馈。请暂时不要Close Issue。

nb5p avatar Jan 24 '21 12:01 nb5p

有时候还会打出回车符也就是U+000D。 还有几次在Xcode里面按出了Control+s对应的控制字符。

lotem avatar Feb 05 '21 12:02 lotem

有待觀察這項改動 https://github.com/rime/squirrel/commit/b875d194d9799ccc74453292c670fcca892799fa 對本問題的影響。

lotem avatar Feb 13 '21 15:02 lotem

感觉问题二出现的概率比之前低了。依旧未找到能高复现的方法。

nb5p avatar Feb 13 '21 15:02 nb5p

已找到在 VSCode 下100%复现的方法。

过程描述:

  1. 输入字符后,鼠标点击输入法框(用其他方法使输入框失焦,亦可)。
  2. 屏幕残留一个U+3000
  3. 再次输入中文,此时按 Backpase 删除 preedit 的所有内容。
  4. 屏幕上会残留U+3000,和一个不可见的U+0008

之后的每次输入,在删除掉 preedit 区域内容时,都会残留上述过程编号4的内容。即使是重新部署鼠须管也无法正常,需关闭VSCode。

但是同样的方法在 iTerm2/文本编辑 上并未复现成功。原因可能出现在上述过程的编号2处,因为这两个应用下的输入法框在失焦时,上屏内容为 predit 的内容,而不是U+3000

这个问题大概率与失焦时输入框的上屏内容有关,如果失焦时未能上屏 preedit 的内容,就会产生此问题。

nb5p avatar Feb 20 '21 14:02 nb5p

已找到在 VSCode 下100%复现的方法。

过程描述:

  1. 输入字符后,鼠标点击输入法框(用其他方法使输入框失焦,亦可)。
  2. 屏幕残留一个U+3000
  3. 再次输入中文,此时按 Backpase 删除 preedit 的所有内容。
  4. 屏幕上会残留U+3000,和一个不可见的U+0008

之后的每次输入,在删除掉 preedit 区域内容时,都会残留上述过程编号4的内容。即使是重新部署鼠须管也无法正常,需关闭VSCode。

但是同样的方法在 iTerm2/文本编辑 上并未复现成功。原因可能出现在上述过程的编号2处,因为这两个应用下的输入法框在失焦时,上屏内容为 predit 的内容,而不是U+3000

这个问题大概率与失焦时输入框的上屏内容有关,如果失焦时未能上屏 preedit 的内容,就会产生此问题。

上面提到的一項改動,是在失去焦點時改爲提交輸入串。我設想會對這個問題有影響,因爲U+3000就是輸入碼不在行內顯示時用來佔位的preedit字符串,如果之前提交這個字符經過了輸入法處理而不是被VSCode直接捕獲,那麼在鼠鬚管0.15.2之後就不應該再出現了。但也沒有把握不會再插入不可見的控制字符。

lotem avatar Feb 21 '21 06:02 lotem

要不要把 U+3000 换成 ASCII SPACE?

ShikiSuen avatar Jul 09 '22 14:07 ShikiSuen

要不要把 U+3000 换成 ASCII SPACE?

不要

lotem avatar Jul 09 '22 14:07 lotem

@lotem 顺便问一下好了。PreEdit 这个词到底怎么来的呢(词源)? macOS 的 Input Method Kit 内的专有术语是「composition buffer」组字区/组字缓冲区。 而程序对内文组字区的支持往往被通称为「inline composition」。

ShikiSuen avatar Jul 09 '22 15:07 ShikiSuen