Emacs,著名的集成開發(fā)環(huán)境和文本編輯器。Emacs被公認(rèn)為是最受專業(yè)程序員喜愛的代碼編輯器之一,另外一個(gè)VIM。
EMACS,即Editor MACroS(編輯器宏)的縮寫,最初由Richard Stallman(理查德·斯托曼)于1975年在MIT協(xié)同Guy Steele共同完成。這一創(chuàng)意的靈感來源于TECMAC和TMACS,它們是由Guy Steele、Dave Moon、Richard Greenblatt、Charles Frankston等人編寫的宏文本編輯器。
自誕生以來,Emacs演化出了眾多分支,其中使用最廣泛的兩種是:1984年由Richard Stallman發(fā)起并由他維護(hù)至今的GNU Emacs,以及1991年發(fā)起的XEmacs。XEmacs是GNU Emacs的分支,至今仍保持著相當(dāng)?shù)募嫒菪浴?/p>
Emacs使用Emacs Lisp,這種有著極強(qiáng)擴(kuò)展性的編程語言,從而實(shí)現(xiàn)了包括編程、編譯乃至網(wǎng)絡(luò)瀏覽等等功能的擴(kuò)展。
發(fā)展歷史
Emacs在1970年代誕生于MIT人工智能實(shí)驗(yàn)室(MIT AI Lab)。在此之前,人工智能實(shí)驗(yàn)室的ITS上運(yùn)行的操作系統(tǒng)PDP-6和PDP-10的默認(rèn)編輯器是一個(gè)叫TECO(Text Editor and Corrector)的行編輯器。與現(xiàn)代的文本編輯器不同,TECO將擊鍵、編輯和文本顯示按照不同的模式進(jìn)行處理,稍晚出現(xiàn)的vi與它有些類似。在TECO上擊鍵并不會(huì)直接將這些字符插入到文檔里去,必須先輸入一系列相應(yīng)的TECO指令,而被編輯的文本在輸入命令的時(shí)候是不會(huì)顯示在屏幕上的。在如今還在使用的UNIX編輯器ed(ed)上,我們還能看到類似的工作方式。
1970年代初,Richard Stallman訪問Stanford AI Lab時(shí)見到了那里的"E" editor。這種編輯器有著所見即所得的直觀特點(diǎn),深深打動(dòng)了Stallman。后來Stallman回到MIT,那時(shí)候MIT AI lab的黑客Carl Mikkelsen 已經(jīng)給TECO加上了稱作“Control-R”的編輯顯示模式,使得屏幕能跟隨用戶的每次擊鍵刷新顯示。Stallman重寫了這一模式,使它運(yùn)行得更有效率,后來又加入了宏,允許用戶重新定義運(yùn)行TECO程序的鍵位。
這一新版的TECO立刻在AI實(shí)驗(yàn)室流行開來,并且很快積累起了大量自定義的宏,這些宏的名字通常就以“麥金塔”或者“MACS”結(jié)尾,意為“宏”(macro)。兩年后,Guy Steele承擔(dān)起統(tǒng)一當(dāng)時(shí)存在的各種鍵盤命令集的工作。Steele和Stallman經(jīng)過一夜奮戰(zhàn),最終由Stallman完成了這一任務(wù),包括一套擴(kuò)展和注釋新的宏包的工具。這個(gè)完成的系統(tǒng)被稱作EMACS,代表“Editing MACroS”。根據(jù)Stallman的說法,他采用這個(gè)名字是“因?yàn)楫?dāng)時(shí)
Stallman意識(shí)到過多的定制、在開發(fā)過程中事實(shí)上的分支以及針對特殊用途的限制,威脅著Emacs的發(fā)展。后來他寫道:
“ Emacs的發(fā)布基于社群共享,這意味著所有的發(fā)展都要反饋給我,由我進(jìn)行整合和發(fā)布。("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一樣只能運(yùn)行在PDP-10系統(tǒng)。Emacs雖然是在TECO的基礎(chǔ)上發(fā)展起來的,不過它已經(jīng)足以被認(rèn)為是一個(gè)新的文本編輯器了。很快,Emacs就成為ITS上的標(biāo)準(zhǔn)編輯程序,接著由Michael McMahon移植到Tenex和TOPS-20系統(tǒng)上。
功能
Emacs不僅僅是一個(gè)編輯器,他是一個(gè)整合環(huán)境,或可稱它為集成開發(fā)環(huán)境,這些功能如讓使用者置身于全功能的操作系統(tǒng)中,在基于編輯器的功能基礎(chǔ)上,Emacs自行開發(fā)了一個(gè)“bourne-shell-like”的shell: EShell。Emacs還可以:
收發(fā)電子郵件
通過斷點(diǎn)續(xù)傳/TRAMP編輯遠(yuǎn)程檔案
通過Telnet登錄主機(jī)
上新聞組
登陸IRC和朋友交流
查看日歷
撰寫文章大綱
對多種編程語言的編輯
調(diào)試程序,結(jié)合GNU偵錯(cuò)器,EDebug等。支持C/C++,Perl,Python,LISP等等
玩游戲
計(jì)算器
記日記
管理日程,Task,ToDo,約會(huì)等
個(gè)人信息管理
目錄管理
文件比較
閱讀info和man文檔
瀏覽網(wǎng)站
為各種程序(TeX等)提供統(tǒng)一的操作界面
……
特點(diǎn)
交互式編輯器
實(shí)時(shí)編輯器
高級編輯器
自文檔化
可定制性
可擴(kuò)展性(集成LISP)
支持X Window環(huán)境
各平臺(tái)上的Emacs
Emacs是目前世界上最具可移植性的重要軟件之一,能夠在當(dāng)前大多數(shù)操作系統(tǒng)上運(yùn)行,包括類Unix系統(tǒng)(GNU/Linux、各種BSD、Solaris、AIX、IRIX 等等)、MS-DOS、微軟 Window 以及OpenVMS等,還有移動(dòng)Android平臺(tái)以及iOS。
Emacs既可以在文本終端也可以在圖形用戶界面(GUI)環(huán)境下運(yùn)行。在類unix系統(tǒng)上,Emacs使用X Window產(chǎn)生GUI,或者直接使用“框架”(widget toolkit),例如Motif、LessTif或GTK+等等。Emacs也能夠利用Mac OS X和Microsoft Windows的本地圖形系統(tǒng)產(chǎn)生GUI。用GUI環(huán)境下的Emacs能提供菜單(Menubar)、工具欄(toolbar)、scrollbar以及context menu等交互方式。
編輯模式
Emacs采取的編輯方式是對不同類型的文本進(jìn)入相應(yīng)的編輯模式,即“主模式”(major mode)。Emacs針對多種文檔定義了不同的主模式,包括普通文本文件、各種編程語言的源文件、HTML文檔、TEX與LaTeX文檔,以及其他類型的文本文件等等。
每種主模式都有特殊的Emacs Lisp變量和函數(shù),使用戶在這種模式下能更方便的處理這一特定類型的文本。例如,各種編程的主模式會(huì)對源文件文本中的關(guān)鍵字、注釋以不同的字體和顏色加以語法高亮。主模式還提供諸如跳轉(zhuǎn)到函數(shù)的開頭或者結(jié)尾這樣特地定義的命令。
Emacs還能進(jìn)一步定義“次模式”(minor mode)。每一個(gè)緩沖區(qū)(buffer)只能關(guān)聯(lián)于一種主模式,卻能同時(shí)關(guān)聯(lián)多個(gè)次模式。比如,編寫c語言的主模式可以同時(shí)定義多個(gè)次模式,每個(gè)次模式有著不同的縮進(jìn)風(fēng)格(indent style)。
快捷鍵
掌握Emacs的快捷鍵可以說是Emacs愛好者的基本功,也是提高編輯速度和質(zhì)量所必備的,但是初學(xué)者可能記不住那么多的快捷鍵必要時(shí)可以翻一下,最常用的快捷鍵數(shù)量也就數(shù)十個(gè)。Emacs的快捷鍵都是綁定于ctrl和alt(或稱meta)上的,例如c-x就是ctrl+x,m-x就是alt+x。當(dāng)然所有的按鍵都可以自定義。
當(dāng)要退出編輯時(shí)C-x C-c 代表著,先按C-x 再按C-c才可以退出編輯環(huán)境.
幫助
C-h r 打開emacs 手冊。
C-h f 查找一個(gè)函數(shù)的用法。
C-h k 查找快捷鍵的用途。
C-h a 查找匹配的命令。
CH ? 顯示幫助的幫助,說明幫助的用法。
文件操作
C-x C-f 打開文件,出現(xiàn)提示時(shí)輸入/username@host:filepath可編輯FTP文件
C-x C-v 打開一個(gè)文件,取代當(dāng)前緩沖區(qū)
C-x 計(jì)算機(jī)科學(xué) 保存文件
C-x C-w 存為新文件
C-x i 插入文件
C-x C-q 切換為只讀或者讀寫模式
C-x C.C. 退出Emacs
編輯操作
C-f 前進(jìn)一個(gè)字符
C-b 后退一個(gè)字符
M-f 前進(jìn)一個(gè)單詞
M-b 后退一個(gè)單詞
C-a 移到行首
C-e 移到行尾
M-a 移到句首
M-e 移到句尾
C-p 后退一行
C-n 前進(jìn)一行
M-x gotoline 跳到指定行
C-v 向下翻頁
摩托船 向上翻頁
M-< 緩沖區(qū)頭部
M-> 緩沖區(qū)尾部
C-M-f 向前匹配括號
CMB 向后匹配括號
C-l 當(dāng)前行居中
M-n or C-u n 重復(fù)操作隨后的命令n次
C-u 重復(fù)操作隨后的命令4次
C-u C-u 重復(fù)操作隨后的命令8次
C-x ESC ESC 執(zhí)行歷史命令記錄,M-p選擇上一條命令,M-n選擇下一條命令
C-d 刪除一個(gè)字符
馬里蘭州 刪除一個(gè)單詞
NHK名古屋放送局 刪除一行
M-k 刪除一句
C-w 刪除標(biāo)記區(qū)域
C-y 粘貼刪除的內(nèi)容
注意:C-y可以粘貼連續(xù)C-k刪除的內(nèi)容;先按C-y,然后按M-y可以選擇粘貼被刪除的內(nèi)容
C-@ 標(biāo)記開始區(qū)域
C-x h 標(biāo)記所有文字
C-x C-x 交換光標(biāo)位置和區(qū)域標(biāo)記區(qū)開頭
M-w 復(fù)制標(biāo)記區(qū)域
C-_ or 富士電視臺(tái) u 撤消操作
執(zhí)行命令
M-x shell 打開殼層
M-x ansi-term 運(yùn)行term
M-! 執(zhí)行殼層命令 (shell-command)
M-1 M-! 執(zhí)行SHELL命令,命令輸出插入光標(biāo)位置,不打開新輸出窗口
M-| 針對某一特定區(qū)域執(zhí)行命令(shell-command-on-region), 比如 C-x h M-|uuencode
窗口操作
C-x 0 關(guān)閉本窗口
C-x 1 只留下一個(gè)窗口
C-x 2 垂直均分窗口
C-x 3 水平均分窗口
C-x o 切換到別的窗口
C-x s 保存所有窗口的緩沖
C-x b 選擇當(dāng)前窗口的緩沖區(qū)
富士電視臺(tái) ^ 縱向擴(kuò)大窗口
C-x } 橫向擴(kuò)大窗口
C-x { 橫向縮小窗口
緩沖操作
C-x C-b 打開緩沖區(qū)列表
d or k 標(biāo)記為刪除
~ 標(biāo)記為未修改狀態(tài)
% 標(biāo)記為只讀
s 保存緩沖
u 取消標(biāo)記
x 執(zhí)行標(biāo)記的操作
f 在當(dāng)前窗口打開該緩沖區(qū)
o 在其他窗口打開該緩沖區(qū)
目錄操作
C-x d 打開目錄模式
s 按日期/文件名排序顯示
v 閱讀光標(biāo)所在的文件
q 退出閱讀的文件
d 標(biāo)記為刪除
x 執(zhí)行標(biāo)記
D 馬上刪除當(dāng)前文件
C 拷貝當(dāng)前文件
R重命名當(dāng)前文件
+新建文件夾
Z壓縮文件
! 對光標(biāo)所在的文件執(zhí)行殼層命令
g 刷新顯示
i 在當(dāng)前緩沖區(qū)的末尾插入子目錄的內(nèi)容
[n]m 標(biāo)記光標(biāo)所在的文件,如果指定n,則從光標(biāo)所在的文件起后n個(gè)文件被標(biāo)記
[n]u 取消當(dāng)前光標(biāo)標(biāo)記的文件,n的含義同上
t 反向標(biāo)記文件
%-m 正則標(biāo)記
q 退出目錄模式
說明:在目錄模式中,如果輸入!,在命令行中包含*或者?,有特殊的含義。*匹配當(dāng)前光標(biāo)所在的文件和所有標(biāo)記的文件,?分別在每一個(gè)標(biāo)記的文件上執(zhí)行該命令。
程序編譯
M-x compile 執(zhí)行編譯操作
M-x gdb GDB排錯(cuò)
M-x dbx DBX排錯(cuò)
M-x xdb XDB排錯(cuò)
搜索模式
計(jì)算機(jī)科學(xué) key 向前搜索
計(jì)算機(jī)科學(xué) 查找下一個(gè)
ENTER 停止搜索
C-r key 反向搜索
C-s C-w 以光標(biāo)所在位置的字為關(guān)鍵字搜索
C-s C-s 重復(fù)上次搜索
C-r C-r 重復(fù)上次反向搜索
C-s ENTER C-w 進(jìn)入單詞搜索模式
C-r ENTER C-w 進(jìn)入反向單詞搜索模式
M-x replace-string ENTER search-string ENTER 替換
M-% search-string ENTER replace-string ENTER 交互替換
C-r 在進(jìn)入查找/替換模式后,該命令進(jìn)入迭代編輯模式
C-M-x 退出迭代編輯模式,返回到查找/替換模式
C-M-s 向前正則搜索
C-M-r 向后正則搜索
C-M-% 正則交互替換
SHELL模式
C-c C-c 相當(dāng)于Bash下的C-c
C-c C-z 相當(dāng)于Bash下的C-z
C-c C-d 相當(dāng)于Bash下的C-d
M-p 執(zhí)行前一條命令
M-n 執(zhí)行下一條命令
C-c C-o 刪除最后一條命令產(chǎn)生的輸出
C-c C-r 屏幕滾動(dòng)到最后一條命令輸出的開頭
C-c C-e 屏幕滾動(dòng)到最后一套命令輸出的結(jié)尾
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
收發(fā)郵件
M-x mail 發(fā)送郵件, C-c C-s 發(fā)送,C-c C-c 發(fā)送并退出
M-x rmail 接受郵件
用 gnus 收發(fā)郵件,閱讀新聞組
M-x gnus 可以通過強(qiáng)大的 gnus 來收發(fā)郵件,閱讀新聞組。可以參考
或者閱讀 gnus 自帶的 manual 來獲得詳細(xì)信息。
富士電視臺(tái) m 撰寫新郵件
定制
Emacs用戶可以根據(jù)自身的需要和偏好對編輯器進(jìn)行定制。強(qiáng)大而自由的個(gè)人定制功能是Emacs受到廣泛歡迎的重要原因之一。定制Emacs主要有三種方法。
第一種方法是使用Emacs的交互式定制功能。Emacs提供了圖形化的交互界面,使用戶能夠?qū)啥ㄖ频墓沧兞窟M(jìn)行設(shè)置。這種方法使Emacs的初學(xué)者不需要接觸Emacs Lisp代碼即可完成定制。
第二種方法是將一系列按鍵記錄為宏,調(diào)用這一宏可以重復(fù)進(jìn)行已經(jīng)記錄的一系列復(fù)雜操作。宏可以保存并命名,以便按名調(diào)用,不過同一時(shí)刻只能存在一個(gè)匿名的宏。
第三種方法是通過使用Emasc Lisp完成Emacs的定制。這種方法最為復(fù)雜,但是也提供了更多的靈活性和更強(qiáng)大的功能。用戶通常將個(gè)人定制的Emacs Lisp代碼保存在一個(gè)名為.emacs的配置文件中,Emacs程序運(yùn)行之初便讀取這一文件,完成用戶要求的配置。用戶可以通過.emacs文件重設(shè)變量、重新定義按鍵的綁定(key bindings)、以及定義新的命令,以方便用戶個(gè)人的使用。很多高級用戶的.emacs文件的個(gè)性化配置長達(dá)數(shù)百行甚至更多,這些個(gè)人的定制使他們的Emacs不僅與默認(rèn)配置的功能不同,每個(gè)人的Emacs之間也千差萬別。這種差異能很好的滿足不同個(gè)性的偏好和不同工作的需求。
如果一段Emacs Lisp代碼確實(shí)有用,它通常會(huì)被打包并發(fā)布給其他用戶。在因特網(wǎng)上能找到很多這樣來自第三方的elisp庫,例如能用于編輯維基百科條目的wikipedia-mode。Usenet上的新聞組gnu.emacs.sources專門發(fā)布新的elisp庫。有些第三方代碼最終還成為了Emacs“標(biāo)準(zhǔn)庫”的一部分。
國際化
Emacs支持對多種文字的文本編輯,包括UTF-8在內(nèi)的諸多編碼系統(tǒng),加上對多種字符集、文稿、書寫系統(tǒng),以及不同文化的書寫習(xí)慣都提供了支持,使得世界上大多數(shù)語言的使用者都能通過Emacs進(jìn)行文本處理。Emacs還能通過調(diào)用諸如ispell這樣的外部程序,實(shí)現(xiàn)多種語言的拼寫檢查。
版權(quán)
Emacs的版權(quán)遵從GNU通用公共許可證(GPL),賦予他人自由地對包括C和LISP在內(nèi)的Emacs源文件進(jìn)行修改和再發(fā)行的權(quán)利。較早版本的GNU Emacs文檔是在一種點(diǎn)對點(diǎn)(ad-hoc)的許可下發(fā)布的,要求所有修改過的副本都要包含某些特定的文字。例如,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 的同時(shí)還會(huì)安裝以下組件:
保持X剪貼板和緩沖區(qū)之間的同步(autocutsel)
郵件美化(Muttprint)
詳細(xì)信息
總大小:下載23.8MB,安裝所需空間73.6MB
版本:23.2+1-7ubuntu2 (emacs23)
許可協(xié)議:開放源代碼
更新:Cononical提供GNU Emacs23的關(guān)鍵更新至2012年十月。
版本發(fā)布
隨后的幾年里,開發(fā)出了許多運(yùn)行于其他操作系統(tǒng)的類Emacs的編輯器,包括由Michael McMahon和Daniel Weinreb編寫的SINE(Sine is not EMACS)、EINE("EINE Is Not EMACS)以及ZWEI(“ZWEI Was EINE Initially”,工作于LISP機(jī)器),它們的名字在德語中分別是“一”和“二”的意思。1978年,Honeywell的Cambridge Information Systems Lab的Bernard Greenberg用Maclisp(LISP的一種)編寫出Multics Emacs,第一次完全采用Lisp作為擴(kuò)展語言。Lisp語言提供了前所未有的靈活性,因此被后來的Emacs開發(fā)者沿用。
最早在Unix上運(yùn)行的Emacs類編輯器是1981年James Gosling編寫的Gosling Emacs(Gosling后來發(fā)明了Java編程語言)。Gosling Emacs以c語言編寫,使用Mocklisp作為擴(kuò)展語言,MockLISP有著類似LISP的語法。1984年,Gosling Emacs成為專有軟件(Proprietary software)。
GNU Emacs
1984年,Richard Stallman開始致力于開發(fā)GNU Emacs,這是一個(gè)自由軟件,以代替成為專有軟件的Gosling Emacs。最初GNU Emacs是在Gosling Emacs的基礎(chǔ)上開發(fā)的,不過Stallman后來用一個(gè)真正的LISP解釋器代替了原來的Mocklisp解釋器,由于Lisp解釋器在此軟件中的核心地位,這意味著實(shí)際上重寫了幾乎全部代碼。GNU Emacs是GNU計(jì)劃的第一個(gè)項(xiàng)目,以c語言編寫,將Emacs Lisp(其解釋器由C實(shí)現(xiàn))作為擴(kuò)展語言。GNU Emacs最早廣泛發(fā)布的版本是15.34,出現(xiàn)于1985年。實(shí)際上版本2到12并不存在,GNU Emacs的早期版本都是以“1.x.x”的形式編號,后來他們把版本號最前面的1給丟掉了,因?yàn)樵瓉淼挠浄ńo人一種主版本號永遠(yuǎn)不變的感覺。因此,Version 13是第一個(gè)public release,它發(fā)布于1985年3月20日。
GNU Emacs和Gosling Emacs一樣運(yùn)行在Unix系統(tǒng)上。不過GNU Emacs的功能更多,特別是它有一個(gè)真正的lisp作為擴(kuò)展。結(jié)果,GNU Emacs很快就取代了Gosling Emacs,成為Unix系統(tǒng)上事實(shí)的Emacs編輯器。
1999年之前,GNU Emacs的開發(fā)相對封閉,以至于到了在《大教堂和市集》這本書里被用作“教堂式”開發(fā)的典范這樣一個(gè)程度。在那以后這個(gè)項(xiàng)目就采用了公開的開發(fā)郵件列表和匿名CVS訪問。開發(fā)工作在一個(gè)單獨(dú)的CVS trunk中進(jìn)行,目前的版本號是24.1、它的維護(hù)者是Richard Stallman。
XEmacs
1991年,Lucid公司的Jamie Zawinski等人以GNU Emacs 19的一個(gè)早期alpha版為基礎(chǔ),添加了一些新的特性,開發(fā)出Lucid Emacs。很快,Lucid Emacs的開發(fā)與GNU Emacs漸行漸遠(yuǎn),最終雙方的團(tuán)隊(duì)放棄了將兩者合并的努力。Lucid Emacs被重新命名為XEmacs,它不像GNU Emacs那樣要求嚴(yán)格的代碼授權(quán),因此能夠吸納大量的優(yōu)秀擴(kuò)展,在很多方面比GNU Emacs更為優(yōu)秀。到目前為止,兩者都是眾多Emacs類編輯器中最受歡迎的選擇。
參考資料 >