Emacs 初學指南
Emacs 是個古老的編輯器,基於 Emacs Lisp 所開發,與 vi 一樣已經存在超過 40 年以上,長久以來,Emacs 編輯器總是披著一層迷霧與傳說 (還有論戰),就跟 Strange Things 一樣撲朔迷離,最近 Emacs is hurting Clojure 這篇文章掀起許多討論,而 Paul Graham 在「駭客與畫家」一書也提到 Lisp 在他早起創業的時候視為一種秘密武器,因為 Lisp 而達到商業上面的重大成功,當時年紀輕看書的時候沒有什麼感覺,後來在因緣際會下我接觸了 Clojure,而 Emacs 強大的套件整合,是許多 Clojure 使用者推崇的編輯器,於是利用時間摸索 Emacs,除了學習之外也親身體驗跟大家分享其中的差異。
我平常主要使用的編輯器是 Visual Studio Code/atom/Sublime Text,在 server 上面會使用 vim/vi,偶爾工作需要會使用 IntelliJ,也有使用過 LightTable。
設定檔
Emacs 的初始設定檔是放在 ~/.emacs.d/init.el,*.el 指的是 emacs lisp 的檔案,通常會在這個設定檔定義你的 package server 來源,以及預先要載入的套件資訊等等,聽說高手 Steve Purcell 的 .emacs.d 值得參考。
Buffer
Emacs 跟 vi/vim 一樣,都有 Buffer 的設計,如果你熟悉 vi/vim,Emacs 的觀念很容易理解,後來的 GUI 編輯器,Buffer 就是一個相對陌生的名詞,大多編輯器如 atom,Sublime Text 都是以檔案為主,所以當建立新檔或是編輯,檔案跟編輯器是有密不可分的關係,但是在 Emacs 裡面,檔案開啟之後會建立一組 Buffer,當你要存檔的時候,是利用這組 Buffer 去寫入到某個檔案當中,所以在看指令列表的時候,會看到很多操作 Buffer 的指令。
在 Emacs 當中,所有活動產生的訊息都可以從不同的 Buffer 去觀看,例如常見的 *Message* 是你執行 Emacs 指令所產生的輸出,*Buffer List* 可以列出所有目前的可以存取的 Buffer 列表,*Package* 則是目前可以安裝的 Package 列表。
在開發的時候,你很有可能會同時間在多個 Buffer 之間來回切換,而建立 Buffer 的時候你可以給他一個名稱,但是你不一定要存檔。
移動與操作
Emacs 讓人卻步,而且是最大的不同之處在於,他是一個快捷鍵導向的編輯器,不同於 vi/vim 或者是 Sublime Text/atom,兩組快捷鍵的組合是家常便飯,例如 C-x C-s 就是存檔,三組以上例如,C-c C-d C-d 是顯示文件。
在 Emacs 裡面移動跟大多數的編輯器如 atom/Sublime Text 差不多,【上下左右】都是可以使用的,在早期電腦鍵盤還不具備【上下左右】的獨立按鍵設計,所以它提供了組合鍵的移動方式,這點跟 vi 當初設計是用 【HJKL】 的原因一樣。至於組合鍵的操作方式孰好孰壞,這其實見仁見智,在實際上使用一段時間之後,組合鍵的方式可以讓輸入資料比較直覺,壞處則是會需要常常記憶組合鍵,這點靠肌肉記憶之外,其實也是有跡可循的。
在移動上面
C 是指 Ctrl,M 指的是 Alt 或者是 ESC (如果鍵盤沒有 Alt),S 指的是 Shift。C 通常關聯的操作都是系統相關的單位,例如一個字元;或者是往下的移動。
M 指的是人們自訂發展出來的單位,例如一個 Word;或者是往上的移動方向。
模式 (Mode)
Emacs 的 Mode 很類似 atom/Sublime Text 的不同程式語言檔案之間的模式,其中一個功能就是做 syntax highlight,但是又稍微有些不同,每個語言或者是檔案類型都有自己的 Mode,當你在開發 Clojure 的時候可能會切到 Clojure-mode, 同時間只能執行一種 Major mode,但是你可以同時間具備多種 Minor mode,Minor mode 裡面定義的就是跨不同 mode 的指令,你可以自由地開啟與關閉 Minor mode。
Keybinding 與 functions
在 Emacs 裡面,你可以透過輸入 function 名稱來執行 function 來啟動某些功能,或者是快捷鍵的方式,由於內建快速搜尋跟比對推薦的功能,所以只要你打出相對應的關鍵字+tab 就會自動出現完成與推薦可能的指令,這點在一開始摸索的時候幫助很大,例如要找如何存檔,只要打 save 就可以找到相關的指令,現在幾乎每個編輯器都具備這樣的功能。
因為 Emacs 裡面都是用 Emacs Lisp (elisp/el)寫的,所以意味著你可以很容易的自訂任何 function 然後在 Emacs 去執行,開發人員對於這個編輯器有著絕對的控制權力,此外,Emacs 裡面還內建小遊戲。
從何開始?
其實最好的新手教學文章就在你一開始裝好的 Emacs 裡面,打開 Emacs 之後,執行 C-h t 就可以開啟這份教學文件,這份教學文件從 Buffer 操作,游標的移動,frame 的運作,模式的觀念,編輯的方式,只要確實的操作過一輪,相信你就會對 Emacs 有基本的了解可以開始運用自如,也會引發你對這個編輯器的好奇心,因為 Emacs 的設計跟 Clojure 一樣,乍看可能不熟悉而無法理解,但是真正去了解可以發現它的設計簡單與充滿各種可能性。
寫在最後
很多人會推薦 Spacemacs,其實我一開始也是試著使用 Spacemacs,但是因為他同時間啟動了所謂的 evil mode (搭載了 vim 的 keyboard bindings),常常在使用一些 Emacs 原生的行為的時候會打架,這一點其實還蠻尷尬的,與其要在 Emacs 使用 vi,不如就直接拋棄 vi 的框架,回歸初心不帶成見的去學習新東西,會讓事情比較簡單一點,但是 Spacemacs 的設定檔幫忙優化了很多,當你比較熟悉 Emacs 之後,推薦使用看看。
此外,也不建議一開始學習就去看 Cheat sheet,因為看了只會讓你壓力更大,建議先走完 Emacs Tutorial 後再回來複習查找用,千萬不要死背,學習 Emacs 無法走捷徑與死背指令,需要有系統的教學跟練習才是正途,也因為這樣,我相信會用 Emacs 的小孩不會變壞(咦?)
摸索到現在大約花了幾個小時消化,大概對 Emacs 的操作比較熟悉,現在已經可以很自在的操作,而我的 Server 上面也都用 Emacs 來編輯,接下來開始要進行使用編輯器最有樂趣的地方:收集套件來打造最佳的舒適工作環境,這也是讓工作效率提升的關鍵要素之一!