編輯器的黃昏
去年公司辦了程式實作相關的活動,鼓勵不同辦公室的同事組隊,協同開發小玩具的競賽。我應台灣同事之邀,參加了為期三天的活動。
很可惜地點在東京,我沒有因此賺到免費機票。但是有幸跟優秀有趣的同事見面,在職場開著熟悉的台灣哏玩笑,也是難得的經驗。
隊友裡面有位年輕的 DevOps,我驚訝地發現他竟然是用 Vim。近年來各種 GUI 編輯工具愈加成熟,同樣的工具往往都有跨平台版本,因此愈年輕的開發者,更容易在諸多選項之中找到自己所好。這位年輕的同事竟然以 Vim 為主要開發工具,我感到相當訝異。
這位同事有多年輕呢?他不知道 Emacs 與 Vim 的宗教戰爭 (笑)
沒想到以前 Linux 社群裡面最經典的玩笑哏式微至此。我彷彿是輕小說中,在酒館拄著拐杖講古的退休老頑固,嘴裡嘮叨著:「什麼?現在的年輕人連這個都不知道了嗎?」
Vim 跟 Emacs 在產品設計上採用不同的哲學,以前初學 Linux,總是無法避開選擇編輯器的關卡,還沒摸熟系統就要選擇哪種原力,一腳踩進去就愈陷愈深(笑)。
我已經很習慣用 Vim 了,甚至寫這邊文章也是用 Vim。其實我一直到 2016 年左右寫任何程式都是用 Vim,就算是 Android 也是用 Vim + Makefile,一直到 Android Studio 逐漸普及之後,我才逐漸使用 IDE。
老實說剛開始使用 IDE 時,挫折感比初學 Vim 還要強烈。各種設定找不到或是按選項找不到,浪費很多時間。後來漸漸習慣介面,也就比較沒問題。使用 IDE 最讓我喜歡的就是 debug 功能,游標點一下就設定好 breakpoint,還可以輕鬆地觀察相關的變數,其他功能或許都能找到相近的 Vim 套件(好比檔案管理或是 auto-complete),就唯獨在 IDE 裡面 debugging 的體驗勝過 Vim 太多,若說我是為了 debugging 才使用 IDE 也不為過。
秉持著工作相關的東西要盡量抱緊主流的大腿這個原則,既然 Google 主推 Android Studio,自此開始我也都只用這個工具開發。後來漸漸地就掉進 JetBrains 的甜美陷阱裡。
JetBrains 的 IDE 工具真的做得很棒。
然而,除了「寫專案程式」之外的文字編輯工作,我依然習慣用 Vim。除了 Debugging 之外,就我的理解大多數功能都能在 Vim 裡面實現。我也想過把 Vim 整得像是 IDE 那樣方便,如此一來我就能有個除了 Debugging 之外無往不利的寫程式工具。那位年輕同事的 Vim 就被調教到這種程度。很厲害,那真的很厲害,我試過所以很清楚,要把一堆 plug-in 整合起來並沒有想像中那麼輕鬆。
我嘗試過要把自己的 Vim 改造得不輸 IDE 太多。身為一位硬派開發者,程式寫得好不好不重要,重要的是編輯器一定要夠強,客製化夠多。就像我多年前,甚至曾經大改 vim 的預設 hjkl 移動方式,接連被迫修改其他預設鍵,最後我的 vim 只有我會用。夠硬派!
改造 Vim 到一半的過程,想起 Vim 的哲學:「Vim 是個編輯器,致力把編輯器的功能做好」。反思自己正在做的事,好像正在違背這個邏輯,它應該是個編輯器,嘗試把它大改成包山包海的開發工具,這樣好嗎?
我無意評價其他人改造 Vim 的做法,看到 Vim 有那麼大的可能性,我很開心。我只是覺得自己好像不應該走這條路。
譬如剛剛提到,我改了 hjkl 快速鍵的事。畢竟「config 很好改,所以要改改看」這種事情大家都經歷過,我大改設定檔使得我的 Vim 只有我會用,也因為肌肉記憶讓我不會用其他人的 Vim。後來決定回歸傳統,讓自己習慣預設的快速鍵,就輕鬆地砍掉一堆設定項。漸漸地我的 Vim 裝的東西愈來愈少,現在幾乎就是一些跟 style 或 syntax highlight 相關的設定或套件。
繞了一圈之後,Vim 之於我又變回了一個文字編輯器,而非主力程式開發工具。真的要開發一個「專案」時,我會出動 JetBrains 家族的 IDE。
我對 IDE 也不是沒有抱怨。工作上用的電腦是 Mac OS X,自己的筆電則是 Debian Linux。雖然兩邊都能裝 JetBrains 系 IDE,但是快速鍵有點不同,要裝 Plugin 才能減少差異,但是有些快速鍵還是要手動改。更討厭的是偶爾的改版讓 UI 介面有變化,某些按鈕要花些時間才能找到,設定檔也不像 Vim 那樣單純。這些都是能接受但是有點煩人的小事。
能夠順利轉換到 IDE 上面,最重要的部分在於:這些 IDE 上面都提供了 Vim 操作介面的 Plugin。亦即,編輯文字的時候能夠使用習慣的 Vim 操作模式。
寫程式除了 Debugging,許多時間都是在敲打文字,能夠以慣用的 Vim 編輯模式操作 IDE,真是讓我開發主力轉移到 IDE 上面的最重要因素。要不然,就算 Debugging 再方便,我也沒辦法忍受要用上下左右鍵移動游標,或是用 Delete 逐個刪除字元這種浪費生命的事情。有了 Vim plugin,我可以享受許多 IDE 方便的功能,包括針對程式語言的補完、快速提醒,同時又保有 Vim 的高效率編輯方式。除了要忍受肥大 IDE 的啟動時間與記憶體消耗,其他都很好。
那麼,Vim 之於我到底是什麼呢?我忍不住又這樣想。
雖然嘴裡說著 Vim,但是其實好幾年前我已經從 Vim 轉成 NeoVim。這個轉換幾乎無痛,畢竟 NeoVim 最初的主張就是要做 Vim 的 super set,編輯的手感相同,自然感覺不出差異。或許我信仰的不是 Vim,而是 Vi/Vim 獨特的編輯模式。
我認為 Vi/Vim 最棒的發明,就是切分出普通模式跟編輯模式的概念。這個概念使得初學者難以入門 Vim,但也是 Vim 取得編輯高效率的主因。這就像是個抽象層,只要支援這一層,底下的編輯器為何我應該都能接受,是不是 Vim 好像就沒那麼重要了。
近年來 IDE 發展得愈來愈好,Emacs/Vim 的使用者不會消失,只是持續小眾,但是未來就不知道了。即便如此,我還是希望 Vim/Vi 這種獨特的編輯模式能夠保留下去,畢竟經過時代的驗證,它已經是個足夠好的編輯模式。