我的Vim第一週


Vim

從上週開始學習Vim到現在七天,真是滿滿的痛苦,但也有滿滿的心得。

簡介

假如你不知道Vim是什麼,說明一下,Vim是一套免費的文字編輯軟體,從1976年的Vi演變而來,1991年由Bram Moolenaar開發成Vi Improved軟體,發展至今。由於功能強大,成為許多開發者的偏愛。

雙手不滿足

我前前後後到現在學code大概1年半,最早用notepad++,後來改用sublime text,說實在sublime text已經非常強大,要挑什麼缺點還挑不出來。不過正所謂人是不滿足的,sublime text用久了,有幾個地方希望可以加強:

  1. 就像notepad++一樣,大部分的功能熱鍵都需要配合ctrl、cmd、option、shift四顆鍵。由於功能太多,有時候會出現三四顆鍵需要一起按的情況,例如ctrl + cmd + p,手的移動幅度非常大,很麻煩。
  2. 接續第一點,使用方向鍵也會讓手在鍵盤上的移動幅度過大。

以上兩點,說穿了就是「懶」一個字,對一般文字工作者來說,按ctrl和方向鍵是稀鬆平常的事情。但在開發方面,「懶」同時也代表「效率」,如果我們可以大幅減少手的移動,就可以相對讓開發速度快很多。

Vim特色1:熱鍵

Vim最大的特色就是熱鍵,所有的熱鍵都可以在鍵盤中間完成,幾乎不需要移動手指,可以輕鬆放在homerow上(也就是一般手放在鍵盤上的標準位置)。

Vim有配備normal mode或稱command mode,在這個模式底下,所有按鍵都是「指令」。一般編輯器都是把指令和編輯功能放在一起,例如我要複製貼上一整行,會使用ctrl + lctrl + cctrl + v;但在vim當中,只要進入command mode,按yy再按p就完成了複製貼上的功能。如果要輸入文字,就按i即可進入編輯模式。

當然這只是千萬個vim熱鍵中的其中一個,我們根本不用去移動手指去按ctrl,甚至比GUI用更少的步驟就完成複製貼上,這就是Vim最強大的地方。不過這也同時是他學習曲線最陡的地方,因為我們還要記y和p的功能同等於複製貼上,就像是學習一個新的輸入法一樣。

Vim特色2:Script

許多編輯器沒辦法自訂function,而vim可以。Vim其中一個陡峭的學習曲線就是.vimrc,也就是vim設定檔案,裡面可調整各種熱鍵、顯示方式、自訂funciton。例如以下是一個很簡易的Vim Script:

" 設定一個利用tab鍵來自動完成打字的功能,例如輸入'vari'再按下tab,自動會變成'variable'
function! TabAutoComplete()
  let col = col(".") - 1
    if !col || getline(".")[col - 1] !~ '\k'
      return "\<tab>"
    else
      return "\<c-n>"
  endif
endfunction

" 將上述funciton綁訂到tab鍵上
inoremap <tab> <c-r>=TabAutoComplete()<cr>

看起來似乎有點麻煩,但重點是我們可以在Vim Script裡面寫入各種特別的script,包括if...else判斷、迴圈等等,如果是其他編輯器呢?就勢必要包成一個外掛,再裝回本機才有可能使用,相對來說是更麻煩的。更別提說如果我要的功能只是10行code就是搞定的簡易function,只要寫在.vimrc`設定檔中,用完以後刪掉,根本簡便到不行。

tab自動完成功能在許多編輯器上已經內建,在Vim上並沒有,看似一個很怪的地方,但這也是包含在Vim的學習曲線當中。如果你有能力自行撰寫tab自動完成功能,其他類似的功能是否也可以自行解決?這樣就不用非得搜尋各種外掛來協助。

Sublime Text不也有Vintage mode?為何一定要學Vim?

有玩過Sublime Text的人都知道可以開啟Vintage mode,也就可以用Vim的模式在Sublime中操作,兩種模式的混合操作,可以截長補短,更增加效率。

不過這還是一個根本上的不同,Sublime Text的根本是GUI,Vintage Mode雖然將終端機介面的操作方式帶入了Sublime Text,但還是有許多無法「模仿」或「超越」的地方,例如:在Sublime Text當中無法直接撰寫Vim Script,以及許多細部設定。在Quora上有一個討論提到幾個關鍵點:

  1. Vim和Sublime的差異在於你會不會需要用到滑鼠:Vim在視窗切割及設定功能上比sublime強上許多,且完全不用動到滑鼠;不過Sublime Text可以讓你用滑鼠快速瀏覽多個檔案。
  2. Vim最初的樣貌非常陽春,什麼功能都沒有,但相對之下可以高度客製化成自己想要的樣子;Sublime Text則是剛開始就把必要的功能幾乎都裝好了,相對來說這些已經裝好的功能就無法再去客製化成自己想要的樣貌。
(筆者翻譯)

在同一個討論串中,對於Vim持反對立場的人都是認為Vim學習曲線過高、.vimrc設定所需時間太長、易忘、投資報酬率太低(亦即花了很多時間去熟悉一個編輯器,但得到的效率提昇並不多)、以及Sublime Text畫面設計較為美觀等等。

不過這並不表示Vim的優點會被掩蓋掉,本人是學Ruby起家的,在SitePoint上一篇調查最多Ruby高手使用的編輯器當中,可以看出Vim是最多高手使用的編輯器,Sublime Text佔第二名,雖然調查的母數很少,但可以看出在高端開發者當中,使用Vim的絕不是少數。

結論

剛開始學Vim第一週,雖然大概知道Vim的強大之處,但還是有許多需要跨越的障礙。Terminally Incogerent上有一篇Why Vim?的文章,有個各編輯器的學習曲線圖讓我覺得非常幽默。

若圖片連結失效請至原部落格觀看

除了Emacs的學習曲線是一個遙不可及的巨人以外,Vim(vi)的學習曲線可以說是最難的。至於Sublime Text和Textmate等常用的GUI工具,可能就是比notepad再難一些吧!

關於Vim的特色和優點,以下的影片用非常幽默的方式呈現:

Welcome to Vim from Derek Wyatt on Vimeo.

歡迎大家討論、指教、修正!