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 に対しては無効です。

2023年11月18日土曜日

emacs29.1 (macOS EMP版) をソースからインストールしてみた

今更ながらだけど、Mac に、emacs29.1 の EMP版を、ソースからインストールした時のメモ。

きっかけ

今まで emacs26 の ns バージョンを使っていて特に大きな不満はなかったが、 日本語で文章を書いていると、たまに変換候補のポップアップが消えなかったり、IME がらみの不具合に見舞われる時があった。
ネットをいろいろ探っていると、IMEパッチについては、 ns 版とは別の EMP版というのがあり、かなり評判がいいようなので、 試しにインストールしてみようと思ったのが直接のきっかけ。

さらに、emacs28 あたりから、elisp のネイティブコンパイルとか、webkit 利用のフルブラウザー機能など、いろいろと斬新な機能が emacs 自体にも加えられているということ。ネイティブコンパイルについては、 僕の技量の範囲を超えているのでパスするとして、フルブラウザーについては結構なインパクトだ。 emacs のバッファーで、youtube が見れるのはうれしいかも。

インストール作業

インストールを行った環境は、古過ぎて馬鹿にされそうだが、Mac はインテル版の iMacで、OSは mojave。

ソースコードを置いたり、いろんなコマンドを実行する作業ディレクトリーは、
    $ mkdir ~/emacs-29
    $ workdir=$HOME/emacs-29
make における仮のインストール場所は、
    $ mkdir ~/emacs-29/build
    $ build="$HOME/emacs-29/build"

に設定した。

$biuid については、make が正常に終了した後、 あらためて ~/Applications にコピーする。

  1. ソースの取得
  2. 山本光晴さんの git ページ から clone で取得。
        $ cd $workdir
        $ git clone https://bitbucket.org/mituharu/emacs-mac.git
    これで、$workdir/emacs-mac/ にソースコードが配備される。

  3. sexy icon をダウンロード
  4. しばらくは、今回の emacs29と、古い emacs26 とを両方使うことになり、 アイコンを標準とは別のものにしたかったので、 Emacs is sexy から、macos 用をダウンロードした。

    なんか、とってもかっこいいアイコン!

  5. sexy アイコンを resource ディレクトリーへコピー
  6.     $ cd $workdir
        $ cp -p ~/Downloads/Emacs.icns emacs-mac/mac/Emacs.app/Contents/Resources/

  7. configure options の検討
    • --with-mac
    • EMP版の場合は、--with-ns ではなく、--with-mac とするらしい。

    • --with-xwidgets
    • webkit 利用のフルブラウザー機能を有効にする。

    • --prefix
    • --enable-mac-app
    • --enable-mac-self-contained
    • これらを指定しないと、Emacs.app 内で全てが完結する状態にならなかった。
      (つまり、loda-pathC-h で表示するさまざまな情報が、 $workdir/emacs-mac/lisp や $workdir/emacs-mac/info を参照している状態になってしまう)

    • --with-native-compilation
    • elisp のネイティブコンパイルが有効になるオプション。
      かなり魅力的な機能なんだが、へたれな僕としてはパス。

  8. make
  9.   $ cd $workdir/emacs-mac
      $ make clean
      $ ./configure  --with-mac  --without-x  --enable-mac-app=$build \
          --prefix=$build  --enable-mac-self-contained  --with-xwidgets
      $ echo $? #=> 0
      $ make bootstrap # (bootstrap なしで、単に make だけでいいのかも?)
      $ echo $? #=> 0
      $ make install
      $ echo $? #=> 0
    
      # AppTranslocation 対策
      # (この作業は、必要なかったもしれない?)
      $ cd $build
      $ xattr -d com.apple.quarantine Emacs.app
      $ xattr -dr com.apple.quarantine Emacs.app/
      $ cd ..

  10. 端末から実行して動作確認
  11.   $ open $build/Emacs.app --args -q
    初期設定ファイルなしのこの状態で、kotoeri からの日本語入力ができているのに感動……

  12. $build 環境を、$HOME/Applications にコピー
  13. App 資源を、仮のインストール場所 $build/Emacs.app から、~/Applications にコピーする。
      $ cp -Rp $build/Emacs.app  ~/Applications/
    追加で、C言語で書かれたソースコードも C-h で見れるように、 C のソースファイル を Emacs.app/ の下にコピーしておく。
      $ cp -Rp $workdir/emacs-mac/src \
           ~/Applications/Emacs.app/Contents/Resources/
    これで、.emacs.el などの初期設定ファイルに、

    (setq source-directory (file-truename 
          "~/Applications/Emacs.app/Contents/Resources"))

    と書いておけば、C-h からのソースファイルや INFO ドキュメントの参照が、 ~/Applications/Emacs.app の下を見るようになり、もう、$workdir からはおさらばになる筈だ。

.emacs.el の設定

  • 必要最低限の設定
  • 少なくとも、以下を設定しておけばいいと思う。
    ;;; -*- coding: utf-8; lexical-binding: t; -*-
    (setq source-directory
          (file-truename
           "~/Applications/Emacs.app/Contents/Resources"))
    (set-language-environment "Japanese")
    (prefer-coding-system  'utf-8-unix)
    (when (fboundp 'mac-input-source) ;; when emacs EMP version
      ;; (setq default-input-method nil) ;; disable leim and ns-xxx ???
      ;; C-xなどのプレフィックスが押されたら自動的に ASCII入力へ移行
      (mac-auto-ascii-mode 1) 
      )
  • 個人的に必要だった設定
  • 僕だけかもしれないが、org-mode の設定にいろいろと手間取った。
    ;; () <> [] {} などの対応装飾が煩わしい...
    (setq show-paren-mode nil)
    ;; --- org-mode 関連 ------
    (require 'org-tempo) ;; <s TAB で source block を書く
    (setq org-adapt-indentation t) ;; header の直下で indent
    ;; たまに起こる、C-c C-o での、Visit tags table の prompt を抑制する W/A
    ;; See: https://emacs.stackexchange.com/questions/76351/how-to-follow-an-internal-link-in-recent-org-mode
    (with-eval-after-load 'org-ctags
      (setq org-open-link-functions
            (cl-delete-if
             (lambda (sym)
               (string-match-p "^org-ctags-" (symbol-name sym)))
             org-open-link-functions)) )
    ;; TeX 出力において、#+OPTIONS: \n:t かつ 図形がある場合の対策??
    (setq org-latex-line-break-safe "\\\\")

emacs29.1 EMP版 の感想

約1ヶ月間 emacs29.1 を使ってみての個人的感想。
  • 何も設定せずに、Kotoeri を使って普通に日本語文章が打てた。でも……
  • IMEはかなり安定して使えるようだ。 ただし、漢字の変換中にモードライン上に「あ」とかの表示は出ない。

    調べてみると、 mac-input-source という関数で現状の IME 状態を知ることができ、 mac-selected-keyboard-input-source-change-hook 変数で、IMEの出入りをフックできるみたいなので、いろいろと対策は打てそう。

    追記 (2023-12-10): 何とか対策した! → EMP版 emacs29.1 で漢字変換時に「あ」とかを表示

  • 辞書サービスが使える
  • 他の mac アプリケーションと同様に、 マウス + M-C-d で辞書を引けるようになっていた。
    もう、dict:///検索語 を使わなくてもいいんだ。

  • youtube が emacs 内で観れる
  • M-x xwidget-webkit-browse-url で、https://www.youtube.com/ を指定すればいいだけだ。

    わざわざ emacs で youtube を見なくても、ブラウザーで見れば済むことなのだが、 もしかしたら自作の javascript と elisp との連携ができるのかも? と考えると夢は広がる……