2023年12月10日日曜日

EMP版 emacs29.1 で漢字変換時に「あ」とかを表示をする elisp

少し前に、 自宅のiMac に emacs 29.1 (macOS EMP版) をインストールし、 いい感じで日本語入力ができ満足していたのだが、 漢字変換している時の IME の状態を表示する機能がないのが唯一の不満だった。
そこで、よくありがちな
こんな感じの、モードライン上にIMEの状態を表示する機能を elisp で作ってみた。

ソースコード:  myemp-aux.el

いちおう、自分の環境(mojava + kotoeri) では、そこそこうまく動作することを確認したが、 他の環境でどうなるかは不明だ。

myemp-aux.el の使い方

(ここの説明では emacs の 初期化ファイルを ~/.emacs.el と仮定している)
  1. myemp-aux.el から、ソースファイルをダウンロード
  2. ダウンロードした myemp-aux.el を load-path ディレクトリーに移動
  3. load-path の設定は、例えば、$HOME/elisp に置く場合は、~/.emacs.el に
    (add-to-list 'load-path (file-truename "~/elisp"))
    と書いておけばいい。
  4. ~/.emacs.el に以下を設定
  5. (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)
      )
    
  6. emacs を再起動
  7. ⌘-SPACE などで入力ソースを切り替えて、モードラインの左端あたりに、」が表示されればとりあえずは成功。

あれ? 使えないよ、の場合

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の状態が変化した時のモードライン表示を制御しているのだが、 フローの概略は、
  1. 現在のインプットソースIDを取得
  2. (mac-input-source) の返り値が、現在のインプットソースIDを教えてくれる。
  3. インプットソースIDを 「」 などのインプットソースタイトルに変換する
  4. この時、あらかじめ定義してある、my-ime-title-alist 変数を参照する。
    この変数は、インプットソースIDとインプットソースタイトルの対応を表す連想リストで、
    ( (インプットソースID . インプットソースタイトル) ... ) 
    の書式で定義する。
  5. モードドラインに、変換したインプットソースタイトルを表示する
  6. isearchの場合には、ミニバッファープロンプトに表示
つまり、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は
入力モードインプットソース 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 に対しては無効です。

0 件のコメント:

コメントを投稿