Emacs,最強編輯器,沒有之一

Emacs的Logo

作者 謝恩銘,公眾號「程序員聯盟」(微信號:coderhub)。
轉載請注明出處。
原文:http://www.lxweimin.com/p/732157b02ecc

Emacs,最強編輯器,沒有之一


小編知道,此標題一出,肯定會遭受廣大群眾“詬病”,說不好還會被其他編輯器的粉絲暗地里“干掉”。

比如,Vim,Sublime,Nano編輯器的粉絲可能就會來“踢館”,VS或Eclipse的粉絲也興許會“群起而攻”,但是小編只是表達一下自己的感受,為了效果也只能夸大一下了。
所以請拍磚的時候輕一點,雞蛋少扔幾個。如果扔的雞蛋多也請多扔幾個番茄過來,再來幾根蔥,這樣我可以做番茄炒蛋,謝謝。

有種張無忌在光明頂被6大門派“圍剿”的架勢...

對于很多人來說,使用Vim和Emacs,不僅是提升“逼格”的方式,更是上升到“信仰”的層面,夸張吧。當然這和宗教信仰不一樣,只是一種可愛的“偏執”而已。

請參看我的 Linux探索之旅 | 第五部分第一課:Vim豈是池中物,寶劍鋒從磨礪出

不過,Emacs實在能做很多事,不要認為它只是一個文本編輯器,它可以說是一個整合環境,或可稱它為“集成開發環境”,它還可以做以下事情:

  • 上網,瀏覽網頁
  • 看視頻
  • 收發郵件
  • 調試程序,結合GDB,EDebug等。支持C/C++,Perl,Python,Lisp等等
  • 玩游戲
  • 計算器
  • 記日記
  • 管理日程,Task,ToDo,約會等
  • 個人信息管理
  • 目錄管理
  • 文件比較
  • 閱讀info和man文檔
  • 等等

當然了,這里主要將Emacs作為文本編輯器來介紹。
如果你要做特定開發,那還是用業界知名的IDE(集成開發環境)更加有效率。
例如開發Android應用,那必須得上Android Studio(你不要跟我說你還在用Google已經不發布支持更新的Eclipse);開發iOS應用,必須得上Xcode。
如果你用Emacs來開發這些應用,那效率太低了。

小編以前在Linux下編寫代碼是使用Vim編輯器的,也極為強大。但是自從2014年接觸到Emacs之后,就愛上了Emacs(fall in love with Emacs),Vim雖然有時還會用到(目前的公司的開發組大家基本都是用Vim,我也沒辦法只好用Vim,以方便和大家交流、演示),但其實我還是比較喜歡Emacs。

一開始我不知道為什么Emacs如此優美又強大,直到后來閱讀了《黑客與畫家》這部經典著作(硅谷創業教父 Paul Graham 保羅?格雷厄姆所寫,其實也就是他的一些日志匯編而成),里面講述了Lisp語言的強大和優美,而Emacs就是用Lisp語言編寫的,怪不得。

閑扯一下為什么Lisp語言如此強大,雖然這門語言很老了(1958年被發明),在2015年6月的TIOBE編程語言排行榜也只有第31位,但是:

摘錄自 阮一峰 翻譯的《黑客與畫家》一書,推薦大家一讀


如果我們把流行的編程語言,以這樣的順序排列:Java、Perl、Python、Ruby。你會發現,排在越后面的語言,越像Lisp。

Python模仿Lisp,甚至把許多Lisp黑客認為屬于設計錯誤的功能,也一起模仿了。至于Ruby,如果回到1975年,你聲稱它是一種Lisp方言,沒有人會反對。

編程語言現在的發展,不過剛剛趕上1958年Lisp語言的水平。

1958年,John McCarthy設計了Lisp語言。我認為,當前最新潮的編程語言,只是實現了他在1958年的設想而已。

這怎么可能呢?計算機技術的發展,不是日新月異嗎?

1958年的技術,怎么可能超過今天的水平呢? 讓我告訴你原因。 這是因為John McCarthy本來沒打算把Lisp設計成編程語言,至少不是我們現在意義上的編程語言。他的原意只是想做一種理論演算,用更簡潔的方式定義圖靈機。

所以,為什么上個世紀50年代的編程語言,到現在還沒有過時?簡單說,因為這種語言本質上不是一種技術,而是數學。數學是不會過時的。

你不應該把Lisp語言與50年代的硬件聯系在一起,而是應該把它與快速排序(Quicksort)算法進行類比。這種算法是1960年提出的,至今仍然是最快的通用排序方法。

直到今天,最高級的主流語言,也只是剛剛接近Lisp的水平。雖然已經很接近了,但還是沒有Lisp那樣強大。

Lisp語言誕生的時候,就包含了9種新思想。其中一些我們今天已經習以為常,另一些則剛剛在其他高級語言中出現,至今還有2種是Lisp獨有的。

按照被大眾接受的程度,這9種思想依次是:

  1. 條件結構(即"if-then-else"結構)。現在大家都覺得這是理所當然的,但是Fortran I就沒有這個結構,它只有基于底層機器指令的goto結構。

  2. 函數也是一種數據類型。在Lisp語言中,函數與整數或字符串一樣,也屬于數據類型的一種。它有自己的字面表示形式(literal representation),能夠儲存在變量中,也能當作參數傳遞。一種數據類型應該有的功能,它都有。

  3. 遞歸。Lisp是第一種支持遞歸函數的高級語言。

  4. 變量的動態類型。在Lisp語言中,所有變量實際上都是指針,所指向的值有類型之分,而變量本身沒有。復制變量就相當于復制指針,而不是復制它們指向的數據。

  5. 垃圾回收機制

  6. 程序由表達式(expression)組成。Lisp程序是一些表達式區塊的集合,每個表達式都返回一個值。這與Fortran和大多數后來的語言都截然不同,它們的程序由表達式和語句(statement)組成。

  7. 符號(symbol)類型。符號實際上是一種指針,指向儲存在哈希表中的字符串。所以,比較兩個符號是否相等,只要看它們的指針是否一樣就行了,不用逐個字符地比較。

  8. 代碼使用符號和常量組成的樹形表示法(notation)

  9. 無論什么時候,整個語言都是可用的。Lisp并不真正區分讀取期、編譯期和運行期。你可以在讀取期編譯或運行代碼;也可以在編譯期讀取或運行代碼;還可以在運行期讀取或者編譯代碼。


怎么樣,是不是很有興趣了解一下如此強大的Lisp語言開發出來的Emacs是如何優美呢?

當然此文不可能帶大家領略所有Emacs的優美之處。說實話,Emacs肯定存在不足之處: 小編還是很“識相”的,不敢“冒天下之大不韙”。

更多Emacs的好處只有大家使用了才能慢慢領略。

Emacs簡介


Emacs是一種強大的文本編輯器,在程序員和其他以技術工作為主的計算機用戶中廣受歡迎。

EMACS,即Editor MACroS(編輯器宏)的縮寫,最初由Richard Stallman(理查德·斯托曼)于1975年在MIT(麻省理工學院)協同Guy Steele共同完成。

Richard Stallman可是開源運動之父啊,我的Linux探索之旅 | 開宗明義+第一部分第一課:什么是Linux?這一課專門介紹過他。

這位可愛的長胡子大叔抵制Apple,抵制Facebook,抵制Amazon,抵制不少公司和機構。他也是自由軟件基金會(Free Software Foundation,簡稱FSF)的主席,而自由軟件基金會主導了包括GNU在內的很多開源工程。

GNU工程使得世界各地的程序員可以為Linux操作系統開發周邊軟件等,才有了Linux的今天。不然Linus Tovarlds(Linux之父)基本上光是寫了一個Linux內核,哪夠啊。所以今天的Linux最正確的稱謂應該是GNU/Linux 。

自誕生以來,Emacs演化出了眾多分支,其中使用最廣泛的兩種分別是:1984年由Richard Stallman發起并由他維護至今的GNU Emacs,以及1991年發起的XEmacs。XEmacs是GNU Emacs的分支,至今仍保持著相當的兼容性。它們都使用了Emacs Lisp這種有著極強擴展性的編程語言,從而實現了包括編程、編譯乃至網絡瀏覽等等功能的擴展。

你可以使用Lisp語言改寫Emacs的功能組件,而且可以更改配置,完全自定義Emacs,所以Emacs是充滿無限可能的編輯器。

國際化


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

Emacs還能通過調用諸如ispell這樣的外部程序,實現多種語言的拼寫檢查。

跨平臺性


Emacs是目前世界上最具可移植性的重要軟件之一,能夠在當前大多數操作系統上運行,包括類Unix系統(GNU/Linux、各種BSD、Solaris、AIX、IRIX、Mac OS X等等)、MS-DOS、Microsoft Windows以及OpenVMS等,還有移動Android平臺以及iOS。

緩沖區的概念


初學Emacs需要理解什么是 緩沖區

Emacs里的一切操作都發生在編輯緩沖區(buffer)里,它通常是某個文件的工作副本。如果你正在編輯的編輯緩沖區里包含著某個文件的一個副本,那么當你保存自己所做的改動時,Emacs把編輯緩沖區的內容復制到文件中。

除了工作在文件副本上的緩沖區外,還有一些做臨時工作的緩沖區,它就像一張草稿紙,當然也可以隨時使用write-file命令("C-x C-w")或save-buffer命令(“C-x C-s”)保存這類臨時工作緩沖區的內容。

小編一開始也是對緩沖區的概念一知半解,不要怕,用著用著馬上就理解了。

可以參考一些高手的Emacs教程和“練級”系列


http://www.cnblogs.com/robertzml/archive/2009/09/10/1564108.html
http://blog.csdn.net/redguardtoo/article/details/7222501/
http://blog.sina.com.cn/s/blog_6df127760101ll7a.html
http://arch.pconline.com.cn//pcedu/soft/gj/photo/0609/865628_1.html

Emacs的官網和Wiki


http://www.gnu.org/software/emacs/

目前最新版是Emacs 25.1

Emacs的中文WiKi
http://www.emacswiki.org/emacs?interface=zh-cn

輕松一下,關于Emacs的一則玩笑


《Emacs 的日子是這個樣子的》:

  1. 聽說有 Emacs 這個東西。試了一下,感覺就像記事本一樣。沒什么學習曲線。就是……咋也找不到退出的辦法……
  2. 開始會一些 Emacs 了,開始學習各種 mode,按鍵綁定,配置方法,開始熟悉 Emacs……
  3. 比較熟悉 Emacs了,基本使用 Emacs干活,每天“活在” Emacs 里面……
  4. 非常熟悉自己“常用”的 Emacs,可以教別人 Emacs,大量泡 Emacs社區,大量下載、使用和跟蹤別人的擴展,已經離不了 Emacs……
  5. 漸漸不滿 Emacs,漸漸熟悉 Lisp 語言,開始改寫“自己”的Emacs,在這期間,又開始四處碰壁,工作效率總是被一個失敗的修改所影響……
  6. 經常修改 Emacs,自己手中的 Emacs基本上每周都和上一周有那么一點不太一樣…… 就是,改的太多了,經常在某天整理代碼的時候突然發現……原來還有這么個易用的功能…… 忘記好久了……
  7. …… ……

Emacs三個平臺的安裝與配置


1. Windows下安裝Emacs

請到以下鏈接下載Windows版的Emacs:

https://ftp.gnu.org/gnu/emacs/windows/

請大家下載列表中最新版本的zip文件,比如目前最新版的是2016年9月18日發布的25.1版:

emacs-25.1-x86_64-w64-mingw32.zip

下載后,用Winrar或7-zip等解壓,會出來一個文件夾 emacs-25.1-x86_64-w64-mingw32

內含四個子文件夾:

  • bin
  • libexec
  • share
  • var

打開bin文件夾,運行其中的 emacs.exe 文件即可開啟Emacs,不需要安裝:

你可以把emacs.exe這個文件鎖定到任務欄,就很方便了,按一下圖標就啟動了。

2. Linux下安裝Emacs


Debian一族(包括Ubuntu)下安裝Emacs:

sudo apt-get install emacs

Redhat一族(包括Fedora)下安裝Emacs:

sudo yum install emacs

其他的可以搜索如何安裝,或者下載Emacs的源代碼來編譯安裝。

下面演示Linux如何下載Emacs的代碼來編譯安裝(“逼格”最高的方式):

  • 首先去

ftp://ftp.gnu.org/pub/gnu/emacs

  • 上面有Emacs的幾乎所有版本的源代碼包,下載最新版的(用老版的也可以),如: emacs-25.1.tar.gz

  • 解壓 emacs-25.1.tar.gz 并編譯,安裝,在終端(Terminal)中依次運行以下命令(如果是其他版本,則將如下命令中的25.1替換為相應版本即可):

tar -zxvf emacs-25.1.tar.gz   #(解壓文件)
cd emacs-25.1                 #(進入目錄)
./configure                   #(配置)
make                          #(編譯)
sudo make install             #(安裝,會提示輸入你的用戶密碼)
  • 安裝完之后要啟動Emacs很簡單,開一個終端(Terminal),輸入emacs,回車,就可以了。

不過小編嫌這樣太麻煩,可以用更簡單的方式來打開Emacs,我這里用一個鍵就可以了(演示環境是Fedora,不過其他系統如Ubuntu類似):

  • 打開Fedora的“設置” (肯定知道設置在哪里吧)

  • 選擇“鍵盤”

  • 選擇列表中的“自定義快捷方式”,然后點擊加號“+”,用于添加新的快捷方式

  • 選擇快捷方式的按鍵,小編這里選的是F2這個鍵,然后填寫命令,就是“emacs”,再填寫快捷方式的名稱,這個隨便填,我填的是“Emacs”,確定。

按F2鍵試試,是不是就啟動Emacs啦?這酸爽,不言而喻!

3. Mac OS下安裝Emacs


Mac下安裝Emacs,網上有不少文章,有用Git克隆下來Emacs的源碼然后編譯安裝的; 也有用一些包管理軟件來安裝的,但是小編推薦一個更方便的方式,和Mac下安裝QQ,迅雷那樣方便:

http://emacsformacosx.com/

上這個網,然后下載那個dmg包,Mac用戶肯定懂的,就是Mac下安裝軟件的最常用方式。然后就沒有然后了... 如果這樣你都不會裝Emacs,那真心沒必要用Emacs了。

自動補全插件


安裝完Emacs之后,還需要安裝一個自動補全(可以自動補全關鍵字,文本等)的擴展,非常強大,名叫company-mode,官網:

http://company-mode.github.io/

幸好,這個擴展并不需要我們按照傳統的方式從官網下載、安裝到Emacs里面,因為Emacs里有個安裝擴展的列表,有點類似 Debian系列的 apt-get 和 Redhat系列的yum 這樣的包管理工具,所以我們只需要按步驟安裝:

  • 按下 M-x 來調出命令輸入 (在Windows下就是Alt + x 鍵)

  • 輸入 list-packages,回車

  • 在出現的列表里,點擊 company

  • 在右邊出現的新緩沖區里點擊 Install(英語“安裝”的意思)

  • 點擊 Yes/是

開始感受自動補全的樂趣吧!

用此方法(list-packages命令)也可以安裝很多其他的Emacs的插件(擴展),大家也看到列表里有很多插件了吧,所以說Emacs都有點像一個小型的操作系統。

小編的Emacs配置文件


大家可以從網上下載一些大牛的Emacs配置文件,看一下他們的Emacs快捷鍵(除了基本的一些通用快捷鍵以外,用戶可以自定義很多快捷鍵,可以定義在 .emacs 文件中)。

如果你“不幸”選擇使用小編的Emacs配置文件,那么承蒙看得起(當然,你可以把我的配置文件作為參考,取其精華,去其糟粕(不過估計精華有點少,糟粕比較多...),“調配”出屬于你自己的Emacs配置):

下面講的是在Linux或Mac OS下的配置操作:

請用小編的 .emacs 文件替換你的家目錄的.emacs文件 (安裝完Emacs,你的家目錄,也就是 ~ 下就會有一個 .emacs 文件(默認是隱藏文件))。

把壓縮文件里的其他三個模塊文件放置到 .emacs.d 這個文件夾下的modules文件夾 (.emacs.d 文件夾是安裝完Emacs就會有的,也在家目錄里,不過modules文件夾需要你自己創建):

cd ~/.emacs.d/
mkdir modules
cp php-mode.el psvn.el saved-places modules/   #(或者手動直接把三個模塊文件復制到modules文件夾里)

我的Emacs配置和說明在Github上


https://github.com/frogoscar/emacs

其中配置文件的內容是:

https://github.com/frogoscar/emacs/blob/master/.emacs

三個模塊:

https://github.com/frogoscar/emacs/tree/master/modules

常用快捷方式


Emacs的快捷鍵都是綁定于Ctrl和Alt(或稱Meta, 在Mac下就是Cmd鍵)上的,例如C-x就是Ctrl+x,M-x就是Alt+x (在Mac下就是Cmd鍵)。當然所有的按鍵都可以自定義。

所以下面我在講述快捷鍵的組合表示方式時:

  • C 代表Ctrl鍵

  • M 代表Alt鍵(在蘋果的Mac OS系統下是Cmd鍵)

  • C-x C-c 代表著“先按C-x,再按C-c”

  • C-x k 代表著“先按C-x,松開手,再按k”

小編平時最常用的是這些快捷鍵組合


M-s : 新建一個buffer(緩沖區)

C-x O : 注意是大寫的O,不是零,所以需要按住shift鍵再按o鍵。用于在緩沖區之間切換

C-g : 取消當前操作

C-x u : 回到上一步,相當于Undo

C-x 3 : 把緩沖區(buffer)分為左右兩個,新的一個緩沖區是復制當前的緩沖區 (可以執行多次,來分割出很多小窗口)

C-x 2 : 把緩沖區(buffer)分為上下兩個,新的一個緩沖區是復制當前的緩沖區 (可以執行多次,來分割出很多小窗口)

M-w : 選中文字的情況是復制文字,而如果沒有選中文字則是復制當前的一行

C-w : 選中文字的情況是剪切文字,而如果沒有選中文字則是剪切當前的一行

M-x : 調出命令輸入,可以在后面接命令,比如man,svn-status,等

C-y : 黏貼

C-x C-s : 保存文本

C-x C-f : 打開文件,如果文件不存在,則新建文件

C-x C-v : 打開一個文件,取代當前緩沖區

C-x k : 關閉當前緩沖區(buffer)

C-s : 向前搜索

C-r : 向后搜索

C-x h : 全選

C-v : 向下翻頁

M-v : 向上翻頁

C-f : 前進一個字符

C-b : 后退一個字符

M-f : 前進一個單詞

M-b : 后退一個單詞

C-@ : 標記開始區域

C-a : 移到行首

C-e : 移到行尾

M-a : 移到句首

M-e : 移到句尾

M-< : 緩沖區頭部

M-> : 緩沖區尾部

M-g M-g,再輸入數字 : 跳轉到文本的第幾行

C-x 0 : 關閉當前緩沖區

C-x C-c : 退出Emacs

暫時只能記起來這么多啦,還有很多快捷鍵就要你自己去發掘啦!小編平時也不會所有的快捷鍵都用上,上述的快捷鍵組合是最常用的。

注意: 千萬不要死記這些快捷鍵組合,隨著你使用Emacs,很快就能記住的,相信我!

Emacs還有一個很大的好處就是幾乎所有的快捷鍵按鍵都在鍵盤的左下角,用左手就能單獨完成大部分操作,而右手則可以玩游戲(哦,不對,是操作鼠標),提高效率。

或者說,你用好了Emacs的快捷鍵組合,編輯代碼時甚至不需要鼠標,兩個手在鍵盤上就夠了!

還有一個平時常用的功能就是查詢函數,可以方便查詢已定義的函數:

  • 按下 M-x 來調出命令輸入

  • 輸入 man ,也就是Linux或Unix系統的man命令,是manuall的縮寫,也就是"手冊"的意思

  • 然后輸入你要查詢的函數名,回車

嘗試一下Emacs吧,真的是“神器”!
誰用誰知道,用過都說好~


我是 謝恩銘,公眾號「程序員聯盟」(微信號:coderhub)運營者,慕課網精英講師 Oscar 老師,終生學習者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標桿直跑」

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容