Posted 2015-12-23 15:11:37 GMT
Emacs Advent Calendar 2015の24日目です。
Emacsといえば、GNU Emacsですが、GNU EmacsだけがEmacsじゃないよということでGNU Emacs以外にはどんなEmacsがあったのかを紹介したいと思います。
ちなみにこの記事は、LispWorksのエディタ(HemlockというEmacsのCommon Lisp実装の末裔らしい)で書いてます。
最初のEmacsはTecoのコマンドの寄せ集めであったというのは周知のことかなと思います。
作ったのは、RMSだけではありませんが、当時、RMSがTecoの専門家であったためRMSがメインとなって保守/改良が進みます。
ITSや、TOPS-20で1980年代中盤頃まで広く使われ、Version 165が最終版のようです。
Lispを中心としてプログラミング言語用のモードやメーラーもありますし、動作もサクサクで、後の1980年代のGNU Emacsの動作の評判が嘘のようです。
(GNU Emacsは当時としては、高スペックマシンでの動作を考慮していた様子)
現在でも、エミュレータのSIMHや、KLH-10、また、公開されているTOPS-20、ITS上で、オリジナルのEmacsを動かしてみることができます。
Lispで実装された最初のEmacsです。
メインの実装者は、当時17歳位のDaniel Weinreb氏ですが、Lispマシン上の実装だったため必然的にLispで書かれることになり、ユーザーによる拡張もLispで行ないます。
Lispの方言は、Lisp Machine Lisp(Zetalisp)で、Emacs LispにもLisp Machine Lispの影響が見受けられます(RMSもLisp Machine Lispのコードを沢山書いていた)。
Lispで実装された最初のEmacsは、Multics Emacsだと度々RMSが発言したお蔭か、世の中ではそういう見方が大勢になっていると思いますが、後にRMSもMultics Emacsの作者のGreenberg氏からの指摘を受けて訂正しています。
ZWEI〜Zmacsは、SymbolicsのLispマシンを中心に広く愛用されましたが、ユーザー定義のコマンドは、Lispの関数とは別にエディタのコマンドを定義する defcommand
を使う等、GNU Emacsとは異なった所が多くあります。
また、ユーザーは、Zmacs上からOSを操作できるためユーザーのフロントエンドとして使われることが多く、『EmacsはOS』、『Emacsは環境』という感覚の元祖かなと思います。
GNU Emacsと同じようにユーザーによる拡張も多数書かれました。
Multics MACLISPで実装されたEmacsです。
端末表示に工夫が凝らされた実装のようですが、MACLISPでユーザーが拡張できるのも特長です。
エディタのコマンドは、Lisp関数をそのまま呼び出すようですし、save-excursion
等RMSが参考にした機能は多いと思います。
1980年代のCommon Lisp(とその前身)では、開発環境としてEmacsが付いてくるのが標準的だったようです。
Hemlockは、Spice Lisp(Common Lisp)で実装され、ワークステーションの標準エディタとして利用されていたようですが、ユーザーはCommon Lispでコマンドを書くことになります。
Hemlockの系統としては、Hemlockそのもの以外にも、Lucid Common LispのHelix、Macintosh Common LispのFred、LispWorksのエディタ等、があります。
Zmacsと同じくコマンドは、Lisp関数とは別にコマンド定義用のdefcommand
で定義します。
Common Lispで実装されたEmacsとしては他にNILのSteve、TAO/ELISのZen等がありますが大体似たような感じです。
ご存知、GNU Emacsです。
マクロ言語として、Emacs Lispを備えますが、他のEmacs実装と比較すると、Lisp関数とコマンド関数を同じdefun
で定義((interactive)
の有無で区別)する等、色々と工夫がみられます。
MIT Schemeで実装されたEmacsです。
カスタマイズもSchemeで可能ですが、エディタ単体としての発展もそれ程無かったようなので、処理系に付属のエディタという性格が強いかもしれません。
日本では有名なエディタで、Common Lisp風Lispをマクロ言語にすることを特徴とすると説明されることが多いですが、他のCommon Lispで実装されたEmacsからすると、Windows上に独自にGNU Emacsを参考にしつつ実装したエディタという感じが強いです。
ユーザーのコマンド拡張もGNU Emacsの方式になっています。
Common LispとCLIMで実装されたエディタです。
ユーザーは少なく常用している人も稀かなと思いますが、Hemlock風というか、Common Lispで実装された他のEmacsと大体似た感じになっていて、ユーザーのコマンドの方法も似ています。
枚挙に暇がありませんが、Gosling Emacsは有名ですね。
GNU Emacsの開発者/利用者からは、Emacsの拡張を作るに当って、Emacs Lispの貧弱さがネックだ、という話は良く耳にします。
その解決策として、Common Lispを採用しよう、Schemeを採用しようというのがありますが、実際にこれらの言語で過去に実装されたEmacsの話は出てきません。
Common Lispでの実装の場合、実際に沢山の実装がありますが、GNU Emacsに匹敵する使い勝手を実現するものはZmacs位しかない所をみると、実装言語やマクロ言語をCommon Lisp/Scheme etcにしても大して解決することは多くないんじゃないのかなあと思っています。
Emacs Lispに比べて、Common LispやSchemeは言語機能は上かもしれませんが、エディタのマクロ言語としては別途沢山の調整が必要なのではないでしょうか。
機会があれば、Common Lispや、Schemeで実装されたEmacsを使ってみることをお勧めします :)
■
HTML generated by 3bmd in LispWorks 7.0.0