Emacs常用指令表

Emacs快捷鍵是可以修改的,所以不一定要全部記住,只需要熟悉基本功能和知道有其他方便的擴充功能即可

Emacs基本

  • C → Ctrl
  • M → Alt 或 esc
  • S → Shift
  • [Ret] → return(enter)
  • 範例
    • C-c → Ctrl + c
    • C-c C-f → Ctrl + c, 放開c, 按下f,也可以分開來按,但較慢
  • 「hello.c」的自動儲存檔案的檔名就是「#hello.c#」。儲存檔案後,自動儲存檔就會被刪除
  • Ctrl 通常是對一個字操作, Alt 通常是對一個詞,或一個句子操作
  • 每一個Emacs的指令都有名稱,可以用M-x [command]來下指令

Emacs移動

指令 介紹
M-v, C-v 上翻/下翻一頁
M-b, M-f 往前/往後 移動一個詞
M-a, M-e 移動到一句的開始/結尾(程式碼的一個段落)
C-l 移動視窗(遊標分別在中間、最上方、最下方)
M-g M-g 跳至指定行(= M-g g)
M-m 將游標移到該行第一個字元(比C-a好用)

Emacs編輯

指令 介紹
C-j 換行並自動縮排(newline-and-indent)
C-SPACE 開始選取文字(再按一次結束選取)
C-x C-x 改變選取的方向
C-x h 全選
M-h 選擇遊標所在的段落
C-w/M-w 剪下/複製 選取文字
C-y 貼上選取文字
M-y 改變貼上的文字(從之前剪下/複製過的文字中,由新到舊出現)
C-d delete鍵(刪除後一個字)
M-d 刪除後一個詞
M-del 刪除前一個詞
C-g 取消尚未完成的指令

C-k : 刪除從游標到「行尾」間的字元
單獨的 C-k 會把一行的內容殺掉
而第二個 C-k 則會殺掉那一行本身(‘\n’)。使所有其他的行向上移動

C-x u : 還原
(1) 沒有改變文字的指令不算(移動游標和視窗等)
(2) 自行鍵入的字元 一次最多還原20個

重複

指令 介紹 示範
C-u [數字] [指令or字元] 重複執行 C-u 8 a → aaaaaaaa
M-[數字] [指令or字元] 重複執行 M-8 a → aaaaaaaa

Emacs搜尋

指令 介紹
C-s 往後搜尋(再按一次:找下一個)
C-r 往前搜尋
M-C-s 正規表示式搜尋
M-% 取代
  • y或space:置換目前游標所在的字串,並且移到下一個可被置換的字串
  • n:跳過目前游標所在的字串。移到下一個可被置換的字串
  • ESC:結束置換模式
  • .:置換目前的字串,並離開置換模式
  • !:將整個檔案一次置換完畢,不進行任何詢問
  • ^:回到前一個符合置換的地方
  • C-r: 進入recursive-edit模式
    • M-C-c: 結束recursive-edit模式

Emacs分割(window)

在螢幕上顯示多個編輯區,我稱為分割

指令 介紹
C-x 0 關閉目前分割
C-x 1 關閉其他分割(只留下目前的分割)
C-x 2 新增水平分割
C-x 3 新增垂直分割
C-x o 跳到別的分割(在現有的分割循環)
M-C-v 捲動另一個分割
C-x 5 2 開新視窗(frame)

Emacs檔案

Emacs檔案切換

指令 介紹
C-x C-b 列出檔案清單(Buffer List)
C-x b 切換至其他開啟的檔案
C-x k 關閉目前編輯的檔案(不存檔)

Emacs檔案指令

指令 介紹
C-x C-f 開新檔案,開啟舊檔
C-x 4 f 在新分割開啟檔案
C-x C-s 儲存檔案
C-x s 全部檔案儲存
C-x C-w 另存新檔
C-x d 開啟資料夾(Dired)
C-x C-v 取代目前檔案(find-alternate-file, 開錯檔案的時候用)

Emacs系統

指令 介紹
C-x C-c 結束 Emacs
C-z 暫時離開Emacs(Suspend)

fg%emacs恢復 Emacs

Emacs函式

指令 介紹
M-x [function] 執行名為[function]的指令
M-x compile 編譯(會開啟compilation分割)
M-x recompile 重覆執行上次執行過的compile指令
C-x ` 跳到下一個有編譯錯誤的地方
M-x gdb 用gdb除錯
M-x shell 開啟shell分割

需要在 Shell 下的慣用命令前加上 C-c
C-c C-c 為中止程式; C-c C-z 為暫停程式等

Emacs幫助

指令 介紹
C-h ? 開啟 Help 分割
C-h c [指令] 在命令列顯示簡短解釋
C-h k [指令] 在新分割顯示詳細解釋
C-h f [函數] 在新分割顯示說明文件
C-h w [函數] 查詢此函數的快捷鍵
C-h m 瀏覽現在模式的文件(C, C++, text…)
C-h a 列出所有「含有此關鍵字」的全部函式(Command Apropos)
C-h i 開啟 info 分割

其他

指令 介紹
M-C-\ 選擇區塊自動縮排(indent-region)
M-; 在句尾加入註解
M-^ 將此行併入上一行
C-t 對調兩字元
M-t 對調兩單字
C-x C-t 對調兩行
M-c 將字的第一個字母改為大寫(Capitalize)
M-u 將單字改為大寫(Upper)
M-l 將單字改為小寫(Lower)
C-x i 插入其他檔案的內容(insert-file)

Emacs技巧

自動完成

M-/
可重複輸入以改變

移動至定義(goto declaration)

  1. 建立tag檔
    1
    2
    3
    4
    # for c, c++ file
    find . | grep ".*\.\(c\|h\|cpp\)" | xargs etags -f tags # output filename "tags"
    # for python file
    find . -type f -name '*.py' | xargs etags -f tags
  2. 在Emacs中用M-.進行搜尋
  3. C-x 4 .: 在另一個分割開啟定義

M-* 回到前一個定義的位置

回到之前的遊標位置

在搜尋或尋找定義之後很好用
C-u C-space

Emacs作為IDE使用

function compile 執行編譯命令(make, g++ …)
function recompile 重復之前的編譯命令
可將其設為快捷鍵

編譯成功後自動關閉compilnation分割
智慧編譯:自動偵測檔名或makefile並編譯

Sublime Text + Emacs快速鍵

https://github.com/grundprinzip/sublemacspro

Emacs巨集(Macro)

指令 介紹
C-x ( 開始定義巨集
C-x ) 結束巨集定義
C-x e 執行上一個定義的巨集
M-[Num] C-x e 將上一個定義的巨集執行 Num 次
C-u C-x ( 執行上一個定義的巨集,然後可以加上按鍵以重新定義巨集
C-x q 將巨集定義中插入查詢
C-u C-x q 將巨集定義中插入遞迴編輯
M-C-c 跳出遞迴編輯

name-last-kbd-macro: 將上一個定義的巨集存檔之前予以命名
load-file: 載入儲存的lisp程式碼巨集
macroname: 執行儲存過的”macroname”巨集
insert-kbd-macro: 將命名過的巨集以lisp程式碼印出

應用:在EmacsMacro.el中儲存巨集程式碼,並在.emacs中寫入

1
2
;;load my macro file                                       
(load "~/EmacsMacro")

Emacs + Latex

參考資料

安裝: sudo apt-get install texlive-full

“:插入 ```’ 或 ''' 或“‘ 符號
M-x validate-tex-region:檢查每一段文稿是否有不平衡的大括號
或錢字號。
C-c {:插入 {}' 並將游標移至左右大括號之間 C-c }:將游標移至下一個右大括號的右端 C-c C-o:插入 LaTeX 區段標記\begin’ 及\end’ 並將游標移至
二者間的空行
C-c C-e:為前一個不平衡的 `\begin’ 加上\end’

編譯

  • C-c C-f:對目前所在的檔案執行 TeX/LaTeX 的編譯

  • C-c C-r:對一段區域 (region) 執行 TeX/LaTeX 的編譯

    • 不論是 TeX 或 LaTeX都包含了一段有關全文的訊息在整篇文稿的開端,若是僅僅編譯所指定的區域而忽略了這段訊息的話,將會產生錯誤的結果。為了解決這個問題,必需在文稿中標明header 的位置,然後在 用 C-c C-r 命令時 emacs 會自動將header中的訊息讀入處理。在 TeX 中標明 header 的方法是在 header段落前後插入 %start of header' 和 %end of header}’
  • C-c C-b:對整個目前所在的緩衝區 (buffer) 執行 TeX/LaTeX 的編譯

  • C-c C-r 和 C-c C-b 並不會產生如 *.aux等的附屬檔,因此無法執行cross-reference等工作。如果需要產生附屬檔則必需使用 C-c C-f

  • C-c TAB:對目前所在的檔案執行 BibTeX 的編譯

  • C-c C-v:預覽 C-c C-r, C-c C-b 或 C-c C-f 編譯的結果

  • C-c C-k:終結 (kill) 目前進行中的 TeX/LaTeX 程序(process)

  • C-c C-p:列印 C-c C-r、C-c C-b 或 C-cC-f 編譯的結果

  • C-c C-q:顯示目前的 printer queue

Emacs + Git

使用git-emacs

畫簡單的ASCII圖

Artist Mode
輸出成圖片檔

Emacs + Markdown Mode

Emacs Markdown模式

有些指令直接輸入比較快…

指令 介紹
C-c C-t [N] 插入第N級的標題
C-c C-a l 插入鏈接,格式為 [text](url)
C-c C-i i 插入圖像,格式為 ![text](url)
C-c - 插入水平線
S-Tab 在大綱視圖、目錄視圖、及正常視圖間切換
C-c C-c m 預覽HTML
C-c C-c p 在瀏覽器中預覽

Emacs + Screen

Screen 指令表

因為Emacs的快捷鍵和Screen重複,要自己在.screenrc設定檔修改

  • .screenrc 中新增 escape ^vv
    即可將 所有 C-a 改為 C-v
  • .screenrc 中新增 escape ^l^l
    即可將 所有 C-a 改為 C-l,且在輸入 C-l C-l 時可以跳脫screen指令(等同在terminal輸入C-l)
  • 修改教學

在使用Emacs時,適合bind到screen的key:
C-v(scroll-up-command), C-space(set-mark-command), C-t(transpose-chars), C-d(delete char), C-l(recenter-top-bottom)
其他都太常用或是不能bind(C-z, C-q, C-m, C-i),不然就要用 C-S 系列

終端機指令
screen -list 可以列出你目前的所有 screen 會話(同時可有多個screen)
screen -r [detached screen] 回復 detach 的 screen
screen -wipe 砍掉不要的screen

screen內指令共同前綴 C-a
C-a c - 開新分頁
C-a n - 切換到下一個分頁
C-a p - 切換到前一個分頁
C-a C-a - 切換到最近用過的分頁
C-a [N] - 跳到編號 N 的分頁
C-a w - 列出開啟的分頁(簡短)
C-a “ - 列出所有的分頁提供切換
C-a k - 關閉目前分頁

C-a S - 將螢幕水平分割
C-a - 在分割的區域之間切換焦點

C-a C - 清除目前的分頁內容
C-a H - 儲存目前分頁記錄(檔名為 screenlog.n, n 為視窗號碼)
C-a x - 鎖定screen,需要輸入使用者密碼
C-a d - Detach screen,暫時脫離screen,程式會持續進行,你可以在重開終端機或重新登入後再連接到剛才的那個 screen (當然,重開機會不見)

C-a [ - 編輯模式(操作和vi相似…)

  • h, j, k, l 分別為向左,向下,向上,向右移動一格(或是一行)
  • ^ 與 $ 分別移到該行最左邊及最右邊的非空白字元
  • w 以字為單位往前移動並移到字首
  • b 以字為單位往後移動並移到字首
  • e 以字為單位往前移動並移到字尾
  • C-b 向上捲一頁
  • C-f 向下捲一頁
  • / 與 ? 向下或向上尋找字串
  • space 第一次按下到第二次按下的區域會被複製
    • C-a ] 貼上
  • 非指令的輸入會離開編輯模式

套件安裝

其他功能

Replacing-text-across-multiple-files

不重要的功能

  • 放大字體: C-x C-+ 或 C-x C-=
  • 縮小字體: C-x C-–
  • 重置字體: C-x C-0

Emacs小知識

名稱: Emacs 是 「編輯巨集」[Editing MACroS]的簡稱

參考資料

前綴

  • 一些不是特別常用的函數綁定到前綴 C-x 上。例如 C-x C-c 退出 Emacs, C-x 2 水平分割當前 window
  • 與某個 mode 相關的的函數被綁定到前綴 C-c 上
  • 最不常用的函數根本沒有鍵綁定,而是使用 M-x 然後輸入函數名來調用他們
  • 前綴 C-x 4 被保留作操作另外一個 window 用的函數,例如 C-x 4 C-f 在另 外一個 window 裡面打開文件
  • 前綴 C-x 5 被綁定到操縱其他frame 的 函數上面

殺掉

  • 被殺掉的可以拉回,而被刪除的則不能
    • delete, backspace都是刪除
    • C-k, C-w, M-w 等指令都是殺掉
      • 如果連續地做了數次 C-k,所有被殺掉的文字都會被儲存在一起,因此做一次C-y 就會把所有這些行都拉回來
  • 將被殺掉的文字回復的動作稱為「拉回( yanking )」
    • C-y 會把最近殺掉的拉回來,前幾次殺掉的文字可以用 M-y 來回複
    • 可以給 M-y 正的或是負的參數來回到之前殺掉的東西

搜尋

  • Emacs 搜尋指令是「漸進的( incremental )」,搜尋發生在遊標後
    • 如果鍵入『u』,游標會移動到「cu」的第一次出現位置。將「u」從s搜尋字串中消除,游標會移回到「c」的第一次出現位置

設定檔: 家目錄的.emacs,可修改Emacs設定

BASH上預設的控制模式是Emacs,也就是說可以使用 C-a, C-f, C-b 等移動鍵,C-r搜尋歷史指令,C-n, C-p 切換歷史指令,C-k 殺掉文字, C-j 執行指令等等。
和Emacs不一樣的地方有 C-h往前刪除一字元, C-w清除游標以前的一個單字, C-u清除游標以前所有的字元。

快速設定

使用現成的設定檔

  • 優點

    • 不用搞lisp
    • 經過優化
    • 較完整
  • 缺點

    • 不夠客製化
    • 功能太多,搞不清
    • 難以修改
  • prelude

  • purcell

Reference

指令大全
Sams Teach Yourself Emacs in 24 Hours
一年成為Emacs高手(有常用套件推薦)