我在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.sh
和setIM1/2.exe
)运行太慢,还是因为autocmd
太慢,或者其他什么原因。有人能帮助我吗?
以下是getIM.ahk
和getIM.sh
,以及setIM1/2.ahk
(setIM1/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
1条答案
按热度按时间ar5n3qh51#
尝试将
set timeoutlen=100
添加到配置文件中。它的默认值为1000,这可能是您的问题的原因。