Emacs

Emacs（，源自 Editor MACroS，宏編輯器），是一個文字編輯器家族，它具有可擴充套件性，使用者以程式設計師和其他以技術工作為主的計算機使用者為主。最初由理查德・斯托曼於 1975 年在 MIT 協同蓋伊・史提爾二世共同完成。這一創意的靈感來源於 TECO 宏編輯器 TECMAC 和 TMACS，它們是由蓋伊・史提爾二世、、李察・格連布勒、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”。

根據斯托曼的說法，他採用這個名字是 “因為當時在 ITS 裡還沒有被當作縮寫用過”。也有說法指出，當時波士頓在 MIT 附近有家名為 “” 的商店出售的冰淇淋很受歡迎，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 人工智慧實驗室和它的計算機科學實驗室的主流編輯器了。

1.1 其他早期實現

後來幾年，程式設計師們寫了很多類 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 成為專有軟體。

1.2 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 上發出以下內容：

1.3 XEmacs

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

1.4 其他 GNU Emacs 的衍生版本

1.5 其他 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 的影響。

1.6 可以模擬 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 還有如下特點：

即時編輯器
Self-documenting
可定製性
可擴充套件性（整合 Lisp 語言）

3.1 可定製性

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

使用 Emacs 的互動式定製功能（即 customize）。Emacs 提供了圖形化的互動介面，使使用者能夠對可定製的公共變數進行設定，也可以定製配色主題。這種方法使 Emacs 的初學者不需要接觸 Emacs Lisp 程式碼即可完成定製。
將一系列按鍵記錄為宏，呼叫這一宏可以自動重複進行已經記錄的一系列複雜操作。宏可以儲存並命名，以便按名呼叫，不過同一時刻只能存在一個匿名的宏。
透過使用 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 詞條。

3.2 效能

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

3.3 平臺

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）等互動方式。

3.4 編輯模式

3.4.1 主模式

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

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

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

3.4.2 次模式

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

3.5 國際化

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

4.1 命令

在普通的編輯模式下，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-@代替。

4.2 小緩衝

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

4.3 檔案管理與顯示

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

4.4 程式語言支援

4.4.1 Python

Emacs 內建的 python-mode
Elpy

4.5 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 使用者（因為相似的原因）也會交換模式轉換鍵和大小寫轉換鍵的功能。