2012年10月16日 星期二

心得:使用 Vim 編輯器的第一年

Photo from: Jesse Huey. Mountain Madness photo


記得當年大一剛學寫程式時,曾經被老師強迫要遠端登入助教的電腦用 Vi 寫作業
那個時候根本不懂怎麼使用他,就只記得 yy dd p :wq …,大概十支手指頭內數得完的指令
我對 Vi 的印象就是難用
雖然看起來比較帥 …
之後陸陸續續在:
  • Windows 用 Visual Studio 或是 Notepad++
  • Linux 用 Eclipse, Gedit 或是其他替代品
多年以來在 linux 終端機環境下,我就算只要編輯某個檔案一兩個字
絕對也是輸入 gedit filename 來開啟編輯器
只要能夠躲開 Vim ,就竭盡所能的逃開他 …
一年前我也還是這樣想
只是我大概沒有想到一年以後,情況卻相反
對於撰寫後端程式這一件事情,我現在認為 Vim 是最能讓我發揮高效率的編輯器
因此我試著撰文閒聊 Vim 這一個編輯器
這篇文章,不是教學,比較像是 Vim 嫩咖的經驗分享
文章的技術含量不高,不過可能會出現奇奇怪怪、有趣
(或不有趣)的東西 :p




開端是因為不得不使用 Vim

Photo Source


大約一年前,我 加入一間新創公司,當我聽到要寫 Web 時
腦中一瞬間浮現了唸書時的 100% 微軟完美解決方案:
  • Visual Studio
  • ASP.NET
  • C#
  • MS-SQL (但是新創公司哪來的錢買這些工具!)
很遺憾的,現在不是單純作學術,成本跟效能都得慎重考量
以 Linux 為主的解決方案才是大多數人選擇做 Web 的方式
很幸運的,我們團隊搭上了 AWS 的列車,我也被迫必須開始跟 Linux 做好朋友
而在必須遠端連線到工作環境的情形下,我不得不使用 Vim 來編輯設定檔、程式碼
初使用時,早已習慣 Visual Studio 的我只覺得超級不方便 (
上下左右移動時手指頭敲得好累)
但是隨著 .vimrc 的調整、plugins 的安裝
卻越來越習慣這樣的開發環境,我想 Vim 有幾個決定性的優點:
  • 少了滑鼠的干擾,Vim 讓我雙手不用離開鍵盤,可專注於打字以完成眼前的工作
  • 便捷的文字處理功能,非常適合撰寫及修改程式碼
    舉例來講,撰寫一般的文章時大都想好後循序打出即可
    但是寫程式卻常常要塗塗改改或是重複使用剛剛命名的變數…
    Vim 的文字處理功能從低粒度的修改到全域的修改都能支援,使得撰寫程式這一件事情是有效率的!
  • 可以依照自己的使用習慣客製化出自己喜愛的 Key Bindings
  • 可以安裝 Plugins 來補足想要的文字處理或是 IDE 功能
  • 內建於非微軟的大多數環境,到處都可以使用到 Vim

當然,Vim 也有著「學習曲線長」、「使用者需要載入比較多記憶體以記憶快捷鍵」 … 的缺點
我認為 Vim 無法成為短時間內好上手,且高效率幫助開發的工具
但是如果一個編輯器要用十年,那麼具有高度成長可能性的 Vim 會是很好的選擇




跟著比自己好學的人學 Vim 比較快

Photo from: saxon. Follow my lead


事實上,使用 Vim 的前兩三個月,我還是處於不太會使用 Vim 的狀態
我覺得自己「真的」開始學 Vim 的時間點其實是在今年初
而學習 Vim 的方式很簡單,就是每天定時看噗浪
剛退伍時由於整個人腦殘,為了恢復腦袋,我會在噗浪上面「搜尋」特定關鍵字(如:Vim 或 Python …)
以訂閱各領域大大的噗來吸收經驗值
我很幸運的剛學 Vim 沒有多久,就遇到噗浪上的 某大大 也在學 Vim
因此我的學習方式為:
  • 每天看大大們分享的連結或文章學 Vim
  • 一看就懂得就馬上學起來
  • 要花時間吸收或練習的,就擺著慢慢吸收(有時候一篇文章會擺一兩個禮拜)
  • 真的看不懂或覺得 Level 超過自己太多就自動忽略 (反正重要或好用的東西會一直出現!)
學習的過程中我發現越是大大越好學
而自己找資料學習的能力太弱,倒不如先跟著學,然後再偷看大大都到哪裡學 …
截至目前為止,Vim 對我而言已經是一個高效率的編輯器
我相信持續學下去,總有一天使用 Vim 寫程式的速率應該可以達到大大們的 1/3 吧!?
其實我認為 Git 的流行對於 Vim 的推廣跟使用是有所幫助的
使用 google 趨勢搜尋「github vim」整體來講熱門度不斷上升
現在只要稍微找一下,就可以看到國內外神人們所分享出來的 Vim 相關 Source code
而每個人使用的小技巧,也很容易可以分享給他人知道




Vim 是一把可變形、可升級的武器


Source



透過修改 .vimrc 及安裝 plugins,Vim 能夠變得很不一樣
我在此分享一些我常用的
瘋狂設定:
  • 在 Normal Mode,我喜歡使用 ',' 鍵 當作 leader key
    • let mapleader = ","   
  • 建立開啟 .vimrc 的快捷鍵
    • map <leader>v :e ~/.vimrc
  • 建立快捷鍵以使用 source 來重新讀取當前的 .vimrc
    • map <leader>R :source ~/.vimrc
  • 如果與同事共用主機帳號,怕自己的 .vimrc 會干擾對方 讓對方吐血而亡,那麼可以在 .vimrc 放上這兩行
    • let mapleader = ","
      map <leader>vv :so ~/.real_vimrc
    • .real_vimrc 才是你真正的設定檔,而你的設定檔只在你使用快捷鍵 ,vv 的組合之後才會讀取進來
  • 在分頁之間切換時,我喜歡對分頁 1~9 用下列方式設定快捷鍵
    • map <leader>1 :b1
  • 鍵盤上的「上下左右」方向鍵不用白不用,我拿來將上下改為翻頁且置中、左右改為前後分頁切換且置中
    • nnoremap <up> <C-U>zz
      nnoremap <down> <C-D>zz
      nnoremap <left> :N<CR><Esc>zz
      nnoremap <right> :n<CR><Esc>zz
  • 我是瘋子請大家不要學 我從小打電動上下左右移動都是 wsad,常用的方向鍵也是倒 T 字型 …
    • 所以我認為使用 hjkl 移動 不如使用 ijkl 倒 T 字型移動
    • 對!我用 h 取代了 i,大家天天打 i,我卻天天打 h …
    • (太瘋狂了,相關設定不附上)
  • 另外我認為從 Insert Mode 回到 Normal Mode 需要按 Esc 鍵,我的指法適應不過來,因此我選擇使用 ;; 代替 Esc
    • inoremap ;; <Esc>
    • 事實上 ; 符號成為了我在 Insert Mode 下的 leader key,例如以下用法可以切換到 Normal Mode 並選取當前字:
    • inoremap ;v <Esc>viw 
    • 在 Insert Mode 下單鍵存檔
    • inoremap <F6> <Esc>:w<CR>
    • 輸入單一個 ; 符號時會發現速度較慢,可以透過 ; + <Space> 來輸入 ;
    • inoremap ;<space> ;
  • 如果需要直接以 Python 執行此檔案,可以使用以下的設定:
    • autocmd BufRead,BufNewFile *.py map <leader>r :% w !python<CR>
  • 個人奇怪的 Key Binding 還蠻多的 畢竟連 i 都敢改掉了,有興趣者請告知,我整理後再釋出!




Vim 仍然需要維護、需要管理

Source


對於 .vimrc 的內容我一直很隨便,看到有趣的語法就隨便找空位插進去
Vim 的 plugins 也是看到感覺不錯就安裝一下
結果這樣子胡搞到後面,我根本不知道我自己裝了哪些 plugins 跟設定哪些快捷鍵
除了快捷鍵之間可能有所衝突以外,更糟糕的是 Vim 的速度也被拖累 …

前一陣子我總算痛定思痛,乖乖把 .vimrc 整理一下並且打上給自己看的簡單註解
Vim 的 plugin 管理工具,也從 Pathogen 換到更強大的 Vundle

此後只要帶著 .vimrc 走就可以在不同環境自動把 plugins 給安裝好,一切變得便捷許多
對於 .vimrc 及 plugins 的使用,我目前傾向「真的要用到再加入、安裝」
盡可能使其保持乾淨狀態或說讓其為可掌握的




對於 Vim 的看法

Photo Source


Vim 的進入門檻跟學習曲線其實還是頗高
我也認為他還不夠友善,印象中 Linus 大大大大…
好像在某訪談中有提到,他手邊有一個編輯器能夠讓 Vim 看起來像記事本 …
或許改天釋出後會八掉 Vim!?

我認為 Vim 的優點是 Normal Mode 與 Insert Mode 的區分
缺點卻也是這兩個模式的轉換成本
客觀來講,的確是有可能讓這兩個模式相處得更好
(事實上,許多人會從設定 Insert Mode 下的快捷鍵開始著手改善)

對我而言,使用 Vim 後的確讓我仔細的思考過自己的打字習慣及弱點
例如我發現原來我只會打注音符號跟 abcd ,有許多標點符號跟數字並不在我的反射神經之內…
在這種情況下,使用 Vim 的效率就降低啦 Orz

我相信,無論使用任何編輯器
只要願意用心分析自己的使用情況及思考編輯器實際上能夠提供的幫助
就一定能夠找到最佳化自己工作效率的方法

總之,寫程式還是要靠大腦,編輯器升級人也要跟著升級,才不會發生悲劇
在接下來的一年內,希望我可以學跟寫一下 Vim Script,期許自己能夠更加掌握這一個能夠用十年的神器!
各位再見啦~明年 Emacs 的心得文見!


備註:
1
如果有人還沒玩過 Vim, NCTU CS 有對 Vim 做很好的介紹
現在在成大教書的 Jserv 大大… 很久以前也做了一張 Vim 的 好用小抄
另外到 google 搜尋 「Jserv 自幹」,點選第一部影片,就可以看到 Vim 的火力展示
2
本文風格可能有點詭異,不像技術文章,不是專家見解,但也不是那麼純粹的喃喃自語
我也不知道這種文章怎麼歸類,但是大致上是整理過後的心得文
無論如何,我也還在試著學習怎麼寫出有自己風格的部落格文章
如果您有任何看法或建議,請告訴我一下,以幫助我升級 Orz
3
這是我寫於四年後的另一篇 Vim 心得文:閒聊:使用 Vim 編輯器的第五年

6 則留言:

  1. 感覺本文的寫法挺像需要上台報告的那種看圖說故事的感覺,當然能寫出自己的風格是真的很棒又很累的 :P

    老實說 Vim 在下也是一年多前才真的痛下心學習,現在離開了 Vim 還真的不知道要怎麼寫 code 呢。

    如果您有在用 Firefox 了話。可以試著用看看 Pentadactyl plogin,當然 w3m 也是不錯用的 :)

    回覆刪除
  2. 其實我目前是以 Chrome 為主,同樣的,噗浪上的大大們教了我使用 Vimiun plugin,看起來跟 Pentadactyl 很類似

    不過我用的很懶散,想到才用一下,到目前為止沒發揮什麼效率 Orz


    w3m 超讚的!!!我之間就一直想找這樣的工具,感謝推薦!

    回覆刪除
  3. 老實說我也覺得用ijkl移動比較方便 但是我現在食指受傷XD

    回覆刪除
  4. 用 ;; 取代真的太天才了,我想好久要如何比較進入Normal mode才比較順利,你給了一個完美解,大感謝

    回覆刪除
    回覆
    1. 現在也有一票人會用 jj 來模擬 ESC 喔!

      $ vim ~/.vimrc
      ...
      inoremap jj

      刪除