=> 上一篇:Emacs 素顏淡妝
前言
配置了字體,修改了顏面,你的 Emacs 此時已頗為體面。
也許你早已迫不及待,像很多學習 Emacs 的人那樣,希望儘快為自己的 Emacs 安裝一些強大的插件,使之從編輯器之神躍遷為神之編輯器。
我希望你能安靜下來,守着你的 init.el,如無必要,勿增配置。
制動鍵
要學會開車,需要先學會如何剎車。
當你讓 Emacs 執行某個命令或某個組合鍵時,中途突然需要放棄,此時可使用 C-g,它可以強行終止 Emacs 正在進行的幾乎任何任務。若 C-g 未起效果,可重複執行幾次。
有時,你的 Emacs 可能會進入一種僵死狀態,例如它在完成一項計算量很大且需要耗費很長時間的任務,在這種情況下,如果你需要 Emacs 終止該任務,你可以摁下 C-g 不放,直至 Emacs 恢復正常。
光標
編輯文本時,會經常移動光標。在 Emacs 的圖形界面模式裏,你可以用鼠標直接將光標定位到某處。若在小範圍內精確移動光標,可以用鍵盤上的四個方向鍵。若將光標快速移動到一行文字的首部或尾部,可以用 Home 或 End 鍵。
若將光標移動到緩衝區的首部或尾部,可以用組合鍵 M-<(即 Alt + Shift + , 鍵)或 M->(即 Alt + Shift + . 鍵)。
現在,你已經寫過一些 Elisp 程序,領略了 Lisp 這門以層層括號編寫程序的另類語言。也許你已經發現了,在使用 Emacs 編寫 Elisp 代碼時,每當光標移動到某個括號上,與之配對的括號便會自動加亮。實際上,此時你也可以通過 C-M-f 和 C-M-b 在這對括號之間來回跳轉。即便用 Emacs 編輯其他內容,這對組合鍵也可以使用,你不妨一試,以觀其效。
需要注意的是,有些輸入法也會定義一些組合鍵,從而對 Emacs 的組合鍵產生劫持效應,例如 fcitx 可能會劫持 C-M-b。遇到這種情況,你可以查看輸入法的配置,修改其組合鍵設定。待日後,你學會如何為 Emacs 設置組合鍵綁定時,也可以讓 Emacs 遷就這些輸入法。
在 Emacs 圖形界面模式裏,可以用鼠標左鍵選取一段文字,也可以將光標移動到這段文字的開始處,用 C-@ 標記區域的起點,然後移動光標至這段文字的末尾,完成選取,且在此過程中,可配合能快速移動光標的快捷鍵或組合鍵,以提高文字選取效率。
剪切/複製與粘貼
無論是用鼠標,還是用鍵盤控制光標選取的文字,若要剪切它,可用 C-w;若要複製它,可用 M-w。對於剪切或複製的文本,需要將其插入某處,只需將光標移該處,執行 C-y。
對於剪切或複製的文字,Emacs 將其放在一個你看不到的環形緩衝區內,亦即,Emacs 為剪切或複製的文字建立了歷史機制。C-y 可以將最近一次剪切或複製的文字粘貼在指定位置,倘若你需要的是之前剪切或複製的內容,此時可繼續用 M-y 予以切換。
練習:對於以下文字,先用 C-w 複製 #include,再複製 stdio.h,再複製 main,然後任選一個位置,用 C-y 粘貼所複製的文本,隨機再執行幾次 M-y,觀察所發生的現象。之後,執行 M-: (setq kill-ring nil),再嘗試執行 C-y 和 M-y,觀察所發生的現象。
#include <stdio.h>
int main(void) {
printf("hello world!\n");
return 0;
}
刪除
用光標選則一段文本,要刪除它,可用 Backspace 或 Del 鍵。刪除了一段文本後,立刻意識到是誤刪,可使用 C-/ 或 C-_ 予以恢復。
類似於用於存儲剪切或複製內容的環形緩衝區,Emacs 也為文字編輯過程提供了一個環形緩衝區,用於記錄歷史操作。當你發現誤刪除一些內容時,使用 C-/ 可以撤銷之前的操作,但是隻要你繼續執行 C-/,則撤銷過程可以繼續,從而讓文檔內容回退到更早的狀態。
M-k 可刪除光標到句尾的全部內容。C-k 可以刪除光標所在位置直至行尾的全部內容。倘若光標移動到行首,則 C-k 可以刪除整行內容。M-z 目標字符,可以刪除光標所在位置到其後目標字符的所有內容。需要注意的是這三個操作所刪除的內容皆會被存入剪切/複製環形緩衝區,亦即它們所綁定的命令皆為文字剪切命令。
M-\ 可以刪除光標前後的所有的空白字符(Tab 和空格)。
搜索與替換
搜索,也是一種高效的移動光標的方式。當你執行 C-s 搜索目標 時,Emacs 便會將光標向後移動到第一個被發現的搜索目標所在的位置。然後,你可以繼續執行 C-s,Emacs 便會繼續移動光標,向後續的搜索目標前進,直至抵達緩衝區末尾,此時 Emacs 宣告搜索失敗。倘若你繼續執行 C-s,Emacs 會從緩衝區首部重新進行搜索。C-r 搜索目標 可以從光標所在位置向前搜索,即搜索方向與 C-s 相反。
倘若你懂得一些正則表達式,可以用 C-M-s 與 C-M-r 以正則表達式的形式設置搜索目標,從而能實現更有效的搜索。需要注意的是,有些輸入法可能會對這兩個快捷鍵劫持,例如 fcitx 會默認劫持 C-M-s。
M-% 搜索目標 RET 替換內容 RET 可以實現搜索和交互式替換,而 C-M-% 搜索目標 RET 替換內容 RET 可實現基於正則表達式的搜索和交互式替換。所謂交互式替換,即需要你逐一確認是否替換。
練習:用 Emacs 將以下數字之間的空格替換為換行符。注意,替換內容裏,是無法輸入回車鍵的,否則相當於向 Emacs 提交替換內容,可使用 C-q C-j 輸入回車鍵。
1 2 3 4 5
命令 replace-string 和 replace-regexp 可分別用於普通搜索目標和正則搜索目標的批量替換,亦即這兩個命令在搜索和替換時,無需逐一確認,而是一次性替換所有搜索目標。
重複
C-u 是一個很奇怪的組合鍵,它的作用是向另一個命令傳遞一個數字參數。通過它,可以實現一些重複的插入或刪除效果。例如,C-u 4 0,可以在光標所在位置插入 0000,倘若將光標移動到這 4 個 0 的首部,然後執行 C-u 4 Del,便可將 4 個 0 刪除。也可以用 C-u 控制光標的移動距離,例如 C-u 8 Right,可以將光標向右移動 8 個字符。倘若不為 C-u 提供數字,它會默認以 4 工作。例如,C-u Down,可以將光標向下移動 4 行。有一些 Emacs 命令,需要用 C-u 改變行為,例如 C-u C-u C-s 可以在搜索文字時,區分大小寫。
練習:你知道 C-u 10 0 和 C-u 10 C-u 0 的區別嗎?可以嘗試在 Emacs 裏執行前者,看能否成功。
矩形操作
文本編輯器大都是基於行(Row)的操作。Emacs 提供了基於列(Column)的操作模式,即矩形模式。在矩形模式下,可以用矩形選取文字,然後刪除或替換。
例如,對於以下文字,將光標移動到第 2 行第 4 個 b 上,然後執行 C-x SPC,SPC 即空格鍵,然後將光標移動到第 3 行倒數第 3 個 c 上,便可獲得如下圖所示的矩形選擇結果。
aaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbb
cccccccccccccccc
dddddddddddddddd
對於所選的結果,可以上文所述的組合鍵複製、剪切或刪除,也可以使用 C-x r t 鍵替換內容,例如只需用 C-x r t C-u 10 * 便可將上述文字修改為
aaaaaaaaaaaaaaaa
bbb**********bbb
ccc**********ccc
dddddddddddddddd
練習:將光標移動到上述文字第一行的第 1 個 a 上,然後執行 C-x SPC,隨機向下移動光標到第 4 行的第 1 個 d 上,然後執行 C-x r t |||| RET,觀察所發生的現象,所得結果應當如下
||||aaaaaaaaaaaaaaaa
||||bbb**********bbb
||||ccc**********ccc
||||dddddddddddddddd
練習:一些現代的文本編輯器提供了多光標編輯功能,Emacs 也有相應的插件。你思考一下,基於上文所講的搜索/替換以及矩形操作,可否完成多光標編輯所能完成的任何事。
總結
你可以將本文所述的這些組合鍵整理到一張卡片上以作備忘。不過,這些組合鍵只要你用過幾次,基本都能記得住,因為它們對應的是一些常用功能。用多了,自然就像識字一樣記住了它們,最終是你的手指記住了它們。當你的手指記住了這些組合鍵,在使用 Emacs 的時候,便會覺得像是在彈奏鋼琴,我只是擔心你會堅持以二指禪的方式彈奏鋼琴。
你生命裏所有編輯文字的任務,也許有 90% 只需基於這些組合鍵便可完成,亦即可能只有 10% 情況需要一些 Emacs 插件的輔助。若你是 Emacs 初學者,不考慮先掌握這 90%,而是先圖謀那 10%,猶如高考時,你一上來就去做壓軸題,而不是先解決那些你有能力解決的題目。
很多放棄 Emacs 的人,是從抱怨長時間頻繁摁 Ctrl 和 Alt 鍵位會傷左手或右手的小手指開始的。我的建議是,小手指若覺得累了或開始疼了,意味着你的身體在提醒你,你該休息了,或者用大拇指代替它們幾天。這世上沒有什麼工作必須要用你的小手指才會得以更快完成。
=> 下一篇:你會寫 Emacs 命令嗎?