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 高手 (有常用套件推薦)