Emacs


Emacs (简体)

Free Web Hosting with Website Builder
Emacs
  • Emacs
  • GNU Emacs
  • XEmacs
  • Emacs Lisp
  • 其他著名的Emacs變種
    • MicroEMACS
    • mg
    • Freemacs
    • Zile (editor)
編輯

Emacs是一種強大的純文字編輯器,在程式設計師和其他以技術工作為主的計算機用戶中廣受歡迎。EMACS,即Editor MACroS巨集編輯器)的縮寫,最初由Richard Stallman1975年MIT協同Guy Steele共同完成。這一創意的靈感來源於TECMAC和TMACS,它們是由Guy Steele、Dave Moon、Richard Greenblatt、Charles Frankston等人編寫的巨集純文字編輯器。自誕生以來,Emacs演化出了眾多分支,其中使用最廣泛的兩種分別是:1984年由Richard Stallman發起並由他維護至今的GNU Emacs,以及1991年發起的XEmacs。XEmacs是GNU Emacs的分支,至今仍保持著相當的兼容性。它們都使用了Emacs Lisp這種有著極強擴充性的程式語言,從而實現了包括程設、編譯乃至網路瀏覽等等功能的擴充套件。

Unix文化裡,Emacs是駭客們關於編輯器優劣之爭的兩大主角之一,它的對手是vi


Richard Stallman 於 2008 年初宣佈不再維護 GNU Emacs. 他在 mail list 上發出以下內容:

From: Richard Stallman

Subject: Re: Looking for a new Emacs maintainer or team
Date: Fri, 22 Feb 2008 17:57:22 -0500
Stefan 和 Yidong 願意接管,所以我也樂意將Emacs開發工作移交給他們。


目錄

歷史

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

1970年代初,Richard Stallman訪問Stanford AI Lab時見到了那裡的"E" editor。這種編輯器有著所見即所得的直觀特點,深深打動了Stallman。後來Stallman回到MIT,那時候MIT AI lab的駭客Carl Mikkelsen 已經給TECO加上了稱作「Control-R」的編輯顯示模式,使得螢幕能跟隨用戶的每次輸入刷新顯示。Stallman重寫了這一模式,使它運行得更有效率,後來又加入了巨集,允許用戶重新定義運行TECO程式的鍵位。

這一新版的TECO立刻在AI實驗室流行開來,並且很快積累起了大量自定義的巨集,這些巨集的名字通常就以「MAC」或者「MACS」結尾,意為「巨集」(macro)。兩年後,Guy Steele承擔起統一當時存在的各種鍵盤命令集的工作。Steele和Stallman經過一夜奮戰,最終由Stallman完成了這一任務,包括一套擴充套件和註釋新的巨集包的工具。這個完成的系統被稱作EMACS,代表「Editing MACroS」。根據Stallman的說法,他採用這個名字是「因為當時<E>在ITS裡還沒有被當作縮寫用過。」("because <E> was not in use as an abbreviation on ITS at the time." )也有說法指出,當時波士頓在MIT附近有家名為「Emack & Bolio's」的商店出售的雪糕很受歡迎,Dave Moon是那裡的老主顧,他就將ITS上一個給文本排版的程式命名為BOLIO,然而Stallman並不喜歡甚或根本不知道那種雪糕,此事後來成了駭客界的一樁公案。

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

Emacs的發布基於社群共享,這意味著所有的發展都要反饋給我,由我進行整合和發布。("EMACS was distributed on a basis of communal sharing, which means all improvements must be given back to me to be incorporated and distributed."

最初的Emacs同TECO一樣只能運行在PDP-10系統。Emacs雖然是在TECO的基礎上發展起來的,不過它已經足以被認為是一個新的純文字編輯器了。很快,Emacs就成為ITS上的標準編輯程式,接著由Michael McMahon移植到Tenex和TOPS-20系統上。

其他 emacs

圖形環境下的GNU Emacs界面。

隨後的幾年裡,開發出了許多運行於其他作業系統的類Emacs的編輯器,包括由Michael McMahon和Daniel Weinreb編寫的SINE(Sine is not EMACS)、EINE("EINE Is Not EMACS)以及ZWEI(「ZWEI Was EINE Initially」,工作于Lisp機器),它們的名字在德語中分別是「一」和「二」的意思。1978年,Honeywell的Cambridge Information Systems Lab的Bernard Greenberg用Maclisp(Lisp語言的一種)編寫出Multics Emacs,第一次完全採用Lisp作為擴充語言。Lisp語言提供了前所未有的靈活性,因此被後來的Emacs開發者沿用。

最早在Unix上運行的Emacs類編輯器是1981年James Gosling編寫的Gosling Emacs(Gosling後來發明了Java程式語言)。Gosling Emacs以C語言編寫,使用Mocklisp作為擴充語言,Mocklisp有著類似Lisp語言的語法。1984年,Gosling Emacs成為專有軟體Proprietary software)。

GNU Emacs

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

GNU Emacs和Gosling Emacs一樣運行在Unix系統上。不過GNU Emacs的功能更多,特別是它有一個真正的lisp作為擴充套件。結果,GNU Emacs很快就取代了Gosling Emacs,成為Unix系統上事實的Emacs編輯器。

到1999年為止,GNU Emacs的開發工作基本是在封閉的情況下進行。這種開發方式在《大教堂和市集》一書中被稱為「大教堂模式」。從那以後,GNU Emacs項目建立了公共開發郵件列表和匿名CVS原始碼訪問。現在的開發在一個CVS原始碼倉庫中進行,最新的版本是23.0.60。


Richard Stallman一直以來是GNU Emacs的維護者。他于2008年將原始碼的維護工作交給了Stefan Monnier和Chong Yidong。[1]


XEmacs

1991年,Lucid公司的Jamie Zawinski等人以GNU Emacs 19的一個早期alpha版為基礎,添加了一些新的特性,開發出Lucid Emacs。很快,Lucid Emacs的開發與GNU Emacs漸行漸遠,最終雙方的團隊放棄了將兩者合併的努力。Lucid Emacs被重新命名為XEmacs,它不像GNU Emacs那樣要求嚴格的原始碼授權,因此能夠吸納大量的優秀擴充套件,在很多方面比GNU Emacs更為優秀。到目前為止,兩者都是眾多Emacs類編輯器中最受歡迎的選擇。


其他實現

功能特點

Emacs不僅僅是一個編輯器,他是一個整合環境,或可稱它為集成開發環境,這些功能如讓使用者置身於全功能的作業系統中,在基於編輯器的功能基礎上,Emacs自行開發了一個「bourne-shell-like」的shell:EShell。Emacs還可以:

  • 收發電子郵件
  • 通過FTP/TRAMP編輯遠程檔案
  • 通過Telnet登錄主機
  • 新聞群組
  • 登錄IRC和朋友交流
  • 查看日曆
  • 撰寫文章大綱
  • 對多種程式語言編輯
  • 調試程式,結合GDB,EDebug等。支持C/C++,PerlPythonLisp等等
  • 玩遊戲
  • 計算器
  • 記日記
  • 煮咖啡
  • 管理日程,Task,ToDo,約會等
  • 個人信息管理
  • 目錄管理
  • 文件比較
  • 閱讀info和man文檔
  • 瀏覽網站
  • 為各種程式(TeX等)提供統一的操作界面
  • ……

此外Emacs還有如下特點:

  1. display editor
  2. 實時編輯器
  3. 高級編輯器
  4. Self-documenting
  5. 可定製性
  6. 可擴充性(集成Lisp語言)
  7. 支持X Window環境


各平台上的Emacs

Emacs是目前世界上最具可移植性的重要軟體之一,能夠在當前大多數作業系統上運行,包括各種類Unix系統GNU/Linux、各種BSDSolarisAIXIRIXMac OS X等等)、MS-DOSMicrosoft Windows以及OpenVMS等。

Emacs既可以在文本終端也可以在圖形用戶界面(GUI)環境下運行。在類Unix系統上,Emacs使用X Windows產生GUI,或者直接使用「框架」(widget toolkit),例如Motif、LessTif或GTK+等等。Emacs也能夠利用Mac OS X和Microsoft Windows的本地圖形系統產生GUI。用GUI環境下的Emacs能提供菜單欄(Menubar)、工具欄(toolbar)、滾動條以及環境菜單(context menu)等交互方式。

編輯模式

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

每種主模式都有特殊的Emacs Lisp變數和函數,使用戶在這種模式下能更方便的處理這一特定類型的文本。例如,各種程設的主模式會對源文件文本中的關鍵字、註釋以不同的字體和顏色加以語法高亮。主模式還提供諸如跳轉到函數的開頭或者結尾這樣特地定義的命令。

Emacs還能進一步定義「次模式」(minor mode)。每一個緩衝區(buffer)只能關聯於一種主模式,卻能同時關聯多個次模式。比如,編寫C語言的主模式可以同時定義多個次模式,每個次模式有著不同的縮進風格(indent style)。

定製

Emacs用戶可以根據自身的需要和偏好對編輯器進行定製。強大而自由的個人定製功能是Emacs受到廣泛歡迎的重要原因之一。定製Emacs主要有三種方法。

第一種方法是使用Emacs的互動式定製功能。Emacs提供了圖形化的交互界面,使用戶能夠對可定製的公共變數進行設置。這種方法使Emacs的初學者不需要接觸Emacs Lisp原始碼即可完成定製。

第二種方法是將一系列按鍵記錄為巨集,調用這一巨集可以重複進行已經記錄的一系列複雜操作。巨集可以保存並命名,以便按名調用,不過同一時刻只能存在一個匿名的巨集。

第三種方法是通過使用Emasc Lisp完成Emacs的定製。這種方法最為複雜,但是也提供了更多的靈活性和更強大的功能。用戶通常將個人定製的Emacs Lisp原始碼保存在一個名為.emacs的配置文件中,Emacs程式運行之初便讀取這一文件,完成用戶要求的配置。用戶可以通過.emacs文件重設變數、重新定義按鍵的綁定(key bindings)、以及定義新的命令,以方便用戶個人的使用。很多高級用戶的.emacs文件的個性化配置長達數百行甚至更多,這些個人的定製使他們的Emacs不僅與默認配置的功能不同,每個人的Emacs之間也千差萬別。這種差異能很好的滿足不同個性的偏好和不同工作的需求。

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


文檔

國際化

Emacs支持對多種文字的文本編輯,包括UTF-8在內的諸多編碼系統,加上對多種字符集、文稿、書寫系統,以及不同文化的書寫習慣都提供了支持,使得世界上大多數語言的使用者都能通過Emacs進行文本處理。Emacs還能通過調用諸如ispell這樣的外部程式,實現多種語言的拼寫檢查。

Emacs通過在程式內部採用一種特殊的內部編碼系統MULE(MULti-language Environment)實現了對不同編碼系統的支持。在Emacs程式內部,每個字元都用1至4個位元組表示,首位元組用於表示這一字元所屬的編碼系統。例如,首位元組為0X91的字元就表示這個字元採用的編碼系統是Chinese-GB2312。有的編碼系統包含的字元過多,就被分為多個字符集,用不同的首位元組表示。Emacs處理文本的過程如下:打開文件時,首先判斷這一文件採用的編碼系統,然後在文件中的所有字元前面加上對應這一編碼系統的首位元組,將這種採用內部編碼的文本存入內存後供程式處理。這一過程被稱作「解碼」。保存文件時,則根據每個字元的首位元組,將採用內部編碼的文本轉換為相應的編碼系統,寫入文件。這一過程被稱作「編碼」。

由於首位元組和編碼長度的限制,Emacs內部編碼的字符集不能包括所有編碼系統的字元。一種變通的解決方法,是挪用其他編碼的空間。例如,MULE不支持GBK字符集,為了在Emacs上使用GBK編寫的擴充套件mule-gbk就佔用了chinese-cns-5、chinese-cns-6和chinese-cns-7的編碼空間。另一種更加徹底的解決方案,是採用Unicode作為內部編碼,在最新的Emacs 23中得到了實現。


版權

Emacs的版權遵從GNU通用公共許可證(GPL),賦予他人自由地對包括C和Lisp在內的Emacs源文件進行修改和再發行的權利。較早版本的GNU Emacs文檔是在一種點對點(ad-hoc)的許可下發布的,要求所有修改過的副本都要包含某些特定的文字。例如,GNU Emacs的用戶手冊中必須包含如何獲得GNU Emacs的說明,以及Richard Stallman的政論——《GNU宣言》(The GNU Manifesto)。作為較早版本的GNU Emacs的分支,XEmacs的手冊也採用相同的使用許可。較新版本的GNU Emacs文檔則採用《GNU自由文檔許可證》(GNU Free Documentation License),以使用「不變段落」("invariant sections" )的形式包含有同樣的文本,並且要求這些文檔自我聲明為「GNU手冊」(GNU Manuals)。

使用Emacs

命令

下表給出了一些基本命令。[Ctrl]鍵以大寫C表示,[Meta]鍵[Alt]鍵以大寫M表示'

命令 快捷鍵 功能
forward-word M-f 向前移動一個單詞。
search-word C-s 在buffer中搜索一個單詞。
undo C-/ 取消最後一次操作,如果多次執行則取消以前的操作。
keyboard-quit C-g 取消當前的命令。
fill-paragraph M-q Wrap text in ("fill") a paragraph.
find-file C-x C-f 在一個新buffer里訪問某個文件(用戶給定文件名)。
save-buffer C-x C-s 保存buffer的內容到文件。
save-with-newname C-x C-w 將buffer內容另存為一個新的文件。
save-buffers-kill-emacs C-x C-c 提示是否保存文件,然後退出emacs。
set-marker C-[空格] 設定標記,用於剪切或複製。
cut C-w 剪切標記到當前游標所在處的文本。
copy M-w 複製標記到當前游標所在處的文本。
paste C-y 從emacs剪貼板中粘貼文本。
kill buffer C-x k 關閉當前buffer。

minibuffer

文件管理與顯示

參見

參考文獻

  1. ^ Re: Looking for a new Emacs maintainer or team.gnu.org Mailing List.於2008年2月23日查閱.(英文),參見"Stallman on handing over GNU Emacs, its future and the importance of nomenclature"(英文)

外部連結

注:本文第一部分,部分引用自遵守GFDL的Emacs用戶指南中譯版







Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History