Emacsはどれを使えばいいのか?〜2023年夏〜
環境
- 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-system
はnil
- Emacs を常用するのにこの CUI 版を使っている人はいない (断言)
- 使っている人はいないのに誰もが直感的に最初に選択するであろうパッケージ名なので emacs-cui などに変えてほしい (小声)
- GUI にも対応した Emacs を使うには NS 版か EMP 版を使う
NS 版と EMP 版の違い
-
NS 版
- NS = NeXTSTEP
- 日本では Ishikawa Takaaki (takaxp) さんがインラインパッチを作成・適用し、メンテ・配布してくれているものを指す
-
mac-change-language-to-us
は NS 版のインラインパッチの中だけにある -
window-system
はns
-
EMP 版
- EMP = Emacs Mac Port
- YAMAMOTO Mitsuharu さんが作って railwaycat さんが brew で入るようにしてくれているものを指す
- macOS に特化した機能があったりする
-
mac-auto-ascii-mode
は EMP 版だけにある -
mac-osa-script
は EMP 版だけにある -
osa-chrome は
mac-osa-script
に依存している
-
-
window-system
はmac
EMP版とNS版の野良ビルド情報の方が詳しい。
どちらも Google 日本語入力などの IME で入力する際のちらつき問題に対処するためにインラインパッチが当たっているそうなのだけど自分は DDSKK を使っているのでそのありがた味がわからない。ただインラインパッチに附属する IME を制御する機能は重宝している。
何をインストールするべきかややこしくしている原因
(NS or EMP) * (バイナリ or 自分でビルド) * (CUI or (CUI + GUI)) * (arm64 or x86_64) * バージョン の関係・組み合わせが選択をややこしくしている。
NS版バイナリ(30秒)
こちらから Apple 28.2 のバイナリを使わせてもらう。
/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 で管理するには、
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 というパッケージもあった。
これはデフォルトで組み込まれている機能が多いのが特徴らしい。しかし最大の問題は IME の操作をサポートしていない点で、IME を自動で OFF にできないのであれば別段これを選ぶ利点は (日本人には) ない。
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-system
はns
- IME サポートなし
【追記】cask 版 Emacs とは?
これは本家が配布している。
しかし、emacs-plus と同様に IME のサポートがない。
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-system
はns
- IME サポートなし
【追記】Spacemacs とは?
これはゴリゴリにカスタマイズした ~/.emacs.d の中身だけの提供になる。したがってバイナリはなんでもいいっぽい。
とりあえず試すだけなら次のような手順で確認できる。
cd ~/src
git clone https://github.com/syl20bnr/spacemacs
open -a Emacs --args --init-directory=~/src/spacemacs
なお、最初の起動では関連パッケージのインストールと実行順序に不整合があるようで正常に動かなかったが、再起動すればエラーがなくなった。
Discussion