この記事はVim2 Advent Calendar 2017の19日の記事(代打)です。
この記事ではmacOS High Sierraでvimの挿入モードに入ったり、挿入モードから出た時にIMEの状態を自動で切り替える方法を説明します。
私はATOKを使っていますが、標準の日本語入力やGoogle IMEを使っていても少しの修正で使えると思います。
挙動としては、挿入モードを抜けた時にIMEの状態を記憶して、挿入モードに入ったときに復元する感じです。
まず最初に、環境設定>キーボード>入力ソースでお好みの英語の入力用ソースを追加します。私の場合はU.S.を追加しました。
結果として入力ソースは以下の画像のようになります。
そして、macOSのIMEをcliで切り替えたりできる、swimを入れます。
IMEを切り替えながら swim list --current
を使って、日本語と英語のIMEの内部名称をメモしてください。
そんでもって、下記 Vim script を vimrc にどーん。s:JapaneseIM
と s:AsciiIM
の値は先ほどメモしたやつに書き換えてくださいね。
" input methodlet s:JapaneseIM ='com.justsystems.inputmethod.atok30'let s:AsciiIM ='com.apple.keyboardlayout.all'function! s:ImActivateFunc(active)ifa:activecall system('swim use ' . s:JapaneseIM)elsecall system('swim use ' . s:AsciiIM)endifendfunctionfunction! s:ImStatusFunc()return system('swim list --current')is# s:JapaneseIM . "\n"endfunctionlet s:ImStatus =0function! s:insertEnter()call s:ImActivateFunc(s:ImStatus)call s:ImStatusFunc()endfunctionfunction! s:insertLeave()let s:ImStatus = s:ImStatusFunc()call s:ImActivateFunc(0)call s:ImStatusFunc()endfunction
augroup ime
autocmd!
autocmd InsertEnter * call s:insertEnter()
autocmd InsertLeave * call s:insertLeave()
augroup END
本当は、imaf
とimsf
を適切に設定すればvimがかってにうまいことやってくれるんですが、imsf
は頻繁に呼ばれてしまい、それでvimがもたついてしまうので挿入モードに出入りするときだけ呼ぶようにしたのが上記になります。
macOS以外の人もImActivateFuncとかImStatusFuncを適切に実装すれば同じことができるはず?
Vimで快適な日本語執筆環境をめざして!
追記:
ImActivateFuncを呼んだ後にImStatusFuncを呼んでいるのは、swimがIMEの切り替えに失敗?することがあって、そんなときに swim list --current
を呼んでやるとうまくいくというworkaroundです。