Windows と WSL2 の neovim を使ったときの 日本語入力をもうちょっとなんとかしたい
vim(neovim)はとても便利で気に入っていますが、日本語入力が不便です。
vimのモード切替+IMEの切り替え が、とにかく面倒です。
日本語入力が必要になるときは別のエディタを使ったりしていますが、それはそれで面倒なので、なんとか改善したいです。
やりたいこと
個人的には
- ノーマルモードに移る時には、IMEがオフになってほしい
- インサートモードに移る時には、直前のインサートモードでのIME状態に戻ってほしい
と思っています。
ついでに、Windowsのneovimだけでなく日頃の開発環境であるWSL2のneovimでも同様なことをしたいと思っています。
既存の解決方法など
1は zenhannを使って実現する方法が多数紹介されています。
2は win-ime-con.vim を使うとWindows上のneovimから実現可能ですが、Windows側のPythonに依存しているため残念ながらWSL2からは使いにくそうです。
もうちょっとなんとかしたい
いい感じにWindowsとWSL2両方のneovimで同じ設定を使ってIMEを制御できるといいなと思い、1と2を合体させたような方法で解決してみました。
やったこと
ざっくり言うと、win-ime-con.vimでPythonがやっているIME制御の部分をzenhanで行うようにした感じです。win-ime-con.vimからフォークして作ろうかと思ったのですが、win-ime-con.vimにはライセンス表記がなかったのでzenhanからフォークしてvimスクリプトの部分は自作しました。
オリジナルのzenhanはIMEの状態を標準出力に表示することはできますが終了ステータスとしてIMEの状態を得ることができないので、改造して終了ステータスとしてもIME
IMEの状態を取得できるようにしました。オリジナルと区別するために、ちょっとだけパッチを当てたzenhanということで、spzenhan (slightly patched zenhan) と名付けました。
そしてこのspzenhanを使ってインサートモードとノーマルモードの遷移時にIMEの状態取得を変更を行うことで、インサートモードの状態の保持と制御ができるようにしています。
コードはここです。
リポジトリにspzenhan.exeの実行バイナリを生でブチ込むという乱暴な作りなのでcloneしてきたらそのまま使えるはずです。
パッケージマネージャ経由では下記のようにすれば使えます。
[[plugins]]
repo = '~/repos/spzenhan.vim'
もしspzenhan.exeがうまく動かなかったら使用している環境上で再ビルドしてみてください。
補足
VSCode + VSCode Neovimでも動作するようです。
補足(2) 2023.10.31
WSL2で使う場合の注意
spzenhan.exe がWSL2イメージ側にあるとなぜか起動に時間がかかるようでneovimのモード遷移が死ぬほど遅くなります。
対策として、spzenhan.exeをWindows側(/mnt/ ディレクトリ以下のどこか)に移動してspzenhan.exeの場所をneovimの設定ファイル上で指定して使ってください。
let g:spzenhan#executable = "/mnt/どこかのWindows側のディレクトリ/spzenhan.exe"
補足(3) 2023.11.27
インサートモードに出入りするときにもっさりするのを改善するため、system のパラメータを文字列からリストに変更しました。( help に system の引数をリストにすると shell を経由せず直接実行できると記載がありました)
※リストで shell なしの直接実行は neovim だけの機能っぽいです
Discussion