Emacs

**Emacs**（/ˈiːmæks/，源自 **E**ditor **MAC**ro**S**，巨集編輯器），是一個純文字編輯器家族，它具有可延伸性，使用者以程式設計師和其他以技術工作為主的電腦使用者為主。最初由 Richard Stallman 於 1975 年在 MIT 協同蓋伊・史提爾二世共同完成。這一創意的靈感來源於 TECO 巨集編輯器 TECMAC 和 TMACS，它們是由蓋伊・史提爾二世、Dave Moon、Richard Greenblatt、Charles Frankston 等人編寫的巨集純文字編輯器。

自誕生以來，Emacs 演化出了眾多分支，其中使用最廣泛的兩種分別是：1984 年由理查・史托曼發起並由他維護至 2008 年的 **GNU Emacs**，以及 1991 年發起的 XEmacs。XEmacs 是 GNU Emacs 的分支，至今仍保持著相當的相容性。它們都使用了 Emacs Lisp 這種有著極強擴充性的程式語言，從而實現了包括程設、編譯乃至網路瀏覽等等功能的擴充套件。

在 Unix 文化裡，Emacs 是駭客們關於編輯器之戰的兩大主角之一，它的對手是 vi（Vim）。

## 歷史

Emacs 在 1970 年代誕生於 MIT 人工智慧實驗室（MIT AI Lab）。在此之前，人工智慧實驗室的 PDP-6 和 PDP-10 電腦上執行的 ITS 作業系統的預設編輯器是一個叫 TECO（Text Editor and Corrector）的行編輯器。與現代的純文字編輯器不同，TECO 將輸入、編輯和文字顯示按照不同的模式進行處理，稍晚出現的 vi 與它有些類似。在 TECO 上輸入並不會直接將這些字元插入到文件裡去，必須先輸入一系列相應的 TECO 指令，而被編輯的文字在輸入命令的時候是不會顯示在螢幕上的。在如今還在使用的 UNIX 編輯器 ed 上，我們還能看到類似的工作方式。

1970 年代初，理查・史托曼拜訪史丹福大學人工智慧實驗室（Stanford AI Lab）時見到了那裡的 "E" editor。這種編輯器有著所見即所得的直觀特點，深深打動了史托曼，後來成為了大部分現代純文字編輯器都具有的特性。後來史托曼回到 MIT，那時候 MIT AI lab 的駭客 Carl Mikkelsen 已經給 TECO 加上了稱作「Control-R」的編輯顯示模式，使得螢幕能跟隨使用者的每次輸入重新整理顯示。史托曼重寫了這一模式，使它執行得更有效率，後來又加入了巨集，允許使用者重新定義執行 TECO 程式的鍵位。

這一新版的 TECO 立刻在 AI 實驗室流行開來，並且很快積累起了大量自訂的巨集，這些巨集的名字通常就以「MAC」或者「MACS」結尾，意為「巨集」（macro）。兩年後，蓋伊・史提爾二世承擔起統一當時存在的各種鍵盤命令集的工作。史提爾和史托曼經過一夜奮戰，最終由史托曼完成了這一任務，包括一套擴充套件和注釋新的巨集包的工具。這個完成的系統被稱作 EMACS，代表「Editing MACroS」，也代表「E with MACroS」。

根據史托曼的說法，他採用這個名字是「因為當時 <E> 在 ITS 裡還沒有被當作縮寫用過」。也有說法指出，當時波士頓在 MIT 附近有家名為「Emack & Bolio's」的商店出售的冰淇淋很受歡迎，Dave Moon 是那裡的老主顧，他就將 ITS 上一個給文字排版的程式命名為 BOLIO，然而史托曼並不喜歡甚或根本不知道那種冰淇淋，此事後來成了駭客界的一樁公案。

史托曼意識到過多的客製化、在開發過程中事實上的分支以及針對特殊用途的限制，威脅著 Emacs 的發展。後來他寫道：

最初的 Emacs 同 TECO 一樣只能執行在 PDP 系列的電腦上。Emacs 雖然是在 TECO 的基礎上發展起來的，不過它已經足以被認為是一個新的純文字編輯器了。很快，Emacs 就成為 ITS 上的標準編輯程式，接著由 Michael McMahon 從 ITS 移植到 Tenex 和 TOPS-20 作業系統上。其他 Emacs 早期的貢獻者還包括 Kent Pitman、Earl Killian 和 Eugene Ciccarelli。到了 1979 年，Emacs 已經是 MIT 人工智慧實驗室和它的電腦科學實驗室的主流編輯器了。

### 其他早期實現

後來幾年，程式設計師們寫了很多類 Emacs 的編輯器。其中包括 Michael McMahon 和 Daniel Weinreb 為 Lisp 機器寫的 EINE（「EINE Is Not EMACS」）和 ZWEI（「ZWEI Was EINE Initially」），還有 Owen Theodore Anderson 寫的 Sine。Weinreb 的 EINE 是第一個以 Lisp 實現的 Emacs。1978 年，Bernard Greenberg 寫了 Multics Emacs，大部分由 Multics Lisp 實現。Multics Emacs 後來由 Richard Soley 維護。很多 Emacs 的變種，包括 GNU Emacs，後來都將 Lisp 作為自己的擴充語言。

詹姆斯・高斯林，在 1981 年寫了 Gosling Emacs，他後來還發明了 NeWS 和 Java。作為第一個在 Unix 上執行的類 Emacs 編輯器，Gosling Emacs 由 C 語言實現，並且以 Mocklisp 作為擴充語言。1984 年，Gosling Emacs 成為專有軟體。

### GNU Emacs

1984 年，史托曼開始致力於開發 GNU Emacs，這將是一個自由軟體，以代替專有的 Gosling Emacs。最初 GNU Emacs 是在 Gosling Emacs 的基礎上開發的，不過史托曼後來用一個真正的 Lisp 直譯器代替了原來的 Mocklisp 直譯器，由於 Lisp 直譯器在此軟體中的核心地位，這意味著實際上重寫了幾乎全部原始碼。GNU Emacs 是 GNU 計劃的第一個專案，以 C 語言編寫，將 Emacs Lisp（其直譯器由 C 實現）作為擴充語言。GNU Emacs 最早廣泛釋出的版本是 15.34，出現於 1985 年。實際上版本 2 到 12 並不存在，GNU Emacs 的早期版本都是以「1.x.x」的形式編號，直到 1.12 版時開發人員放棄了這一記法，因為他們認為主版本號是不應該改動的，所以版本號從「1」跳躍到了「13」。因此，Version 13 是第一個 public release，它釋出於 1985 年 3 月 20 日。

GNU Emacs 後來被移植到了 Unix 系統上。它比 Gosling Emacs 擁有更多的的功能，尤其是它有一個真正的 Lisp 作為擴充語言。結果，GNU Emacs 很快就取代了 Gosling Emacs，成為 Unix 系統上預設的 Emacs 編輯器。

到 1999 年為止，GNU Emacs 的開發工作基本是在封閉的情況下進行。這種開發方式在《大教堂和市集》中被稱為「大教堂模式」。從那以後，GNU Emacs 專案建立了公共開發郵寄清單和匿名 CVS 原始碼存取，開發工作在一個 CVS 原始碼倉庫中進行。2008 年，Emacs 開始使用 Bazaar 進行版本控制。

史托曼是 GNU Emacs 的主要維護者，但他曾經有幾次把維護工作交給別人。他於 2008 年將原始碼的維護工作交給了 Stefan Monnier 和 Chong Yidong。他在 mail list 上發出以下內容： 

### XEmacs

1991 年，Lucid 公司的 Jamie Zawinski 等人以 GNU Emacs 19 的一個早期 alpha 版為基礎，添加了一些新的特性，開發出 Lucid Emacs。很快，Lucid Emacs 的開發與 GNU Emacs 漸行漸遠，最終雙方的團隊放棄了將兩者合併的努力。Lucid Emacs 被重新命名為 XEmacs；至今為止，XEmacs 仍然是最流行的 Emacs 變種之一。

### 其他 GNU Emacs 的衍生版本

其他的衍生版本，包括：

* Meadow - 一個 Windows 下的日語版本
* SXEmacs - Steve Youngs 實現的衍生版本，基於 XEmacs
* Aquamacs - 一個致力於與蘋果的 OS X 整合的 Emacs 版本

### 其他 Emacs 變種

除上述編輯器以外，還有很多不基於 GNU Emacs 的編輯器，有些專案的目標是建立一個精簡版的 Emacs。在 1980 年代，GNU Emacs 只能在很高端的電腦上執行，這就為精簡版的 Emacs 實現的出現奠定了基礎。還有一些 Emacs 變種是為了克隆一個完整的 Emacs，但是使用不同的 Lisp 方言或者其他的程式語言。比如：

* MicroEMACS，原作者是 Dave Conroy，後來由 Daniel Lawrence 進一步開發，有很多變種。
* Mg，原名 MicroGNUEmacs，是一個 MicroEMACS 的公共領域分支，比 MicroGNUEmacs 更加接近於 GNU Emacs。現在預設安裝在 OpenBSD 上。
* NotGNU，一個小型、快速的 Emacs 實現，是免費軟體，支援 DOS、Win16、Win32 和 GNU/Linux，作者為 Julie Melbin。
* JOVE（Jonathan's Own Version of Emacs），Jonathan Payne 為類 Unix 系統寫的 Emacs 不可程式化的 Emacs 實現。
* Zile 是 _Zile Is Lossy Emacs_ 的遞迴縮寫，以 C 語言編寫。
* Climacs，以 Common Lisp 編寫的 Emacs 變種。
* QEmacs，一個由 Fabrice Bellard 編寫的小型編輯器，支援 UTF-8，可以快速編輯上百兆大小的檔案。
* Epsilon，一個由 Lugaru Software 開發的 Emacs 變種。支援 MS-DOS、MS-Windows、GNU/Linux、FreeBSD、O/S 2 等作業系統。它使用了一個與 C 語言語法類似的非 Lisp 語言作為擴充語言。
* EmACT，1986 年由 Christian Jullien 從 MicroEmacs 衍生而來，原始碼可以在 SourceForge 取得。
* Hemlock，最初以 Spice Lisp 實現，後來改為 Common Lisp。Hemlock 是 CMU Common Lisp 的一部分，受到了 Zmacs 的影響。

### 可以類比 Emacs 的編輯器

* Yi，以 Haskell 語言編寫，內建一個 Emacs 模擬器。
* Joe's Own Editor 內建一個 Emacs 模擬器。
* JED 內建一個 Emacs 模擬器。

## 著作權

Emacs 的著作權遵從 GNU 通用公眾授權條款，賦予他人自由地對包括 C 和 Lisp 在內的 Emacs 原始檔進行修改和再發行的權利。較早版本的 GNU Emacs 文件是在一種對等（ad-hoc）的授權下釋出的，要求所有修改過的副本都要包含某些特定的文字。例如，GNU Emacs 的使用者手冊中必須包含如何獲得 GNU Emacs 的說明，以及理查・史托曼的文章 ——《GNU 宣言》。作為較早版本的 GNU Emacs 的分支，XEmacs 的手冊也採用相同的使用授權。較新版本的 GNU Emacs 文件則採用《GNU 自由文檔許可證》，以使用「不變段落」（"invariant sections"）的形式包含有同樣的文字，並且要求這些文件自我聲明為「GNU 手冊」（_GNU Manuals_）。

## 功能特點

Emacs 不僅僅是一個編輯器，它是一個整合環境，或可稱它為整合式開發環境，這些功能如讓使用者置身於全功能的作業系統中。Emacs 可以：

* 收發電子郵件、上新聞群組（Gnus）
* 無縫直接編輯遠端檔案（Tramp）
* 通過 Telnet 登入遠端主機
* 操作殼層（M-x EShell，Term）
* 結合 git, mercurial 等版本控制系統並直接操作（Magit，VC）
* 上 Twitter（Twittering-mode）
* 登錄 IRC 和朋友交流（M-x ERC，rcirc）
* 電子資料表
* 類比其他編輯器，如 vi（Evil-mode）、WordStar、EDT、TPU 等
* 編輯 Wiki (Wikipedia-mode)
* 對多種程式語言的編輯，如 C/C++、Perl、Python、Lisp 等等
* 除錯程式，結合 GDB，EDebug 等。
* 玩遊戲
* 計算機
* 心理諮詢（M-x doctor）
* 煮咖啡
* 記筆記、日記（Org-mode）
* 管理日程，Task，待辦事項（ToDo），約會等 GTD（Org-mode）
* 寫作與出版（Org-mode，Muse-mode）
* 目錄管理（Dired）
* 檔案比較、合併（Ediff）
* 閱讀 info 和 man 文件（M-x info，woman）
* 瀏覽網站（M-x eww）
* 為各種程式（TeX、LaTeX 等）提供統一的操作介面
* ……

此外 Emacs 還有如下特點：

1. 即時編輯器
2. Self-documenting
3. 可客製化性
4. 可延伸性（整合 Lisp 語言）

### 可客製化性

GNU Emacs 幾乎所有的功能都可以客製化，有的可以通過 C 語言實現，有的可以通過一個 Lisp 的方言 ——Emacs Lisp 來實現。在 Lisp 環境中，變數和子程式可以在不重新編譯 / 啟動 Emacs 的前提下被修改。Emacs 使用者可以根據自身的需要和偏好對編輯器進行客製化。強大而自由的個人客製化功能是 Emacs 受到廣泛歡迎的重要原因之一。客製化 Emacs 主要有三種方法：

1. 使用 Emacs 的互動式客製化功能（即 **customize**）。Emacs 提供了圖形化的互動介面，使使用者能夠對可客製化的公共變數進行設定，也可以客製化配色主題。這種方法使 Emacs 的初學者不需要接觸 Emacs Lisp 原始碼即可完成客製化。
2. 將一系列按鍵記錄為巨集，呼叫這一巨集可以自動重複進行已經記錄的一系列複雜操作。巨集可以儲存並命名，以便按名呼叫，不過同一時刻只能存在一個匿名的巨集。
3. 通過使用 Emacs Lisp 完成 Emacs 的客製化。這種方法最為複雜，但是也提供了更多的靈活性和更強大的功能。使用者通常將個人客製化的 Emacs Lisp 原始碼儲存在一個名為 `.emacs(.el)`（或 init.el）的設定檔中，Emacs 程式執行之初便讀取這一檔案，完成使用者要求的組態。使用者可以通過 `.emacs` 檔案重設變數、重新定義按鍵的繫結（key bindings）、以及定義新的命令，以方便使用者個人的使用。很多進階使用者的 `.emacs` 檔案的個性化組態長達數百行甚至更多，這些個人的客製化使他們的 Emacs 不僅與預設組態的功能不同，每個人的 Emacs 之間也千差萬別。這種差異能很好的滿足不同個性的偏好和不同工作的需求。

如果一段 Emacs Lisp 原始碼確實有用，它通常會被打包並發布給其他使用者。在網際網路上能找到很多這樣來自第三方的 Emacs Lisp 庫，例如能用於編輯維基百科條目的 wikipedia-mode。Usenet 上的新聞群組 gnu.emacs.sources 專門釋出新的 Emacs Lisp 庫。有些第三方原始碼最終還成為了 Emacs 的一部分。

手工組態安裝各種 Emacs Lisp 原始碼畢竟有些麻煩。為了解決這個問題，Emacs 24 內建包管理器 ELPA（package.el）。使用者可以方便的瀏覽可用的包（M-x package-list-packages）和自動下載安裝套件（M-x package-install）。詳細資訊可以參考 Emacs Wiki 上的 ELPA 詞條（頁面存檔備份，存於網際網路檔案館）。

### 效能

在 GNU Emacs 剛誕生時，它比相同系統上的其他編輯器執行速度要慢很多，但是現代的電腦可以很快地執行 GNU Emacs。早期的 GNU Emacs 可以處理 256 MB 以下的檔案，GNU Emacs 23.2 將這一限制提升到 512 MB，而在 64 位元系統的 GNU Emacs 24 中，這個限制是大約 2 EiB。

### 平台

Emacs 是目前世界上最具可移植性的重要軟體之一，能夠在當前絕大多數作業系統上執行，包括各種類 Unix 系統（GNU/Linux、FreeBSD、NetBSD、OpenBSD、Solaris、AIX、OS X 等）、MS-DOS、Microsoft Windows 等。甚至在 Android 和諾基亞的 Maemo 上，Emacs 也能執行。

GNU Emacs 既可以在文字終端也可以在圖形化使用者介面環境下執行。在類 Unix 系統上，GNU Emacs 使用 X-Window 產生 GUI，或者直接使用「框架」（widget toolkit），例如 Motif、LessTif 或 GTK + 等等。Emacs 也能夠利用 OS X 和 Microsoft Windows 的本地圖形系統產生 GUI。用 GUI 環境下的 Emacs 能提供選單欄（Menubar）、工具列（toolbar）、捲軸以及環境選單（context menu）等互動方式。

### 編輯模式

#### 主模式

Emacs 採取的編輯方式是對不同類型的文字進入相應的編輯模式，即「主模式」（major mode）。Emacs 針對多種文件定義了不同的主模式，包括普通文字檔案、各種程式語言的原始檔、HTML 文件、TEX 與 LaTeX 文件，以及其他類型的文字檔案等等。

每種主模式都有特殊的 Emacs Lisp 變數和函式，使使用者在這種模式下能更方便的處理這一特定類型的文字。例如，各種程式語言的主模式通常會提供：

* 語法突顯（「font lock」）：對原始檔文字中的關鍵字、注釋加以不同的字型和顏色（「faces」）。
* 自動縮排，用來維護檔案的格式一致。
* 自動插入檔案所需要的結構元素，如空格、換行以及括號。
* 特殊的編輯命令，比如跳轉到函式的開頭或者結尾，或者（在類似於 XML 的標記式語言中）驗證文件還有插入關閉標籤。

#### 次模式

Emacs 還能進一步定義「次模式」（minor mode），用以深度客製化 Emacs。一個 GNU Emacs 的緩衝區（buffer）只能關聯於一種主模式，卻能同時關聯多個次模式。比如，編寫 C 語言的主模式可以同時定義多個次模式，每個次模式有著不同的縮排風格（indent style）。

### 國際化

Emacs 支援對多種文字的文字編輯，加上對多種字元集、字母系統、書寫系統，以及不同文化的書寫習慣都提供了支援，使得世界上大多數語言的使用者都能通過 Emacs 進行文字處理。Emacs 還能通過呼叫諸如 Aspell 這樣的外部程式，實現多種語言的拼寫檢查。GNU Emacs 24 添加了對雙向文字的支援。

Emacs 支援包括 UTF-8 在內的諸多編碼系統。GNU Emacs 從 23 開始以 UTF-8 作為自身的編碼系統，而在之前的版本，Emacs 擁有一種特殊的內部編碼系統 MULE（MULti-language Environment），在讀寫檔案時進行編碼和解碼。XEmacs 編碼系統和 GNU Emacs 相似，但具體的實現方法不完全一樣。

一個叫做 Emacspeak 的子系統可以通過音訊回饋，讓擁有視覺障礙的使用者和盲人使用者使用 Emacs。

## 使用 Emacs

### 命令

在普通的編輯模式下，GNU Emacs 和其他純文字編輯器一樣，允許使用者通過按下鍵盤上的鍵插入其相對應的字元，也可以使用鍵盤上的方向鍵來移動游標。使用各種修飾鍵（如 [Ctrl]、[Alt]、[Shift] 等）和其它的普通鍵配合可以呼叫 Emacs Lisp 函式和巨集。

某些 GNU Emacs 命令會呼叫外部程式，比如使用 Aspell 進行拼寫檢查或者使用 GCC 進行程式編譯，解析被呼叫的外部程式的輸出，並將結果顯示出來。習慣 IBM Common User Access 的使用者可以使用「cua-mode」，「cua-mode」曾經是一個第三方外掛程式，從 GNU Emacs 22 開始被包含在 Emacs 中。

下表給出了一些基本命令。[Ctrl] 鍵以大寫 _C_ 表示，[Meta] 鍵 [Alt] 鍵以大寫 _M_ 表示。

註：中文系統 C-[空格] 一般為系統輸入法，可使用 C-@代替。

### 小緩衝

Emacs 使用「小緩衝」（通常在最下面一行）顯示資訊提示以及輸入命令和命令參數。在合適的情況下，小緩衝支援使用製表鍵或空格鍵補全。每個 frame 只有一個小緩衝。

### 檔案管理與顯示

Emacs 將文字存放在緩衝區中。使用者可以建立新的緩衝區，也可以關閉不需要的緩衝區，Emacs 可以同時存在很多緩衝區。大部分的緩衝區的文字來自文字檔案，使用者可以編輯緩衝區的內容，並且儲存到磁碟上。緩衝區也可以儲存臨時文字，比如「help」庫顯示的文件字串。

### 程式語言支援

#### Python

* Emacs 內建的 python-mode
* Elpy

### Emacs 小拇指

很多 Emacs 使用者都有過重複性勞損的經歷，原因是 Emacs 強烈依賴 Ctrl 鍵和 Meta 鍵，也由於 Ctrl 鍵在現代鍵盤中的位置。

解決方法有軟體方法，也有硬體方法。軟體方法包括：

* 使用 ergoemacs-mode 客製化鍵盤配置。
* 客製化鍵盤配置，使 Ctrl 和大寫鎖定鍵交換位置。其他相似的方法包括將大寫鎖定鍵定義為 Ctrl，或交換 Ctrl 和 Meta 鍵。
* god-mode 可以讓 Emacs 不用修飾鍵就觸發命令。
* 使用 evil-mode，一個進階的 Vim 類比層。
* Emacs 有一個內建的「Viper-mode」，允許使用者使用 vi 的鍵繫結來進行基本的文字編輯，而使用 Emacs 本身的鍵繫結來進行更進階的操作。
* 讓一個更容易按的鍵（如空格鍵）擁有多種功能，當那個鍵和其他鍵一起按下時，功能為 Ctrl 鍵的。
* 使用語音輸入控制 Emacs。
* 很多軟體，如 xwrits，可以提醒使用者進行定期的休息。

硬體方法包括使用特殊的鍵盤，如 Kinesis 鍵盤的修飾鍵放在大拇指很容易按到的位置，或者微軟自然鍵盤，它的修飾鍵對稱的放置在鍵盤的兩邊，並且可以使用手掌按下。腳控踏板也是一種方法。

如果使用普通鍵盤，可以在按 Ctrl 組合鍵時手掌下移，用無名指擊 Ctrl，或者直接以小指掌骨壓下 Ctrl，以規避小指過度利用。

「Emacs 小拇指」是近些年才出現的。在 Emacs 誕生時，鍵盤的 Ctrl 鍵非常大，並且在空格鍵的旁邊，使用大拇指很容易按。

Vim 的擁護者經常以 Emacs 小拇指作為切換編輯器的原因，雖然有些 Vim 使用者（因為相似的原因）也會交換模式轉換鍵和大小寫轉換鍵的功能。

## 外部連結

* GNU Emacs 官方網站（頁面存檔備份，存於網際網路檔案館），包括：
  * GNU Emacs 常見問題解答（頁面存檔備份，存於網際網路檔案館）
  * GNU Emacs for Windows 常見問題解答（頁面存檔備份，存於網際網路檔案館）
* A paper on the design of the original Emacs（頁面存檔備份，存於網際網路檔案館），by Stallman
* "Multics Emacs: The History, Design and Implementation"（頁面存檔備份，存於網際網路檔案館） by B. Greenberg
* "Emacs Timeline"（頁面存檔備份，存於網際網路檔案館） by J. Zawinski
* "List of Emacs implementations" by C. Finseth
* Reviewed entry（頁面存檔備份，存於網際網路檔案館） in the Free Software Directory
* Emacs 實現列表（頁面存檔備份，存於網際網路檔案館）
* WikEmacs（頁面存檔備份，存於網際網路檔案館）
* Emacs 中文網 (已失效)
* Emacs China 中文論壇（頁面存檔備份，存於網際網路檔案館）
* 中文 Emacs User's Guide
* IBM dw 教程：生活在 Emacs 中
* Emacs Wiki（頁面存檔備份，存於網際網路檔案館）：一個關於 **Emacs** 的 wiki。網站上有英語、漢語等多種語言。EmacsWiki 主要是提供一些 Emacs 的使用教程、技巧和使用者貢獻的設定檔。像其他 wiki 一樣，所有人都可以編輯。不過 EmacsWiki 沒有註冊的制度，不需要帳戶就可以編輯整個 wiki。

## 參考文獻

* 註：本文第一部分，部分參照自遵守 GFDL 的《Emacs 使用者指南》漢譯版

## 參見

* 檔案編輯器比較
* 使用 Emacs 編輯維基百科
* GNU TeXmacs