はじめに
日本語ユーザにとって和文の書類を作成する($\LaTeX$やmarkdownなど)際,最も面倒くさいのが,入力メソッド(input method)の切り替えである.ノーマルモードでj
やk
を押した時に全角の「j」とか「k」が出てきてカーソルが動かなかったときには深いため息をつきたくなるだろう.そこで私はLinuxターミナル上で以下の仕様のスクリプト(lua)を作成した:
- 挿入モード終了時の入力メソッドを記憶
- ノーマルモードでの入力メソッドの自動オフ
- 挿入モード開始時の入力メソッドの自動オン(終了時にオンになっていれば)
日本語環境
日本語入力環境はfcitx5-mozc
であるため,別の日本語入力メソッドを使っている方は正常に動作しないことに注意されたい.
Luaスクリプト
仕様の説明は二の次で内容物がほしい人は,以下のスクリプトを init.lua
に貼り付けてほしい.
local function trim(s)
return s:match("^%s*(.-)%s*$")
end
local function GetFcitxStatus()
local handle = io.popen('fcitx5-remote -n')
local result = handle:read("*a")
handle:close()
return trim(result)
end
local function OnInsertLeave()
-- Save fcitx status when leaving insert mode
vim.g.fcitx_status = GetFcitxStatus()
-- Disable (Japanese) input method
os.execute('fcitx5-remote -c')
end
local function Enable(status)
if status ~= 'keyboard-us' then
os.execute('fcitx5-remote -o')
end
end
vim.g.fcitx_status = GetFcitxStatus()
-- Autocmd for InsertLeave and InsertEnter
vim.api.nvim_create_autocmd("InsertLeave", {
callback = OnInsertLeave
})
vim.api.nvim_create_autocmd("InsertEnter", {
callback = function()
Enable(vim.g.fcitx_status)
end
})
仕様
原理としてはじめに
にも書いたが以下の通り:
- 起動時に
GetFcitxStatus()
で現在fcitx5
がオンかオフかを検知し,fcitx_status
に代入 - 挿入モード終了
InsertLeave
をトリガーにOnInsertLeave
が動き,escキーを押した直前の入力モードをfcitx_status
に保存し,入力メソッドをオフにする - 挿入モード開始
InsertEnter
をトリガーに,前の挿入モード時のステータスfcitx_status
を使って,入力メソッドを切り替え
おわりに
WindowsのVSCodeはzenhanという便利なツールがある一方,macOSやLinuxは整備が十分でないようである.これを機にたくさんの方がこのスクリプトを使用してくれることを願う.
また,私は約半年前にvimrcから脱却し,luaへの移行作業を済ませた.そこまでハードコアなvimmerでない人はluaを使っていないだろう.そのため,今後は vimrc でも普及できるように務める次第である.
また余力があればlua引っ越しのすゝめ的な記事も書いてみたい.