GNU Emacs

歴史

リチャード・ストールマンは1976年に初代のEmacs ("Editor MACroS") を書き、1984年にプロプライエタリであるGosling Emacsのフリーソフトウェアによる代替物を作成するため、GNU Emacsの作業を開始した。GNU Emacsは当初Gosling Emacsをベースとしていたが、ストールマンがGosling EmacsのMocklispインタプリタを本物のLISPインタプリタへと置き換えようとしたところ、Gosling Emacsのコードの大半を書き換える必要があった。GNU Emacsは創生期のGNUプロジェクトがリリースした最初のプログラムとなった。GNU EmacsはC言語で書かれており、拡張用言語としてEmacs Lisp (ELisp) を提供する。Emacs LispもまたC言語で実装されている。最初の公式リリースであるバージョン13は1985年3月20日に発表された。最初に広く頒布されたGNU Emacsのバージョンは1985年に登場した15.34であった。GNU Emacsのバージョン番号は"1.x.x"のように、最初の桁がC coreのバージョンを表すよう採番されていたが、バージョン1.12が出された後でもC coreのメジャー番号が変わりそうにないため、先頭の1をなくすことにした。このため、バージョン番号は1から13にスキップした。そしてユーザーサイトによる変更を表すため、3番目のバージョン番号が新規に追加された。現在の採番スキームでは、2番目の数はリリースバージョンを表し、3つ目の数は開発バージョンを表している。
GNU Emacsは後にUNIXへと移植され、Gosling Emacsよりも多くの機能を提供した。その中でも特に代表的な機能は、GNU Emacsの拡張言語としてフル機能搭載LISPである。それから瞬く間にGNU EmacsはGosling Emacsに取って代わり、UNIX Emacsエディタのデファクトスタンダードとなった。Markus Hessは彼の1986 cracking spreeで、GNU Emacs電子メールサブシステムのセキュリティ上の弱点を悪用し、UNIXコンピュータ上でスーパーユーザーアクセス権を取得した。
1999年まで、ユーザーがパッチやElispコードをnet.emacsニュースグループに提出することが多かったが、現在と比べGNU Emacs開発への参加は制限されており、『伽藍とバザール』において「伽藍」開発スタイルの例として挙げられた。それ以降、GNU Emacsプロジェクトは公開された開発メーリングリストと、匿名CVSアクセスを採用した。開発は2008年まで単一のCVSトランクで行われていたが、現在では分散型バージョン管理システムであるgitが使われている。
リチャード・ストールマンはGNU Emacsの主要なメンテナのままだったが、時代が進むにつれ役割から後退していった。2008年以降はStefan MonnierとChong Yidongがメンテナンスを監督するようになった。2015年9月21日にMonnierはEmacs 25の機能凍結をもって事実上のメンテナのまま辞任することをアナウンスした。2015年11月5日、長期に渡り貢献してきたJohn Wiegleyが新しいメンテナとなることがアナウンスされた。

ライセンス

CとEmacs Lispから成るGNU Emacsのソースコードは、GNU General Public License (GPL) 規約の下で調査、修正、再頒布のため自由に入手できる。
古い版のGNU Emacsのドキュメントは、修正版の複製にあるテキストの挿入を必要とする個別のライセンスの下でリリースされた。例えば、GNU Emacs user's manualにはGNU Emacsの入手方法と、リチャード・ストールマンの政治的エッセー「GNU宣言」が含まれていた。フォーク時に古いGNU Emacsのマニュアルを継承したXEmacsのマニュアルも同じライセンスである。 一方、新しい版のGNU Emacsのドキュメントは、GNU Free Documentation Licenseを用い「不変部分」を利用して、同じドキュメントの包含を要求しつつ、マニュアルがGNU Manualsであることも宣言している。
GNU Emacs（や他のGNUパッケージ一般）ではコピーレフトの強制を容易にするため、すなわちFSFが係争に入ったときに法廷でソフトウェアを守れるようにするため、著しい量のコード寄贈は著作権者が自身の著作権を適切に放棄またはフリーソフトウェア財団に委譲したときだけ受理する方針になっている。 この方針の唯一の例外はMule（MULtilingual Extension、Unicodeや、他の言語の用字系を処理する高度なメソッドがある）のコードで、著作権者が日本国政府で著作権の委譲が不可能であった 。 些細なコード寄贈やバグ修正には、この方針は適用されない。 些細かどうかの厳密な定義はないが、指針として10行未満のコードは些細とみなされている。
2011年、GPLにより意図された精神に反して、該当するソースコードが存在しないバイナリを2年間に渡りリリースしていたことが発覚した。ストールマンは「大変重大な誤り」としてこの事件について述べ、この誤りはすぐに修正された。当然のことだが、下流の再頒布者が技術的にGPL違反をしたのは彼ら自身の過ちではないため、FSFは誰も訴えなかった。

基本的な操作

基本的な操作は、GNU Emacsからのフォークとして始まったXEmacsとその後継版は、GNU Emacsとおおむね互換性がある。
カーソル移動などは矢印キーをつかって行うこともできるが、主要な大部分の操作は、コントロールキー・メタキー（Windowsでは通常Altキーを使用する）・スーパーキーなどを押し下げたまま別のキーを打鍵することで行うことができる。viと比較した場合、viが編集モード、カーソル移動モードの2つのモードを持つのに対し、Emacsはそのようなモードを持たない。ただしEmacs上でviの操作をエミュレートするエミュレータもいくつかある (vip-mode, viper-mode) 。
なお、Emacsではコントロールキーを押しながら「a」を押す事を「C-a」と表記し、メタキーを押しながら「a」を押す事を「M-a」と表記する。本稿でも以下この表記を用いる。
キーの多くは英語の頭文字にしたがって割り振られているので、どのキーがどの操作に対応しているのかを比較的簡単に覚えることができる。たとえばカーソルを右、左、上、下に動かす操作はそれぞれC-f、C-b、C-p、C-nであるが、これはそれぞれforward、backward、previous、nextの略である。
Emacsでは、2ストローク以上のキー操作も多数用意している。たとえば「C-xC-s」(＝コントロールキーを押し下げたままx、sと打鍵する)でファイルを保存する。キーの割り当てられていないコマンドも多くあり、それらは M-x を押してからコマンドを入力することで実行する。
なお、C-h t（英語）あるいはC-h T（翻訳）でチュートリアルを表示させることができ、そのまま操作方法を学習することができる。
GUIでEmacsを使っているとき、キーボードの代わりにメニューバーやツールバーからもコマンドを呼び出せる。しかし、経験豊富なEmacsの利用者には、必要なキー操作をいったん記憶してしまえばより速く操作でき便利なキーボードからのコマンド呼び出しのほうが好まれている。
全ての編集コマンドは、実際はEmacs Lisp環境の関数を呼び出す。文字aを挿入するコマンドのaをたたいただけでも、関数を（この場合self-insert-commandを）呼び出す。一部のEmacsコマンドは、外部プログラム（つづりのチェックにispellや、プログラムのコンパイルにgcc）を呼び出し、プログラムの出力を解析し、Emacsに結果を表示することで、機能している。

コマンド

GNU Emacsは、通常の編集モードにおいては他のテキストエディタと同じように振る舞うため、ユーザーは対応するキーで文字を挿入でき、さらに矢印キーで編集場所を移動できる。エスケープキーシーケンスを入力するか、またはコントロールキー、メタキー、Altキー、スーパーキーのうち1つ以上のキーを通常キーと同時に押すことにより、修飾キーストロークを発生させてEmacs Lisp環境から関数を呼び出す。save-bufferやsave-buffers-kill-emacsなどのコマンドでは、複数の修飾キーストロークを組み合わせる。
GNU Emacsのコマンドの中には、スペルチェック用のIspellやプログラムコンパイル用のgccなどのように外部プログラムを呼び出して処理を行うものも存在する。GNU Emacsはこれら外部プログラムの出力をパースして、GNU Emacsに結果を出力する。Emacsは「下位プロセス」もサポートする。下位プロセスとは、Emacsバッファと相互に影響しあう長寿命なプロセスであり、shell-modeの実装に使われる。このモードでは各種プログラミング言語用のREPLモードやUnixシェルを、下位プロセスで起動する。GNU Emacsは外部プロセスをサポートしているため、InterlispやSmallTalkの行に沿った対話型プログラミング用環境としてGNU Emacsは魅力的なものである。
IBM Common User Accessスタイルのキーを好むユーザーはcua-modeを使うことができる。このモードは元々サードパーティーのアドオンであったが、バージョン22以降のGNU Emacsに含まれるようになったパッケージである。

ミニバッファ

Emacsは状態を表したり情報を要求するために「ミニバッファ」を利用する。通常、ミニバッファは一番下の行に存在する。ミニバッファが果たす機能は、ほとんどのGUIでは一般的にダイアログボックスが果たす機能である。ミニバッファは、検索対象となるテキストや、読み込みや保存を行うファイル名などの情報を保持している。該当する場合、タブキーやスペースキーでコマンドライン補完ができる。

ファイル管理と表示

Emacsはバッファと呼ばれるデータ構造でテキストを保持する。バッファは画面に表示することも非表示にすることもでき、さらにEmacs Lispプログラムやユーザインタフェースから全てのバッファ機能にアクセスできる。ユーザーは新しいバッファを作成したり不要なバッファを消去することができ、複数のバッファを同時に存在させることもできる。Emacsが使えるバッファ数はハードウェアメモリが許す限り増やすことができる。上級ユーザーは自身の作業と関係のある様々なタイプの開かれたバッファを数百個蓄えることもある。
バッファの中にはテキストファイルから読み込まれたテキストバッファなどのように、ユーザーが編集したり永続ストレージに保存することができるものもある。このようなバッファを、ファイルを「訪問している」バッファと呼ぶ。バッファはこれ以外にも、Emacsコマンドの出力、Diredディレクトリ一覧表示、「ヘルプ」ライブラリが表示するドキュメントの文字列、およびEmacs以外のエディタではダイアログボックスに表示される通知メッセージなどのデータを表示する役割も果たす。GNU Emacsはこれらの通知をミニバッファへ簡潔に表示し、さらにそれら通知の最新履歴を保持するために*Messages*バッファを提供する。バッファはシェルやREPLなどの外部プロセスに対する入出力エリアとしての役割も果たす。ユーザーバッファと区別するため、Emacsが独自に作成するバッファ名には最初と最後にアスタリスクが付くことが多い。開かれているバッファの一覧は、それ自体がこのタイプのバッファに表示される。
Emacsキーシーケンスのほとんどは、どのバッファでも機能する。例えば、標準Ctrl-s isearch機能はDiredバッファでファイル検索のために使うことができ、さらにそのファイル一覧を他の全てのバッファと同様にテキストファイルへと保存することもできる。Diredバッファを書き込み可能モードに切り替えると、ファイル名や属性をテキストベースで編集することができ、さらにその場合にDiredバッファを保存すると変更した箇所がファイルシステムに書き込まれる。これにより、Emacsの検索および置換機能を利用して複数のファイルを改名することができる。さらに装備すると、GNU Emacsはバッファに画像ファイルを表示する。GNU Emacsはバイナリセーフで8ビットクリーンである。
Emacsは編集領域を「ウィンドウ」と呼ばれるエリアに分割できる。EmacsではGUIが普及するよりも前の1975年から、既にウィンドウ機能を使えるようになっていた。Emacs用語における「ウィンドウ」とは、他のシステムでは「フレーム」や「ペイン」と呼ばれるものと類似している。ウィンドウは独自に更新や対話ができる、プログラムによる表示の矩形部分である。Emacsでは各ウィンドウにそれぞれ「モードライン」と呼ばれるステータスバーが存在し、デフォルトではウィンドウの最下端に表示される。Emacsウィンドウはテキスト端末でもグラフィカルモードでも使うことができ、さらにウィンドウにより複数のバッファや、1つのバッファにおける複数の部分を同時に見ることが可能となる。一般的なウィンドウの応用例としては、カレントディレクトリのファイル一覧に加えてDiredバッファを表示したり（ファイルバッファをDiredでハイライトされたファイルに従わせる特殊なモードが存在する）、あるウィンドウでプログラムのソースコードを表示しながら別のウィンドウにプログラムをコンパイルした結果のシェルバッファを表示してプログラムを起動しているシェルバッファと一緒にデバッガを起動したり、manページや（Emacsのビルトインウェブブラウザの一種を使ってWorld Wide Web全体からロードされたものなどの）他のドキュメントを表示しながらコードを処理したり、Cベースの言語用ヘッダとその実装ファイルなどを同時に編集するため複数のファイルを表示したりなどができる。加えて、バッファの重複しない部分を表示するようウィンドウを連鎖させるfollow-modeが存在する。follow-modeを使うと、1つのファイルをスクロール時に適切に更新される複数の並列ウィンドウに表示する。Emacsウィンドウはタイル型であるため、ウィンドウが「前面」や「背面」になることはない。Emacsは複数の「フレーム」を起動することができる。フレームはグラフィカル環境で個々のウィンドウを表示するためのものである。テキスト端末上で複数のフレームを作ることができる。テキスト端末において、複数フレームは端末全体を満たすよう積み重ねられて表示され、標準Emacsコマンドを使うことでフレームを切り替えることが可能である。

副モード

「副モード（マイナーモード、minor-mode）」でGNU Emacsの振る舞いをさらにカスタム化することもできる。バッファを編集するGNU Emacsは1つの主モードしか使えないが、副モードは複数同時に操作できる。C言語用の主モードへ人気のある字下げスタイル毎に個別の副モードを定義するなどのような方法により、副モードをドキュメント上で直接操作したり、副モードで編集環境を変更することができる。後者の例としてはウィンドウ構成の変更をアンドゥする能力を追加するモードや、オンザフライなシンタックスチェックを実行するモードなどが挙げられる。複数のプログラミング言語が埋め込まれたドキュメントを編集する際に便利なため、複数の主モードを単一のファイルで使えるようにする副モードもある。

「バッチモード」

GNU Emacsは、テキストエディタユーザインタフェースを表示しないElisp言語用インタープリタとしての使用もサポートしている。バッチモードではユーザー設定はロードされず、端末割り込み文字のC-cとC-zは、Emacsのキーバインディングを呼び出す効果ではなく、プログラム終了や実行中断をする通常の効果をもたらす。GNU Emacsは、ロードおよび実行するためのファイルや、コマンドラインから渡せるEmacs Lisp関数を指定するためのコマンドラインオプションを持つ。Emacsが開始されると渡されたファイルや関数を実行し、結果を出力してから終了する。#!/usr/bin/emacs --scriptというシバンの行でEmacs Lispのスタンドアロンスクリプトを作成できる。バッチモードはEmacsのモード「そのもの」ではないが、Emacsプログラムの代替実行モードとして説明される。

マニュアル

ビルトインドキュメントとは別に、GNU Emacsには異常に長くて詳細なマニュアルがある。リチャード・ストールマンによって書かれたGNU Emacs Manualの電子コピーはGNU Emacsにバンドルされ、ビルトインinfoブラウザで閲覧できる。Bil Lewis、リチャード・ストールマンそしてDan LaliberteによるEmacs Lisp Reference ManualとRobert ChassellによるAn Introduction to Programming in Emacs Lispの2つの追加マニュアルも含まれる。これらのマニュアルは全てフリーソフトウェア財団により書籍形式でも発行されている。XEmacsのマニュアルはGNU Emacs Manualと類似しているが、XEmacsのソフトウェアはGNU Emacsからフォークされたと同時にマニュアルもフォークされたからである。

国際化

GNU Emacsは多種のアルファベット、文字体系、表記体系および文化的慣習をサポートしており、Ispellのような外部プログラムを呼ぶことで多数の言語のスペルチェックを提供している。バージョン24にはアラビア語、ペルシア語、そしてヘブライ語といった言語のため、横書きにおいて左横書きと右横書きとを混在して書く機能のサポートが追加された。
UTF-8を含む多数の文字コードをサポートしている。GNU Emacsはバージョン23から文字コードにUTF-8を使うが、それ以前のバージョンでは固有の内部文字コードを使い、読み書き時に変換していた。XEmacsが使う内部文字コードは以前のバージョンのGNU Emacsのものと類似しているが、詳細は異なる。
GNU Emacsユーザインタフェースはビギナーのチュートリアルを除き英語で開始され、それ以外の言語には翻訳されていない。
Emacspeakと呼ばれるサブシステムにより、視覚障害のあるユーザーや盲目のユーザーがオーディオフィードバックを通じてエディタをコントロールできる。

日本語化

GNU Emacsの日本語版としてNemacs (Nihongo Emacs) が、多国語対応版としてMule (MULtilingual Enhancement to GNU Emacs) が開発された。NemacsおよびMuleは電子技術総合研究所（電総研:現在の産業技術総合研究所）の半田剣一らによるものである。

Mule

Muleはアラビア文字などの右から左へ記述する文字をふくめた複数の文字集合の1ファイル中での混在と編集が可能であり、中国や、タイ等多くの国や地域で規格化された文字集合をサポートするなど、先進的かつ実用的な多用字系処理系であった（しばしば多言語処理系ともいわれる）。

日本語 GNU Emacs

日本語 GNU Emacs (Nemacs:Nihongo Emacs) は東京大学の平野聡と大阪大学の東田学によって、フリーなDOSエクステンダのgo32/djgppを用いてMS-DOS上に移植され（後にemxにも対応）、demacsと呼ばれた。

パフォーマンス

GNU EmacsはLispベースのコードをロードし解釈することによるパフォーマンスのオーバーヘッドが発生するため、初期の実装時点では競合するテキストエディタよりもシステム上における実行が著しく遅かった。現在のコンピュータはスローダウンせずにGNU Emacsを起動するほどパワフルであるが、19.29以前のバージョンでは8MB以上のファイルを編集できなかった。このファイルサイズ制限はバージョンを通じて存在したが、GNU Emacs 23.2以降の32ビットバージョンでは512MBまでのサイズのファイルを編集できる。64ビットマシンでコンパイルされたEmacsではさらに大きいバッファを処理できる。

プラットフォーム

GNU Emacsは最も移植された非商用コンピュータプログラムの1つであり、DOS、Microsoft WindowsそしてOpenVMSを含む様々なオペレーティングシステム上で動作する。Emacs 23.1でサポートが削除された時代遅れのプラットフォームの中には、VMSや（Linuxベースのもを除く）大半のUnix派生など、既に開発が終了していたものもある。GNU EmacsはLinux、BSD派生、Solaris、AIX、HP-UXおよびmacOSなどのほとんどのUnix系オペレーティングシステムで利用可能であり、システムインストールパッケージに含まれていることが多い。AndroidやノキアのMaemo用のGNU Emacsネイティブ移植が存在する。
GNU Emacsはテキスト端末とGUI環境の両方で動作する。GNU EmacsはUnix系オペレーティングシステム上でX Window Systemを利用できるため、Athena Widgetsを直接利用したり、Motif、LessTif、またはGTK+などの「ウィジットツールキット」を利用することでGUIを作成することができる。GNU EmacsはmacOSやWindowsといった各プラットフォームのルック・アンド・フィールに、より密接に適合したメニューバー、ツールバー、スクロールバーおよびコンテキストメニューを提供するため、macOSやWindowsのネイティブなグラフィックスシステムを利用することもできる。

GUIへの対応

Emacsはもとは文字端末での利用を前提に設計されていたものであるが、少なくともGNU Emacsバージョン18ではX Window Systemアプリケーションとしてコンパイルすることもできた。しかし、その実装方法は、自前の端末エミュレータを立ち上げ、その中で動くというものであり、ウィンドウシステムの持つ機能を十分に発揮するには至っていなかった。このためXEmacsなどのプロジェクトが生まれたが、GNU Emacs自身も徐々にGUIに対応していった。
Emacsバージョン21およびXEmacsではグラフィックス機能が強化されており、1バッファ中で複数のサイズやスタイルのフォントを混在させることもできる。また、画像を表示させることもでき、ImageMagickと連携してさまざまな画像ファイルを開くことができるようになった。
2009年のGNU Emacs 23ではフォントの扱いが大きく変わり、TrueTypeフォントが自由に使えるようになった。

Windows

現在はGNU Emacs自体をVisual C++またはCygwinでコンパイルすることが可能である。バイナリ形式でも配布されているので、zipを展開するだけでWindows上でEmacsが使用可能である。
日本では、かつて宮下尚によりWin32アプリケーションとしてMule 2.3をベースにしたMule for Win32、そしてGNU Emacs 20をベースにしたMeadowがWindows上に移植・開発され、広く使われていた。2004年7月7日にはGNU Emacs 21をベースにしたMeadow2がリリースされたが、GNU Emacs 22以降には対応していない。一方、上記のバイナリは日本語IMEからの入力に問題があるため、パッチをあててCygwinでビルドしたgnupackが使われるようになってきている。
SKKのようなGNU Emacs上の入力システムを使い、Windows上の日本語IMEを使用しない場合は、公式のバイナリをそのまま使えばよい。
Win32で動くEmacsをNTEmacsとよぶこともある。

macOS

macOSは最初からGNU Emacsがインストール済みだが、標準ではGUIが使えない。銭谷誠司がGNU Emacs 22をmacOSのCarbon APIを使ってGUI対応したCarbon Emacsが使われてきたが、GNU Emacs 23からはGNU EmacsそのものがCocoa APIを使ったGUIで動くようになり、configureに --with-ns （nsはNEXTSTEP）オプションをつけるだけでGUIで動くEmacsをソースからビルドすることもできる。そのほか、GUIをAquaとしたAquamacsなど、多数のバリエーションが存在する。
macOSでは、コントロールキーのほかにコマンドキーとオプションキーが用意されており、そのどちらかをMetaキー・もう片方をSuperキーとして使うことができる。Superキーの割り当ての一部はmacOSの標準のキー割り当てとよく似ている（s-x でカット・s-c でコピー・s-n で新しいフレームが開くなど）。ただし、その副作用として本来のオプションキーとしての機能は使えなくなってしまう。たとえば日本語キーボードではバックスラッシュをオプション+円記号で入力する必要があるので、特別な対応が必要となる。

XEmacs

1991年初頭、GNU Emacs 19の初期α版をベースとしてJamie ZawinskiとLucid社の人達によりLucid Emacsが開発された。コードベースはすぐに2つに分割され、開発チームは単一プログラムとして併合しようとすることをあきらめた 。これはフォークしたフリーソフトウェアのうち初期の最も有名な例の1つである。Lucid EmacsはXEmacsと名前を変え、Emacsの中でGNU Emacsに次いで2番目に有名な派生となった。XEmacsの開発は2009年1月に最新の安定版であるバージョン21.4.22がリリースされてから遅くなっていき、その一方でGNU Emacsは以前はXEmacsにしかなかった機能の多くを実装していった。このため一部のユーザーはXEmacsの死を宣言するようになった。