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 | 插入圖像,格式為 ![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 ^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-t
C-m
C-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高手
- 有常用套件推薦