在Windows git-bash中,如何在Vim中自动切换两种输入法?

dfty9e19  于 2022-11-11  发布在  Windows
关注(0)|答案(1)|浏览(190)

我在Vim中输入中文文章时,在InsertMode下使用中文输入法,在NormalMode下使用英语输入法,需要在离开InsertMode时自动切换到英文输入法,再次进入InsertMode时切换到原来的输入法--这是常见的要求。
我知道Windows中的GVim在这方面做得很好。同样,在Linux中也有一些插件可以很好地解决这个问题,使用“fcitx”输入法。但是我更喜欢在Windows中的终端中使用Vim(我选择了git-bash)!
我试着接下去道:
1.使用AutoHotkey创建脚本,以获取当前输入法(getIM.sh)并切换到指定的输入法(setIM1.exe用于中文,setIM2.exe用于英语)。
1.然后在Vimscript中编写一个函数来切换输入法,然后使用autocmd.vimrc中离开或进入InsertMode时自动调用这个函数,如下所示:

let g:otherModeIM = 2
function SwitchIM()
  let l:curModeIM = system("~/getIM.sh")
  let l:tmp = system("~/setIM" . g:otherModeIM)
  let g:otherModeIM = l:curModeIM
endfunction

set ttimeoutlen=100
autocmd InsertEnter * call SwitchIM()
autocmd InsertLeave * call SwitchIM()

**问题在于:现在在Vim中切换模式变得太慢了!**当我输入i<esc>时,有一秒钟的延迟。我不知道这是因为我的脚本(getIM.shsetIM1/2.exe)运行太慢,还是因为autocmd太慢,或者其他什么原因。有人能帮助我吗?

以下是getIM.ahkgetIM.sh,以及setIM1/2.ahksetIM1/2.exe是从setIM1/2.ahk编译而来的)。

// getIM.ahk:
IMCodeToIndex := {0x8040804: 1, 0x4090409: 2}
winID := WinActive("A")
threadID := DllCall("GetWindowThreadProcessId", "Int", winID)
IM := DllCall("GetKeyboardLayout", "Int64", threadID)
FileOpen("curIM.txt", "w").write(IMCodeToIndex[IM])

// getIM.sh:

# !/bin/bash

AutoHotkey ~/getIM.ahk
cat ~/curIM.txt

// setIM1.ahk:
PostMessage, 0x50, 0, 0x8040804 /* which is 0x4090409 for setIM2.sh */, , A
ar5n3qh5

ar5n3qh51#

尝试将set timeoutlen=100添加到配置文件中。
它的默认值为1000,这可能是您的问题的原因。

相关问题