GNU Emacs
GNU Emacs
GNU Emacs(グヌー・イーマックス)は最も有名で、かつ最も多く移植されているEmacsテキストエディタであり、GNUプロジェクト創設者のリチャード・ストールマンにより作成された。GNU Emacsは他のEmacs系エディタと同様に、チューリング完全なプログラミング言語で拡張可能である。GNU Emacsは「今日利用できる最もパワフルなテキストエディタ」と称されている。GNU Emacsは基盤となるシステムからの適切なサポートにより、複数の文字集合を含むを表示することが可能だが、1999年の時点で既にほとんどの人間言語を同時に表示することが可能であった。GNU Emacsはその歴史を通じてGNUプロジェクトの中心となるコンポーネントであり、さらにフリーソフトウェア運動のフラグシップである。GNU Emacsは、他のEMACS派生と区別する場合にGNUMACSと略されることがある。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の実装に使われる。このモードでは各種プログラミング言語用のRead–eval–print loopモードや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用語における「ウィンドウ」とは、他のシステムでは「フレーム (World Wide Web)」や「ペイン」と呼ばれるものと類似している。ウィンドウは独自に更新や対話ができる、プログラムによる表示の矩形部分である。Emacsでは各ウィンドウにそれぞれ「モードライン」と呼ばれるステータスバーが存在し、デフォルトではウィンドウの最下端に表示される。Emacsウィンドウはテキスト端末でもグラフィカルモードでも使うことができ、さらにウィンドウにより複数のバッファや、1つのバッファにおける複数の部分を同時に見ることが可能となる。一般的なウィンドウの応用例としては、カレントディレクトリのファイル一覧に加えてDiredバッファを表示したり(ファイルバッファをDiredでハイライトされたファイルに従わせる特殊なモードが存在する)、あるウィンドウでプログラムのソースコードを表示しながら別のウィンドウにプログラムをコンパイルした結果のシェルバッファを表示してプログラムを起動しているシェルバッファと一緒にデバッガを起動したり、manページや(Emacsのビルトインウェブブラウザの一種を使ってWorld Wide Web全体からロードされたものなどの)他のドキュメントを表示しながらコードを処理したり、Cベースの言語用ヘッダとその実装ファイルなどを同時に編集するため複数のファイルを表示したりなどができる。加えて、バッファの重複しない部分を表示するようウィンドウを連鎖させるfollow-modeが存在する。follow-modeを使うと、1つのファイルをスクロール時に適切に更新される複数の並列ウィンドウに表示する。Emacsウィンドウはタイル型であるため、ウィンドウが「前面」や「背面」になることはない。Emacsは複数の「フレーム」を起動することができる。フレームはグラフィカル環境で個々のウィンドウを表示するためのものである。テキスト端末上で複数のフレームを作ることができる。テキスト端末において、複数フレームは端末全体を満たすよう積み重ねられて表示され、標準Emacsコマンドを使うことでフレームを切り替えることが可能である。
GNU Emacsは様々な異なるタイプのテキストを編集でき、「主モード(メジャーモード、major-mode)」と呼ばれるアドオンモードに入ることで、編集するテキストの種類に応じて振舞いを適用させる。普通のテキストファイル、多くのプログラミング言語のソースコード、HTMLドキュメント、TeXやLaTeXドキュメントや、多くの他種の用に主モードが定義されている。各主モードはEmacs Lisp変数を調節するなどして固有の型のテキストに都合よく振る舞うように作られている。 主モードは通常、以下のような共通機能の一部または全てを提供する:
シンタックス強調表示(「フォントロック」):「フェイス」と呼ばれる、キーワードやコメントといったドキュメント要素の差異を示す、フォントと色の組み合わせ
空白、新しい行、および括弧のようなドキュメントの構造に必要な要素の自動挿入
プログラミングファイルの編集中に関数の先頭や末尾へ飛ぶコマンドや、XMLのようなマークアップ言語の作業中にドキュメントを検証したり終了タグを挿入するコマンドのような特殊編集コマンド
「副モード(マイナーモード、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はアラビア文字などの右から左へ記述する文字をふくめた複数の文字集合の1ファイル中での混在と編集が可能であり、中国や、タイ等多くの国や地域で規格化された文字集合をサポートするなど、先進的かつ実用的な多用字系処理系であった(しばしば多言語処理系ともいわれる)。
日本語 GNU Emacs (Nemacs:Nihongo Emacs) は東京大学の平野聡と大阪大学の東田学によって、フリーなDOSエクステンダのgo32/djgppを用いてMS-DOS上に移植され(後にemxにも対応)、demacsと呼ばれた。
GNU Emacsの振る舞いは、新しいコマンド、新しいバッファモード、新しいキーマップなどを定義したり、コマンドラインオプションを追加するための組み込みEmacs Lispプログラムにより、ほぼ制限なく修正したり拡張することができる。ユーザー向け機能を提供する拡張の多くは主モードを定義する(新しいファイルタイプ用の主モードか、テキスト編集させないユーザインタフェースを構築する主モードのどちらかとなる)。その他の拡張には、コマンドや副モードのみを定義するものや、別の拡張を補強する機能を提供するものなどがある。
GNU Emacsのインストールには多くの拡張がバンドルされている。バンドルされていない拡張はルーズファイル(Usenet newsgroup gnu.emacs.sourcesが伝統的なソースであった)として、ダウンロードされ使用されていたが、バージョン24より管理されたパッケージやパッケージダウンロードサイトが発展してきている。これらのパッケージは、拡張をダウンロードしてインストールし、さらに最新の状態に維持するためのビルトインパッケージマネージャ(これ自体が拡張である)を利用する。
以下に主な拡張の例を示す:
AUCTeX : TeXおよびLaTeXドキュメントを編集し処理するためのツール
Calc : パワフルなRPN数値計算機
Calendar-mode : 予定表や日記の維持
Dired : ファイルマネージャ
Dissociated press : テキストジェネレータ風のRacter
Doctor : ELIZAにインスパイアされた精神分析シミュレーション
Ediff / Emerge : インタラクティブにファイルの比較と統合を行うためのもの
Emacs/W3 : 主にWilliam M. PerryによってEmacs Lispで書かれたテキストブラウザ。Emacs/W3はXEmacs用のSumoパッケージの一部であり、URLを取得するためのサブモジュールは現在GNU Emacs CVSリポジトリの一部である。HTML+と呼ばれたHTML 2の後継に取り組んでいる間、Emacs/W3とtkWWWはデーブ・ラゲットをサポートしていた
Emacs Speaks Statistics (ESS) : RやSASなど統計言語の編集モード
Emacs Web Wowser (EWW) : 組み込みウェブブラウザ
ERC (ソフトウェア) / rcirc / Circe : IRCクライアント
Eshell : Emacs Lispで書かれたコマンドラインシェル。BashやPowerShellなどの標準的なシェルはEmacsからも利用できるが、Eshellはそれら標準的なシェルよりもさらに緊密なEmacs環境との統合を可能にする
Exwm : X11アプリをEmacsウィンドウで起動できるXウィンドウマネージャ
Gnus : フル装備のニュースクライアント兼電子メールクライアントで、Zawinskiの法則に対する初期の証拠
howm : メモ取り環境兼ToDo管理
JDE: Java統合開発環境
Magit : バージョン制御システムであるgitと連携を可能にする
Mediawiki-mode : プロジェクトのページ編集モード
MULtilingual Enhancement to Emacs (MULE) : Unicodeにやや類似した方法で多言語のテキストを編集できる拡張
Org-mode : 要約を維持しながら、様々なタイプのリストを整理し、プロジェクトを見積もり、そして(PDF、HTML、OpenDocumentなどの)多数のフォーマットのドキュメントを組み合わせる。Org-modeを使う静的サイトジェネレータだけではなく、文芸的プログラミングのために利用できるBabelが存在する
Planner (ソフトウェア) : Emacsを使ったPersonal Information Manager
Pong : ポン
Simple Emacs Spreadsheet (SES) : スプレッドシート
SQL Interaction Mode : SQLデータベースサーバの様々な流儀でやり取りするためのモード
Superior Lisp Interaction Mode for Emacs (SLIME) : Common Lisp用開発環境にGNU Emacsを拡張する。(Emacs Lispで書かれた)SLIMEによりGNU Emacsエディタは特殊な通信プロトコルを通じて(SWANKバックエンドを利用している)Common Lispシステムと通信し、さらにRead–eval–print loop、データ検査器、およびデバッガなどのツールを提供する
Tetris : テトリス
Texinfo (Info) : オンラインヘルプブラウザ
Twittering-mode: ツイッターのクライアント
VC : バージョン管理システム
View Mail (VM) : フル装備の電子メールクライアント
Viper : viエミュレーション層。Vimエミュレーション層であるEvilも存在する
W3M : ウェブブラウザで、w3mスタンドアローンブラウザをベースとして利用する
Wanderlust : 多目的用途の電子メール/ニュースクライアント
wikipedia-mode : Wikipediaの記事を編集する
Zone : 様々ななテキスト効果を組み込むためのディスプレイハックモード
GNU EmacsはLispベースのコードをロードし解釈することによるパフォーマンスのオーバーヘッドが発生するため、初期の実装時点では競合するテキストエディタよりもシステム上における実行が著しく遅かった。現在のコンピュータはスローダウンせずにGNU Emacsを起動するほどパワフルであるが、19.29以前のバージョンでは8MB以上のファイルを編集できなかった。このファイルサイズ制限はバージョンを通じて存在したが、GNU Emacs 23.2以降の32ビットバージョンでは512MBまでのサイズのファイルを編集できる。64ビットマシンでコンパイルされたEmacsではさらに大きいバッファを処理できる。