本セッションの登壇者
セッション動画
うさみけんたです。よろしくおねがいします。ふだんはPHPを書いていて、TechFeedのPHP公認エキスパートです。エディタ関連の活動としてはVim Confで2回ほど講演しています(2018および2019)。またエディタに関する私の立ち位置もTwitterで表明しています。


Emacsの本質と歴史
Emacsは厳密には優秀なテキストエディタではなく、本質はモダンなLISPマシン、つまりLISPを主要なプログラミング言語としてサポートしているコンピュータです。実は40年くらい前にはNTTなどが実際のコンピュータとしてLISPマシンを販売していたこともありました。

昔は「AIならLISP、CGならLISP」という時代もありましたが、現代ではLISPのような高級言語専用のマシンは廃れてしまっています。しかし、LISP自体は死滅しておらず、Emacsの世界で生き残っています。

Emacsの元祖はTECOというエディタの拡張マクロ集(EditorMACroS)でした。現在一般に「Emacs」と呼ばれるのは1985年に発表されたGNU Emacsです。オープンソースの歴史を語る際には、GNU Emacsの開発スタイルは「伽藍とバザール」として言及されます。現代でもGitHubやGitLabは使わず、メーリングリストで開発が進められ、改善したいところがあればメーリングリストにパッチを投げれば気軽に取り込んでくれる雰囲気があります。

昔は歴史的な経緯から、EmacsでPHPの開発をしようとするとデフォルトではサポートされず、MELPAというパッケージレポジトリを追加してから、php-modeパッケージをインストールしなければいけませんでした。最近は公式のレポジトリも拡充され、このような設定をせずにEmacsでPHPの開発ができるようになりました。

Emacsには30 - 40年の歴史があり、2023年2月現在では28.2(2022年9月リリース)が最新バージョンです。また、現在も次のメジャーバージョンとなる29.0系統に向けて活発に開発が続いています。

Emacs Lispによる拡張/カスタマイズ
Emacsはスクリプトで拡張/カスタマイズできるテキストエディタの元祖といえるでしょう。

こちらはEmacsのコードに占める各プログラミング言語の割合ですが、Emacs Lispが6割ほど、次にRoff(ドキュメントファイル)が16.2%、C言語が15.7%です。Emacsのコアである処理系はC言語で書かれていますが、その割合は15%に過ぎず、大半をEmacs Lispが占めていることがわかります。


Emacsはエディタの実装言語とユーザーのカスタマイズ言語が同じEmacs Lispであることも大きな特徴です。C言語を知らなくてもEmacs Lispがわかればあらゆるものをユーザーがカスタマイズできるようになっています。

LISPについては、Y Combinatorの創始者であるPaul Grahamの「普通のやつらの上を行け ---Beating the Averages---」にも登場します。このWebテキストは、Paulがベンチャー企業で働いていたとき、LISPを使って高速に開発し、Yahooに買収されて成功したというストーリーです。その中で、LISPはパワーがある言語であり、90年代当時のPerlやCOBOLを使っていたライバルを打ち負かすことができたと語っています。ここで語られているLISPはCommon Lispなので厳密には異なりますが、Emacs Lispも同じくらいのパワーを持ったプログラミング言語です。

しかし、現在Emacsを使っているユーザーはEmacs Lispのパワーを使ってハッカーになりたい人だけというわけではありません。Emacsそのものもパワフルです。
Emacsは実行時にあらゆるものを再定義できる最強の動的言語ランタイムといえ、危険な再定義をせずにhookという仕組みで容易にカスタマイズできる設計が浸透しています。

Emacs単体は未完成品であり、ユーザーがinit.el
を記述することで完成するフレームワークです。また、init.el
を記述しなくても、コードを書き換えて再評価すると、Emacsを再起動することなく挙動を変更することもできます。
Emacs最前線 - 改善とさまざまな使われ方
長い歴史を持つEmacsですが、現在もEmacs Lispによる拡張や現代的なユーザエクスペリエンスや使い方を実現するための改善が行われています。
エディタとしてのEmacsを使いやすくする
Emacsはエディタとして使いにくいという意見もありますが、Evilというパッケージを使うとEmacs内でVimの主要機能も利用でき、Emacsでも思考の速度で編集が可能です。

また、エディタとしてのEmacsをきちんと学びたい方向けには「Mastering Emacs」という本もあります。

また、Emacsはカスタマイズが面倒という場合には、Doom Emacsという最初から全部入りのスターターキットのようなものが便利です。Doom EmacsをインストールするだけでEvilが利用できたりします。

動作速度の改善
Emacsは動的言語インタプリタでもあるので、シングルスレッドで動作するためGILから逃れられず、重いという制約もあります。しかし、Emacs 28ではLispをネイティブコンパイルできる機能が導入され、速度が改善されています。

開発環境としてのEmacs
各プログラミング言語のサポートについては、Lispで言語ごとの開発環境を実装し続けるのが大変(言語とEmacs Lisp両方がわかる人がメンテナンスし続けなければならない)という問題がありますが、Emacs 29ではTree-sitterベースの言語モードが導入する方向に進んでいます。

また、高速なLSPクライアントであるlsp-bridgeを使うと、VSCodeなどと遜色ない速度でコード補完が実現できます。

Emacsはなんでもできる!
Emacsはエディタだけではなく、メーラーでもあり、ブラウザでもあり、RSSリーダーでもあり、EPUBやPDFも読めます。EAF(Emacs Application Framework)というEmacs上でブラウザやPDFリーダーなど、現代のGUIアプリケーションと遜色ない機能/高速な動作を実現するプロジェクトもあります。

まとめ
このように、Emacsのパワーを使ってコンピュータサイエンスの問題に立ち向かい、最強の環境を作りたい人にはEmacsをおすすめします。

以上で発表を終わります。ありがとうございました。