Emacs是一種強大的文本編輯器,在程序員和其他以技術工作為主的計算機用戶中廣受歡迎。EMACS,即Editor MACroS(編輯器宏)的縮寫,最初由Richard Stallman(理查德·馬修·斯托曼)于1975年在MIT協同Guy Steele共同完成。這一創意的靈感來源于TECMAC和TMACS,它們是由Guy Steele、Dave Moon、Richard Greenblatt、Charles Frankston等人編寫的宏文本編輯器。
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等)提供統一的操作界面 ……
編輯本段此外Emacs還有如下特點:
display editor 實時編輯器 高級編輯器 Self-documenting 可定制性 可擴展性(集成Lisp語言) 支持X Window環境
編輯本段各平臺上的Emac
Emacs是目前世界上最具可移植性的重要軟件之一,能夠在當前大多數操作系統上運行,包括類Unix系統(GNU/Linux、各種BSD、Solaris、AIX、IRIX、Mac OS X等等)、MS-DOS、Microsoft Windows以及OpenVMS等。 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愛好者的基本功,也是提高編輯速度和質量所必備的,但是初學者可能記不住那么多的快捷鍵必要時可以翻一下,最常用的快捷鍵數量也就數十個。Emacs的快捷鍵都是綁定于ctrl和alt(或稱meta)上的,例如c-x就是ctrl+x,m-x就是alt+x。當然所有的按鍵都可以自定義。 當要退出編輯時C-x C-c 代表著,先按C-x 再按C-c才可以退出編輯環境.
編輯本段文件操作
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 撤消操作
編輯本段執行SHELL命令
M-x shell 打開SHELL 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-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 來收發郵件,閱讀新聞組。可以參考 [1] 或者閱讀 gnus 自帶的 manual 來獲得詳細信息。
編輯本段定制
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這樣的外部程序,實現多種語言的拼寫檢查。