Emacs

Emacs（イーマックス、）は、その拡張性を特徴としたテキストエディタのファミリーである。Emacsの中で最も広く使われている派生物はGNU Emacsであるが、そのマニュアルにはEmacsを「the extensible, customizable, self-documenting, real-time display editor」（拡張およびカスタマイズが可能で、自己文書化を行い、リアルタイム表示を行うエディタ）であると説明されている。最初のEmacs開発が1970年代中盤に開始されてから、その直系の子孫であるGNU Emacsが製作され、その開発がも続いている。
Emacsはユーザインタフェースと10,000を超える組み込みコマンドを持ち、ユーザーは作業自動化のためにこれらのコマンドをマクロと組み合わせることができる。さらに深い拡張性を提供するLISPプログラミング言語の方言であるEmacs Lisp (ELisp) はEmacs実装の主な特徴であり、ELispでユーザーや開発者はEmacs用の新しいコマンドやアプリケーションを書くことができる。Emacsの拡張機能として電子メール、ファイル、アウトライン、およびRSSフィードが書かれており、それ以外にもELIZA、ポン、ライフゲーム、ヘビゲーム、およびテトリスのクローンもある。ユーザーの中にはEmacs内部からテキスト編集だけでなくほとんど全ての作業を行うことができることに気づいた者もいる。
原典であるEMACSは1972年にCarl Mikkelson、、およびガイ・L・スティール・ジュニアらによりTECOエディタ用の"Editor MACroS"のセットとして書かれたものであり、TECOマクロエディタの概念にインスパイアされている。
最も有名かつ最も移植されたEmacsは、ストールマンによってGNUプロジェクトのために作成されたGNU Emacsである。XEmacsは1991年にGNU Emacsからフォークされた派生物である。GNU EmacsとXEmacsは類似のLISP方言を使い、互いに互換性のある部分が大半である。
Emacsはvi (Vim) と並びUNIX文化における伝統的なエディタ戦争の主要な当事者の2つである。Emacsは未だ開発中であるオープンソースプロジェクトの中で最古のものである。
歴史.
Emacsは1970年代のMIT人工知能研究所（MIT AI研）で産声をあげた。 AI研で使われていたPDP-6やPDP-10のオペレーティングシステムはIncompatible Timesharing System (ITS) であり、そのデフォルトエディタはTECOというラインエディタであった。TECOは現在の一般的なテキストエディタとは違い、追加・編集・表示用にそれぞれ別々のモードが存在していた。そのため文字を入力しても即座に反映されるわけではなく、代わりにTECOコマンド言語の ('i') 文字を入力して入力モードに切り替えてから必要な文字を入力し、最後に (<esc>) 文字を入力してエディタをコマンドモードに再度切り替える必要があり（上書きが可能なため、同様のテクニックが使われた）、しかも入力モードで編集中の文字は画面に表示されなかった。なお、この振る舞いは現在も使われているedプログラムと同じである。
リチャード・ストールマンは、1972年と1974年にスタンフォード人工知能研究所を訪れ、Fred Wrightにより書かれたその研究所の「E」エディタを目にした。Eの振る舞いは今のエディタの大半で使われている直感的なWYSIWYGであり、ストールマンはその機能に触発されてMITに戻った。 AI研ハッカーの一人であるCarl Mikkelsenは、利用者がキー操作するたびに画面表示を更新する「Control-R」という表示・編集を組み合わせたモードをTECOに追加していた。ストールマンは、この更新が効率的に動くよう書き直し、任意のキー操作でTECOプログラムが動くように利用者が再定義できるマクロ機能をTECOの表示・編集モードに追加した。
EにはTECOに不足していたランダムアクセス編集機能が搭載されていた。TECOはPDP-1の紙テープを編集するために設計されたページシーケンシャルエディタであるため、一度に1つの紙テープしか編集することしかできず、さらに紙テープのファイルに存在するページの順に編集しなければならなかった。Eはディスク上のページランダムアクセスを可能にするため、ファイルを構造化するというアプローチを採用していたが、ストールマンはTECOを修正してさらに巨大なバッファを効率的に処理できるようにするというアプローチを採用し、ファイル全体を単一バッファとして読み込み、編集し、書き込めるようにファイル管理方法を変更した。現在ではほとんどのエディタがこのアプローチを用いている。
新しいバージョンのTECOはまたたく間にAI研で評判となり、マクロを意味する「MAC」や「MACS」が語尾に付いた名前のカスタム・マクロの巨大なコレクションが溜まった。さらにその2年後、どんどんばらばらになっていくキーボード・コマンド・セットを1つに統合するプロジェクトをガイ・スティールが引き受けた。ストールマンはスティールとハックしたある夜の後、新しいマクロ・セットの文書化や拡張の機能を含む実装を完成させた。こうしてできあがったシステムは"Editing MACroS"や"E with MACroS"を意味するEMACSと呼ばれることになる。ストールマンによると、Emacsとしたのは「当時ITSで<E>が略称に使われていなかったから」である。作り話であるHacker koanではケンブリッジの人気アイスクリーム店「」にちなんで名付けられたとしている。操作可能な最初のEMACSシステムは1976年後半に姿を現した。
ストールマンはEMACSの過度のカスタム化や事実上の分裂の危険に気づいたため、ある使用上の条件をつけた。彼は後に次のような文章を残している:
原典であるEmacsはTECO同様にPDP-10上だけで動作した。Emacsの振る舞いはTECOのそれとは大きく異なっていてTECOとは独立した別のエディタとみなせるようになり、さらにEmacsは急激にITS上の標準編集プログラムとなった。はEmacsをITSからTENEXやTOPS-20オペレーティングシステムに移植した。 初期のEmacsへの貢献者には、このほか、Earl Killian、Eugene Ciccarelliらがいる。1979年までに、EmacsはMIT人工知能研究所やMITコンピュータ科学研究所で使われる主要エディタとなった。
その他の初期実装.
その後、他のコンピュータシステム用に多くのEmacs風エディタが書かれた。これらにはMichael McMahonとらがLISPマシン用に書いた ("Eine Is Not Emacs") とZWEI ("Zwei Was Eine Initally"）（なお、ZWEIはドイツ語で「2」の意味でもある。EINEが「1つの」（女性形）にあたるためのもじり。ストールマンの呼ぶEINEは「アイン」のように聞こえるが、ドイツ語の発音は「アイネ」に近い）、そしてOwen Theodore Andersonによって書かれたSINE ("Sine Is Not Emacs") がある。WeinrebのEINEはLISPで書かれた最初のEmacsである。1978年にはハネウェルケンブリッジ情報システム研究所でによりがほぼ全てをMultics MACLISPを用いて書かれ、その後とBarry Margolinによりメンテナンスされた。GNU Emacsを含むEmacsのバージョンの多くは後に拡張言語としてLISPを採用することになる。UNIXで動作する最初のEmacs風エディタは、後にNeWSやJavaの開発で知られることになるジェームス・ゴスリングが1981年に書いたGosling Emacsであった。 これはCで書かれ、というLISP風構文の拡張言語を使っていた。Mocklispにはシンボルさえなく、構文がLISP風なだけで本当のLISPではない。Gosling Emacsは、現在広く使われているフリーソフトウェアのGNU EmacsやMeadowとは異なりプロプライエタリソフトウェアであった。プロプライエタリソフトウェアとは、ソースコードが公開されていないソフトウェアで、プログラムを自由に配布や改変、逆コンパイルをすることができないものを指す用語である。
GNU Emacs.
1984年、リチャード・ストールマンはプロプライエタリソフトウェアであったGosling Emacsのフリーソフトウェアによる代替物を作るべく、GNU Emacsに取り組み始めた。当初GNU EmacsはGosling Emacsをベースとしていたが、ストールマンはMocklispインタプリタを本物のLISPインタプリタに入れ替えてしまい、ほぼすべてのコードが入れ替わった。GNU Emacsは揺籃期のGNUプロジェクトがリリースした最初のプログラムとなった。GNU EmacsはCで書かれており、Cで実装されたEmacs Lisp (ELisp) を拡張言語として提供する。最初に広く頒布されたGNU Emacsのバージョンは1985年に登場した15.34だった。初期のGNU Emacsのバージョン番号は"1.x.x"のように最初の桁にC coreのバージョンを表すよう採番されていたが、バージョン1.12が出た後にメジャー番号が変わりそうにないため先頭の1をなくすことにしたので、バージョン番号は"1"から"13"にスキップした。最初の公開リリースであるバージョン13は1985年3月に完成した。2014年9月にGNU emacs-develメーリングリストで、GNU Emacsにラピッドリリース戦略を採用し、将来的にバージョン番号をより迅速に増やしていくことが発表された。
GNU Emacsは後にUNIXへ移植され、Gosling Emacsよりも多くの機能を提供した。それらの機能の中で代表的な物は、拡張言語であるフル機能を持ったLISPである。それから瞬く間にGNU EmacsはGosling Emacsに取って代わりUNIXのEmacsエディタのデファクトスタンダードとなった。は彼の1986 cracking spreeで、GNU Emacs電子メールサブシステムのセキュリティ上の弱点を悪用し、UNIXコンピュータ上でスーパーユーザーアクセス権を取得した。
Emacsは、チューリング完全な言語を小さい中央コアの頂点で起動する階層型アーキテクチャを使用する。ストックされたEmacs頒布の約3/4（24.4現在では1611kLOCのうち1266）がElisp拡張言語で書かれており、一度Cによる中核部分（Elispインタプリタを実装し、24.4現在では247kLOCを占める）を移植すればElispコードに実装された機能のセットは存在することになるので、Emacsを新しいプラットフォームに移植することはネイティブコードのみから成る同等のプロジェクトを移植するよりはるかに簡単である。Emacsの移植は理論上中核部のみを新しいプラットフォームへ移植すればよい。このため一度中核部が移植されれば、Cよりも高級な言語で実装された部分は最小限度の作業で済む。
GNU Emacsの開発は"伽藍とバザール"で"伽藍"式開発の例にあげられていたように、1999年まで比較的閉鎖的だったが、それ以降は公開された開発メーリングリストと匿名CVSアクセスを採用するようになった。GNU Emacsの開発は2008年までは単一のCVSトランクで行われていたが2009年末より分散型バージョン管理システムであるBazaarに切り替えられ、さらに2014年11月11日にGitへと移行した。
リチャード・ストールマンは長らくGNU Emacsの主要な管理者を務めていたが、時代と共にその役目から退いていった。2008年から2015年まで管理はStephan MonnierとChong Yidongに引き継がれている。2015年にMITにおけるストールマンとの会合の後、John Wiegleyがメンテナとして指名された。2014年の時点で、GNU Emacsはその歴史を通じて579人によりコミットされてきた。
GNU Emacs のバージョンは 1985年のうちに 17 まであがったが、それ以降は更新は落ち着いた速度で行われている。
XEmacs.
1991年初頭、GNU Emacs 19の初期α版をベースとしてと社の人たちによりLucid Emacsが開発された。コードベースはすぐに2つに分割され、開発チームは単一プログラムとして併合しようとすることをあきらめた 。これはフォークしたフリーソフトウェアのうち初期の最も有名な例の1つである。Lucid EmacsはXEmacsと名前を変え、Emacsの中でGNU Emacsに次いで2番目に有名な派生となった。XEmacsの開発は2009年1月に最新の安定版であるバージョン21.4.22がリリースされてから遅くなっていき、その一方でGNU Emacsは以前はXEmacsにしかなかった機能の多くを実装していった。このため一部のユーザーはXEmacsの死を宣言するようになった。
その他のGNU Emacsのフォーク.
XEmacsほど有名ではないGNU Emacsのフォークには以下のものがある:
様々なEmacsエディタ.
過去においては、各Emacsプロジェクトの目的は肥大化したEmacsの小規模なバージョン作成であった。GNU Emacsは当初、当時のハイエンドであった32ビットフラットアドレス空間と少なくとも1MiBのRAMを搭載するコンピュータを想定していたが、1980年代ではそのようなコンピュータはハイエンドなワークステーションやミニコンピュータであったので、一般的なパーソナルコンピュータのハードウェアで動作するようより小規模に再実装する必要があった。近年では小規模なEmacsクローンはソフトウェアインストールディスクに収まるよう設計されている。
小規模バージョン作成以外のプロジェクトの目的は、ELisp以外のLISP方言やLISPとは全く異なるプログラミング言語によるEmacsの実装である。Emacsクローンを以下に示す。ただし現在その全てが管理されているわけではない:
機能.
Emacsは主にテキストエディタでありテキスト要素を操作するよう設計されているが、LaTeX、Ghostscript、ウェブブラウザといった外部のプログラムと通信することで、ワードプロセッサのように文書を整形したり印刷することができる。Emacsは語、文、そして段落といった異なるセマンティック要素や、関数のようなソースコードの構成要素を処理したり様々な色を付けるためのコマンドを提供する。さらにEmacsは編集コマンドのユーザー定義バッチ用に"キーボードマクロ"も提供する。
GNU Emacsは"リアルタイム表示"エディタであるので、編集する度にその編集がオンスクリーンで表示される。これは現在のテキストエディタの標準的振る舞いであるが、EMACSは初期の段階でこの機能を実装していたため、viのように既存のテキストに新しい編集を挿入するために個別のコマンドを実行する必要がなかった。
viが編集のための基本的な機能のみを搭載していたのに対し、Emacsはインクリメンタルサーチ・無制限のアンドゥ・ヤンク（ペースト）用のスタック・複数のバッファ・バッファ上でシェルを実行・補完・言語ごとのモードなど、エディタとして考えられる限りの機能を詰め込んでいる。VimではEmacsと同等のことができるようになっているが、バッファの使い方はEmacsより控えめである。
一般的アーキテクチャ.
文書への文字列挿入などの基本的な編集操作を含むEmacsの機能はほとんど全て、LISPの方言で書かれた関数で行える。GNU Emacsで使われるLISP方言はEmacs Lisp (ELisp) として知られている。ELisp層はCで書かれた基本的なサービスとプラットフォームを抽象化した概念の、安定したコアの頂点に位置している。LISP環境の変数と関数は、Emacsのリコンパイルや再起動をせずとも一時的に修正できる。
Emacsは追加属性を持つテキストを含んだ"バッファ"と呼ばれるデータ構造上で動作する。全てのバッファはその固有の"ポイント"（カーソル位置）と"マーク"（ポイントと併せて、選択された"リージョン"を区切るためのもう1つの位置）、（適用可能な場合）バッファが"訪問"しているファイル名、そして変数で編集や振る舞いを制御する現在の"モード"のセット（正確には1つの「主モード」と複数の「副モード」からなる）を保存している。Elispコードは"コマンド"と名付けられ、インタラクティブに実行できる。コマンドはキープレスにバインドでき、さらに名前でアクセスすることもできる。コマンドの中にはバッファから任意のElispコードを評価するもの（例としてはcodice_1やcodice_2など）もある。
バッファは"ウィンドウ"内に表示される。ウィンドウは端末画面やGUIウィンドウのタイリングされた部分である（その部分はEmacs用語で"フレーム"と呼ばれ、複数のフレームが可能）。特に設定されていない場合、ウィンドウにはスクロールバー、行番号、一番上にある"ヘッダ行"（通常この行にはバッファタイトルやファイル名が表示される）、そして一番下にある"モード行"（通常この行には現在のモードとバッファにおけるポイントの位置のリストが表示される）が含まれる。
同じバッファ上で複数ウィンドウを開くことができるため、例えば1つの長いテキストから異なるパートを見ることができる。さらに複数バッファで同じテキストを共有できるので、例えば言語が混在したファイルで異なる主モードを利用することができる。codice_3により必要に応じてモードを手動で変更することもできる。
ふつう最下行にある"ミニバッファ"は、Emacsが情報を受け取る場所である。検索対象のテキストや読んだり保存したりするファイルの名前などの情報をミニバッファに入力する。一部の入力ではタブキーを用いて入力を補完することができる。ミニバッファは通常1行しかないが、ここでも通常のバッファと同じ移動・編集コマンドを使うことができる。
カスタマイズ.
Emacsは、プログラマが単一インターフェースでコードを編集、コンパイル、デバッグするような統合開発環境 (IDE) としても使うことができる。
このような編集機能にとどまらず、Emacs LispはTCP/IP通信や外部プロセスの起動などの機能を持っており、テキストエディタとしては一般的でない機能も多くEmacs Lispで記述されている。これらの機能を利用した様々なアプリケーションソフトウェアが書かれてきた。Emacsはこれらのアプリケーションソフトウェアを動作させる実行環境となっている。外部プロセスとして、UNIXのプロセスを起動する場合、Emacs はプロセスのフロントエンドプロセッサとして動作する。例えば、LISP を Emacs から起動すると、閉じカッコ")"がキーボードから入力された時それに対応する開きカッコ"("をハイライトするようなマクロを組んでおくことで、カッコの確認をしながら入力が可能である。
ライブラリーは、インターネットで見付けることができる。
新しいライブラリーを投稿するためのUsenetニュースグループgnu.emacs.sourcesまである。一部のライブラリーは、最終的にEmacsに取り込まれて、「標準」ライブラリーとなる。
GNU Emacs 24では、パッケージマネージャが内蔵された。公式のパッケージアーカイブであるGNU ELPA(Emacs Lisp Package Archive)のほか、いくつかのアーカイブを扱うことができる。
自己文書化.
Emacsには最初から各個別のコマンド、変数、内部関数の説明文字列を表示する、強力な"help"ライブラリが付属していた。このため通常の機能や現在の状態の情報をユーザーに提供するので、Emacsは"自己説明的"だと評される。各関数には説明文字列が含まれていて、要求に応じてユーザーに表示される。その後関数に説明文字列をつける習慣は、LISP、Java、Perl、およびPythonといったさまざまなプログラミング言語に広まった。このヘルプシステムにより、ユーザーは組込みのライブラリや追加されたサードパーティーのライブラリのどちらからも各関数用の実際のヘルプコードを取得できる。
Emacsには組み込みのチュートリアルもある。編集ファイルを指定せずEmacsを起動すると、簡単な編集コマンドの実行方法とチュートリアルを呼出す方法についての説明が表示される。このチュートリアルはStuart Cracraftとリチャード・ストールマンによって作られたものである。
GNU Emacsには組込みの説明文字列のほかにも、リチャード・ストールマンの執筆した"GNU Emacs Manual"の電子コピーがついており、組込みのInfoブラウザで閲覧することができる。電子版のほかに、3種のマニュアルがフリーソフトウェア財団から書籍のかたちで刊行されている。
XEmacsの場合、ソフトウェア本体と同時にGNU Emacs Manualからフォークした同様のマニュアルがある他、Bill Lewis、リチャード・ストールマン、Dan Laliberte共著の"Emacs Lisp Reference Manual"、Robert Chassel著の"Programming in Emacs Lisp"も含まれている。
文化.
Emacs教会.
"Emacs教会" () とはEmacsユーザーによって作られたである。Emacs教会はviを「獣の数字」である（ローマ数字ではvi-vi-viは666を表すため）としているが、viのユーザーに反対しているわけではない。むしろプロプライエタリソフトウェアをアナテマと呼んでいる（「viのフリーソフトウェア版を使うことは罪というより苦行である」）。このパロディ宗教をサポートするためのEmacs教会のニュースグループとしてalt.religion.emacs,が存在する。Emacsユーザーの中には「よりよいものを真似る」ことを試みたとして、viの支持者は対抗として"viカルト" () を作成した。
ストールマンは冗談で自身をEmacs教会の聖人 () であるSt IGNUciusとしている。
Emacs小指.
Emacsの修飾キーへの強い依存がとなるというフォークロアは"Emacs小指" () と呼ばれる。
ユーザーは様々なアプローチでEmacs小指に対処してきた。ソフトウェア側の手段には以下のようなものがある:
ハードウェアによる解決法としては、修飾キーを親指で簡単に操作できるKinesis Contoured Keyboardや、手の平で押せるようキーボードの両側に対称的に手の平で押すことができる巨大な修飾キーを配置したがある。フットペダルも利用できる。
Emacsが開発されたスペースカデットキーボードは、スペースキーに隣接したコントロールキーが巨大で親指が届き易かった。
用語.
英語においてboxenやVAXenのように、"emacs"という単語の複数形を"emacsen"と綴ることもある。
問題点.
起動の遅さ.
EmacsのLispベースの設計の欠点は、Lispコードの読込み、解釈 に伴う性能への負荷である。
Emacsが最初に実装されたシステムでは大抵、競合するテキストエディタよりかなり遅かった。このことをジョークにした、頭文字による略語がEMACSになる文がいくつか存在する（このようなジョークは他にも存在し、例えばユーザー・インターフェースをネタにした ("Escape Meta Alt Control Shift") などがある）。
ただし、最近のコンピュータは十分速くなり、以前言われていたほどEmacsを遅いと感じることはめったになくなった。実際、Emacsは最近のワードプロセッサよりも素速く立ち上がる。
さらに、GNU Emacs 23以降はEmacsをサーバープログラムとして立ち上げておくデーモンモードが追加された。この場合、Emacs本体はOS起動時に自動的に一度起動するだけなので、速度は問題にならない。