Emacs(イーマックス、)は、その拡張性を特徴としたテキストエディタのファミリーである。Emacsの中で最も広く使われている派生物であるGNU Emacsの作者、リチャード・ストールマンは、自身の声明において「たくさん模倣されたオリジナルのEMACSエディタの発明者 (inventor of the original much-imitated EMACS editor)」を自称し、GNU EmacsのマニュアルではEmacsを「the extensible, customizable, self-documenting, real-time display editor」(拡張およびカスタマイズが可能で、自己文書化を行い、リアルタイム表示を行うエディタ)であると説明している。最初のEmacs開発が1970年代中盤に開始されてから、その直系の子孫であるGNU Emacsが製作され、その開発がも続いている。
Emacsはユーザインタフェースと10,000を超える組み込みコマンドを持ち、ユーザーは作業自動化のためにこれらのコマンドをマクロと組み合わせることができる。さらに深い拡張性を提供するLISPプログラミング言語の方言であるEmacs Lisp (ELispまたElispとも) はEmacs実装の主な特徴であり、Emacs Lispでユーザーや開発者はEmacs用の新しいコマンドやアプリケーションを書くことができる。Emacsの拡張機能として電子メール、ファイル、アウトライン、およびRSSフィードが書かれており、それ以外にもELIZA、ポン、ライフゲーム、ヘビゲーム、およびテトリスの実装も存在する。ユーザーの中にはEmacs内部からテキスト編集だけでなくほとんど全ての作業を行うことができることに気づいた者もいる。
原典であるEMACSは1972年にCarl Mikkelson、デイヴィッド・A・ムーン、およびガイ・L・スティール・ジュニアらによりTECOエディタ用のEditor MACroSのセットとして書かれたものであり他の共同制作者としてリチャード・ストールマンがクレジットされることが多いが、は「(TECOベースである)オリジナルのEmacsはガイ・L・スティール・ジュニアとデイヴィッド・ムーンが開発・設計した。彼らがEmacsを動くようにした後で、MIT AI研における標準テキストエディタとして確立されていき、ストールマンがそのメンテナンスを引き継いだ」と記している。ムーン自身は「私が覚えている限り、それは全て真実だ。しかし公正を期して言えば、ストールマンがガイと私からEmacsを『解放した』後、ストールマンがEmacsを大幅に改善したと言わなければならない」と応えた。以下を参照 : 、TECOマクロエディタの概念に触発されている。
最も有名かつ最も移植されたEmacsは、ストールマンによってGNUプロジェクトのために作成されたGNU Emacsである。XEmacsは1991年にGNU Emacsからフォークされた派生物である。GNU EmacsとXEmacsは類似のLISP方言を使い、互いに互換性のある部分が大半である。
Emacsはvi (Vim) と並びUNIX文化における伝統的なエディタ戦争の主要な当事者である。Emacsは開発中のオープンソースプロジェクトの中で最古のものである。
歴史
Emacsは1970年代のMIT人工知能研究所(MIT AI研)で産声をあげた。 AI研で使われていたPDP-6やPDP-10のオペレーティングシステムはIncompatible Timesharing System (ITS) であり、そのデフォルトエディタはTECOというラインエディタであった。TECOは現在の一般的なテキストエディタとは違い、追加・編集・表示用にそれぞれ別々のモードが存在していた。そのため文字を入力しても即座に反映されるわけではなく、代わりにTECOコマンド言語の i 文字を入力して入力モードに切り替えてから必要な文字を入力し、最後に ESC 文字を入力してエディタをコマンドモードに再度切り替える必要があり(上書きが可能なため、同様のテクニックが使われた)、しかも入力モードで編集中の文字は画面に表示されなかった。なお、この振る舞いは現在も使われているedやviと同じである。
リチャード・ストールマンは、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ではケンブリッジの人気アイスクリーム店「Emack & Bolio's」にちなんで名付けられたとしている。操作可能な最初のEMACSシステムは1976年後半に姿を現した。
ストールマンはEMACSの過度のカスタム化や事実上の分裂の危険に気づいたため、ある使用上の条件をつけた。彼は後に次のような文章を残している:
「EMACSは、共同参加を基として頒布される。つまり改良点は全て、組み入れて頒布するために、私のところへ戻ってこなければならない」
原典であるEmacsはTECO同様にPDP-10上だけで動作した。Emacsの振る舞いはTECOのそれとは大きく異なっていてTECOとは独立した別のエディタとみなせるようになり、さらにEmacsは急激にITS上の標準編集プログラムとなった。Mike McMahonは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 Emacsがほぼ全てをMultics MACLISPを用いて書かれ、その後とBarry Margolinによりメンテナンスされた。GNU Emacsを含むEmacsのバージョンの多くは後に拡張言語としてLISPを採用することになる。UNIXで動作する最初のEmacs風エディタは、後にNeWSやJavaの開発で知られることになるジェームス・ゴスリングが1981年に書いたGosling Emacsであった。 これはCで書かれ、MocklispというLISP風構文の拡張言語を使っていた。MocklispにはシンボルもリストもなくRMS Lecture at KTH: Japanese、構文が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コアのバージョンを表すよう採番されていたが、バージョン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)がEmacs Lisp拡張言語で書かれており、一度Cによる中核部分(Emacs Lispインタプリタを実装し、24.4現在では247kLOCを占める)を移植すればEmacs Lispコードに実装された機能のセットは存在することになるので、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に引き継がれている; see also "Stallman on handing over GNU Emacs, its future and the importance of nomenclature"。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のフォークには以下のものがある:
Meadow - Microsoft Windows用の日本語バージョンFrontPage - Meadow Wiki SXEmacs - Steve YoungsによるXEmacsのフォーク Aquamacs - GNU Emacsをベースとし、Macintoshユーザインタフェースと統合することに焦点を当てている(Aquamacs 3.2はGNU Emacsバージョン24をベースとし、Aquamacs 3.3はGNU Emacsバージョン25をベースとしている)。
様々なEmacsエディタ
過去においては、各Emacsプロジェクトの目的は肥大化したEmacsの小規模なバージョン作成であった。GNU Emacsは当初、当時のハイエンドであった32ビットフラットアドレス空間と少なくとも1MiBのRAMを搭載するコンピュータを想定していたが、1980年代ではそのようなコンピュータはハイエンドなワークステーションやミニコンピュータであったので、一般的なパーソナルコンピュータのハードウェアで動作するようより小規模に再実装する必要があった。近年では小規模なEmacsクローンはソフトウェアインストールディスクに収まるよう設計されている。
小規模バージョン作成以外のプロジェクトの目的は、Emacs Lisp以外のLISP方言やLISPとは全く異なるプログラミング言語によるEmacsの実装である。Emacsクローンを以下に示す。ただし現在その全てが保守されているわけではない:
MicroEMACS - Dave Conroyが初めに書き、後にDaniel Lawrenceが開発した、非常に可搬性のある実装である。リーナス・トーバルズの使うエディタでもあるhttp://www.stifflog.com/2006/10/16/stiff-asks-great-programmers-answer/。 - 当初はMicroGNUEmacsといわれていたが後にmg2aといわれるようになった。MicroEMACSのパブリックドメインなフォークでありより密接にGNU Emacsを似ていることを意図された。OpenBSDでは既定でインストールされる。また、macOSにプリインストールされていたEmacsは、2018年にリリースされたmacOS Mojave (v10.14)の時点でさえ11年も前にリリースされたemacs22であったが、macOS Catalina (v10.15)よりmgに変更されている。 NotGNU - Julie Melbinにより書かれた小さくて高速なプロプライエタリなフリーウェア。DOS、Win16、Win32、Linux版がある。 (Jonathan's Own Version of Emacs) - Jonathan PayneによるUnix系システム用の非プログラマブルなEmacs実装である。 (MINCE Is Not Complete Emacs) - マーク・オブ・ザ・ユニコーン製のCP/M用のバージョンで後にDOSにも移植された。MINCEはFinal Wordへと進化し、さらにFinal Wordはボーランドのとなった。 - CP/M実装であり、Kaypro IIおよびKaypro IVの最初期のリリースに付属のデフォルトワードプロセッサであるcirca 1982を含んだMINCEが由来。後にWordStarの代替品としてKaypro 10に提供された。 - テキストマクロ拡張ベースの拡張言語を使うDOSバージョンであり、DOSの64KiBフラットメモリ限界に収まる。 GNU Zile - ZileはZile Is Lossy Emacsの再帰的頭字語であったが、Luaで再度書き直されてZile Implements Lua Editorsとして拡張機能を提供する。新しいZileには未だにZemacsと呼ばれるLuaによるEmacs実装が含まれている。Ziと呼ばれるvi実装も含まれる。 - MIT LISPマシンとその子孫用で、ZetaLispで実装されている。 Climacs - Zmacsに影響された派生で、Common Lispで実装されている。 QEmacs - による、何千MiBものサイズになる巨大なファイルを迅速に編集可能でUTF-8が使用可能な小規模エディタ。 - Lugaru SoftwareによるEmacsクローン。リリースにはDOS、Windows、Linux、FreeBSD、macOS、およびOS/2用のバージョンがバンドルされる。EpsilonはCの構文を持つLISPではない拡張言語を使用し、シングルタスクであるDOSにおいて非常に高速な同時コマンドシェルバッファ実装を使っていた。 PceEmacs - 用のEmacsベースエディタ。 EmACT - 1986年のChristian JullienによるMicroEmacsのフォーク。EmACTのソースコードはSourceForgeから利用できる。 Amacs - EmacsのApple II ProDOSバージョン。ブライアン・フォックスにより6502アセンブラで実装された。 Hemlock - 元々Spice Lispで書かれていたが、後にCommon Lispとなった。CMU Common Lispの一部。Zmacsに影響された。後に(Helixとして)Lucid Common Lisp、LispWorksおよびプロジェクトによりフォークされた。Hemlockを提供することを狙いとした、Portable Hemlockプロジェクトも存在する。HemlockはいくつかのCommon Lisp実装で動作する。
Emacsエミュレーションを使うエディタ - Haskellで書かれHaskellで拡張可能なエディタで、Emacsのエミュレーションモードがある。 - jmacsと呼ばれるEmacsキーバインディングをエミュレートする。 - Emacsのエミュレーションモードがある。 Eclipse - Emacsキーバインディングのセットを提供する。 IntelliJ IDEA - Emacsキーバインディングのセットを提供する。 - Emacsエミュレーションをデフォルトとし、viモードをサポートする。 - Emacsと同じ用語を使用し、Emacs操作バインディングを多数理解する。これはネイティブユーザインタフェースがコントロールキーの代わりに(Superキーと等価な)コマンドキーを使うためである。 Sublime Text - SublemacsProプラグインによりEmacsの振る舞いをいくつかエミュレートできる。 Visual Studio Emacs Keys - Visual StudioユーザーにEmacsキーキーバインディングのセットを提供する。 GNU Readline - 標準的なEmacs操作のキーバインディングを理解するラインエディタで、viエミュレーションモードも存在する。 - Emacs用エミュレーションモードを搭載している。
機能 Emacsは主にテキストエディタでありテキスト要素を操作するよう設計されているが、、Ghostscript、ウェブブラウザといった外部のプログラムと通信することで、ワードプロセッサのように文書を整形したり印刷することができる。Emacsは語、文、そして段落といった異なるセマンティック要素や、関数のようなソースコードの構成要素を処理したり様々な色を付けるためのコマンドを提供する。さらにEmacsは編集コマンドのユーザー定義バッチ用にキーボードマクロも提供する。
GNU Emacsはリアルタイム表示エディタであるので、編集する度にその編集がオンスクリーンで表示される。これは現在のテキストエディタの標準的振る舞いであるが、EMACSは初期の段階でこの機能を実装していたため、viのように既存のテキストに新しい編集を挿入するために個別のコマンドを実行する必要がなかった。
viが編集のための基本的な機能のみを搭載していたのに対し、Emacsはインクリメンタルサーチ・無制限のアンドゥ・ヤンク(ペースト)用のスタック・複数のバッファ・バッファ上でシェルを実行・補完・言語ごとのモードなど、エディタとして考えられる限りの機能を詰め込んでいる。VimではEmacsと同等のことができるようになっているが、バッファの使い方はEmacsより控えめである。
一般的アーキテクチャ 文書への文字列挿入などの基本的な編集操作を含むEmacsの機能はほとんど全て、LISPの方言で書かれた関数で行える。GNU Emacsで使われるLISP方言はEmacs Lispとして知られている。Emacs Lisp層はCで書かれた基本的なサービスとプラットフォームを抽象化した概念の、安定したコアの頂点に位置している。LISP環境の変数と関数は、Emacsのリコンパイルや再起動をせずとも一時的に修正できる。
Emacsは追加属性を持つテキストを含んだバッファと呼ばれるデータ構造上で動作する。全てのバッファはその固有のポイント(カーソル位置)とマーク(ポイントと併せて、選択されたリージョンを区切るためのもう1つの位置)、(適用可能な場合)バッファが訪問しているファイル名、そして変数で編集や振る舞いを制御する現在のモードのセット(正確には1つの「主モード」と複数の「副モード」からなる)を保存している。対話的に実行可能なEmacs Lispコードをコマンドという。コマンドはキープレスなどのイベントにバインドでき、さらに名前でアクセスすることもできる。コマンドの中にはバッファから任意のEmacs Lispコードを評価するもの(例としてはeval-regionやeval-bufferなど)もある。
バッファはウィンドウ内に表示される。ウィンドウは端末画面やGUIウィンドウのタイリングされた部分である(その部分はEmacs用語でフレームと呼ばれ、複数のフレームが可能)。特に設定されていない場合、ウィンドウにはスクロールバー、行番号、一番上にあるヘッダ行(通常この行にはバッファタイトルやファイル名が表示される)、そして一番下にあるモード行(通常この行には現在のモードとバッファにおけるポイントの位置のリストが表示される)が含まれる。
同じバッファ上で複数ウィンドウを開くことができるため、例えば1つの長いテキストから異なるパートを見ることができる。さらに複数バッファで同じテキストを共有できるので、例えば言語が混在したファイルで異なる主モードを利用することができる。M-x <mode name>により必要に応じてモードを手動で変更することもできる。
ふつう最下行にあるミニバッファは、Emacsが情報を受け取る場所である。検索対象のテキストや読んだり保存したりするファイルの名前などの情報をミニバッファに入力する。一部の入力ではタブキーを用いて入力を補完することができる。ミニバッファは通常1行しかないが、ここでも通常のバッファと同じ移動・編集コマンドを使うことができる。
カスタマイズ キーストロークをマクロに記録し、複雑な反復タスクを自動で再現できる。これは使用後に廃棄される各マクロによりアドホックベースに行われることが多い。ただしマクロを保存したり、後で呼び出すこともできる。 起動時にEmacsは~/.emacsと名付けられたEmacs Lispスクリプト(近年のバージョンでは~/.emacs.elや~/.emacs.d/init.elでもよい。Emacsは最初に見つけたスクリプトを実行し、それ以外のスクリプトは無視する)を実行する。個人的なカスタマイズファイルは任意の長さや組み合わせでよいが、通常は以下のものが含まれる: Emacsの振る舞いをカスタマイズするための、グローバル変数や関数呼び出しの設定。例としては(set-default-coding-systems 'utf-8)など。 標準的なキーバインディングを上書きしたり、ユーザーにとって便利なのにデフォルトでバインドされていないキーを持つコマンド用ショートカットを追加するためのキーバインディング。例 : (global-set-key (kbd "C-x C-b") 'ibuffer) Emacsの拡張の読み込み、有効化、および初期化(Emacsには多くの拡張が付属しているが、デフォルトでは極少数しか読み込まれない)。 指定された時間に任意のコードを実行するイベントフックの設定。例としてはバッファの保存後に自動でソースコードをリコンパイルするafter-save-hookなど。 任意の複数ファイル実行。通常は長すぎる設定ファイルを管理できるように均等な部分に分割するためのもの(これらの個人的スクリプト用の伝統的な場所は~/.emacs.d/と~/elisp/である)。