vimScriptでIMEの状態を取得できる関数を書いた
Schemeの学習メモを書いている時に、autocomplpop.vimで日本語まで補完されるのでSchemeから脱線してvimScriptをぱっと書きました。
前から気になっていた事なのですが、vimはCursorIMというIMEの状態でカーソル色を変更するオプションはあるのに、状態を取得する関数が存在しません。IMEの状態でフックできればどれだけ便利だろうなーと思った事か・・・*1
Macでもやりたいところですが、まずはWindows専用で。
Win32APIとRubyとvimのコラボでインタフェース利用の嵐です。
"----------------------------- " IMEの状態を取得する " Return 1:ON 0:OFF "----------------------------- function! ImeStatus() if has('win32') ruby << EOF require 'Win32API' # 最前面のウィンドウハンドルを取得(操作中のvimウインドウ) wndObj = Win32API.new('user32.dll', 'GetForegroundWindow', 'v', 'n') hWnd = wndObj.call # IMEのコンテキストを取得 imcObj = Win32API.new('imm32','ImmGetContext','l','l') himc = imcObj.call(hWnd) # IMEの状態を取得 imeOpenObj = Win32API.new('imm32','ImmGetOpenStatus',%w(l),'l') VIM::command("return '" + imeOpenObj.call(himc).to_s + "'") EOF else return 0 endif endfunction
これをvimrcに書くか、vimscript化すればOKです。
あとは、autocomplpop.vim内でIMEの状態により挙動を変更するという感じでよいのかなー。