Emacs常用指令表
Emacs快捷鍵是可以修改的,所以不一定要全部記住,只需要熟悉基本功能和知道有其他方便的擴充功能即可
Emacs基本
- C → Ctrl
- M → Alt 或 esc
- S → Shift
- Ret → return(enter)
- 範例
C-c→ Ctrl + cC-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-x C-; | 註釋/取消註釋 |
C-k: 刪除從游標到「行尾」間的字元
- 單獨的 C-k 會把一行的內容殺掉
- 而第二個 C-k 則會殺掉那一行本身('\n')。使所有其他的行向上移動
C-x u: 還原
- 不會還原沒有改變文字的指令(移動游標和視窗等)
- 自行鍵入的字元 一次最多還原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 Mode) |
| 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分割中,需要在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)
- 建立tag檔
1 | # for c, c++ file |
- 在Emacs中用
M-.進行搜尋 C-x 4 .: 在另一個分割開啟定義
M-* 回到前一個定義的位置
使用autocomplete套件
回到之前的遊標位置
在搜尋或尋找定義之後很好用
C-u C-space
Emacs作為IDE使用
編譯成功後自動關閉compilnation分割
智慧編譯:自動偵測檔名或makefile並編譯
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 | ;;load my macro file |
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}'
- 不論是 TeX 或 LaTeX都包含了一段有關全文的訊息在整篇文稿的開端,若是僅僅編譯所指定的區域而忽略了這段訊息的話,將會產生錯誤的結果。為了解決這個問題,必需在文稿中標明header 的位置,然後在 用 C-c C-r 命令時 emacs 會自動將header中的訊息讀入處理。在 TeX 中標明 header 的方法是在 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
Emacs Markdown模式
有些指令直接輸入比較快…
| 指令 | 介紹 |
|---|---|
| C-c C-t [N] | 插入第N級的標題 |
| C-c C-a l | 插入鏈接,格式為 [text](url) |
| C-c C-i i | 插入圖像,格式為  |
| C-c - | 插入水平線 |
| S-Tab | 在大綱視圖、目錄視圖、及正常視圖間切換 |
| C-c C-c m | 預覽HTML |
| C-c C-c p | 在瀏覽器中預覽 |
Emacs + Screen
Screen 指令表
因為Emacs的快捷鍵和Screen重複,要自己在.screenrc設定檔修改
- 在
.screenrc中新增escape ^tt
即可將 所有 C-a 改為 C-t - 在
.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 系列
其他功能
多檔案取代字串
字體大小
- 放大字體: C-x C-+ 或 C-x C-=
- 縮小字體: C-x C-–
- 重置字體: C-x C-0
Emacs Server
若Emacs設定檔太大,開啟時會需要花很長時間,所以可以持續開啟server,需要的時候再使用client連接至server,即可省下讀取設定的時間。
- 開啟server:
emacs --daemon - 連線至server:
emacsclient
解決Windows上C-Space被中文輸入法佔用的問題
- 上策:移除輸入法的
C-space綁定(失敗)- 語言列選項 → 輸入語言快捷鍵 → 將
C-Space取消或改成別的
- 語言列選項 → 輸入語言快捷鍵 → 將
- 中策:比輸入法更優先綁定
C-space(成功)- 使用AutoHotKey
^Space::^+2: 將C-Space映射至C-S-2
- 使用AutoHotKey
- 下策:換別的快捷鍵
C-S-2(Emacs內建,不過很難按)M-space(在VSCode不適用)C-tC-mC-h
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 的 函數上面
殺掉(kill)
- 被殺掉的可以拉回,而被刪除的則不能
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.d資料夾,可修改Emacs設定
Shell
- Bash上預設的控制模式是Emacs,也就是說可以使用
C-a,C-f,C-b等移動鍵,C-r搜尋歷史指令,C-n,C-p切換歷史指令,C-k殺掉文字,C-y貼上文字,C-j執行指令等等- 和Emacs不一樣的地方有
C-h往前刪除一字元,C-w清除游標以前的一個單字,C-u清除游標以前所有的字元
- 和Emacs不一樣的地方有
其他
Emacs即為Lisp語言直譯器,所以理論上可以做到任何Lisp能做到的事,所以也被稱為「神之編輯器」。
我完全同意 emacs 和管風琴一樣。配合 Cherry 機械鍵盤寫論文寫程式有如彈琴。Ctrl 鍵有如和弦,空白鍵宛如音符之間的暫停,而最後重重敲下 Return 鍵時,右手宛如指揮家劃下最後一個節拍的爽快。
-- 劉邦鋒
軼事
Tim O'relly 原本使用 Emacs,直到他弄丟 .emacs 檔案
原文
快速設定
使用現成的設定檔
-
優點
- 不用寫lisp
- 經過優化
- 較完整
-
缺點
- 不夠客製化
- 功能太多,搞不清
- 難以修改
-
Prelude
-
Purcell
-
Spacemacs
CheatSheet

Cheat Sheet
Emacs 上網
M-x url-handler-mode, C-x C-f <url> 可打開 html檔
M-x browse-url <url> 會直接打開瀏覽器
M-x eww <url> 開啟網頁於內部(不支援Javascript)
Emacs on Windows
- 下載GNU Emacs Windows版本
- 設定字體大小:M-x →
menu-bar-open→ o → D
參考資料
- 指令大全
- Sams Teach Yourself Emacs in 24 Hours
- 一年成為Emacs高手
- 有常用套件推薦