走近 Emacs

-1. 學習 Emacs 須要點好奇心

在 GNU/Linux、Windows、Mac OS X 這三大主流操做系統中,Emacs 都是能夠用的,區別可能就是配置文件須要做一些輕微的調整。雖然運行 Android 系統的手機與平板也能安裝相應的 Emacs 移植版本,可是不管如何我都要建議你不要去嘗試在沒有實體鍵盤的系統中使用 Emacs。html

這個世界上,能跨這麼多操做系統運行的程序並不太多。對於一款自由軟件而言,能跨衆多系統運行的惟一緣由就是來自部分人類的須要。編程

對於『爲何要使用 Emacs?』這樣的問題,我不想回答。由於提出這個問題的人差很少已經有了本身不打算使用 Emacs 的自洽的理由。bash

若是你是對本身活着的這個世界有點好奇心的人,那麼當你聽到有人說『Emacs 是個假裝成文本編輯器的操做系統』,去體驗一下這個起源於計算機上古年代然而如今依然生機勃發的文本編輯器是怎樣的一種存在,這並不是浪費時間,並且 Emacs 的開發者與傳教者們將本身能夠變成李彥宏、馬化騰之輩的智慧奉獻給了 Emacs。他們的努力至少對得起你所付出的好奇與時間,而他們爲什麼而努力這自己就是一件值得好奇的事。編程語言

0. 也許你須要的是 Emacs 官方使用說明書

請打開終端,執行如下命令:編輯器

$ emacs -q

在打開的 Emacs 窗口中,經過菜單『Help』->『Emacs Tutorial (choose language)』打開『Emacs 指南』的多語言版本選擇界面,而後選擇『Chinese-GB18030』便可打開『Emacs 指南』的中文版。這就是 Emacs 官方提供的『使用說明書』,爲初學者提供了 Emacs 基本功能的概覽。函數

Emacs 官方指南的優勢是綱目並舉,內容嚴謹,可是顯然它比較適合採用廣度優先遍歷的方式閱讀。我喜歡的閱讀方式倒是深度優先遍歷,因此 Emacs 官方指南我一直都沒有看完。學習

雖然 Emacs 的知識駁雜繁多,但弱水三千,僅需一瓢。所以這份文檔主要圍繞我所用的 Emacs 一些功能而逐步展開。人工智能

1. 將 Emacs 做爲記事本使用

不管 Emacs 有多麼強大的功能,然而它本質上是文本編輯器,而文本編輯器所作的事情無非就是打開一份文本文件,而後在編輯器的文本編輯區域輸入文字。文本編輯任務結束後,再將文件保存至非易失性存儲器。Windows 系統提供的記事本程序(notepad.exe)可完美的勝任這些任務,而 Emacs 能夠完美的客串 notepad.exe 這個角色。spa

假設使用 Emacs 打開或新建一份名曰 demo.txt 的文本文件,只需:操作系統

$ emacs demo.txt

若是當前目錄存在 demo.txt 文件,那麼 Emacs 便會打開這份文件;反之,Emacs 會默默的在本身的世界裏以 demo.txt 爲名開闢一個 buffer(緩衝區)。

Emacs 的緩衝區是很是重要但也是很是簡單的概念。緩衝區差很少是世界上全部文本編輯器的標準設施。咱們在文本編輯器中輸入的文本只是保存在計算機主存中的,只有調用文本編輯器提供的『文件保存』功能時,文本編輯器纔會將緩衝區中的信息寫入至非易失性存儲器中對應的文件。這是文本編輯器最基本的功能,其反作用就是若是你不常常將緩衝區中的信息保存至文件,萬一機器掉電,你辛苦輸入的內容也就煙消雲散了。

用 Emacs 打開或新建一份文本文件,本質上意味着用 Emacs 在計算機主存中開闢了緩衝區,全部編輯工做都在這塊緩衝區中進行,除非使用 C-x C-s 命令進行文件保存。

所謂的 C-x C-s 命令是一套組合鍵。 C-x 表示:『摁住 Ctrl 鍵,再敲擊(摁下去即刻鬆開) x 鍵,而後鬆開 Ctrl 鍵』。 C-s 與之相似。因爲 C-x C-s 這套組合鍵須要摁下與鬆開 Ctrl 鍵兩次,Emacs 認爲這符合英語的連讀語序,因此你徹底能夠摁住 Ctrl 鍵不放,而後敲擊 x ,再敲擊 s 鍵。

用一套組合鍵調用文本編輯器的『文件保存』功能,這等小事,本沒必要多言,更況且它比 notepad.exe 的快捷鍵複雜了一倍(後者只需 C-s ),可是若是我說『 C-x C-s 是一個名曰 save-buffer 的 Emacs Lisp 函數的鍵綁定』,這樣可能會挽回一點 Emacs 的尊嚴。

也就是說,即便 Emacs 未提供 C-x C-s 這樣的快捷鍵,依然可使用 M-x 這個固定的快捷鍵去直接調用 save-buffer 函數,方法是:使用 M-x 組合鍵使得編輯器底部的微型緩衝區(Minibuffer)接受咱們所輸入的 Emacs Lisp 函數名及參數。因爲 save-buffer 函數不須要參數,因此在微型緩衝區中輸入 save-buffer 以後回車便可調用 save-buffer 函數,從而將 demo.txt 緩衝區中的信息寫入文件。

所謂 M-x ,一般意味着摁住 Alt 鍵,而後敲擊 x 鍵,而後鬆開 Alt 鍵。如今應該記住, C-x 是快捷鍵前綴,而 M-x 是調用 Emacs Lisp 函數的前綴。

2. Emacs Lisp 的三言兩語

Emacs 的所有功能體現爲一個數量龐大的 Emacs Lisp 函數集。 save-buffer 也許被用的最爲頻繁的 Emacs Lisp 函數之一。

所謂『Emacs Lisp 函數』,就是用一種名曰『Emacs Lisp』的 Lisp 方言寫的函數。

所謂『Lisp 方言』,指的是一種像 Lisp 語言的語言。

所謂的『Lisp 語言』,則是被譽爲『人工智能之父』的 John Maccarthy 於 1958 年爲人工智能領域發明的一種編程語言。

Lisp 語言有許多方言,諸如 Common Lisp、Scheme、Emacs Lisp、Clojure、Lua、Ruby 等等。之因此會出現多種方言,與人類的各類語言也存在許多方言差很少。Lisp 語言出自 Maccarthy 之手,可是在不一樣的環境中通過五十多年的發展,出現方言絕不奇怪。

Emacs Lisp 脫胎於 MIT 人工智能實驗室早期開發的一種 Lisp 方言——MacLisp,後來又受了 Common Lisp 的一些影響。事實上,Richard Stallman 在開發 Emacs Lisp 之時,Scheme 這個簡潔優美的 Lisp 方言已經出現,但其解釋器的運行效率不足以做爲一款文本編輯器的擴展語言。

Stallman 創造 Emacs 的主要手法是用 C 語言編寫與計算機硬件直接做用的模塊,而後用 C 語言寫出 Emacs Lisp 語言的解釋器,最後用 Emacs Lisp 語言編寫 Emacs 的文本編輯功能。許多年後,Paul Graham 在《黑客與畫家》中提到了『格林斯潘第十定律』:『任何C或Fortran程序複雜到必定程度以後,都會包含一個臨時開發的、只有一半功能的、不徹底符合規格的、處處都是bug的、運行速度很慢的Common Lisp實現』。偉大的 Stallman 從一開始就讓 Emacs 項目巧妙使得這個定律失效了。

Lisp 語言從計算機科技的上古時代跨越到了現代,它的存在也許是對這數十年來短視的人類的嘲弄。由於直到今天,最高級的主流語言,終於在功能上有些像 Lisp 了。無獨有偶,Emacs 也參與了這種嘲弄——現代的最高級的文本編輯器,終於在功能上也有些像 Emacs 了!

3. 緩衝區、窗口與窗框

Emacs 爲文本編輯提供的最基本的設施是緩衝區(Buffer)、窗口(Window)與窗框(Frame)。

文件,就是位於非易失性存儲器(硬盤、U 盤等)上的一塊區域。Emacs 可將文件中存儲的信息讀入緩衝區,也能夠將緩衝區中的信息寫入文件。窗口是用來編輯與顯示緩衝區中信息的設施。窗框是包含窗口的設施。

Emacs 的窗口功能,我一直以爲是神來之筆。大部分文本編輯器,緩衝區與窗口是用鉚釘固死的,而 Emacs 的緩衝區與窗口應該是螺栓鏈接。也就是說,在 Emacs 一個窗口中,能夠切換顯示不一樣的緩衝區。同理,一個緩衝區也能夠在多個窗口中顯示,由於窗框支持無限多的窗口。

Emacs 啓動後,窗框中默認只有一個窗口,可是使用 C-x 1C-x 2 能夠將其水平或豎直一分爲二,這個分割過程能夠無限的進行下去。每次被分割的窗口都是輸入光標所在的窗口(也稱爲被激活的窗口)。使用 C-x o 能夠在多個窗口中跳轉。

若是是圖形界面的 Emacs,可直接使用鼠標點擊要激活的窗口來實如今多個窗口中的跳轉,並且比 C-x o 更方便。即使如此,記住 C-x o 依然是必要的。由於你的鼠標有時會壞掉,有時你用的 Emacs 並不是圖形界面而是終端界面。若是你不懂我在說什麼,可在終端中執行如下命令:

$ emacs -nw 你要編輯的文件

因爲 Emacs 在拆分窗口時,默認是水平或豎直均分,因此若是你但願將某個窗口調的寬一些,可 C-x } ;要使之窄一些,可 C-x { ;要使之高一些,可 C-x ^,可是要使之矮一些,貌似只能是激活該窗口下方的窗口,而後讓下方的窗口高一些。這些窗口大小的調整方法,每次只能使得窗口的尺寸增大或減少一個字符的寬度或高度。若是你不想屢次輸入像 C-x ^ 這樣的命令,那麼能夠用 C-u n C-x ^ 這樣的組合鍵,其中 n 表示你要重複執行 C-x ^ 這樣的命令 n 次。例如,要將當前窗口的高度增長 5 個字符的高度,只需 C-u 5 C-x ^ 便可。

C-u 最好要牢記,它的職能就是給某個組合鍵所綁定的 Emacs Lisp 函數傳遞一個參數值。 C-u 5 C-x ^ 表示向 C-x ^ 所綁定的 Emacs Lisp 函數傳遞參數值 5 ,而這個函數接受這個參數值以後,就會將窗口的高度增長 5 個字符的高度。

要查看按鍵被綁定到了哪一個 Emacs Lisp 函數,只需 C-h k <RET> 按下你要查詢的鍵 。 <RET> 表示回車鍵。

若是以爲窗口太多,想關掉一些,那麼關閉被激活的窗口的組合鍵是 C-x 0 。若是是圖形界面的 Emacs,只須要鼠標右鍵點擊窗口的模式行便可將該窗口關閉。個人建議是:能用鍵盤就不要用鼠標

要在某個窗口中打開或新建一個文件,可 C-x C-f 文件路徑

爲了節省內存佔用,請儘可能使用 Emacs 的多窗口模式,不要打開一個又一個 Emacs。

4. 文本編輯的正確姿式

在 Emacs 窗口中輸入文字,這也許是 Emacs 世界中最沒有難度的一件事,只要你的輸入法能在 Emacs 窗口中輸入文字。可是這件事興許有可能演變爲世界無人能解決的『難題』——忽然有一天,你用的中文輸入法在圖形界面的 Emacs 中不工做了!

當中文輸入法在圖形界面的 Emacs 中不工做時,沒關係張也不要沮喪,由於 Emacs 的終端界面老是差很少老是可用的。這也是前文之因此對鼠標操做 Emacs 的行爲提出告誡的主要緣由。

複習:在終端中,執行 emacs -nw 或 emacs --no-window-system 命令便可開啓 Emacs 的終端界面。

若是你不擔憂中文輸入法問題,那麼接下來應該關注的想必是如何操縱窗口中的既有文本。例如,在某行文本中發現了輸入錯誤,須要刪除錯誤的文字,而後補正。對於這個任務,若是你用的是圖形界面的 Emacs,想必你又會不由自主的動用鼠標將光標移動到出錯的位置,而後用 Backspace 鍵去刪除錯誤的文字。重要的事,每每須要提醒三遍,假如你只有終端界面的 Emacs 可用,鼠標是救不了你的。

用 Emacs 的正確姿式應該是永遠保持能不用鼠標就不用鼠標的姿式!所以,你須要學會用鍵盤來控制光標在窗口中的位置。

最基本的光標位置控制鍵以下所示:

上一行 C-p
                    :
                    :
向左移 C-b .... 目前光標位置 .... 向右移 C-f
                    :
                    :
               下一行 C-n

要記憶這幾個鍵並不困難。 p 就是 previousn 就是 nextb 就是 backwardf 就是 forward,而 C 就是 Control……美國人民真會玩!

上述按鍵雖然簡單易懂,但它們只適合小範圍移動光標。在行內,能夠用 M-fM-b 先後大步移動光標,步進單位對於英文而言是單詞的長度,對於中文而言是兩個標點符號的間距。

對於英文文本,若將光標快速移到行首或行尾,標準按鍵是 C-aC-e 可是對於中文而言,這對按鍵有着將光標被移到段首或段尾的奇異效果……若是偶爾忘記了這對按鍵,用 HomeEnd 鍵也何嘗不可。 M-aM-e 則分別可將光標移動到句首或句尾。

若是文檔很長,用 C-vM-v 可實現向下或向上翻屏。若是偶爾忘記了這對按鍵,用鍵盤上的 PgUpPgDn 翻頁鍵也可行。

跨度最大的光標移動鍵是 M-<M-> ,可分別將光標移動到緩衝區的首部與尾部。

一旦掌握了上述這幾個控制光標位置的按鍵,在 Emacs 中鼠標基本上就變得不是那麼不可或缺了,更重要的是,這些按鍵可以幫助你更快速的選擇文本。對於文檔中的待選文本區域,用上述按鍵將光標移動到該區域的起始位置,而後用 C-@ 標定選區之首,而後繼續用上述按鍵將光標移動到選區之尾,這樣就完成了文本的選取。

你可能不知道怎麼產生 C-@ 按鍵序列。普通鍵盤上,應該是摁住 Ctrl 鍵,而後再摁住 Shift 鍵,最後摁下數字 2 鍵,而後鬆開手。由於 @2 上面,須要 Shift 切換……

對於選中的文本,隨後的操做無非是剪切、複製或刪除。剪切,請用 C-w;複製,請用 M-w;刪除,請用 Backspace。對於剪切或複製的文本,要粘帖在光標所在位置,請用 C-y……或者你也能夠試着看看 C-y 以後再 M-y 有什麼效果!

對文本進行了一段時間的編輯以後,要反悔的話,就用 C-_ 鍵執行 Undo 操做。

要產生 C-_ 的按鍵序列,請參考上文所講的 C-@ 的作法。

建議如今就馬上將上述提到的每一個按鍵都反覆試驗6、七次,之後就一直堅持使用它們……用不了幾天也許就變成手指的本能了。忘掉鼠標吧,鍵盤能夠解放你的雙手,可讓你從畸形的鼠標手解脫,而後變成鍵盤手……由於你很快就會以爲左手的小指會有點痠痛!我會在下一節中拯救你的手。

5. 拯救你的左手小拇指!

若是感到左手的小手指有點疼,就不要再去用左手去摁 C-x C-s 這樣的鍵了,你徹底能夠用右手的小指去摁鍵盤右側的 Ctrl 鍵,而後左手相應的手指去摁 x 與 s 鍵!

若是你幸虧懂得一些數字電路技術,也能夠作一對 USB 接口的腳踏板,而後用左腳踏板模擬 Ctrl 鍵,右腳踏板模擬 Alt 鍵(Emacs 稱之爲 Meta 鍵)。

很惋惜,我上面的諄諄教導可能對不少人都無效,由於他們每每是用一指禪或二指禪打字……那麼就自行揣摩如何讓本身的雙手不要患上 Emacs 病!

6. 將一段代碼向右推

雖然不如項羽力拔山兮氣蓋世,可是 Emacs 可以不費吹灰之力推進一段代碼使之向右平移。

例以下面的代碼:

#include <stdio.h>

int main(void)
{
        printf("Hello World!");

        return 0;
}

如今要解決的問題是將這段代碼總體向右平推三個空格的距離,也就是在這段代碼每一行的行首插入三個空格。

Emacs 提供了矩形區域選取文本的功能,在選區的起始位置使用 C-x <SPC> 進入矩形選擇模式,而後運用前文所述的移動光標的幾個按鍵,便可構造出以下圖所示的矩形高亮選區。

矩形選區

對於矩形選取內的文本,有一種方法可將其中的每一行替換爲指定的字符串,即 C-x r t 指定的字符串 <RET>。對於上面圖中所示的矩形選取,若將其每行替換爲 20 個空格字符,只需 C-x r t C-u 20 <SPC> <RET>,這樣就能夠將整個矩形選區抹爲空白了。以下圖所示:

矩形選區內的文本替換

如今解讀一下剛纔那句咒語。 C-x r 驅使 Emacs 進入矩形域編輯模式, t 表示要對矩形選區內的每行文本進行替換。 C-u 20 <SPC> 能夠構造 20 個空格組成的字串, <RET> 以後,大功告成。

如今,再回到本節開始所提出的那個問題上……我以爲解決方法已經顯而易見了。因而,你就掌握了一種很是有效的在 reStructuredText 標記文檔中排版代碼的技巧。

有關 Emacs 的矩形區域編輯功能更多的知識,建議閱讀 Emacs 手冊的 Rectangles 一節。在 Emacs 中打開 Emacs 手冊的方法是 C-h r。快速找到 Rectangles 這一節的方法是:打開 Emacs 手冊後,用 <CapsLock> T 鍵打開目錄,而後用 Ctrl-s Rectangles 進行搜索。找到 Rectangles 節以後,將光標移到像超級連接同樣的文本上,而後 <RET> 即進入該節。

7. 文本的查找與替換

C-sC-r.

C-M-sC-M-r 。注意,fcitx 輸入法可能會將 C-M-s 按鍵攔截。

M-x replace-stringM-x replace-regexp

M-x query-replaceM-x query-replace-regexp

上述按鍵的用法做爲本文的課後習題,自行去了解……若是須要查看 Emacs 對它們的描述,例如查看 C-s 的信息,可如此這般 C-h k <RET> C-s,只要別傻呵呵的真的以文本的形式輸入了 C-s

8. 拿出 15 分鐘瞭解一下 Emacs Lisp 如何?

國外黑客寫了一份簡短的「Emacs Lisp 入門指南」,按照他說的那樣作下去,再考慮語言的差別以及自身的懶惰情緒,大概半小時左右可以近距離的體驗一下 Emacs Lisp。試試看!

9. 回顧一下你的 init.el 文件

一旦對 Emacs Lisp 有所瞭解以後,可能就再也不懼怕 $HOME/.emacs.d/init.el 文件了。雖然文件裏的不少東西你依然不瞭解,可是你能夠很放心的把它們交給時間來保管。

相關文章
相關標籤/搜索