🦬

Emacsはどれを使えばいいのか?〜2023年夏〜

2023/06/15に公開

環境

  • M2 Mac (Ventura 13.4)
  • Emacs 27.2 (NS 版 + ns-inline-patch, x86_64)
  • IME: DDSKK (Emacs の外では AquaSKK)

目的

  • 27.2 から 28.2 に上げたい
    • が、どの Emacs をどうやってインストールすればいいのかわからなくなっている
    • ずっと Emacs を使っていてもわからないのだから、初めて Emacs を使おうとする人はもっとわからないだろう
  • arm64 バイナリを使いたい
    • あるのか?
  • できれば Google Chrome と連携する osa-chrome を使えるようにしたい
    • このパッケージは EMP 版でしか動かない
  • ファイル名に日本語が含まれているとテキスト置換できないというめちゃくそ不便な不具合を直したい
    • 更新すれば直るかもと期待

初めにすべてのパッケージを更新しておく(重要)

  • M-x package-list-packages からの U x ですべてを最新版にする
  • 古いパッケージを参照している場合があるので M-x package-autoremove で掃除しておく
  • これらを丁寧にやっておかないとレガシーコードが影響して本体を新しくしてもまともに動かない

brew install emacs で入るのは CUI 版だけ

インストール手順
brew info emacs
brew uninstall --ignore-dependencies emacs
brew install emacs
主要ファイルの場所
/opt/homebrew/bin/emacs -> /opt/homebrew/Cellar/emacs/28.2/bin/emacs
/opt/homebrew/bin/emacsclient -> /opt/homebrew/Cellar/emacs/28.2/bin/emacsclient
確認
$ /opt/homebrew/bin/emacs --batch --eval '(princ (emacs-version))'
GNU Emacs 28.2 (build 1, aarch64-apple-darwin22.1.0) of 2023-01-08
  • stable な最新版 28.2 が入る
  • Formulaファイル
  • GUI には対応していない
  • window-systemnil
  • Emacs を常用するのにこの CUI 版を使っている人はいない (断言)
    • 使っている人はいないのに誰もが直感的に最初に選択するであろうパッケージ名なので emacs-cui などに変えてほしい (小声)
  • GUI にも対応した Emacs を使うには NS 版か EMP 版を使う

NS 版と EMP 版の違い

  • NS 版
    • NS = NeXTSTEP
    • 日本では Ishikawa Takaaki (takaxp) さんがインラインパッチを作成・適用し、メンテ・配布してくれているものを指す
    • mac-change-language-to-us は NS 版のインラインパッチの中だけにある
    • window-systemns
  • EMP 版
    • EMP = Emacs Mac Port
    • YAMAMOTO Mitsuharu さんが作って railwaycat さんが brew で入るようにしてくれているものを指す
    • macOS に特化した機能があったりする
      • mac-auto-ascii-mode は EMP 版だけにある
      • mac-osa-script は EMP 版だけにある
      • osa-chromemac-osa-script に依存している
    • window-systemmac

EMP版とNS版の野良ビルド情報の方が詳しい。

どちらも Google 日本語入力などの IME で入力する際のちらつき問題に対処するためにインラインパッチが当たっているそうなのだけど自分は DDSKK を使っているのでそのありがた味がわからない。ただインラインパッチに附属する IME を制御する機能は重宝している。

何をインストールするべきかややこしくしている原因

(NS or EMP) * (バイナリ or 自分でビルド) * (CUI or (CUI + GUI)) * (arm64 or x86_64) * バージョン の関係・組み合わせが選択をややこしくしている。

NS版バイナリ(30秒)

こちらから Apple 28.2 のバイナリを使わせてもらう。

https://github.com/takaxp/ns-inline-patch#emacs-28-with-inline-patch

主要ファイルの場所
/Applications/Emacs-takaxp/Emacs.app
/Applications/Emacs-takaxp/Emacs.app/Contents/MacOS/Emacs
/Applications/Emacs-takaxp/Emacs.app/Contents/MacOS/bin/emacsclient
確認
$ /Applications/Emacs-takaxp/Emacs.app/Contents/MacOS/Emacs --batch --eval '(princ (emacs-version))'
GNU Emacs 28.2 (build 1, aarch64-apple-darwin20.6.0, NS appkit-2022.70 Version 11.6.7 (Build 20G630)) of 2022-09-13
  • arm64 になっているのがわかる
  • もともと NS 版を使っていてアップグレードしたいだけならこれ
  • シンボリックリンクやパスの設定などは自分で行う

NS 版ビルド(15分以上)

cd ~/src
git clone --depth 1 git@github.com:takaxp/ns-inline-patch.git
cd ~/src/ns-inline-patch
sh build/setup.sh
sh build/emacs-28.sh

とすれば ~/Desktop/emacs/nextstep/Emacs.app ができるはずなのだが自分の環境ではビルドが途中で失敗したり PC がフリーズしたりするようになってしまった。[1]

EMP 版バイナリ(3秒)

インストール手順
brew tap railwaycat/emacsmacport
brew info emacs-mac-spacemacs-icon
brew uninstall emacs-mac
brew uninstall emacs-mac-spacemacs-icon
brew install --cask emacs-mac-spacemacs-icon
いろんなとこに配置される主なファイル
/Applications/Emacs.app
/opt/homebrew/bin/emacs
/opt/homebrew/bin/ebrowse
/opt/homebrew/bin/emacsclient
/opt/homebrew/include/emacs-module.h
/opt/homebrew/share/emacs/site-lisp/subdirs.el
/opt/homebrew/bin/etags
バイナリ確認
$ /Applications/Emacs.app/Contents/MacOS/Emacs --batch --eval '(princ (emacs-version))'
GNU Emacs 28.2 (build 1, aarch64-apple-darwin21.6.0, Carbon Version 165 AppKit 2113.6) of 2022-09-15
  • brew に emacs-mac とコンフリクトすると言われるので最初に uninstall している
  • パッケージ名がわかりにくいけど Spacemacs がインストールされるわけではなく Spacemacs のアイコンが代用される
    • brew install emacs-mac --with-spacemacs-icon 相当

EMP 版ビルド(約5分)

インストール手順
brew tap railwaycat/emacsmacport
brew info emacs-mac
brew uninstall emacs-mac
brew uninstall emacs-mac-spacemacs-icon
brew install emacs-mac
主要ファイルの場所
/opt/homebrew/opt/emacs-mac/Emacs.app
/opt/homebrew/bin/emacs
/opt/homebrew/bin/emacsclient
バイナリ確認
$ /opt/homebrew/bin/emacs --batch --eval '(princ (emacs-version))'
GNU Emacs 28.2 (build 1, aarch64-apple-darwin22.5.0, Carbon Version 169 AppKit 2299.6) of 2023-06-15
  • brew install のときに特定のオプションをつけてカスタマイズしたい人向け
  • これを常用するなら
    cp -a /opt/homebrew/opt/emacs-mac/Emacs.app /Applications
    としておく

NS 版のコードを EMP 版でも動くようにする

条件分岐

- (when (eq window-system 'ns)
+ (when (memq window-system '(ns mac))
  • 対象に mac を含める
  • 「GUI なら〜」でいいなら (when window-system ...) でいい

Emacs に入ると AquaSKK を切る

  (add-hook 'focus-in-hook
            '(lambda ()
               (when (fboundp 'mac-change-language-to-us)
                 (mac-change-language-to-us))
+              (when (fboundp 'mac-auto-ascii-setup-input-source)
+                (mac-auto-ascii-setup-input-source))
                 ))
  • DDSKK ユーザー向け
  • EMP 版で通常の IME を使う場合は相性の問題であらかじめ (mac-auto-ascii-mode 1) をしておくと C-x などのタイミングで IME を自動的に切ってくれるが、DDSKK を使っているならそれは有効にせず、単に Emacs に入ったタイミング focus-in-hook で IME を切れば快適になる

(dired "/") ができない場合の対処法

Listing directory failed but `access-file' worked

と言われる場合は「システム環境設定」→「セキュリティとプライバシー」→「プライバシー」→「フルディスクアクセス」に /Applications/Emacs.app を指定する。

置換できない不具合はどうなったか?

ファイル名に日本語が含まれているとテキスト置換できないという、めちゃくそ不便な不具合は 28.2 で直っていた。

まとめ

種類 バイナリ ビルド
emacs[2] brew で arm64 版が入るが CUI 版しかない なし
NS 版 サイトで arm64 版をダウンロード むずい
EMP 版 brew で arm64 版が入る brew で arm64 版が入る

結局どれにしたか?

EMP 版バイナリにした。再掲すると、

brew tap railwaycat/emacsmacport
brew uninstall emacs-mac
brew uninstall emacs-mac-spacemacs-icon
brew install --cask emacs-mac-spacemacs-icon

で入る。

理由は、

  • 数秒で確実にインストールできる
  • 所定のディレクトリに各種ファイルを配置してくれて親切
  • brew で入るので .Brewfile で管理できる
  • 今後のアップデートも楽そう[3]

だから。

.Brewfile で管理するには?

ついでに書くと .Brewfile で管理するには、

~/.Brewfile
tap "railwaycat/emacsmacport"   # brew tap railwaycat/emacsmacport
cask "emacs-mac-spacemacs-icon" # brew install --cask emacs-mac-spacemacs-icon

を用意して定期的に、

brew bundle --global

だけでよい。

インストール時の注意点

brew reinstall は使うな

reinstall ではなく uninstall して install する。こちらによると Emacs に限らず brew reinstall はまともに動作しないとのこと。

https://github.com/d12frosted/homebrew-emacs-plus?tab=readme-ov-file#reinstall

Emacs は一つだけ入れる

他の Emacs をすべて消して一つだけ入れる。Emacs 関連のパッケージは共存を考慮していないため、/Applications/Emacs.app をリネームしたとしても /opt/homebrew/bin/ebrowse などが干渉してインストールに失敗する場合がある。

したがって関連するパッケージをすべて削除してから一つだけインストールするのが望ましい。具体的にはとりあえず次のコマンドを事前に実行しておけばよい。

brew uninstall --ignore-dependencies emacs

brew uninstall emacs-mac
brew uninstall emacs-mac-spacemacs-icon
brew untap railwaycat/emacsmacport

brew uninstall emacs-plus
brew untap d12frosted/emacs-plus

brew uninstall --cask emacs

【追記】emacs-plus とは?

さらに emacs-plus というパッケージもあった。

https://github.com/d12frosted/homebrew-emacs-plus

これはデフォルトで組み込まれている機能が多いのが特徴らしい。しかし最大の問題は IME の操作をサポートしていない点で、IME を自動で OFF にできないのであれば別段これを選ぶ利点は (日本人には) ない。

インストール手順 (約2分)
brew tap d12frosted/emacs-plus
brew info emacs-plus
brew uninstall emacs-plus
brew install emacs-plus
主要ファイルの場所
/opt/homebrew/opt/emacs-plus@29/Emacs.app
/opt/homebrew/opt/emacs-plus@29/bin/emacs
/opt/homebrew/opt/emacs-plus@29/bin/emacsclient
/opt/homebrew/opt/emacs-plus@29/bin/emacs-29.4
バイナリ確認
$ /opt/homebrew/opt/emacs-plus@29/Emacs.app/Contents/MacOS/Emacs --batch --eval '(princ (emacs-version))'
GNU Emacs 29.4 (build 1, aarch64-apple-darwin23.6.0, NS appkit-2487.70 Version 14.6.1 (Build 23G93)) of 2024-11-27
  • window-systemns
  • IME サポートなし

【追記】cask 版 Emacs とは?

これは本家が配布している。

https://www.gnu.org/savannah-checkouts/gnu/emacs/emacs.html

しかし、emacs-plus と同様に IME のサポートがない。

インストール手順 (約45秒)
brew uninstall emacs-mac
brew uninstall emacs-mac-spacemacs-icon
brew info --cask emacs
brew install --cask emacs
主要ファイルの場所
/Applications/Emacs.app/Contents/MacOS/Emacs
/Applications/Emacs.app/Contents/MacOS/bin/emacsclient
バイナリ確認
$ /Applications/Emacs.app/Contents/MacOS/Emacs --batch --eval '(princ (emacs-version))'
GNU Emacs 29.4 (build 1, aarch64-apple-darwin21.6.0, NS appkit-2113.60 Version 12.6.6 (Build 21G646)) of 2024-08-03
  • window-systemns
  • IME サポートなし

【追記】Spacemacs とは?

これはゴリゴリにカスタマイズした ~/.emacs.d の中身だけの提供になる。したがってバイナリはなんでもいいっぽい。

https://www.spacemacs.org/

とりあえず試すだけなら次のような手順で確認できる。

cd ~/src
git clone https://github.com/syl20bnr/spacemacs
open -a Emacs --args --init-directory=~/src/spacemacs

なお、最初の起動では関連パッケージのインストールと実行順序に不整合があるようで正常に動かなかったが、再起動すればエラーがなくなった。

脚注
  1. 一度ビルドできたのだけど何が影響したのかわからないがビルドできなくなってしまった ↩︎

  2. brew install emacs で入るやつ ↩︎

  3. 数ヶ月後に brew bundle --global したら勝手に 29.1 にアップデートされたので .Brewfile で管理していてほんとによかった ↩︎

Discussion