Amazon オーディブル2ヶ月無料キャンペーン中 5/9まで

【Mac】NeovimのステータスラインにIMEの状態を表示する

3 min

こんにちは。ナミレリです。Neovimでのコマンド操作中に日本語IMEがオンなのかオフなのか?のストレスはないですか?

この記事ではNeovimを快適に使うために、IMEの入力モードの状態を取得する関数を書いて、それをlualineのステータスラインに表示してみましたので紹介します。

IMEの入力モードの状態取得はim-selectで行い、それをlualineでステータスラインに表示します。現在の入力モードが日本語入力か英字入力か一目瞭然になるので、打ち間違いも少なくなります。下の画像のようにステータスラインに表示させてみました。

英字入力モードでは[_A]と表示

英字入力モードでは[_A]と表示

日本語入力モードでは[]と表示

日本語入力モードでは[あ]と表示

上の画像のように、現在のIMEの状態がオンなのかオフなのかを簡単に確認することができるようになります。

この記事はこんな人にオススメ

  • Neovimで入力モードによって入力ミスがある方
  • im-selecctを使ってみたい方
  • lualineを使ってみたい方
  • Neovimの設定をLuaでカスタマイズすることが好きな方
この記事の環境
Parallelsのホスト
  • MacBook Pro 14インチ M1Max(メモリ32GB)
  • macOS Ventura 13.5.1
  • Parallels Desktop 19 for Mac(Parallelsの公式サイト
  • NVIM v0.9.1
Parallels 19 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 19 for Mac

Parallels Desktop 19 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

はじめに

記事の前半では、im-selectを使ってモードが切り替わった際には(例:インサートモードからノーマルモードに戻った際)必ずIMEをオフにし、再度インサートモードに入った際は、前回のIMEの状態にする方法を紹介します。

記事の後半では、IMEの入力モードの状態を取得する関数を書いて、それをlualineのステータスラインに表示する方法を紹介していきます。

では早速いってみましょう。

Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

Amazon オーディブル:2ヶ月無料キャンペーン中(5/9まで)→ 詳しくはこちら

モードが切り替わった際にIMEをオフにする

Neovimでモードが切り替わった際に(例:インサートモードからノーマルモードに戻った際)必ずIMEをオフにし、再度インサートモードに入った際は、前回のIMEの状態にしたいです。これを実現するのがim-selectim-select.nvimです。

im-selectはコマンドラインからIMEの入力モードを確認や変更することのできるツールです。

im-selectのインストール

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

私はATOKを使っているので、上のようにローマ字入力時のIMEは、com.justsystems.inputmethod.atok33.Roman
が表示されます。

ATOKの場合

ABC入力:com.justsystems.inputmethod.atok33.Roman

日本語入力:com.justsystems.inputmethod.atok33.Japanese

現在のIME(Mac標準)を確認


im-select
com.apple.keylayout.ABC

Mac標準のIMEの場合

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に書きます。

IMEを半角英数のモードにして、im-selectを実行した結果を記載します。(下の例はATOKです。)


require('im_select').setup {
    default_im_select = "com.justsystems.inputmethod.atok33.Roman"
}

これだけの設定で十分に機能するはずです。

具体的には、インサートモードを抜ける時にIMEがオフになり、再度インサートモードに入ると前回のインサートモードのIME状態になります。

IMEの入力モードをステータスラインに表示する

IMEの入力モードの状態取得はim-selectで行い、それをlualineでステータスラインに表示させてみます。完成形は下の画像のようなステータスラインになります。

英字入力モードでは[_A]と表示

英字入力モードでは[_A]と表示

日本語入力モードでは[]と表示

日本語入力モードでは[あ]と表示

im-selectを実行した結果を取得するLua関数の作成

まずはim-selectを実行した結果を取得するLua関数を作成します。~/.config/nvim/lua/imselect.luaに作成します。


vi ~/.config/nvim/lua/imselect.lua

im-selectの実行は負荷になるので初期状態でステータスラインへの表示はオフにしています。トグルするためのキーマップを後ほど設定します。


-- 初期状態ではステータスラインへの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

上記はATOKを想定したLua関数です。その他のIMEの場合は32行目以降を修正してください。

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" },
	},
})

以下のコマンドを実行するとステータスラインにIMEの状態が表示されます。


:lua require'imselect'.toggle_ime_display()
英字入力モードでは[_A]と表示

もう1度、:lua require'imselect'.toggle_ime_display()コマンドを実行すると非表示になります。

キーマップの設定

この関数のキーマップを<Leader>IIとしてみます。


vi ~/.config/nvim/lua/keymaps.lua


vim.keymap.set("n", "<leader>II", ":lua require'imselect'.toggle_ime_display()<CR>", {})


これで<Leader>IIでステータスラインに表示、非表示することができます。

im-selectの実行は負荷になるので必要な時だけ表示するようにしています。負荷にならない常時表示しておく良い方法あったらぜひ教えてください。

Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

Amazon オーディブル:2ヶ月無料キャンペーン中(5/9まで)→ 詳しくはこちら

最後に

最後まで読んでいただきありがとうございます。今回のNeovimのステータスラインにIMEの状態を表示するはいかがでしたでしょうか。

負荷軽減が課題ですが、Neovimの日本語入力環境を改善する目的は達成することができました。Luaも楽しいですね。

究極のコーディング体験:NeovimとHHKBで高める生産性

定番おすすめ記事

Neovimをかっこ良くクールに使う設定

カテゴリー:
関連記事