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-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)

  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
  1. 在Emacs中用M-.進行搜尋
  2. 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
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

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被中文輸入法佔用的問題

  1. 上策:移除輸入法的C-space綁定(失敗)
    1. 語言列選項 → 輸入語言快捷鍵 → 將C-Space取消或改成別的
  2. 中策:比輸入法更優先綁定C-space(成功)
    1. 使用AutoHotKey
      1. ^Space::^+2: 將 C-Space 映射至 C-S-2
  3. 下策:換別的快捷鍵
    1. C-S-2(Emacs內建,不過很難按)
    2. M-space(在VSCode不適用)
    3. C-t
    4. C-m
    5. 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的第一次出現位置。將us搜尋字串中消除,游標會移回到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即為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高手
    • 有常用套件推薦