🐼

WSL環境でNeovimのInsertモード終了時にIMEをオフにする

2024/12/14に公開

はじめに

Neovimを使っていると、日本語入力システム(IME)の切り替えを煩わしく感じることがあります。
特にInsertモードから抜けたときにIMEをオフにする設定がないと、不要な文字入力が発生したり、思わぬ混乱を招くことがあります。

当然同じような事を思うユーザーは多く、解決を図る記事も沢山あります。

ところで、私はWSLユーザーなのですが、WSLからWindowsのIMEをコントロールする、となると途端に選択肢は多くありません。
最後の記事のim-select.nvimがそうしているように、im-select.exeを使うというのが一番よく見る解決策です。
しかし、im-select.exeはやたらと重く、やたらと難解な設定も強いられるため、あまり良い解決とは言いがたいものです。

この記事では、WSL環境にフォーカスして、NeovimのInsertモードを終了した際にIMEを自動でオフにする設定をご紹介します。

使用するツールと背景

WSL環境では、IME制御のために zenhan を使用します。
これはspzenhan.vimをForkしたツールです。
spzenhan.vimは、元を辿ればzenhanのようです。
どちらも作者の方がVSCodeでの設定事例を記事にされていました。

しかし、いくらか気に入らない部分があったため、個人的なフォークとしています。

  • APIのレスポンスが意図しないものの場合、プロセスが正常終了してしまい紛らわしかった
  • ビルド済みバイナリをリポジトリ内に含めたくなかった
    • リリースに置いておきたい
  • 状態を取得できるアイディア自体はspzenhan.vimの方が良かった
  • GitHub Actionsで自動ビルドしておきたかった
  • Insertモードに入ったときのIME状態を記憶して復元する機能は、実際の使用感を考慮して削除した
    • 前回InsertモードでIMEがオンだったとしても、次回の入力内容が必ずしも日本語とは限らない
    • 前回Insertモードの時のIMEの状態を記憶してくれる⇒ユーザー自身が覚えていない状態に戻されることがかえって混乱を招く可能性がある
  • 付属しているVimプラグインの設定が複雑
    • 自分の設定だけで完結する方が見通しよくできそうだった
    • Neovim/VSCodeを配慮する気はなかった

私がForkした方のzenhanも、ビルドしたバイナリはreleaseから取得できます。
適当なPATHの通ったディレクトリにダウンロードして、実行権限を与えておけば使えます。

$ gh --repo kyoh86/zenhan release download -p '*.exe' -O ~/.local/bin/zenhan.exe 
$ chmod +x ~/.local/bin/zenhan.exe 

設定の具体例

以下は、InsertLeave イベントをトリガーとして、zenhanでIMEを自動でオフにする設定です。

local uname = vim.uv.os_uname()
local group = vim.api.nvim_create_augroup("kyoh86-conf-ime", {})
if uname.sysname == "Linux" then
  if os.getenv("WSL_DISTRO_NAME") ~= "" then
    vim.api.nvim_create_autocmd("InsertLeave", {
      group = group,
      command = "silent! !zenhan.exe 0",
    })
  else
    -- 割愛: WSL以外の設定
  end
else
  -- 割愛: Linux以外の設定
end
  • WSL環境での判定 : 環境変数 WSL_DISTRO_NAME をチェックして、WSL内で実行されているかを確認する
  • シンプルなコマンド実行 : zenhan.exe を使って直接IMEをオフに切り替える

まとめ

WSL環境でNeovimを快適に使うための、Insertモード終了時にIMEを自動オフにする設定を紹介しました。この設定により、煩わしいIME切り替えの手間を省き、集中して編集作業に取り組むことができます。

ぜひ、ご自身の環境に合わせてカスタマイズしてみてください。


参考リンク

Discussion