解决 Windows 下 VSCode Vim 输入中文闪烁的问题
首先,看一下输入的效果吧,这里我没有录制 gif,但是,输入法的候选框确实是不闪的,
这个问题呢,可以说得上是由来已久呀。如果是 arch linux 下,kde 的桌面环境下的 fcitx5 输入法在 VSCode 中的表现是没有问题的。Mac 设备的话,我没有,但是它也是有问题的,具体详情可以看这个 issue,
https://github.com/VSCodeVim/Vim/issues/7496
大概就是这个问题,类似的 issue 还有几个,这里就不放了,都不知道晾了多少个月了。
令人疑惑的是,VSCode 或者 VSCode Vim 就是不修复这个 bug。
真是令人头疼呀。
所以就没办法啦,只能自己动手尝试解决啦。最终的解决方案就是影子输入法。嗯,我采取的方法是换输入法。
难道事情就这么简单吗?当然不是。
我是尝试了各种各样的输入法的,最终才锁定了影子输入法的。
一开始,影子输入法有以下几个缺点:
4k 屏幕下,这个位置会出现严重偏移。这个问题猜测应该是 ahk 自己的获取光标位置的函数问题导致的。
4k 屏幕下,高分屏的显示效果不行。
随着输入文字的增多,这个软件占用的内存会不断变大。
软件一开始启动的时候,第一次打字会有卡顿的现象。
字体渲染似乎不够锐利。
经过一段时间的努力,最终是得到以下的处理方案:
- 第一个问题,我们可以把两块显示器的缩放比例调成一致的,比如,我现在两块屏幕的缩放都是 150% 的,那么,这个问题就可以得到解决。这个问题确实是 ahk 官方的问题,这个也是有他们自己的考量。
- 第二个问题,解决方法同上。
- 第三个问题,经过更长时间的使用,发现它其实是可以自己整理内存占用的。
- 第四个问题,这个暂时先将就一下,毕竟第一次之后就会变得异常顺滑。
- 第五个问题,这个可以通过修改源码来解决,我将源码放入了我的仓库。由于这个输入法的界面是使用 Gdip 来渲染的,所以我的解决思路就是去修改相关函数中的抗锯齿参数。
好吧,到这里其实问题就已经解决了。剩余的就是代码的不断优化了。
之后就是这一段时间的折腾的简单记录。
这一切的缘起是我关于对 VSCode 的全键盘操作的想法。而一旦选择了 VSCode 作为我的主力代码编辑器,那么,其 Vim 下的中文输入就是一个绕不开的问题。
之后开始换输入法。尝试过的输入法有:
- 微软输入法,这个就不多说了,自带的,可配置的东西不多。
- 小鹤双拼,小鹤官网下的,这个是使用多多输入法的框架生成的。尝试了小鹤双拼和小鹤音形,最终因为输入法的美观性和是否开源这一个方面以及不能解决 VSCode 的输入问题而放弃。
- 小狼毫,试过小鹤双拼和自带的全拼,使用的是 GitHub 上的雾凇方案,也是解决不了 VSCode 的中文输入问题。而且,年久失修。
- 搜狗输入法,在 VSCode 和 VSCode-Insider 表现竟然都不一样,而且,由于 VSCode Vim 的问题,一般的输入法捕捉光标都会出现问题,搜狗输入法也不例外,这就导致了在 VSCode 中输入时输入时,候选框会把光标给盖住。还有一个缺点,它不能够主动控制拼音的是否上屏,我向官方反映了这个问题,然后有加入了官方群反映问题,都不给解决,呵呵。更何况搜狗还是出了名的私自搜集用户隐私和流氓广告。遂弃之。
- 百度输入法,基本能够解决 VSCode 中文输入的问题,但是,其界面年久失修,尤其是在任务栏的图标,然后就是,它的光标捕也是不行,另外,百度的产品,心得是有多大的人才敢去使用呢?
光标捕捉这一块儿,小狼毫倒是做得不错,但是它在输入的时候,会私自修改光标,并且在光标的右下角添加一个下横线,这就注定了在光标附近无法解决 VSCode 的闪烁问题。
然后又去找其他的开源的输入法,这一块儿能找到的其实不多。于是就聚焦在解决影子输入法的问题上,由于 ahk 是一门脚本语言,学起来和 Python 差不多,所以对于影子输入法这一开源的输入法,如果我想自己定制的话,相对来说是比较容易的。
所以最终是解决了一定的问题。顺带着,我觉得进入了 ahk 这一领域,也向是打开了一扇新的大门。其实为了解决输入法的问题,我最近几天甚至在带着学习 Win32 编程,想着,如果最后实在没有满意的输入法,我就自己使用最底层的 api 来自己实现一个吧。不过,Win32 这一领域的相关材料可谓是真的少呀。而 ahk 此时又有一个优点凸显了出来,那就是它这个脚本语言可以很方便地调用 Win32 的接口,本来这个就是为 Windows 量身定制的嘛。至于 Python,它当然也有封装的库,但是残废,不是这一行的。
最后,再贴一下原来的影子输入法和我微修过的影子输入法仓库:
https://github.com/fanlumaster/YingziIME
这下,难道还不能在 VSCode 中编写一切吗?
对了,我的影子个人词库的来源也是 rime-ice,也就是 rime 的雾凇方案。然后拼音方案则是小鹤双拼。影子输入法也是支持辅助码的。