Emacs

文字編輯器家族

Emacs/ˈmæks/,源自Editor MACroS巨集編輯器),是一個純文字編輯器家族,它具有可延伸性,用戶以程式設計師和其他以技術工作為主的電腦用戶為主。最初由理查德·史托曼於1975年在MIT協同蓋伊·史提爾二世共同完成。這一創意的靈感來源於TECO巨集編輯器TECMAC和TMACS,它們是由蓋伊·史提爾二世David Moon英語David A. Moon李察·格連布勒、Charles Frankston等人編寫的巨集純文字編輯器。

GNU Emacs
GNU Emacs 23.1.1,首個在X Window系統上支援反鋸齒的版本。
GNU Emacs 23.1.1,首個在X Window系統上支援反鋸齒的版本。
原作者理查·史托曼蓋伊·史提爾二世
開發者GNU計劃
目前版本29.4[1]在維基數據編輯(2024年6月)
作業系統GNU/LinuxFreeBSDAIX 4.3.3或更高、macOSMS-DOSWindowsNetBSDOpenBSDSolaris
類型純文字編輯器
特許條款GNU通用公眾特許條款

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

Unix文化裏,Emacs是黑客們關於編輯器之戰的兩大主角之一,它的對手是viVim)。

歷史

編輯

Emacs在1970年代誕生於MIT人工智能實驗室(MIT AI Lab)。在此之前,人工智能實驗室的PDP-6PDP-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裏還沒有被當作縮寫用過」[2]。也有說法指出,當時波士頓在MIT附近有家名為「Emack & Bolio's英語Emack & Bolio's」的商店出售的雪糕很受歡迎,Dave Moon是那裏的老主顧,他就將ITS上一個給文字排版的程式命名為BOLIO,然而史托曼並不喜歡甚或根本不知道那種雪糕,此事後來成了黑客界的一樁公案。

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

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

其他早期實現

編輯

後來幾年,程式設計師們寫了很多類Emacs的編輯器。其中包括Michael McMahon和Daniel WeinrebLisp機器寫的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,他後來還發明了NeWSJava。作為第一個在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 MonnierChong Yidong[4]。他在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實現。
  • ZileZile 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的編輯器

編輯

著作權

編輯

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++、PerlPythonLisp等等
  • 除錯程式,結合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)
  • 為各種程式(TeXLaTeX等)提供統一的操作介面
  • ……

此外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-modeUsenet上的新聞組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/LinuxFreeBSDNetBSDOpenBSDSolarisAIXOS X等)、MS-DOSMicrosoft Windows等。甚至在Android和諾基亞的Maemo上,Emacs也能執行。

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

編輯模式

編輯

主模式

編輯

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

每種主模式都有特殊的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表示。

命令 快速鍵 功能
forward-word M-f 向前移動一個單詞。
isearch-forword C-s 遞增搜尋
undo C-/ 復原最後一次操作,如果多次執行則取消以前的操作。
keyboard-quit C-g 取消當前的命令。
find-file C-x C-f 在一個新的緩衝區里訪問某個檔案(用戶給定檔名)。
save-buffer C-x C-s 將緩衝區的內容儲存到檔案。
save-some-buffers C-x s 儲存所有的緩衝區
save-with-newname C-x C-w 將緩衝區的內容另存為一個新的檔案。
save-buffers-kill-emacs C-x C-c 提示是否儲存檔案,然後退出Emacs。
set-mark-command C-[空格] 設定標記,用於剪下或複製。
kill-region C-w 剪下標記到當前游標所在處的文字。
kill-ring-save M-w 複製標記到當前游標所在處的文字。
yank C-y 從Emacs的剪貼簿中貼上文字。
kill-buffer C-x k 關閉當前buffer。

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

小緩衝

編輯

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

檔案管理與顯示

編輯

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

程式語言支援

編輯

Python

編輯
  • Emacs 內建的 python-mode
  • Elpy

Emacs小拇指

編輯

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

解決方法有軟件方法,也有硬件方法。軟件方法包括:

  • 使用 ergoemacs-mode 客製化鍵盤配置。[5]
  • 客製化鍵盤配置,使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 用戶(因為相似的原因)也會交換模式轉換鍵和大小寫轉換鍵的功能。[6]

外部連結

編輯

參考文獻

編輯
  1. ^ Emacs 29.4 released. 
  2. ^ 原文:because <E> was not in use as an abbreviation on ITS at the time.
  3. ^ 原文:EMACS was distributed on a basis of communal sharing, which means all improvements must be given back to me to be incorporated and distributed.
  4. ^ Re: Looking for a new Emacs maintainer or team. gnu.org Mailing List. [2008-02-23]. (原始內容存檔於2011-06-03). (英文),參見"Stallman on handing over GNU Emacs, its future and the importance of nomenclature"頁面存檔備份,存於互聯網檔案館(英文)
  5. ^ ergoemacs-mode. [2015-02-17]. (原始內容存檔於2015-06-27). 
  6. ^ VimとEmacsのあいだで小指痛を叫んだけもの. 2007-10-14 [2015-02-17]. (原始內容存檔於2015-02-17) (日語). 
  7. ^ GNU Emacs的终极扩展管理工具— el-get. Emacs中文網. [2012-05-29]. (原始內容存檔於2012-06-20). 
  8. ^ Emacs Wiki. [2012-05-29]. (原始內容存檔於2012-05-23). 
  9. ^ redguardtoo. 一年成为Emacs高手(像神一样使用编辑器). csdn. [2012-05-29]. (原始內容存檔於2013-04-30). 
  10. ^ EmacsWiki: Site Map. [2012-05-29]. (原始內容存檔於2012-12-06). You can edit this website. There’s a link, Edit this page, at the bottom of this and other pages. Please check SiteMap Discussion before editing this SiteMap page, however. 
  • 註:本文第一部分,部分參照自遵守GFDL的《Emacs用戶指南》漢譯版

參見

編輯