vimScriptでIMEの状態を取得できる関数を書いた

Schemeの学習メモを書いている時に、autocomplpop.vimで日本語まで補完されるのでSchemeから脱線してvimScriptをぱっと書きました。

前から気になっていた事なのですが、vimはCursorIMというIMEの状態でカーソル色を変更するオプションはあるのに、状態を取得する関数が存在しません。IMEの状態でフックできればどれだけ便利だろうなーと思った事か・・・*1

Macでもやりたいところですが、まずはWindows専用で。

Win32APIとRubyvimのコラボでインタフェース利用の嵐です。

"-----------------------------
" 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の状態により挙動を変更するという感じでよいのかなー。

*1:puttyIMEのカーソル色を変更する時に探しまくった・・・