Как в Windows git-bash автоматически переключаться между двумя методами ввода в Vim?

Когда я печатаю статью на китайском языке в Vim, я использую метод ввода на китайском языке в режиме InsertMode и метод ввода на английском языке в режиме NormalMode. Мне нужно автоматически переключаться на английский метод ввода при выходе из InsertMode и переключаться на исходный метод ввода при повторном входе в InsertMode — это обычное требование.

Я знаю, что GVim в Windows справляется с этим хорошо. Кроме того, в Linux есть несколько плагинов, которые хорошо решают эту проблему с помощью метода ввода «fcitx». Но я предпочитаю использовать Vim в терминале (я выбрал git-bash) в Windows!

Я пробовал следующим образом:

  1. Используйте AutoHotkey для создания скриптов для получения текущего метода ввода () и переключения на указанный метод ввода (setIM1.exeдля китайского иsetIM2.exeдля английского).
  2. Затем напишите в 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

0 ответов

Другие вопросы по тегам