解决Windows下(Neo)Vim中文输入法的切换问题
问题描述⚠️
在 Windows 系统下,如果使用 (Neo)Vim
编辑器,比如 WSL、VS Code 或者其它 IDE 的 VIM 功能,如果使用中文输入法,在由 Insert
模式进入 Normal
时,难免需要不停切换中英文输入法,有时则会忘记切换,导致在 Normal 模式下输入中文。
本文将介绍两种方法进行输入法的自动切换:
- im-select
- AutoHotKey
必要准备📦️
打开 系统设置,进入 时间和语言 --> 语言和区域,然后点击 添加语言 按钮。
找到 English(United States)
,点击 下一页 进行安装即可。
如果有其它语种的需求,安装对应语言即可。
安装完成后,进入 时间和语言 --> 输入 --> 高级键盘设置,勾选 允许我为每个窗口应用不同的输入法 即可。
解决方法一:im-select1️⃣
im-select是一款为 VS Code Vim 所设计的一款插件,为 VSCodeVim 的 autoSwitchIM
功能提供了命令行程序。
需要在 vs code 中使用的读者请在网上查阅,资料较多。
首先点击下方链接下载合适的 Windows 版本:
下载完成后,我们将其放入到合适的英文路径。这里我选择的是 C:\im-select\im-select.exe
。
打开 WSL,通过如下命令我们可以做出相应的输入法操作:
/mnt/c/im-select/im-select.exe # 查看当前输入法的代码编号
/mnt/c/im-select/im-select.exe locale # 切换当前输入法
/mnt/c/im-select/im-select.exe 2052 # 切换到中文输入法
/mnt/c/im-select/im-select.exe 1033 # 切换到英文输入法
打开 (Neo)Vim,选择合适的方法下载插件 vim-im-select,这里我使用的是 NeoVim 的 packer 插件管理器,其配置如下:
return require('packer').startup(function(use)
-- Other Plugins
use {
"brglng/vim-im-select",
config = function()
require("conf.im-select")
end,
}
end
conf.im-select
是我自己的插件配置目录,我在im-select.lua
文件中对其进行配置。根据自己的配置自行进行更改。记得输入:PackerInstall
安装该插件。
im-select.lua
文件的配置如下:
-- 设置 im-select 的路径
vim.g.im_select_command = "/mnt/c/im-select/im-select.exe"
-- normal 模型下采用英文输入法
vim.g.im_select_default = "1033"
-- 如果您的桌面已经开启“在不同的窗口/应用程序之间切换输入法”的功能,可能需要将此选项设置为 0
vim.g.im_select_enable_focus_events = 0
到此,便配置完成。normal 模式下采用英文输入法,insert 模式下采用中文输入法。同时,可以通过 :ImSelectEnable
命令启用插件,通过 :ImSelectDisable
命令禁用插件。
如果存在问题,比如:进入 neovim 时是英文输入法,但是进入 insert 模式后还是英文输入法,只有当按下 <Win + Space>
的组合键在 insert 模式下切换到中文输入法后,该插件才会正常运行。如果存在这种情况,可以通过如下自动命令强制其更新:
local augroup = vim.api.nvim_create_augroup
-- 进入 insert 模式时自动切换中文输入法
autocmd("InsertEnter", {
pattern = "*",
command = 'silent exec "!(/mnt/c/im-select/im-select.exe 2052) &"',
group = cursorGrp,
})
-- 进入 VIM 时自动切换英文输入法
autocmd("VimEnter", {
pattern = "*",
command = 'silent exec "!(/mnt/c/im-select/im-select.exe 1033) &"',
group = cursorGrp,
})
更换 im-select.exe 的路径为自己的文件路径。
解决办法二:AutoHotKey2️⃣
1. 下载AutoHotKey
打开 AutoHotKey 官网下载相应软件,点击 Download Current Version
即可。
下载完成后,进行安装。安装包很小,仅仅 3MB。选择默认安装,或者自定义安装都可以。
自定义安装仅仅更改安装路径即可,其它使用默认即可。
2. 获取语言代码
新建一个 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
组合键,即可出现当前语言输入法的相对应代码。记录下来,然后切换到另一种语言的输入法,再次按下上述按键,查看其对应代码即可。
如图,为 中文(简体,中国) 输入法的对应代码:
如图,为 英语(美国) 输入法的对应代码:
其它的语言输入同样按照上述方法进行操作。
完成后,右键退出该脚本即可。
3. 编写脚本
同样新建一个 txt 文件,然后输入如下内容:
global CurMode = normal
#IfWinActive ahk_exe WindowsTerminal.exe
:*:o::
{
sendinput,{o}
if (%CurMode% = normal)
{
PostMessage, 0x50, 0, 0x8040804, , A
CurMode = input
}
}
return
#If
#IfWinActive ahk_exe WindowsTerminal.exe
:*:a::
{
sendinput,{a}
if (%CurMode% = normal)
{
PostMessage, 0x50, 0, 0x8040804, , A
CurMode = input
}
}
return
#If
#IfWinActive ahk_exe WindowsTerminal.exe
:*:i::
{
sendinput,{i}
if (%CurMode% = normal)
{
PostMessage, 0x50, 0, 0x8040804, , A
CurMode = input
}
}
return
#If
#IfWinActive ahk_exe WindowsTerminal.exe
ESC::
{
sendinput,{Esc}
if (%CurMode% = input)
{
PostMessage, 0x50, 0, 0x4090409, , A
CurMode = normal
}
}
return
#If
其中,如果按下 o、i、a 就进入 vim 的 Insert 模式,切换为中文输入法。如果按下 Esc,就进入了 vim 的 Normal 模式,切换为英文输入法。同时声明了一个全局变量 CurMode
用于判断当前模式,防止在 Shell 中因为按下 i、o、a 键而疯狂切换输入法。
其中的 0x8040804
和 0x4090409
为之前所查看的输入法代码。
函数 sendinput
则表示将按下的键再输出出去,以响应 vim 操作。
#IfWinActive
表示检测特定的可执行文件进行触发。由于作者使用的是 WSL2,因此我设置的响应程序为 Windows Terminal
。如果读者使用的是 VS Code,那么可以将 WindowsTerminal.exe
替换为 Code.exe
。如果要响应其它软件,将其更换为相对应的可执行文件名称即可。
其它热键也可以自行设置。常用的特殊按键如下:
- !: Alt
- ^: Ctrl
- +: Shift
- &: 用于连接两个按键(含鼠标按键)合并成为一个自定义热键
- space: 空格键
- enter: 回车键
- Esc: Esc键
完成之后,将脚本后缀改为 .ahk
,启动即可。配置完成!
4. 设置脚本自启动
如果需要设置脚本为开机自启动,只需将之前创建的脚本放在如下的路径中即可:
C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
注:将用户名改为自己的用户名。
AppData 路径为隐藏文件夹,需要显示隐藏文件夹才可以看到。
Start Menu 和 Programs 文件夹可能显示为中文。