解决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,然后双击运行,会自动进入系统托盘,如图所示:

image

如果要暂停脚本热键,只需右键点击相对应的脚本,然后选择 Suspend HotKey 即可。

脚本启动后,按下 Win + z 组合键,即可出现当前语言输入法的相对应代码。记录下来,然后切换到另一种语言的输入法,再次按下上述按键,查看其对应代码即可。

如图,为 中文(简体,中国) 输入法的对应代码:

image

如图,为 英语(美国) 输入法的对应代码:

image

其它的语言输入同样按照上述方法进行操作。

完成后,右键退出该脚本即可。

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 键而疯狂切换输入法。

其中的 0x80408040x4090409 为之前所查看的输入法代码。

函数 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 文件夹可能显示为中文。

posted @ 2022-06-29 00:57  Leaos  阅读(2421)  评论(0编辑  收藏  举报