読者です 読者をやめる 読者になる 読者になる

VimのstatuslineにMacのIMEのステータスを(結構無理やり)表示させてみた

Carbon EmacsではデフォルトでIMのステータスが表示されているのを見ていいなぁと前々から思いつつ、ひとまずObjective-CAppleScriptのドキュメントに挑んではやられていたところちょうど次のようなツールを発見。

hnakamur’s blog: Mac OS X 10.5以降でIMEを切り替えるコマンドラインツールを作りました


で、「やったー、これで出来るぜ!ありがとうございます!」と思いつつやってみたので晒してみる。

まず、上記のページからそのinputsourceコマンドをDLし、READMEを見ながらmakeしてPATHの通ったところに置く。

そして.vimrcに以下の様なのを追加。

" inputsourceコマンドを使ってIMの状況を返す関数
" ことえり、Google日本語入力以外のIMを使ってる人はifの条件文を適宜弄る必要があるかと
" あと、半角カタカナや全角カタカナ、全角英数のような場合もinputsourceコマンドの出力結果を見ながら適宜追加する必要があるかと
function! IM_status()
  let l:id = substitute(system('inputsource'), '\n', '', '')
  if l:id == 'com.apple.inputmethod.Kotoeri.Roman' || l:id == 'com.google.inputmethod.Japanese.Roman'
    return ' A'
  elseif l:id == 'com.apple.inputmethod.Kotoeri.Japanese' || l:id == 'com.google.inputmethod.Japanese.base'
    return 'あ'
  else
    return ''
  endif
endfunction

" この辺は各自のstatuslineの設定に合わせてどうぞ
let &statusline.='[%{IM_status()}]'

VimScriptにはswitch-case文が無いらしく、if文での条件分岐などコードはアレですが、これで.vimrcを読み込み直せばステータスラインに英数入力時なら[ A]、日本語入力時なら[あ]のように表示されているはず。

一応わかってる範囲での現象としては

  • コンソール版Vimの場合トラックパッドやマウスで画面をスクロールした際全体の画面表示がひどいことになる(hjklやg, Gのようなキーでの移動では正常に表示されている)
  • IMを切り替えてすぐにはステータスラインでの表示には反映されず、何か文字を入力するなどすると反映される

などがあります。
ので、ご利用の際は適宜ええ感じに使ってくださいな。


追記:
しばらく使ってみた感じだとよく考えたらそんなにIMの状態って見ないし、関数呼び出しまくって描画処理が追いついていないのか結構バギーだったのであまりオススメはしませんが。良いやり方があればお知らせくださいな。

当ブログに於いて、私tasutenによって創作されたことが自明である著作物に対しては、別途明示のある場合を除き全てCC0が適用されます。