Как в Windows git-bash автоматически переключаться между двумя методами ввода в Vim?
Когда я печатаю статью на китайском языке в Vim, я использую метод ввода на китайском языке в режиме InsertMode и метод ввода на английском языке в режиме NormalMode. Мне нужно автоматически переключаться на английский метод ввода при выходе из InsertMode и переключаться на исходный метод ввода при повторном входе в InsertMode — это обычное требование.
Я знаю, что GVim в Windows справляется с этим хорошо. Кроме того, в Linux есть несколько плагинов, которые хорошо решают эту проблему с помощью метода ввода «fcitx». Но я предпочитаю использовать Vim в терминале (я выбрал git-bash) в Windows!
Я пробовал следующим образом:
- Используйте AutoHotkey для создания скриптов для получения текущего метода ввода () и переключения на указанный метод ввода (
setIM1.exe
для китайского иsetIM2.exe
для английского). - Затем напишите в Vimscript функцию для переключения метода ввода, а затем используйте для автоматического вызова этой функции при выходе или входе в режим InsertMode в
.vimrc
, следующее:
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>
, есть задержка в одну секунду. Я понятия не имею, это потому, что мои скрипты ( & ) работают слишком медленно, или потому чтоautocmd
слишком медленно или что-то еще. Кто-нибудь может мне помочь?
P.S. Дальше естьgetIM.ahk
&getIM.sh
, иsetIM1/2.ahk
(которыйsetIM1/2.exe
составлено из).
// 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