在 Windows 系统下,如果使用 (Neo)Vim
编辑器,比如 WSL、VS Code 或者其它 IDE 的 VIM 功能,如果使用中文输入法,在由 Insert
模式进入 Normal
时,难免需要不停切换中英文输入法,有时则会忘记切换,导致在 Normal 模式下输入中文。
常见的一些解决方案包括:im-select 或者 fitcx。而这篇文章只需使用 Windows 平台下的一款自动化工具,借助 Windows 平台进行自动切换。
打开 系统设置,进入 时间和语言 --> 语言和区域,然后点击 添加语言 按钮。
找到 English(United States)
,点击 下一页 进行安装即可。
如果有其它语种的需求,安装对应语言即可。
安装完成后,进入 时间和语言 --> 输入 --> 高级键盘设置,勾选 允许我为每个窗口应用不同的输入法 即可。
打开 AutoHotKey 官网下载相应软件,点击 Download Current Version
即可。
下载完成后,进行安装。安装包很小,仅仅 3MB。选择默认安装,或者自定义安装都可以。
自定义安装仅仅更改安装路径即可,其它使用默认即可。
新建一个 txt
文本文件,输入如下内容:
#z:: SetFormat, Integer, H WinID:=WinActive("A") ThreadID:=DllCall("GetWindowThreadProcessId", "UInt", WinID, "UInt", 0) InputLocaleID:=DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt") Clipboard:=InputLocaleID MsgBox, %InputLocaleID% return
完后后保存,将其后缀改为 .ahk
,然后双击运行,会自动进入系统托盘,如图所示:
如果要暂停脚本热键,只需右键点击相对应的脚本,然后选择 Suspend HotKey
即可。
脚本启动后,按下 Win + z
组合键,即可出现当前语言输入法的相对应代码。记录下来,然后切换到另一种语言的输入法,再次按下上述按键,查看其对应代码即可。
如图,为 中文(简体,中国) 输入法的对应代码:
如图,为 英语(美国) 输入法的对应代码:
其它的语言输入同样按照上述方法进行操作。
完成后,右键退出该脚本即可。
同样新建一个 txt 文件,然后输入如下内容:
#IfWinActive ahk_exe WindowsTerminal.exe :*:o:: { sendinput,{o} PostMessage, 0x50, 0, 0x8040804, , A } return #If #IfWinActive ahk_exe WindowsTerminal.exe :*:a:: { sendinput,{a} PostMessage, 0x50, 0, 0x8040804, , A } return #If #IfWinActive ahk_exe WindowsTerminal.exe :*:i:: { sendinput,{i} PostMessage, 0x50, 0, 0x8040804, , A } return #If #IfWinActive ahk_exe WindowsTerminal.exe ESC:: { sendinput,{Esc} PostMessage, 0x50, 0, 0x4090409, , A } return #If
其中,如果按下 o、i、a 就进入 vim 的 Insert 模式,切换为中文输入法。如果按下 Esc,就进入了 vim 的 Normal 模式,切换为英文输入法。
其中的 0x8040804
和 0x4090409
为之前所查看的输入法代码。
sendinput
表示将按下的键再输出出去,以响应 vim 操作。
#IfWinActive
表示检测特定的可执行文件进行触发。由于作者使用的是 WSL2,因此我设置的响应程序为 Windows Terminal
。如果读者使用的是 VS Code,那么可以将 WindowsTerminal.exe
替换为 Code.exe
。如果要响应其它软件,将其更换为相对应的可执行文件名称即可。
其它热键也可以自行设置。常用的特殊按键如下:
完成之后,将脚本后缀改为 .ahk
,启动即可。配置完成!