Emacs

Emacs，是一個文字編輯器家族，它具有可擴充套件性，使用者以程式設計師和其他以技術工作為主的計算機使用者為主。最初由理查德·斯托曼於1975年在MIT協同蓋伊·史提爾二世共同完成。這一創意的靈感TECO宏編輯器TECMAC和TMACS，它們是由蓋伊·史提爾二世、#重定向 、李察·格連布勒、Charles Frankston等人編寫的宏文字編輯器。自誕生以來，Emacs演化出了眾多分支，其中使用最廣泛的兩種分別是：1984年由理查·斯托曼發起並由他維護至2008年的GNU Emacs，以及1991年發起的XEmacs。XEmacs是GNU Emacs的分支，至今仍保持著相當的相容性。它們都使用了Emacs Lisp這種有著極強擴充套件性的程式語言，從而實現了包括程式設計、編譯乃至網路瀏覽等等功能的擴充套件。在Unix文化裡，Emacs是駭客們關於編輯器之戰的兩大主角之一，它的對手是vi。歷史.Emacs在1970年代誕生於MIT人工智慧實驗室的行編輯器。與現代的文字編輯器不同，TECO將擊鍵、編輯和文字顯示按照不同的模式進行處理，稍晚出現的vi與它有些類似。在TECO上擊鍵並不會直接將這些字元插入到文件裡去，必須先輸入一系列相應的TECO指令，而被編輯的文字在輸入命令的時候是不會顯示在螢幕上的。在如今還在使用的UNIX編輯器ed上，我們還能看到類似的工作方式。1970年代初，-{zh-tw:理查·史託曼;zh-cn:理查德·斯托曼}--{zh-tw:拜訪;zh-cn:訪問}--{zh-tw:史丹福大學人工智慧實驗室;zh-cn:斯坦福大學人工智慧實驗室}-時見到了那裡的"E" editor。這種編輯器有著所見即所得的直觀特點，深深打動了-{zh-tw:史託曼;zh-cn:斯托曼}-，後來成為了大部分現代文字編輯器都具有的特性。後來斯托曼回到MIT，那時候MIT AI lab的駭客Carl Mikkelsen已經給TECO加上了稱作“Control-R”的編輯顯示模式，使得螢幕能跟隨使用者的每次擊鍵重新整理顯示。斯托曼重寫了這一模式，使它執行得更有效率，後來又加入了宏，允許使用者重新定義執行TECO程式的鍵位。這一新版的TECO立刻在AI實驗室流行開來，並且很快積累起了大量自定義的宏，這些宏的名字通常就以“MAC”或者“MACS”結尾，意為“宏”。兩年後，蓋伊·史提爾二世承擔起統一當時存在的各種鍵盤命令集的工作。史提爾和斯托曼經過一夜奮戰，最終由斯托曼完成了這一任務，包括一套擴充套件和註釋新的宏包的工具。這個完成的系統被稱作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人工智慧實驗室和它的計算機科學實驗室的主流編輯器了。其他早期實現.後來幾年，程式設計師們寫了很多類Emacs的編輯器。其中包括Michael McMahon和Daniel Weinreb為Lisp機器寫的EINE，還有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作為擴充套件語言。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的衍生版本.其他的衍生版本，包括：其他Emacs變種.除上述編輯器以外，還有很多不基於GNU Emacs的編輯器，有些專案的目標是建立一個精簡版的Emacs。在1980年代，GNU Emacs只能在很高階的電腦上執行，這就為精簡版的Emacs實現的出現奠定了基礎。還有一些Emacs變種是為了克隆一個完整的Emacs，但是使用不同的Lisp方言或者其他的程式語言。比如：版權.Emacs的版權遵從GNU通用公共許可證，賦予他人自由地對包括C和Lisp在內的Emacs原始檔進行修改和再發行的權利。較早版本的GNU Emacs文件是在一種點對點。功能特點.Emacs不僅僅是一個編輯器，它是一個整合環境，或可稱它為整合開發環境，這些功能如讓使用者置身於全功能的作業系統中。Emacs可以：此外Emacs還有如下特點：可定製性.GNU Emacs幾乎所有的功能都可以定製，有的可以透過C語言實現，有的可以透過一個Lisp的方言——Emacs Lisp來實現。在Lisp環境中，變數和子程式可以在不重新編譯/啟動Emacs的前提下被修改。Emacs使用者可以根據自身的需要和偏好對編輯器進行定製。強大而自由的個人定製功能是Emacs受到廣泛歡迎的重要原因之一。定製Emacs主要有三種方法：如果一段Emacs Lisp程式碼確實有用，它通常會被打包併發布給其他使用者。在因特網上能找到很多這樣來自第三方的Emacs Lisp庫，例如能用於編輯維基百科條目的。Usenet上的新聞組gnu.emacs.sources專門釋出新的Emacs Lisp庫。有些第三方程式碼最終還成為了Emacs的一部分。手工配置安裝各種Emacs Lisp程式碼畢竟有些麻煩。為了解決這個問題，Emacs 24自帶包管理器ELPA。效能.在GNU Emacs剛誕生時，它比相同系統上的其他編輯器執行速度要慢很多，但是現代的電腦可以很快地執行GNU Emacs。早期的GNU Emacs可以處理256 MB以下的檔案，GNU Emacs 23.2將這一限制提升到512 MB，而在64位系統的GNU Emacs 24中，這個限制是大約2 EiB。平臺.Emacs是目前世界上最具可移植性的重要軟體之一，能夠在當前絕大多數作業系統上執行，包括各種類Unix系統、MS-DOS、Microsoft Windows等。甚至在Android和諾基亞的Maemo上，Emacs也能執行。GNU Emacs既可以在文字終端也可以在圖形使用者介面環境下執行。在類Unix系統上，GNU Emacs使用X-Window產生GUI，或者直接使用“框架”等互動方式。編輯模式.主模式.Emacs採取的編輯方式是對不同型別的文字進入相應的編輯模式，即“主模式”。Emacs針對多種文件定義了不同的主模式，包括普通文字檔案、各種程式語言的原始檔、HTML文件、TEX與LaTeX文件，以及其他型別的文字檔案等等。每種主模式都有特殊的Emacs Lisp變數和函式，使使用者在這種模式下能更方便的處理這一特定型別的文字。例如，各種程式語言的主模式通常會提供：次模式.Emacs還能進一步定義“次模式”。國際化.Emacs支援對多種文字的文字編輯，加上對多種字符集、字母系統、書寫系統，以及不同文化的書寫習慣都提供了支援，使得世界上大多數語言的使用者都能透過Emacs進行文字處理。Emacs還能透過呼叫諸如Aspell這樣的外部程式，實現多種語言的拼寫檢查。GNU Emacs 24添加了對雙向文字的支援。Emacs支援包括UTF-8在內的諸多編碼系統。GNU Emacs從23開始以UTF-8作為自身的編碼系統，而在之前的版本，Emacs擁有一種特殊的內部編碼系統MULE，在讀寫檔案時進行編碼和解碼。XEmacs編碼系統和GNU Emacs相似，但具體的實現方法不完全一樣。一個叫做Emacspeak的子系統可以透過音訊反饋，讓擁有視覺障礙的使用者和盲人使用者使用Emacs。使用Emacs.命令.在普通的編輯模式下，GNU Emacs和其他文字編輯器一樣，允許使用者透過按下鍵盤上的鍵插入其相對應的字元，也可以使用鍵盤上的方向鍵來移動游標。使用各種修飾鍵和其它的普通鍵配合可以呼叫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”庫顯示的文件字串。Emacs小拇指.很多Emacs使用者都有過重複性勞損的經歷，原因是Emacs強烈依賴Ctrl鍵和Meta鍵，也由於Ctrl鍵在現代鍵盤中的位置。解決方法有軟體方法，也有硬體方法。軟體方法包括：硬體方法包括使用特殊的鍵盤，如Kinesis鍵盤的修飾鍵放在大拇指很容易按到的位置，或者微軟自然鍵盤，它的修飾鍵對稱的放置在鍵盤的兩邊，並且可以使用手掌按下。腳控踏板也是一種方法。如果使用普通鍵盤，可以在按Ctrl組合鍵時手掌下移，用無名指擊Ctrl，或者直接以小指掌骨壓下Ctrl，以規避小指過度利用。“Emacs小拇指”是近些年才出現的。在Emacs誕生時，鍵盤的Ctrl鍵非常大，並且在空格鍵的旁邊，使用大拇指很容易按。Vim 的擁護者經常以Emacs小拇指作為切換編輯器的原因，雖然有些 Vim 使用者也會交換模式轉換鍵和大小寫轉換鍵的功能。