關於 Emacs 的學習,其實老早之前就想進行了,現在正好借學習 Common Lisp 這個機會來整理一下。
測試環境:
Windows 10 20H2;
Emacs 27.2 x86_64-w64-mingw32;使用圖形界面。如無注明,本文的參考即為 Emacs 中內置的 Emacs 快速指南(Tutorial),相關術語的中文譯文選擇,也是向 TUTORIAL.cn(孫一江翻譯、薛富僑維護、水本社區校對)靠齊的。在此向他們及其他參考資料的作者一並表示感謝。
操作說明
不同於 Vim,Emacs 在打開一個文件后就處於可編輯狀態;和 Vim 相同的是,Emacs 也建議不要離開主鍵盤區來完成各類操作。Emacs 采用一種獨特的方式來記錄按鍵,為了方便閱讀,筆記仍會盡可能使用一貫的按鍵記錄方式,同時標注 Emacs 的標記,作為對比學習的參考。
在此之前,先梳理一下這種標記的基本含義。
C
代表Ctrl
;M
代表Alt
;<ESC>
代表Esc
;<Return>
代表Enter
;<SPC>
代表Space
;<TAB>
代表Tab
;<DEL>
代表Backspace
。
操作邏輯
Emacs 作為早期在文字終端中使用軟件,其中各項操作需要依靠鍵盤完成,而除了文字輸入外,大部分又以組合鍵的形式存在,即 Ctrl
+ 某某鍵,Alt
+ 某某鍵等;如 Ctrl
+ V
(C-v
)向下翻頁,Alt
+ V
(M-v
) 向上翻頁。
但這樣所能表示的功能是有限的,所以這里先介紹拓展(eXtend)命令的邏輯:
- 字符拓展:指按下
Ctrl
+X
后再按下某個鍵,或某個組合鍵,如Ctrl
+X
Ctrl
+F
(C-x C-f
)打開一個文件; - 命令名拓展:指按下
Alt
+X
后再輸入一個命令名,最后回車,如Alt
+X
help-with-tutorial
Enter
(M-x help-with-tutorial
)打開 Emacs 快速指南。
使用
Ctrl
+H
T
(C-h t
)可以快捷打開 Emacs 快速指南。
在使用字符拓展時,如果你操作地很慢,則能觀察到 Emacs 窗口底部會顯示出你已按下的組合鍵。比如你想打開一個文件,在按完 C-x
后忘記了接下來操作,一小段時間后,Emacs 底部顯示出了你剛才的按鍵:
圖 1 回顯區
這個提示了之前按鍵的區域稱之為回顯區(Echo Area)。其上具有較深底色的區域稱之為狀態欄(Mode Line)。
特別地,在使用 M-x
或 C-x C-f
后,你需要輸入相應的內容:
圖 2 小緩存
此時,接受你輸入的這塊區域被稱之為小緩存(Minibuffer),在這里也可以像在普通緩存區一樣執行各種 Emacs 操作。
在小緩存中,命令名或其他內容的輸入未必要完整,可以在輸入開頭幾個字符后,按下
Tab
鍵來補全。如果是類似help-with-tutorial
這樣有連字符的內容,可以輸入hel
后按 2 下Space
鍵實現補全到help-
(單按Tab
鍵不會補出-
符號),然后再輸入w
后按Tab
鍵補全完整(而單按Space
鍵不會補到-
之后,所以兩者要結合起來用)。
無論是小緩存還是回顯區,也無論一個操作執行到何種地步,都可以使用 Ctrl
+ G
(C-g
)來中斷取消(推測 G 為 Give up 之意)或者連按 3 下 Esc
鍵(<ESC><ESC><ESC>
)。
查看操作
Emacs 作為文本編輯器,首要的任務當然是文本的查看,相關操作如下:
操作 | 操作鍵 | 特有記法 | 備注 | 主區外鍵 |
---|---|---|---|---|
移動光標(→) | Ctrl + F |
C-f |
F 意為 Forward | → |
移動光標(←) | Ctrl + B |
C-b |
B 意為 Backward | ← |
移動光標(↓) | Ctrl + N |
C-n |
N 意為 Next | ↓ |
移動光標(↑) | Ctrl + P |
C-p |
P 意為 Previous | ↑ |
向下翻頁 | Ctrl + V |
C-v |
當前頁面的最后兩行會保留到下一頁面中 | PgDn |
向上翻頁 | Alt + V |
M-v 或 <ESC>v |
先按一下 Esc ,再按一下 V ,這種為沒有 Alt 設計的替代按法,后面不會再記錄了 |
PgUp |
將當前光標所在行置於中心 / 頂 / 底 | Ctrl + L |
C-l |
按第一次置於中心,第二次頂,第三次底 | / |
移動到行首 | Ctrl + A |
C-a |
A 是第一個英文字母,可能有開頭之意 | Home |
移動到行尾 | Ctrl + E |
C-e |
E 意為 Ending | End |
移動到下一個單詞 | Alt + F |
M-f |
如果全是中文的話,會移動到下一個標點符號處 | / |
移動到上一個單詞 | Alt + B |
M-b |
如果全是中文的話,會移動到上一個標點符號處 | / |
移動到句首 | Alt + A |
M-a |
中英文邏輯一致 | / |
移動到句尾 | Alt + E |
M-e |
中英文邏輯一致 | / |
移動到文件首 | Alt + Shift + , |
M-< |
因為輸入 < 需要按 Shift + , |
/ |
移動到文件尾 | Alt + Shift + . |
M-> |
因為輸入 > 需要按 Shift + . |
/ |
向后搜索 | Ctrl + S |
C-s |
輸入要搜索的字符串后,繼續執行 C-s 跳轉到下一個匹配的項,使用 <DEL> 回到上一個匹配的項,使用 <Return> 結束搜索 |
/ |
向前搜索 | Ctrl + R |
C-r |
輸入要搜索的字符串后,繼續執行 C-s 跳轉到上一個匹配的項,使用 <DEL> 回到下一個匹配的項,使用 <Return> 結束搜索 |
/ |
表 1 基本查看操作表
在 “向后搜索” 中,也可以使用
C-r
改變搜索方向,反之亦然。
編輯操作
Emacs 在打開文件后,會直接進入編輯模式,此時可以和很多常見的編輯器一樣,輸入、刪除、換行等,相關操作如下:
操作 | 操作鍵 | 特有記法 | 備注 | 主區外鍵 |
---|---|---|---|---|
開始選擇 | Ctrl + Space 或Ctrl + Shift + 2 |
C-<SPC> 或C-@ |
激活此命令后,進入 Mark set 狀態, 此時移動光標,舊光標與新光標之間的 內容將被選中 |
/ |
刪除前一個字符或 刪除選中的內容 |
Backspace |
<DEL> |
注意不要當成是 Delete 鍵了 |
/ |
刪除后一個字符 | Ctrl + D |
C-d |
/ | Delete |
復制選中的內容[1] | Alt + W |
M-w |
復制選中的內容 | / |
移除(Kill)選中的內容 | Ctrl + W |
C-w |
復制選中的內容,然后將其刪除,相當於剪切 | / |
移除(Kill)前一個單詞 | Alt + Backspace |
M-<DEL> |
如果全是中文的話,會復制到上一個標點符號處, 然后將其間的內容刪除 |
/ |
移除(Kill)后一個單詞 | Alt + D |
M-d |
如果全是中文的話,會復制到下一個標點符號處, 然后將其間的內容刪除 |
/ |
移除(Kill)至行尾 | Ctlr + k |
C-k |
從光標處復制到行尾,不含此行的換行符, 然后將其間的內容刪除 連續的多次移除所刪的內容會被復制在一起 |
/ |
移除(Kill)至句尾 | Alt + k |
M-k |
從光標處復制到句尾,含此句的句號, 然后將其間的內容刪除 |
/ |
召回(Yank) | Ctrl + Y |
C-y |
將最后一次復制的內容在光標處插入,相當於粘貼 | / |
召回循環 | Alt + Y |
M-y |
使召回后,立刻使用此命令,可改變召回的內容 為上上一次的復制,連續使用則不斷回溯 回到最初后再次使用則回到最后 |
/ |
撤銷操作 | Ctrl + / 或Ctrl + Shift + - 或Ctrl + X U |
C-/ 或C-_ 或C-x u |
光標移動、頁面滾動等命令不會撤銷 輸入的字符最多 20 個為一組視為一次操作 撤銷操作本身也會視為一次操作被記錄下來 |
/ |
表 2 基本編輯操作表
因此,在撤銷后如果想要立刻重做,可以通過
C-g C-/
來實現[2]。
文件與窗格(Window)操作
如何打開、關閉等,也是十分重要的內容,整理如下:
操作 | 操作鍵 | 特有記法 | 備注 | 主區外鍵 |
---|---|---|---|---|
打開文件 | Ctrl + X Ctrl + F |
C-x C-f |
需要輸入文件的路徑地址, 不存在則進入新建模式 |
/ |
保存文件 | Ctrl + X Ctrl + S |
C-x C-s |
/ | / |
表 3 基本文件操作表(上)
需要注意的是,一個打開的文件在 Emacs 中會以一個緩沖區(Buffer)的形式存在,Emacs 中可以同時存在多個緩沖區,一個在顯示在界面中,多個隱藏了起來(也可以讓兩個或更多個顯示在界面中)。
操作 | 操作鍵 | 特有記法 | 備注 | 主區外鍵 |
---|---|---|---|---|
保存所有文件 | Ctrl + X S |
C-x s |
會保存前台以及后台的未保存的文件 | / |
列出緩存區列表 | Ctrl + X Ctrl + B |
C-x C-b |
在緩存區列表中回車,會調出光標所在行的緩存區, 這會讓兩個緩存區位於前台 |
/ |
切換緩存區 | Ctrl + X B |
C-x b |
需要輸入緩存區的名字來切換,會將當前光標活動的緩存區 切換成目標緩存區 |
/ |
關閉當前緩存區[3] | Ctrl + X K |
C-x k |
可以實現放棄更改 | / |
關閉所有緩存區,退出 | Ctrl + X Ctrl + C |
C-x C-c |
會詢問是否保存未保存的緩存區 | / |
表 4 基本文件操作表(下)
在使用圖形界面時,一個有最大化、最小化和關閉按鈕的 Emacs 界面被稱之為一個窗口(Frame);在一個窗口之中,Emacs 可以分出 2 個或更多的 “部分” 來顯示同一個緩存區的不同位置或顯示不同的緩存區,這些 “部分” 被稱之為窗格(Window)。
圖 3 一個 Emacs 窗口與其中的三個窗格
操作 | 操作鍵 | 特有記法 | 備注 | 主區外鍵 |
---|---|---|---|---|
在新窗格中打開文件 | Ctrl + X 4 Ctrl + F |
C-x 4 C-f |
打開后,光標也會自動切換到新窗格中 | / |
將當前窗格左右一分為二[4] | Ctrl + X 3 |
C-x 3 |
分割后,皆顯示原當前窗格的緩存區 光標停留在左窗格中 |
/ |
將當前窗格上下一分為二 | Ctrl + X 2 |
C-x 2 |
分割后,皆顯示原當前窗格的緩存區 光標停留在上窗格中 |
/ |
僅顯示當前窗格 | Ctrl + X 1 |
C-x 1 |
其他窗格將被關閉,當前窗格將最大化顯示 關閉窗格並不會連帶關閉其中的緩存區 |
/ |
將光標移動到另一個窗格 | Ctrl + X O |
C-x o |
連續使用,可以循環回原窗格 光標所在的窗格即為當前窗格 |
/ |
表 5 基本窗格操作表
配置說明
新版的 Emacs (本筆記為 Emacs 27.2)在配置方面似乎與之前略有出入,總之,和我在其他地方查到的說法不太一致。
配置文件
Emacs 的配置位於 %AppData%\.emacs
[5] 這個文件之中,新安裝 Emacs 情況下,建議在配置文件的最后添加如下內容[6]:
(add-to-list 'package-archives
'("melpa" . "http://melpa.org/packages/"))
;; 啟用 melpa 的包管理。
插件相關
完成上一節的添加后,重新打開 Emacs,就可以在線安裝插件了,下面介紹一些相關操作。
查詢與安裝
執行 M-x package-list-packages
打開插件列表[6:1]。
圖 4 插件列表加載中
插件列表的加載可能會比較慢,當狀態欄中有 Loading 字樣時,表示列表還在加載之中。
圖 5 插件列表加載完畢
當回顯區出現 Package refresh done 字樣時,表示加載已經完成了,此時可以使用 C-s
來搜索需要的插件了。
單擊目標插件名,並在新出現的窗格中單擊 “Install”,並在彈出的對話框中選擇 “是(Y)”。
圖 6 插件安裝完成
當觀察到 Other versions 字段后出現了 installed 字樣后,就表示安裝成功了。
如果列表加載太慢或安裝太慢,可以考慮更換為網易的鏡像源:將配置文件
.emacs
中的http://melpa.org/packages/
替換為http://mirrors.163.com/elpa/
[7]。
快速安裝
如果知道准確的插件名,可以使用 M-x package-install
,然后在小緩存中輸入准確的插件名后回車確認[8]。
列出已安裝插件與卸載
使用 M-x package-delete
進入插件卸載模式[9],執行命令后,小緩存區等待輸入插件名,此時直接按下 Tab
鍵,可以查看已安裝插件列表:
圖 7 已安裝插件列表
然后,輸入待刪除插件的名稱(注意可以使用 Tab
鍵補全)即可。
主題、字體、字號等配置
這部分內容基本為自行探索所得。
首先推薦 Doom 系列主題,要獲得這個主題,安裝插件 doom-themes
。
完成后,定位到菜單欄的 “Options” → “Customize Emacs” → “Custom Themes”,在新出現的窗格中,勾選 doom-opera-light
(本筆記使用的主題)后,回到頂部,點擊 “Save Theme Settings” 即可。
如果想要尋找其他主題,建議在 “A GNU Emacs Themes Gallery” 上找到后[6:2],再去安裝相應的插件。
要更改字體與字號,定位到菜單欄 “Options” → “Set Default Font...”,在彈出的窗口中設置字體,本筆記使用的設置如下:
- 字體(F):等距更紗黑體 Slab SC;
- 字形(V):常規;
- 大小(S):四號。
完成后點擊 “確定”,最后需要 “Options” → “Save Options” 才能保存這一設置(否則下次啟動 Emacs 又恢復成原來的樣子了)。
滾動條與圖標工具欄用處不大,反而還隱藏界面的簡潔性,去除方法為在 .emacs
配置文件的最后添加如下內容[10]:
(set-scroll-bar-mode nil)
;; 隱藏滾動條。
(tool-bar-mode 0)
;; 隱藏圖標工具欄。
雜談
這篇筆記基本上算是實踐完 Emacs 快速指南后心得體會。非常建議初次學習 Emacs 的讀者,先跟着快速指南操作一遍,再來閱讀此筆記。我在筆記中按功能,分類整理了 Emacs 的快捷鍵,同時也增加了我自己的表述,希望能從另一個角度幫助讀者理解和記憶。
此外,這篇 Emacs 學習指南也很值得一讀:mastering-emacs-in-one-year-guide/guide-zh.org at master · redguardtoo/mastering-emacs-in-one-year-guide · GitHub。
在准備寫博客之前,我一直在考慮,應該使用什么樣的方式、面對什么樣的讀者。不過后來我發覺,又何必等到一切准備就緒呢?互聯網世界日新月異,既然已經加入,何不分享一些感受?反正筆記已經記下,不如將其公開;各人有各自的角度,這一點對作者和讀者都同樣適用。若真為自己的所思所悟,那就不必瞻前顧后,就讓它恣意地沉浮在互聯網的洪流之中吧,其價值自交給淘沙者們去評判吧。
-
這部分參考了菜單欄上面的快捷鍵提示。 ↩︎
-
這部分為自行類推出來的。 ↩︎
-
如果 Win10 系統用戶名為
ABC
,那%AppData%
就等同於C:\Users\ABC\AppData\Roaming
。可以按Win
+R
打開 “運行” 窗口,在其中輸入%AppData%\.emacs
后回車,然后選擇記事本或其他文本 / 代碼編輯器打開它,建議使用 Visual Studio Code。 ↩︎ -
參考:推薦使用 TUNA ELPA 鏡像(優先於 Emacs China ELPA 鏡像) - Emacs-general - Emacs China。 ↩︎
-
參考:emacs - How to remove installed elpa package - Stack Overflow。 ↩︎
-
滾動條部分參考 “Emacs-050-關閉 Emacs 滾動條_小灰筆記 - CSDN 博客”,圖標工具欄部分參考 “Emacs 顯示時間、隱藏菜單欄工具欄、關閉啟動畫面、高亮當前行_u010654583 的博客 - CSDN 博客”。 ↩︎