🐃

MacOS(Sonoma)にjitコンパイラ付きでEmacsを入れる

2023/12/09に公開

まえがき

MacOSに降り立ってプログラム勉強しようとしたとき、Emacsをいれてみたいと考える人もいると思います。VScodeあるからいらない!という人も多いと思いますが、実はMacOSユーザにはEmacsを使うメリットもあるんです。それは、 「MacOSのキーバインドはEmacsと同じものが多い」 ということ。
 何を言っているかというと、MacOSの文字入力(Finderなど純正はもちろん多くのアプリもそう)はこんなショートカットが使えます。

Key 用途.
Ctrl+a 行頭へ移動.
Ctrl+k カーソル位置から最後まで削除
Ctrl+d カーソルの後ろの1文字を削除
Ctrl+h カーソルの前の1文字を削除
Ctrl+p カーソルを上に移動
Ctrl+n カーソルを下に移動
Ctrl+f カーソルを右に移動
Ctrl+b カーソルを左に移動

正直Emacsは慣れないと使いづらいと感じるかも知れません。が、その分強力でGUIでもTerminalでも使え、キーボードだけで操作できます。LinuxでもWindowsでも動きます。設定ファイルもほぼ同じものが使えます。まあそれと、Emacs使えるとカッコいいという人も居るようです。あこがれ的な・・・(ドキ・・)。

入れて損はないので、入れてみましょう。

Macで動くEmacsには色々ある

Emacsを入れようと調べてみると、なんだかいろいろ出てきます。何を入れればいいんだ!と迷う事になります。例えば・・・

1.Emacs for MacOSX

https://emacsformacosx.com/

純粋なEmacsを謳うこちらはバイナリで提供されていて、インストールも簡単。ただ、いくつかの問題を持っています。また、後述するNative Compには対応していません。

2.Homebrew emacs

homebrewは入っていますか?入っていれば、

$ brew install emacs

これで簡単にインストールできます。が、こちらはterminal版のみです。さらにNative Compも対応してません。

3.Emacs-plus

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

Emacsにオプションてんこ盛りにした物で、こちらも人気があるようです。これはNative Compに対応しています。その他のオプションも色々あります。

$ brew tap d12frosted/emacs-plus
$ brew install emacs-plus  -ここにOption

オプションの指定はこの後のEmacs-Macと同じです。(もちろんplusにしかない物もあります)こちらも人気があるようです。

4.Emacs Mitsuharu Yamamoto version (emacs-mac)

https://bitbucket.org/mituharu/emacs-mac/src/master/

さて、結論をいうと、私はこれを使っています。ネットで検索した時に、一番良いとの声が多かったからです。もちろんそこは個人の感じ方次第でしょうが、使ってみて安定しており、お勧めできます。また特徴として、

  • Native Comp 対応
  • スムーズスクロール対応
  • Apple Event 送信対応(Scriptで動かせる)
  • MacOSのUIに対応
  • Font選択など各種機能がMacOSとなじませてある
  • もちろんGUI,CUI両対応

など、要は MacOSに最適化している バージョンになります。
ズバリ、悩んでいる人はこれにしましょう。
これもHomebrewでインストールできますしそれが一番カンタンです。

Native Compって何?

先程から出ている Native Comp とは何かを簡単に説明します。

EmacsはLispの塊

Emacsというエディタは、簡単に言えばEmacsLispというプログラミング言語の処理系に、エディタの機能をそのLispプログラムで書いて被せたものです。

つまりEmacsとは、エディタ機能をつけたプログラム環境と言えます。

この事により、昔から Emacsはエディタではなく環境だ
言われてきました。事実、その通りです。メールアプリもEmacs上で動きますし、ゲームも動きます。

Emacs の弱点は速度だった

そんな理由から、Emacsには弱点がありました。重いのです。現在のような仮想マシンがサクサク動くようなPCはありませんでしたし、Unixワークステーションでも重いと言われていました。
何と言っても、インタープリタを動かして、その上でエディタを実行しているのですから当然です。

しかしこの問題は時代とともに余り問題視されなくなってきました。PCが速くなったからです。もちろんこれは喜ばしい事ですが、一方で他のエディタアプリに比べると遅いままでした。

Native Compilation

そんなEmacsの重さを劇的に改善するのが、28から搭載された  Native Comp です。
要は実行する都度読んで解釈していたLispコード(忘れないでください、Emacsのエディタ機能は大量のLispで作られています)を、ネイティブコードつまりバイナリコードにコンパイルする機能です。
このコンパイルはLispが実行される都度、バックグラウンドで自動的に行われます。そして次からは最速で動くのです。

準備

必要なもの

homebrew

何はともあれ、homebrewを入れます。持っている方は読み飛ばしてください。

https://brew.sh/ja/

上のホームページにあるコマンドを下記のようにペーストして使います。
あとは質問に沿って進めます。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

英語が良く分からないという方は検索すると色々な方が説明しています。例えば
https://blog.kikagaku.co.jp/homebrew-install-howto

周辺ライブラリ

もう良く分からないから、とりあえずお勧めの方法で入れたい。という方はここを読み飛ばしても構いません。

Native Comp 関係

Native Compilation 機能を有効にするには、必要な周辺プログラムがあります。この機能は最近gccに追加されたjitライブラリを利用して実現しています。

  • gcc :jit対応の新しいもの
  • glib :GNU Cライブラリ
  • libgccjit :jit対応ライブラリ

その他

基本はhomebrewが依存関係を処理しますが、下記は入れて置きましょう。

  • gnutls : TLS サポート
  • jansson : json サポート(json形式のファイルを扱う)

他にも色々なライブラリが必要なのですが、homebrewからいれる場合には自動で依存ファイルが入りますので基本は大丈夫でしょう。
以下は必要なら入れれば大丈夫ですが、今回は全盛りで行きます。

  • librsvg : svg画像を表示できるようになる
  • tree-sitter : Tree Sitterサポート(29から追加された強力な文法解析)

インストール

まず上記のライブラリ等を入れます。

$ brew install gcc glib libgccjit gnutls jansson librsvg tree-sitter

慣れていない方は一つづつ入れても構いません。

さて満を持してEmacsを入れます。
実はhomebrewはソースファイルを落としてきてコンパイルしているのでコンパイル時のオプションが使えます。

まずemacs-macは通常のhomebrewのリストにはありませんから、下記コマンドを実行します。
一度実行すると、今後homebrewを使う時に検索する場所が増えます。

$ brew tap railwaycat/emacsmacport

興味がある方向けにオプションにどんなものが有るのか見る方法も書いておきます。これは実行しなくても良いです。

% brew install emacs-mac --help

ずらずらとコンパイルオプションが表示されるはずです。
ではお勧めのオプションをつけてインストールします。

% brew install emacs-mac --with-glib --with-librsvg --with-native-comp --with-xwidgets

M1 Macで5分程度はかかります。(昔は一晩掛かりました・・)

仕上げ

インストールできましたが、実際に使うにはあと少し手間が必要です。
brewのアプリインストール先には、ターミナルでしか動かないコマンドが入っているはずです。これを、
①他のアプリのようにアイコンから起動できる
②ターミナルから % emacs -nwで起動できる
ようにします。

% cp -a /opt/homebrew/opt/emacs-mac/Emacs.app /Applications
% ln -fs /opt/homebrew/opt/emacs-mac/Emacs.app/Contents/MacOS/Emacs.sh /opt/homebrew/bin/emacs

1つ目はアプリケーションフォルダへのコピー。もう一つはターミナルから起動するスクリプトへのリンクを、homebrewのbinディレクトリに置くものです。

Native Comp 確認

初めて起動すると、バックグラウンドでLispコンパイルが走ります。この動作の詳細についてはここでは書きませんが、最初だけ重く感じるはずです。その後は速くなります。
気になる方は立ち上げて少ししたら、メニューの Buffers → Async-native-compile-log というのがコンパイル画面です。終わるとFinishedと出ます。

これは2回目なので何もコンパイルしていません
Compiling /opt/homebrew/Cellar/emacs-mac/emacs-29.1-mac-10.0/share/emacs/29.1/lisp/emacs-lisp/cl-loaddefs.el.gz...
uncompressing cl-loaddefs.el.gz...
uncompressing cl-loaddefs.el.gz...done
Compilation finished.

まとめ

以上、Emacs29をMacOSに Native comp つきでいれる方法でした。Macで初めてEmacsを使い始める場合の初期設定のお勧めについてはまた次回に。

Discussion