emacs

emacs

Emacs,著名的集成開發環境和文本編輯器。Emacs被公認為是最受專業程序員喜愛的代碼編輯器之一,另外一個vim

EMACS,即Editor MACroS(編輯器宏)的縮寫,最初由Richard Stallman(理查德·馬修·斯托曼)於1975年在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使用Emacs Lisp,這種有著極強擴展性的編程語言,從而實現了包括編程、編譯乃至網路瀏覽等等功能的擴展。

發展歷史


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的說法,他採用這個名字是“因為當時在ITS里還沒有被當作縮寫用過。”("because 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
emacs
Emacs不僅僅是一個編輯器,他是一個整合環境,或可稱它為集成開發環境,這些功能如讓使用者置身於全功能的操作系統中,在基於編輯器的功能基礎上,Emacs自行開發了一個“bourne-shell-like”的shell: EShell。Emacs還可以:
收發電子郵件
通過FTP/TRAMP編輯遠程檔案
通過Telnet登錄主機
上新聞組
登陸IRC和朋友交流
查看日曆
撰寫文章大綱
對多種編程語言的編輯
調試程序,結合GDB,EDebug等。支持C/C++,Perl,Python,Lisp等等
玩遊戲
計算器
記日記
管理日程,Task,ToDo,約會等
個人信息管理
目錄管理
文件比較
閱讀info和man文檔
瀏覽網站
為各種程序(TeX等)提供統一的操作界面
……

特點


互動式編輯器
實時編輯器
高級編輯器
自文檔化
可定製性
可擴展性(集成Lisp語言)
支持X Window環境
各平台上的Emacs
Emacs是目前世界上最具可移植性的重要軟體之一,能夠在當前大多數操作系統上運行,包括類Unix系統(GNU/Linux、各種BSD、Solaris、AIX、IRIX 等等)、MS-DOS、Microsoft Window 以及OpenVMS等,還有移動Android平台以及iOS。
Emacs既可以在文本終端也可以在圖形用戶界面(GUI)環境下運行。在類Unix系統上,Emacs使用X Window產生GUI,或者直接使用“框架”(widget toolkit),例如Motif、LessTif或GTK+等等。Emacs也能夠利用Mac OS X和Microsoft Windows的本地圖形系統產生GUI。用GUI環境下的Emacs能提供菜單(Menubar)、工具欄(toolbar)、scrollbar以及context menu等交互方式。

編輯模式


Emacs採取的編輯方式是對不同類型的文本進入相應的編輯模式,即“主模式”(major mode)。Emacs針對多種文檔定義了不同的主模式,包括普通文本文件、各種編程語言的源文件、HTML文檔、TEX與LaTeX文檔,以及其他類型的文本文件等等。
每種主模式都有特殊的Emacs Lisp變數和函數,使用戶在這種模式下能更方便的處理這一特定類型的文本。例如,各種編程的主模式會對源文件文本中的關鍵字、註釋以不同的字體和顏色加以語法高亮。主模式還提供諸如跳轉到函數的開頭或者結尾這樣特地定義的命令。
Emacs還能進一步定義“次模式”(minor mode)。每一個緩衝區(buffer)只能關聯於一種主模式,卻能同時關聯多個次模式。比如,編寫C語言的主模式可以同時定義多個次模式,每個次模式有著不同的縮進風格(indent style)。

快捷鍵


掌握Emacs的快捷鍵可以說是Emacs愛好者的基本功,也是提高編輯速度和質量所必備的,但是初學者可能記不住那麼多的快捷鍵必要時可以翻一下,最常用的快捷鍵數量也就數十個。Emacs的快捷鍵都是綁定於ctrl和alt(或稱meta)上的,例如c-x就是ctrl+x,m-x就是alt+x。當然所有的按鍵都可以自定義。
當要退出編輯時C-x C-c 代表著,先按C-x 再按C-c才可以退出編輯環境.

幫助


C-h r 打開emacs 手冊。
C-h f 查找一個函數的用法。
C-h k 查找快捷鍵的用途。
C-h a 查找匹配的命令。
C-h ? 顯示幫助的幫助,說明幫助的用法。

文件操作


C-x C-f 打開文件,出現提示時輸入/username@host:filepath可編輯FTP文件
C-x C-v 打開一個文件,取代當前緩衝區
C-x C-s 保存文件
C-x C-w 存為新文件
C-x i 插入文件
C-x C-q 切換為只讀或者讀寫模式
C-x C-c 退出Emacs

編輯操作


C-f 前進一個字元
C-b 後退一個字元
M-f 前進一個單詞
M-b 後退一個單詞
C-a 移到行首
C-e 移到行尾
M-a 移到句首
M-e 移到句尾
C-p 後退一行
C-n 前進一行
M-x goto-line 跳到指定行
C-v 向下翻頁
M-v 向上翻頁
M-< 緩衝區頭部
M-> 緩衝區尾部
C-M-f 向前匹配括弧
C-M-b 向後匹配括弧
C-l 當前行居中
M-n or C-u n 重複操作隨後的命令n次
C-u 重複操作隨後的命令4次
C-u C-u 重複操作隨後的命令8次
C-x ESC ESC 執行歷史命令記錄,M-p選擇上一條命令,M-n選擇下一條命令
C-d 刪除一個字元
M-d 刪除一個單詞
C-k 刪除一行
M-k 刪除一句
C-w 刪除標記區域
C-y 粘貼刪除的內容
注意:C-y可以粘貼連續C-k刪除的內容;先按C-y,然後按M-y可以選擇粘貼被刪除的內容
C-@ 標記開始區域
C-x h 標記所有文字
C-x C-x 交換游標位置和區域標記區開頭
M-w 複製標記區域
C-_ or C-x u 撤消操作

執行命令


M-x shell 打開SHELL
M-x ansi-term 運行term
M-! 執行SHELL命令 (shell-command)
M-1 M-! 執行SHELL命令,命令輸出插入游標位置,不打開新輸出窗口
M-| 針對某一特定區域執行命令(shell-command-on-region), 比如 C-x h M-|uuencode

窗口操作


C-x 0 關閉本窗口
C-x 1 只留下一個窗口
C-x 2 垂直均分窗口
C-x 3 水平均分窗口
C-x o 切換到別的窗口
C-x s 保存所有窗口的緩衝
C-x b 選擇當前窗口的緩衝區
C-x ^ 縱向擴大窗口
C-x } 橫向擴大窗口
C-x { 橫向縮小窗口

緩衝操作


C-x C-b 打開緩衝區列表
d or k 標記為刪除
~ 標記為未修改狀態
% 標記為只讀
s 保存緩衝
u 取消標記
x 執行標記的操作
f 在當前窗口打開該緩衝區
o 在其他窗口打開該緩衝區

目錄操作


C-x d 打開目錄模式
s 按日期/文件名排序顯示
v 閱讀游標所在的文件
q 退出閱讀的文件
d 標記為刪除
x 執行標記
D 馬上刪除當前文件
C 拷貝當前文件
R重命名當前文件
+新建文件夾
Z壓縮文件
! 對游標所在的文件執行SHELL命令
g 刷新顯示
i 在當前緩衝區的末尾插入子目錄的內容
[n]m 標記游標所在的文件,如果指定n,則從游標所在的文件起后n個文件被標記
[n]u 取消當前游標標記的文件,n的含義同上
t 反向標記文件
%-m 正則標記
q 退出目錄模式
說明:在目錄模式中,如果輸入!,在命令行中包含*或者?,有特殊的含義。*匹配當前游標所在的文件和所有標記的文件,?分別在每一個標記的文件上執行該命令。

程序編譯


M-x compile 執行編譯操作
M-x gdb GDB排錯
M-x dbx DBX排錯
M-x xdb XDB排錯
M-x sdb SDB排錯

搜索模式


C-s key 向前搜索
C-s 查找下一個
ENTER 停止搜索
C-r key 反向搜索
C-s C-w 以游標所在位置的字為關鍵字搜索
C-s C-s 重複上次搜索
C-r C-r 重複上次反向搜索
C-s ENTER C-w 進入單詞搜索模式
C-r ENTER C-w 進入反向單詞搜索模式
M-x replace-string ENTER search-string ENTER 替換
M-% search-string ENTER replace-string ENTER 交互替換
C-r 在進入查找/替換模式后,該命令進入迭代編輯模式
C-M-x 退出迭代編輯模式,返回到查找/替換模式
C-M-s 向前正則搜索
C-M-r 向後正則搜索
C-M-% 正則交互替換

SHELL模式


C-c C-c 相當於Bash下的C-c
C-c C-z 相當於Bash下的C-z
C-c C-d 相當於Bash下的C-d
M-p 執行前一條命令
M-n 執行下一條命令
C-c C-o 刪除最後一條命令產生的輸出
C-c C-r 屏幕滾動到最後一條命令輸出的開頭
C-c C-e 屏幕滾動到最後一套命令輸出的結尾
C-c C-p 查看前一條命令的輸出
C-c C-n 查看后一條命令的輸出

列印資料


M-x print-buffer 先使用pr,然後使用lpr
M-x lpr-buffer 直接使用lpr
M-x print-region
M-x lpr-region

收發郵件


M-x mail 發送郵件, C-c C-s 發送,C-c C-c 發送並退出
M-x rmail 接受郵件
用 gnus 收發郵件,閱讀新聞組
M-x gnus 可以通過強大的 gnus 來收發郵件,閱讀新聞組。可以參考
或者閱讀 gnus 自帶的 manual 來獲得詳細信息。
C-x m 撰寫新郵件

定製


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的版權遵從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)。

附加組件


在Ubuntu 11.04版本上,安裝 Emacs 的同時還會安裝以下組件:
保持X剪貼板和緩衝區之間的同步(autocutsel)
郵件美化(muttprint)

詳細信息


總大小:下載23.8MB,安裝所需空間73.6MB
版本:23.2+1-7ubuntu2 (emacs23)
許可協議:開放源代碼
更新:Cononical提供GNU Emacs23的關鍵更新至2012年十月。

版本發布


隨後的幾年裡,開發出了許多運行於其他操作系統的類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
emacs
emacs
1984年,Richard 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給丟掉了,因為原來的記法給人一種主版本號永遠不變的感覺。因此,Version 13是第一個public release,它發佈於1985年3月20日。
GNU Emacs和Gosling Emacs一樣運行在Unix系統上。不過GNU Emacs的功能更多,特別是它有一個真正的lisp作為擴展。結果,GNU Emacs很快就取代了Gosling Emacs,成為Unix系統上事實的Emacs編輯器。
1999年之前,GNU Emacs的開發相對封閉,以至於到了在《大教堂與市集》這本書里被用作“教堂式”開發的典範這樣一個程度。在那以後這個項目就採用了公開的開發郵件列表和匿名CVS訪問。開發工作在一個單獨的CVS trunk中進行,目前的版本號是24.1、它的維護者是Richard Stallman。
XEmacs
1991年,Lucid公司的Jamie Zawinski等人以GNU Emacs 19的一個早期alpha版為基礎,添加了一些新的特性,開發出Lucid Emacs。很快,Lucid Emacs的開發與GNU Emacs漸行漸遠,最終雙方的團隊放棄了將兩者合併的努力。Lucid Emacs被重新命名為XEmacs,它不像GNU Emacs那樣要求嚴格的代碼授權,因此能夠吸納大量的優秀擴展,在很多方面比GNU Emacs更為優秀。到目前為止,兩者都是眾多Emacs類編輯器中最受歡迎的選擇。