前言
作為 Emacs 的資深新手,我見過很多人立下宏願,要學會 Emacs,甚至希望成為箇中高手。我也曾有此奢求。現在我已明白,凡持此心者,註定極有可能學不會 Emacs。
你可能會覺得自己是個有毅力的人,只要你想做,這世上沒有你做不好的事。然而對於學習 Emacs 這件事而言,毅力反而是有害的。毅力只能讓你比尋常人晚一些放棄 Emacs,但無論你堅持多久,最終還是會放棄,甚至最終你會以自身為反面教材,諄諄教誨他人放下 Emacs,改入 Vim 或 VSCode 的門庭。
其他文本編輯器也不乏可與 Emacs 媲美的優秀之處,但是學過 Emacs,卻不知為何學不會,這恰是 Emacs 獨有的優秀之處。
你每天活着,活在這個你已經覺得異常熟悉的世界裏。你可曾想過,要學會這個世界?倘若你從未有過這樣的念頭,那麼為什麼你會覺得 Emacs 是可以學會的呢?那些發現自己學不會 Emacs 的人,非常可惜的是他們選擇放棄 Emacs,而不是放棄學習 Emacs。
Emacs 並非文本編輯器,而是一個完整且開放的世界。文本編輯器功能只是這個世界的門户而已。世界不可學,卻可進入,可感受。若你從未嘗試進入和感受 Emacs,而是試圖學會它,掌控它,註定會徒勞而返。
本質
Emacs 的特點是,其形易得,其神難求。
最讓初學者難以自持的是 Emacs 在文本編輯方面過於強大的功能且得之甚易。你總是能直接將他人對 Emacs 所作的配置化為己有,如同用北冥神功或吸星大法,直接吸收他人的內力。你化用他人的配置越多,越會覺得 Emacs 高深莫測,難以掌控,最終會被一種難以克服的巨大挫敗感吞噬。
Emacs 其神非常簡單,在 Linux 裏,即位於 $HOME/emacs.d 目錄下的 init.el 文件。當你第一次啓用 Emacs 時,這份文件尚不存在,你需自行創建它。
$ emacs # 運行 Emacs。用鼠標關閉 Emacs 窗口,便可結束該命令。
$ cd $HOME/emacs.d # 進入 $HOME/emacs.d 目錄
$ touch init.el # 創建空的 init.el 文件
每次啓用 Emacs 時,它也會自動載入 init.el,以得其神,亦即 Emacs 其神需要你親手塑造。若你的 init.el 是空的,或者照搬他人的 init.el 的內容而不知其意,那麼你的 Emacs 終歸徒具軀殼而無其神。
組合鍵
任何一份 Emacs 教程都會先傳授你一堆組合鍵的功能和用法。諸如 C-x C-f 用於打開或創建文件,C-x C-s 用於保存文件內容,C-x C-c 用於退出 Emacs。有耐心且希望學會 Emacs 的人,也許會製作一些卡片,記下這些快捷鍵及其功能,作為備忘,隨時查看。
我不建議刻意記住這些組合鍵。你需要記住的是 Emacs 組合鍵的表示及操作方法。例如當你看到 C-x C-f 時,立刻明白其含義是按下 Ctrl 鍵不放,擊 x 鍵,再擊 f 鍵,然後鬆開 Ctrl 鍵。所謂的「擊鍵」,即摁下某鍵後快速鬆開。再例如,當你看到 M-x find-file RET 時,能立刻明白其含義是,摁下 Alt 鍵不放,單擊 x 鍵,再鬆開 Alt 鍵,輸入 find-file 命令,擊回車鍵。你需要知道的是,Emacs 裏響應這些組合鍵的區域是 Emacs 界面下方的單行區域,即微緩衝區(minibuffer)。
練習 1:你會操作 C-h k C-x C-f 嗎?若你能通過這個組合鍵開啓如下圖所示的幫助區域——Help 緩衝區,便意味着你的操作是正確的。用鼠標將輸入焦點定位到 help 緩衝區,擊 q 鍵便可關閉該緩衝區。
練習 2:你會操作 C-h f find-file RET 嗎?若你能通過這個組合鍵開啓如下圖所示的幫助區域——Help 緩衝區,便意味着你的操作是正確的。
C-h k 可用於查詢組合鍵所綁定的命令。默認情況下,C-x C-f 綁定的命令是 find-file。C-h f 可用於查詢某個命令的幫助文檔,以瞭解其功用。C-x C-f 與 M-x find-file RET 是等效的,前者通過組合鍵隱式調用 find-file,後者是通過 M-x 顯式調用 find-file。組合鍵綁定的命令並非固定不變,事實上你可以用 C-x C-f 綁定其他命令,Emacs 對此並無禁止。這就是我建議你不要刻意去記組合鍵的原因。一些常用的組合鍵,其功用在頻繁使用時,自然能記住,而那些不常用的組合鍵,它們所綁定的命令往往是變動的。
練習 3:執行 M-x find-file RET foo.txt RET,在執行過程中,輸入 find 後,單擊空格,觀察所發生的現象,然後再單擊 Tab 鍵,觀察所發生的現象。
Emacs 的組合鍵是虛的,命令是實的。在 Emacs 的世界裏,虛實相生是非常普遍的現象。
窗口
Emacs 輸入焦點所在的窗口可稱為當前窗口。C-x 2 和 C-x 3 可分別將當前窗口橫向和縱向分割為兩個窗口。反覆使用這兩個組合鍵,可將 Emacs 界面分割得七零八落,不過,這些窗口顯示的內容卻是相同的,亦即在任一窗口裏對內容所作的修改,會同時作用於其他窗口,這種特性自然沒什麼用處。不過,Emacs 允許在每個窗口裏用 C-x C-f 打開或新建文件,如此便可實現在單個 Emacs 進程中編輯多份文件,亦即無需為每份文件的編輯任務單獨開啓一個 Emacs 進程。
Emacs 會在內存中為它所編輯的每份文件開闢一個緩衝區,緩衝區的名字即文件的名字。Emacs 的每個窗口都可以關聯一個緩衝區,但後者可隨時切換。這又是一種虛實相生的現象。窗口是虛的,緩衝區是實的。無論你在 Emacs 裏打開了多少個窗口,破除虛幻,萬物歸一的法門是 C-x 1。
守拙
Emacs 的圖形界面,默認有菜單、工具欄、滾動條等組件。這些組件,如同兒童單車上的輔助輪。當你初步熟悉瞭如何騎單車時,這些輔助輪就該拆除了。當你知道如何使用 C-c C-f 打開一份文件時,你還需要在菜單裏找到 File,再從中找到 Open 麼?不需要的組件,需要拆除,否則它們的存在不僅會分散你的注意力,甚至可能會讓你對它們產生依賴。
現在,在你的 Emacs 裏執行 C-x C-f ~/emacs.d/init.el RET,打開 init.el 文件,在其中添加以下內容:
;;關閉菜單、工具欄、滾動條
(tool-bar-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
;;關閉 Emacs 啓動時的 “開機畫面”
(setq inhibit-startup-message t)
然後,C-x C-s 保存對 init.el 的修改,再 C-x C-c 退出 Emacs。以後每次開啓 emacs 時,默認的界面是樸素的,除了一個 scratch 緩衝區,便只有微緩衝區了。倘若你足夠細心,應該早已發現上文中的一些插圖表明,我的 Emacs 早已去除了這些輔助組件。
你可能並不理解上述 init.el 中每條配置語句的形式或語法,但是你大致可以猜出它們的用途。tool-bar-mode,menu-bar-mode 以及 scroll-bar-mode 皆為命令。以 tool-bar-mode 為例,你可以通過 M-x tool-bar-mode RET 隨時打開或關閉 Emacs 的工具條組件。inhibit-startup-message 是什麼呢?它是一個變量,用 setq 將它的值設為 t,即 true 的簡寫,便可關閉 Emacs 的開機畫面。
練習 4:你會操作 C-h v inhibit-startup-message RET 嗎?請閲讀這個操作打開的 Help 緩衝區裏對 inhibit-startup-message 變量的介紹。若英文不好也無妨,現在的 AI 時代了,語言隔閡已不再是問題。
Elisp
倘若你懂得一些編程,應該能夠有所察覺,在 init.el 里居然可以執行一些命令,也能設置變量,這意味着 init.el 似乎是一個程序。倘若你有此覺悟,前途可謂不可限量,至少在 Emacs 的世界裏不可限量。
init.el 的確是一個程序。Emacs 是一台計算機,它在啓動時,會運行 init.el 這個程序。init.el 所用的編程語言是 Emacs Lisp,簡稱 Elisp,故而其後綴是 .el。
現在你是否能夠明白,為什麼很多人學不會 Emacs 了麼?計算機,可以學會麼?事實上,沒任何一個人能學會計算機,包括 Linux 之父 Linus。於是,也沒有人能學會 Emacs,包括 Emacs 之父兼自由軟件之父 Richard Stallman。如同你在荒原上點着了一團火,接下來這團火會如何燃燒和蔓延,你無法控制。
使用 Emacs,本質上是用 elisp 語言編程,即使你只是在緩衝區裏插入一個字符,或移動一下光標,也是 Emacs 計算機在運行一條 elisp 命令,更確切地説,是一個 elisp 函數。例如,上文的 init.el 的配置:
(menu-bar-mode -1)
實際上是對函數 menu-bar-mode 求值,該函數接受 1 個參數且其值為 -1,求值結果是,Emacs 菜單被關閉。
總結
若某種事物是可學習的,意味着該事物是靜止的,學習它,即熟悉它,測量它。Emacs 並非靜止之物,它是活動的。倘若你以為記住一些組合鍵,從別處獲得一些 init.el 的配置——這些配置也許異常強大,便是在學習 Emacs,結果是可預料的,遲早有一天你會發現,你耗費了大量的時間,學到的一切皆是僵死之物,它們從來都不是 Emacs。
真正的 Emacs 是一台完備的計算機,其中最根本的靜物是 Elisp 語言。你可以學習 Elisp,通過一個又一個 Elisp 程序與 Emacs 交流。這些程序可以是你親手寫的,也可以是他人寫的,然而它們不是 Emacs。如同 Windows 系統雖然用户眾多,但它不過是運行在計算機實體上的軟件,而非計算機本身。計算機上的操作系統也不止 Windows,還有 macOS,還有 Linux。甚至有些計算機,沒有操作系統。大學裏會設立計算機專業,卻從不會出現 Windows 專業……
我們的現實世界何嘗不是如此呢?無論你是成功者,還是失敗者,你應該保持清醒,這個世界未必如你所見,如你所想,也未必如他人所見,如他人所想。故而佛教經典《金剛經》説,應無所住而生其心。倘若你不明白這句話,Emacs 應當能讓你明白它。
=> 下一篇:為 Emacs 配置字體,你可曾認真過?