十大必知的 Emacs 小技巧

發表於2016-08-11

下面是我經常使用的Emacs功能以及一些小技巧。想看更多這類東西的話,請移步Guided Tour of Emacs

觸手可及的文件

除非你能夠很容易的查閱文件,否則很難去學(甚至很難想去學)Emacs. 關於閱讀文件,有一些有用的命令,其中最有用的有以下幾個命令: C-h C-h (關於幫助的幫助,必不可少的!) C-h k, C-h f 以及 C-h v (分別用於顯示按鍵,函式和變數的說明;必不可少的) C-h r (在Emacs內閱讀Emacs manual).

我再沒看到有其他什麼程式有像Emacs那麼完善的文件了. 而且通過這些文件命令來查詢比你用Google查詢要來的更快也更直接.

More information about help.

Keyboard macros(錄製鍵盤操作的巨集)

我在寫這篇文章的時候就用到了keyboard macros, and I’m only on #2. 在大多數編輯器中,macro智慧用於完成那些最簡單,最單調的任務,因為在那些編輯器中光用鍵盤,你幾乎作不了什麼事. Emacs的與眾不同之處在於它擁有大量的高層命令(high-level command),這些命令可以讓你定位和修改字元,單詞,行,句子,函式,段落,頁面以及整個檔案)

若你知道如何在Emacs中用鍵盤來完成某些任務,則你只需要多按下那麼幾個按鍵就能不斷的重複這些動作–根本無需程式設計! 要錄製macro, 先按下 F3, 然後進行你想要被錄製的那些操作,再按下 F4 停止錄製. 然後就可以通過不斷的的按下 F4 來重複這些操作. (相比之下,你可能需要學習一個全新的指令碼語言才能自動化某些任務-比如Office中的Visual Basic-然後還要弄明白怎麼用這門新語言來完成你要完成的任務,這真是一個巨大的阻力)

Emacs macros 有兩個王牌特性:

  1. 一旦你定義了一個巨集,你可以讓它不斷的執行,直到Emacs發現異常情況. 比如,若你定義了一個macro來修改某一行並移動到下一行,則 M=0 F4 會讓Emacs修改所有行直到游標移動到最後一行.
  2. 計數器(Counter)允許在每次執行macro時都插入不同的數字. 當用於聲稱連續(或非連續)的編號列表時很有用.

More information about macros.

矩形編輯

雖說XML最近變得很熱門,但還是有很多人要處理按列排列的資料. 這種資料在常見的Unix系統中隨處可見. Emacs的矩陣命令可以讓你修改,拷貝和移動文字中的一個矩形塊; 要指定一個矩形塊,你只需要將mark放在矩形的一個角,然後將游標放在矩形的對角上就行了. 你也可以通過在一系列連續行的相同位置插入相同文字的方式來插入一個矩形.

More information about rectangles.

The mark ring

你再也不同在buffer中到處找”剛才的那個位置”了. 每次你跳轉了游標(e.g. 進行了文字搜尋或者按下了 M-<M->), Emacs使用mark標記下你的前一個位置. 這就好像你在看書時用手指插入某一頁然後將書翻到另一頁一樣. 你按下 C-x C-x 就會跳轉到那個mark處. 不僅如此,Emacs會儲存多達16個mark,你使用 C-u C-SPC 跳轉到更早些時候的mark處. 這就使得mark和mark ring成為一個很好用的導航工具了. 你完全可以不假思索的使用它: 當你想跳回上之前的位置時,不斷按下 C-u C-SPC 直到你回到想要的位置為止.

(你也可以顯式的用 C-SPC 設定mark, 但是我幾乎不需要通過這種方式來設定導航的座標,只是在標示region時才會這樣做.)

More information about the mark ring.

Ediff

用Ediff來比較一個檔案的兩個版本很方便. 我經常使用的一個命令是 M-x ediff-buffers. Emacs會高亮buffer間不同的地方並彈出一個新視窗供你輸入命令. 例如,在新視窗中,按下n和p可以兩buffer不同內容的region之間跳轉. 對於每個region,你可以用a(或b)拷貝第一個(或第二個)buffer的內容到另一個buffer. 你甚至可以在啟用Ediff的情況下編輯buffer. 然後再卻換到Ediff視窗然後按下!來重新比對不同之處. 在編輯檔案的同時能夠互動式地比對兩個檔案的不同之處,對於編輯檔案那是相當有幫助.

More information about ediff.

Tramp

你是否試過新開一個shell來執行Emacs編輯檔案?(例如開啟一個root shell,或者是遠端主機上的shell), 實際上,藉助Tramp可以滿足大多數的要求而無需重開一個新shell. Tramp允許你像編輯本地檔案一樣編輯”遠端”檔案,它會自動為你做開啟shell,讀取和寫入資料之類的事情. 你只需要按下 C-x C-f 並在輸入檔名的地方以一種特殊的語法指定遠端檔案就可以了. 像這樣: /ssh:phil@remotehost:records/pizza-toppings.txt. 我上面所說的”遠端”加了引號是因為Tramp足夠靈活,你可以用它來以其他使用者的身份來編輯本地檔案-只需要通過su或sudo語法就行. 像這樣: /sudo::/etc/hosts.

More information about Tramp.

Compilation-mode and friends

Emacs中大量的封裝並增強了那些你早已熟知的工具的功能.這些工具包括compiler,grep等等. 舉個例子,當你使用 M-x compile 執行make時, Emacs會在一個新window中顯示編譯器的輸出結果. 當有編譯錯誤出現時,Emacs會高亮這些錯誤並找出這些錯誤的所在行號. 按下 C-x (M-x next-error)會直接跳轉到原始碼中第一個錯誤的那一行; 不斷的按 C-x 會跳轉到接下來的那個錯誤所在位置.(你也可以直接在編譯輸出buffer中點選出錯的條目.) 你還可以使用 M-g nM-g p (分別表示next-error與previous-error)在錯誤列表中前後跳轉.

這套機制足夠普適以至於你可以在 M-x grepM-x occur 的輸出結果中也使用相同的按鍵來跳轉到相應的行位置. 總之,你真的完全不需要關注程式輸出的檔名和行號是什麼,Emacs可以自動為你跳轉到那些位置上去.

More information about “compilation mode”.

VC

我的個人專案都是適用Git作為版本控制的工具的,而有些我參與的專案則會適用CVS或SVN. Emacs提供了一個名為VC的package,它允許我們在Emacs中進行許多版本控制的操作. 它提供了一個統一的操作層:不管各個專案實際使用的版本控制系統是什麼,使用者所使用的命令都是一樣的. 這套機制很棒,因為這意味著不管是bzr還是hg或者其他什麼版本控制系統變得流行起來,我完全不需要學習這些版本控制系統就能直接拿來用了.

我的一般工作流程是這樣的: 開啟一個檔案. 修改並進行測試. 使用 C-x v = 來檢視做出了哪些改變. 如果確定了這些帶動,我按下 C-x v v 準備進行提交. Emacs會彈出一個新window供你輸入提交資訊. 輸入提交資訊後,按下 C-c C-c 確認提交.

VC還有其他一些有用的功能,比如它能顯示檔案的annotated versions, 顯示指定檔案的修改日誌,幫助你回顧歷史版本並對比出版本間有什麼不同.

More information about VC.

Emacs server and multi-TTY support

Emacs23開始支援Multi-TTY, 這使得開啟新Emacs frame快速而painless. 當你在shell中開啟一個檔案或執行那些會呼叫$EDITOR的程式時可以用到這一特性. (然而Emacs本身就有那麼多的功能,基本上不太需要執行什麼外部程式.)

為了使用multi-TTY,你需要在一個執行中的Emacs例項中執行 M-x server-start. 然後設定$EDITOR為 emacsclient -t. 當一個程式呼叫預設編輯器時,emacsclient會連線上你已經存在的這個Emacs例項,這個Emacs例項就會在當前的TTY中開啟一個新的frame. 看起來你好像是執行了一個emacs似的,但是你可以獲取另一Emacs例項的所有狀態:所有的buffer,kill ring的內容等等. 而且它的啟動速度也非常的快速. 當你編輯完後,按下 =C-x #=關閉這個frame.

我在很多其他場合(非編輯檔案)也會用 emacsclient 來呼叫emacs. 例如,我不用man命令來閱讀man page,相反,我在Emacs中閱讀這些man page. 下面是我的 .bashrc 中的相關程式碼片段:

global-set-key

每個人都有不同的常用命令集合. 為那些最常用的Emacs功能分配快捷鍵可以節省你的時間. 你可以用下面語句來將shell命令的快捷鍵設定為 C-c s:

C-c [any letter] 是專門預留給使用者自定義快捷鍵的,所有的major和minor mode都應該準從這一規範.

More information about key bindings and key binding conventions.

相關文章