少し前に、
自宅のiMac に emacs 29.1 (macOS EMP版) をインストールし、
いい感じで日本語入力ができ満足していたのだが、
漢字変換している時の IME の状態を表示する機能がないのが唯一の不満だった。
そこで、よくありがちな
こんな感じの、モードライン上にIMEの状態を表示する機能を elisp で作ってみた。
ソースコード:
myemp-aux.el
いちおう、自分の環境(mojava + kotoeri) では、そこそこうまく動作することを確認したが、
他の環境でどうなるかは不明だ。
そこで、よくありがちな
myemp-aux.el の使い方
(ここの説明では emacs の 初期化ファイルを ~/.emacs.el と仮定している)
- myemp-aux.el から、ソースファイルをダウンロード
- ダウンロードした myemp-aux.el を load-path ディレクトリーに移動 load-path の設定は、例えば、$HOME/elisp に置く場合は、~/.emacs.el に
- ~/.emacs.el に以下を設定
- emacs を再起動 ⌘-SPACE などで入力ソースを切り替えて、モードラインの左端あたりに、「あ」が表示されればとりあえずは成功。
(add-to-list 'load-path (file-truename "~/elisp"))と書いておけばいい。
(when (fboundp 'mac-input-source) ;; (mac-auto-ascii-mode 1) ;; C-xなどで自動で ASCII 入力 ;; (setq default-input-method nil) ;; disable leim ?? (require 'myemp-aux) ;; 必要なら `my-ime-title-alist' の設定 ;; (setq my-ime-title-alist '((インプットソースID名 . "あ"))) (my-ime-enable) )
あれ? 使えないよ、の場合
myemp-aux.el は、少々古めの環境で申し訳ないが、macOS-mojave + kotoeri で
しか動作確認を行っていない。
運が良ければ、他の環境でもそのままで動作するかもしれないが、
そうでない場合は、次項の説明に従って my-ime-title-alist
変数をカスタマイズすれば、何とか使えるようになるかもしれない。
プログラムの仕組みと my-ime-title-alist 変数について
EMP版 emacs29 では、mac-input-source という関数で、現在の IME 状態を知ることができ、
mac-selected-keyboard-input-source-change-hook
変数で、IMEの状態が変化した時のコールバック関数を定義することができる。
myemp-aux.el ではこの二つを利用して、
IMEの状態が変化した時のモードライン表示を制御しているのだが、
フローの概略は、
- 現在のインプットソースIDを取得 (mac-input-source) の返り値が、現在のインプットソースIDを教えてくれる。
- インプットソースIDを 「あ」 などのインプットソースタイトルに変換する この時、あらかじめ定義してある、my-ime-title-alist 変数を参照する。
- モードドラインに、変換したインプットソースタイトルを表示する isearchの場合には、ミニバッファープロンプトに表示
この変数は、インプットソースIDとインプットソースタイトルの対応を表す連想リストで、
( (インプットソースID . インプットソースタイトル) ... )の書式で定義する。
つまり、myemp-aux.el がうまく動作しないケース、
特に、インプットソースを変えてもモードラインが変化しない場合は、
my-ime-title-alist 変数を、
IME 環境に合わせてカスタマイズする必要がある。
テスト用のコマンド my--ime-toggle-checkId を使えば、実際に、
どのようなインプットソースIDがあり、
それがどんな場合に有効になっているかを調べることができる。
具体的には、M-x my--ime-toggle-checkId を実行して、
キーボードからインプットソースを切り替えれば、
その都度 *mylog* というバッファーに ID のログが表示される筈だ。
そのID値を覚えておいて、my-ime-title-alist 要素の左辺(car部)を決めればいい。
上図は、kotoeri で、「ひらがなモード」と「カタカナモード」を有効にした時の、 *mylog* の一例である。
各々のモードとその時のインプットソースIDは
になっていると推測出来るので、
上図は、kotoeri で、「ひらがなモード」と「カタカナモード」を有効にした時の、 *mylog* の一例である。
各々のモードとその時のインプットソースIDは
入力モード | インプットソース ID |
---|---|
ひらがな | com.apple.inputmethod.Kotoeri.Japanese |
カタカナ | com.apple.inputmethod.Kotoeri.Japanese.Katakana |
IME OFF | com.apple.inputmethod.Kotoeri.Roman |
(setq my-ime-title-alist '(("com.apple.inputmethod.Kotoeri.Japanese" . "あ") ("com.apple.inputmethod.Kotoeri.Japanese.Katakana" . "ア") ))これを ~/.emacs.el に記述すればいい。
Note:
myemp-aux.el スクリプトは、あくまで、emacs29.1
のソースに山本光晴さんのパッチを当てた、通称
EMPバージョンの emacs に対するもので、他の emacs に対しては無効です。