2024/10/06
Neovimオススメ設定② 日本語入力を快適にするim-select.nvimのすすめ
Neovimのオススメ設定シリーズ第2弾。
はじめに
オススメ設定というよりもオススメプラグイン紹介になります。
皆さんはneovimで日本語入力をする時、入力言語の切り替えでストレスを抱えていると思います。(断定)
人によっては、skk(vim-skk/skkeleton)を使用している人もいるでしょう。
今回は皆さんに別の選択肢を提示したいと考えています。
WindowsまたはWSLの方はこちらもご覧ください。
※ 追記
im-select.nvim
READMEを読めばわかる通りですが、自動で入力メソッドを切り替えてくれるプラグインです。
Macではそのまま使えばいいのですが、Windowsだと不都合なことが起きます。(Linuxは未検証)
それは、IMEがオフになってしまうことです。 Macならまた切り替えればいいですが、、 WindowsだとIMEをオンにしてから再び日本語に切り替える必要があり、非常に手間です。 他のウィンドウにいった時とneovimを終了した時に困ります。 また、SSH接続等でim-selectが無いと言われたりするのが面倒なので、設定を付け加えます。
そもそも言語で英語がない人は切り替わらないので、設定->時刻と言語->言語と地域->言語の追加 から英語(米国)を追加しておいてください。
READMEにありますが、最近のアップデートでMacではim-selectではなくmacismを 使うようになったので注意が必要です。
設定
今回はlazy.nvimの設定です。各種プラグインマネージャーに読み替えてください。
return {
{
"keaising/im-select.nvim",
init = function()
if vim.env.DISPLAY then
require("im_select").setup()
if vim.fn.has("wsl") or vim.fn.has("win32") then
vim.api.nvim_create_autocmd("VimLeave", {
callback = function()
vim.fn.system("im-select.exe 1041")
end,
})
vim.api.nvim_create_autocmd("FocusLost", {
callback = function()
vim.fn.system("im-select.exe 1041")
end,
})
end
end
end,
},
}SSHしている時は起動してほしくないので、SSH_TTYがnullの時に起動しなければ良いです。
と、思っていたのですがSSH中にユーザーを変更するとこの環境変数がnullになってしまいます。
なので、DISPLAYがnullかどうかで判断することにしました。
これで、余計な時には起動しないようにします。
また、先ほど述べたほうにWindows環境だとIMEがオフになるので、neovimを終了した時またはカレントウィンドウを変更した時にIMEをオンにする設定を入れます。
日本語IMEはim-selectで1041なので、Windows環境またはWSL環境でneovimを終了した時とフォーカスを失った時にIMEをオンにしてやります。
再びneovimにフォーカスを移した時はプラグイン側がやってくれます。
MacだとDISPLAYがなく、正常に動かない場合もあると思います。
これで確認できます。
echo $DISPLAY何も表示されない場合は以下のように暫定的に変数を設定しておく必要があります。
export DISPLAY=:0MacにSSHして操作する場合はクライアント側でDISPLAYを上書きしておいてください。
Host Mac
SetEnv DISPLAY=最後に
これでまたneovim生活が快適になりました。
ただ、少し不具合もあってINSERTモードにしてもIMEがオンにならない時とフォーカスを別アプリに移してもIMEがオンにならない時があります。
原因がわかった方は教えていただけると幸いです。自分もわかったら追記します。
これらの時にIMEがオンにならないです。今のところ解決策は見つかっていません。
- タスクバーから別のアプリを選択
- デスクトップをクリック
逆に、正常に機能する時は以下です。
- Alt Tab
- タスクバーでターミナルを閉じる
- 他のアプリの画面をクリック
なかなか完璧とはいきませんが、ノーマルモードに戻った時の「っっっっっっj」がなくなるだけ全然良いです。
Macではそもそも基本英語入力モード運用しているのもあって、理想通りです。
ではまた。
最終更新日:2026/01/20