こんにちは。ナミレリです。Neovimでのコマンド操作中に日本語IMEがオンなのかオフなのか?のストレスはないですか?
この記事ではNeovimを快適に使うために、IMEの入力モードの状態を取得する関数を書いて、それをlualineのステータスラインに表示してみましたので紹介します。
IMEの入力モードの状態取得はim-selectで行い、それをlualineでステータスラインに表示します。現在の入力モードが日本語入力か英字入力か一目瞭然になるので、打ち間違いも少なくなります。下の画像のようにステータスラインに表示させてみました。
英字入力モードでは[_A]と表示
![英字入力モードでは[_A]と表示](https://namileriblog.com/wp-content/uploads/2023/09/1-1.png)
日本語入力モードでは[あ]と表示
![日本語入力モードでは[あ]と表示](https://namileriblog.com/wp-content/uploads/2023/09/2.png)
上の画像のように、現在のIMEの状態がオンなのかオフなのかを簡単に確認することができるようになります。

この記事はこんな人にオススメ
- Neovimで入力モードによって入力ミスがある方
- im-selecctを使ってみたい方
- lualineを使ってみたい方
- Neovimの設定をLuaでカスタマイズすることが好きな方
- MacBook Pro 14インチ M1Max(メモリ32GB)
- macOS Ventura 13.5.1
- Parallels Desktop 19 for Mac(Parallelsの公式サイト)
- NVIM v0.9.1

目次
はじめに
記事の前半では、im-selectを使ってモードが切り替わった際には(例:インサートモードからノーマルモードに戻った際)必ずIMEをオフにし、再度インサートモードに入った際は、前回のIMEの状態にする方法を紹介します。
記事の後半では、IMEの入力モードの状態を取得する関数を書いて、それをlualineのステータスラインに表示する方法を紹介していきます。
では早速いってみましょう。
モードが切り替わった際にIMEをオフにする
Neovimでモードが切り替わった際に(例:インサートモードからノーマルモードに戻った際)必ずIMEをオフにし、再度インサートモードに入った際は、前回のIMEの状態にしたいです。これを実現するのがim-selectとim-select.nvimです。
im-selectのインストール
https://github.com/keaising/im-select.nvim/blob/master/README.md
brew tap laishulu/homebrew
brew install macism
im-selectの公式githubを参考にインストールします。
brew tap daipeihust/tap
brew install im-select
インストール後、パスを確認しておきます。
which im-select
/opt/homebrew/bin/im-select
im-selectコマンドを実行すると、現在のIMEを確認することができます。
現在のIME(ATOK)を確認
im-select
com.justsystems.inputmethod.atok33.Roman
ABC入力:com.justsystems.inputmethod.atok33.Roman
日本語入力:com.justsystems.inputmethod.atok33.Japanese
現在のIME(Mac標準)を確認
im-select
com.apple.keylayout.ABC
ABC入力:com.apple.keylayout.ABC
日本語入力:com.apple.inputmethod.Kotoeri.RomajiTyping.Japanese
im-select.nvimのインストール
次に、Neovimからim-selectを制御するim-select.nvimをインストールします。Luaで書かれたプログラムです。下の設定を~/.config/nvim/lua/plugins.luaに書き、その後:PackerInstallします。
use 'keaising/im-select.nvim'
次に下記の設定を~/.config/nvim/init.luaに書きます。
require('im_select').setup {
default_im_select = "com.justsystems.inputmethod.atok33.Roman"
}
これだけの設定で十分に機能するはずです。
具体的には、インサートモードを抜ける時にIMEがオフになり、再度インサートモードに入ると前回のインサートモードのIME状態になります。
IMEの入力モードをステータスラインに表示する
IMEの入力モードの状態取得はim-selectで行い、それをlualineでステータスラインに表示させてみます。完成形は下の画像のようなステータスラインになります。
英字入力モードでは[_A]と表示
![英字入力モードでは[_A]と表示](https://namileriblog.com/wp-content/uploads/2023/09/1-1.png)
日本語入力モードでは[あ]と表示
![日本語入力モードでは[あ]と表示](https://namileriblog.com/wp-content/uploads/2023/09/2.png)
im-select
を実行した結果を取得するLua関数の作成
まずはim-select
を実行した結果を取得するLua関数を作成します。~/.config/nvim/lua/imselect.luaに作成します。
vi ~/.config/nvim/lua/imselect.lua
-- 初期状態ではステータスラインへのIMEの表示はオフ
vim.g.show_ime_status = false
-- モジュールの初期化
-- このモジュールにはIMEの状態を操作・取得する関数
local M = {}
-- IME表示のトグル機能。ステータスラインのIME表示を切り替える
M.toggle_ime_display = function()
-- IMEのステータスをトグルする
vim.g.show_ime_status = not vim.g.show_ime_status
-- ステータスライン再描画して変更をすぐに反映
vim.cmd("redrawstatus")
end
-- 現在のIMEの入力方法(例:日本語、ローマ字)を
-- ステータスライン用の文字列として返す関数
M.input_method = function()
-- IMEのステータスが非表示の場合、空文字を返す
if not vim.g.show_ime_status then
return ""
end
-- im-selectを使って、現在のIMEの状態を取得
local handle = io.popen("im-select")
local result = handle:read("*a")
handle:close()
-- 結果文字列から末尾の改行文字を削除
result = result:gsub("\n$", "")
-- im-selectの結果から"atok33.Japanese"または"atok33.Roman"の部分を抽出
local method = result:match("atok33%.([^%.]+)")
-- ステータスライン用の文字列を生成
if method == "Japanese" then
return " " .. "%#IME_Japanese#[" .. "あ" .. "]%*"
elseif method == "Roman" then
return " " .. "%#IME_Roman#[" .. "_A" .. "]%*"
else
return "[Unknown]"
end
end
-- モジュールを返す
return M
lualineの設定
上のim-select
を実行した結果を取得するLua関数を、lualineに表示するように設定します。
~/.config/nvim/init.luaを編集します。
vi ~/.config/nvim/init.lua
先程作成した~/.config/nvim/lua/imselect.luaをrequireします。色はお好みで変更してください。
~/.config/nvim/init.lua
local function imselect_status()
return require("imselect").input_method()
end
vim.api.nvim_command('highlight IME_Japanese guifg=#f7768e')
vim.api.nvim_command('highlight IME_Roman guifg=#9ece6a')
lualineのlualine_xを以下のようにします。
~/.config/nvim/init.lua
require("lualine").setup({
sections = {
lualine_x = { imselect_status, "encoding", "fileformat", "filetype" },
},
})
:lua require'imselect'.toggle_ime_display()
![英字入力モードでは[_A]と表示](https://namileriblog.com/wp-content/uploads/2023/09/1-1.png)
キーマップの設定
この関数のキーマップを<Leader>IIとしてみます。
vi ~/.config/nvim/lua/keymaps.lua
vim.keymap.set("n", "<leader>II", ":lua require'imselect'.toggle_ime_display()<CR>", {})
これで<Leader>IIでステータスラインに表示、非表示することができます。
最後に
最後まで読んでいただきありがとうございます。今回のNeovimのステータスラインにIMEの状態を表示するはいかがでしたでしょうか。
負荷軽減が課題ですが、Neovimの日本語入力環境を改善する目的は達成することができました。Luaも楽しいですね。
NeovimとHHKBの組み合わせは、コーディング体験を最適化し、より生産的で満足のいくものにするための最高のツールです。コーディングの楽しさと効率性を新たなレベルへと引き上げてくれます。

定番おすすめ記事
Neovimをかっこ良くクールに使う設定