zhanghj
zhanghj
进一步测试了一下, 发现有以下规律: 1. shift与非字母键组合输入时容易出现, 比如shift+回车组合, 如果按键之后, 先松开回车, 则不会切换, 如果两者同时松开, 基本都会出现. 2. shift与字母键组合确实不太容易出现, 之前反馈不准确.
之前测试是在emacs里会出现, 现在又试了几个其他程序, 浏览器文本框, 系统备忘录, vscode, 都不会出现. 现在确定的是在emacs里会出现, 比如shift+回车组合, shift+backspace, 都会出现. 用的是emacs-26.3修改版. 正在测试master版本看会不会出现.
测试了emacs的master版本, 也会出现此问题.
这种问题该怎么调试啊? 什么情况下应用程序会影响系统输入法状态? 难道它给把一个按键事件发送给了系统? 比如发送了shift按键事件给系统? 然后系统再传给输入法? 我的理解是按键事件首先被输入法截获, 然后转换后才传给应用程序.
> 順便提一下,我用 emacs 26.2 測試未能重現。 > 或許是某些配置包導致的問題。請務必用 `emacs -Q` 在無配置狀態下測試。 我测试了一下emacs 26.2, 也能重现, 是用的`emacs -Q`. 重现使用shift+回车, 操作要点: 按键后, 两键要同时松开, 必然重现. 如果回车键先松开, shift延后几百毫秒松开, 那么不会出现. 可能是我按键比较快, 但是同样的操作速度, 在其他程序里不会重现, 目前只有emacs会出现此问题.
> macOS 上輸入法可能不是首先處理鍵盤事件的。 > Shift鍵的要點在於,切換發生在keyup事件,在此之前應用有可能響應了Shift keydown,以及key up之前的字符按鍵。 > 这一段不是很理解, 你是说键盘事件先到应用程序, 然后再到输入法? 是不是有部分事件被应用处理了之后, 到不了输入法? 另外, 这些事件被应用处理过程中, 应用能修改事件或者插入一些新的按键事件吗? > Shift鍵的要點在於,切換發生在keyup事件,在此之前應用有可能響應了Shift keydown,以及key up之前的字符按鍵。 > shift的keyup事件最终是传给了输入法, 才导致中英文切换的吧? 这样的话, 跟应用之前响应的shift keydown等事件有什么关系吗? 我们现在只针对shift加回车组合键来分析一下. 比如, 我在macvim里也用同样的速度按shift+回车, 输入法中英为没有切换,...
> https://github.com/rime/librime/blob/master/src/rime/engine.cc#L99 > Debug build會輸出這項日誌。Release build沒有。 > 这个有点难度, 抽时间尝试一下. > 我猜測是emacs處理了Shift keydown和Shift keyup之間的其他字符按鍵事件,輸入法不知道Shift鍵和字符鍵並用。 > 就是说emacs过滤掉了回车的按键事件? 但是shift加普通字母或数字符号键组合不会出问题, 只有跟回车, tab, backspace, F1, F2等这些会出问题, 可能emacs对两者处理不一样. > 問題是我也一直使用Emacs,系統是macOS 10.14.6,並未遇到過這種情況。 我的系统是10.13.6, 可以稳定重现.
那很可能是emacs把shift加回车的keydown和回车的keyup事件都处理掉了, 最后到输入法可能就剩了一个shift的keyup事件(先松开回车, 然后松开shift).
我给emacs提交了个bug, 看有没有效果. https://debbugs.gnu.org/cgi/bugreport.cgi?bug=38293
> 在 Xcode 中使用 XVim 插件的情况下有类似问题,在 Normal 模式下按大写字母的命令时会触发 shift 切换中英文,感觉和你的问题类似。 > Debug 查了下 handleEvent 是无法接收到 Normal 模式的字母按键输入(但 Shift 键可以)。可能除了监听系统全局按键之外无法避免被其他程序处理掉的按键了。 > 看上去字母的按键事件被程序吃掉了, 然后把一个shift给传出来了. 这个shift的事件是keyup吗? 还是keydown加keyup? 另外, 跟emacs的情况有一点差别: emacs里shift加字母不会出现这情况, shift加回车或者f1,f2这种会出现. 感觉上app完全有能力控制shift按键是否传出来. 但是我看不懂objc代码,...