顯示具有 vim 標籤的文章。 顯示所有文章
顯示具有 vim 標籤的文章。 顯示所有文章

2016年11月2日 星期三

閒聊:使用 Vim 編輯器的第五年


哼哼,都用 Vim 那麼久惹
寫個 Plugin 來說嘴也只是剛好而已 XDDD




記得前陣子才寫了一篇「心得:使用 Vim 編輯器的第一年
結果一覺醒來又過了四年 Orz

仔細想想,這幾年我其實沒什麼長進 ...
到了最近半年,我才覺得自己對 Vim 的掌握真的有變多一點
也難怪會想提筆碎碎念一下

#本文純粹就是閒聊 #沒什麼組織 #想到什麼寫什麼 


前情提要

對,我仍然還是一個用 ijkl 做移動的 Vimer ,而且活得好好的

我仍然用 ;; 離開 insert mode
我仍然還是裝一大堆 plugins
我仍然還是以 Vim 作為主要的程式碼編輯器
我仍然還是同事裡的少數派

我仍然每隔一陣子就覺得自己已經覺會了 Vim 大部分的指令 😏
然後下一秒會在 Vim Tips Wiki 查到整頁都沒看過的指令來解決我日常生活會遇到的問題
是的,我已經習以為常了



說到使用 Plugin 這件事情

儘管 Vundle 沒什麼不好,我還是衝著能平行化安裝 or 更新套件這點,跳槽到 Plug
Plug 支援使用一些 lazy loading 的寫法,可以減緩一下安裝太多套件的 overhead

但是事實上,主要會拖累速度的 plugin 就那幾隻
一般的套件幾乎不會佔用多少載入時間
而套件本身如果架構上有採用 lazy loading 的設計,更加不需要用 Plug 的 hook 再加一層

近期改變我使用習慣最大的套件,大概就是渾身充滿暗黑力量的 Shougo 所寫的 Unite
讓我戒掉了 minibufexplorer ,改用搜尋的方式在數十個 buffers 中切換
同時,我透過各種 unite source 來解決找檔案、剪貼簿管理、Mark 之間跳耀 ... 等等問題

好吧,我承認我其實沒有完全戒掉 minibufexplorer 帶來的體驗
我使用 vim-airline 並且開啟下列參數

let g:airline#extensions#tabline#enabled=1
let g:airline#extensions#tabline#buffer_idx_mode=1

nmap <space>1 <plug>AirlineSelectTab1
" ...
nmap <space>9 <plug>AirlineSelectTab9
nmap <space>j <plug>AirlineSelectPrevTab
nmap <space>l <plug>AirlineSelectNextTab

對,我是個拿空白鍵來當作第二 leader key 的魯蛇

值得一提的是, Unite 近期已經停止功能的開發
等作者用 Python3 寫的 Denite 功能更佳完善後,我應該會遷移過去

如果只能再提幾個套件(因為懶),那我會提這三個:

  • YouCompleteMe 
    • 很好很強大,不提到這個彷彿沒用過程式碼補齊一般 ...
    • 啟動時會吃個 0.x 人類可感的秒數,之後不知道會不會好一點
    • :YcmCompleter GoTo 是一個很容易被忽略的好用指令!
  • EasyMotion
    • 移動神器,就算你已經安裝了,還是值得再看一下他最新的文件
    • 目前主要負責開發的作者 haya14busa 大約三年前才摸 Vim,而且最近還手滑送了四個 patches 給 Vim 不小心也成為 Vim 的 Contributor,堪稱 Vim 生勝利組(咦?)
    • 目前我已經把 w 改成直接呼叫  nmap w <Plug>(easymotion-bd-w)
  • Tagbar
    • 看扣都會用到,雖然有點拖累畫面速度,希望之後改版速度會變好
    • 會特別提到是因為他的使用率實在太高,以及跟我手邊自己寫的另一個還沒釋出的套件在 updatetime 上有點相衝 Orz
      • 希望大家多貢獻開源專案,把 Tagbar 改好啊 XD

最後,對於使用套件這件事情,我想說的是

顯然地,目前我還是沒有成為那一個傳說中 ...
       使用 Vim 滿 N 年就返璞歸真把套件砍光的神人 ... 囧rz

將來可能也不會成為(吧?)



有空可以學個 VimScript 看看

如果你下一個十年還打算用 Vim 改點程式
那麼我認為花一個月的閒暇時間,有空就看一點笨方法學 VimScript
來學一下可愛又惱人的 VimScript 是很划算的
這麼做的好處有:

  • 邊學可以邊整理一下自己的 .vimrc 
  • 可以比較看懂自己的 .vimrc 
    • 我相信大多數的人的 .vimrc 多少都會有一些自己也看不懂的咒語
  • 累積足夠的 Vim 知識去解決打開 Vim 時出現的惱人錯誤之類的 ...
  • 可以順便達成你總是沒達成的年度計畫「一年學一個語言」

VimScript 有許多 function 都很有 Python 的味道
儘管如此,但還是不得不說,這個語言的行為非常的神妙啊(笑)

除了增加自動化一些事情的能力以外
其實,學 VimScript 的最大收穫是了解編輯器如何運作的概念模型
這使得在使用 Vim 及套件上,會有更加清楚的認識
也同時能帶來一些有趣的想像



寫一個 Plugin 玩玩

前陣子我看完笨方法學 VimScript 以後
我就帶著我的想像來寫了我自己的第一個套件:vim-codequery

簡單版 的故事我已經在 Taipei.py 分享過
完整版 的故事我也在 Tainan.py 分享過

要問我寫這個有什麼收穫
除了做出自己想要的東西的成就感以外,大概就是「了解更多」這四個字

要寫自己的套件前總是得看看範例,所以就跑去看看其他套件是怎麼實作的
當更認真的看其他人的套件時,才會真的了解他們在幹嘛
並領略他人程式碼的美妙(與不美妙)之處

同時,在認真向外看的時候,才會知道一些一般 User 不知道但是對套件開發者很重要的消息
例如,前陣子我才知道 Vim8 有哪些厲害的 features ,以及與 NeoVim 的 Async 愛恨情仇

自己進行比較大量的實作時,我才從學語言的狀態,前進為應用語言的狀態
雷還是要踩一踩,程式碼還是要打個上百上千行才會逐漸深刻 Orz



轉換觀點

幾年前我開始讀諾曼先生的設計心理學相關書籍,近期則花了不少時間研究跟寫套件
開始對於 Vim 有跟自己初學的時候比較不一樣的觀點
我現在的看法如下:


  • 套件不是裝越多越好
    • 被遺忘的套件就等於沒有用
    • 但我也沒有嚴格到沒用到的就全刪,建議不妨設一個「觀察區」來管理新加入的套件吧!
  • 快捷鍵要小心且用心設定
    • 同上,忘記用的就等於沒有用
    • 更糟糕的是,既有的設定會排擠未來能使用的快捷鍵組合,所以真的要小心設定
    • 設定的要點在於:「增加容易記憶的程度」與「提高敲擊上的便利性」。舉例來講,我一律使用相當好敲到的 <space> 加上其他鍵來進行頁面相關的移動,這使得大腦以及肌肉記憶的負擔降到最低。
  • 用滑鼠不會死
    • 打開讓滑鼠捲動生效的選項其實也沒什麼不好,有時候進入輕鬆瀏覽模式時,看扣的心智負擔反而比較小
    • 跟同事 Code Review 或是一起看 Code 的時候,至少對方還可以用滑鼠移動 XD
  • 用上上上上上下下下下移動也不會死
    • 認真!非反串 👻
    • 重點是其實是當一個人在做這件事情的「心智狀態」,當你在做這件事情的時候,目的是要進行移動呢?還是只是一邊看 Code 一邊移動,而把游標當做一個「視覺提示」來使用呢?還是其實你只是想要移動到螢幕兩端進行進行捲動?
      • 合理而有效率地達成你真正的目的,才是重點!
      • 不用因為按了上上上上下下下下而感到羞恥,重點是認清你自己在幹嘛!
    • 千萬記得要把鍵盤的連續輸入速度調高,不然我會為被你浪費掉的時間感到羞恥 Orz
    • 我自己的做法是把上下改為維持游標位置但是上下捲動一格,所以要看上面或下面一點的程式碼都很方便。有 Code 有真相:(以下程式碼不負任何維護責任)
      " 用 i,k,j,l 進行上下左右移動
      nnoremap k gj
      nnoremap i gk
      nnoremap j h
      function! s:move_up_and_down()
          if line("$") > winheight('%')
              nnoremap <buffer> k gj<C-E>
              nnoremap <buffer> i gk<C-Y>
          endif
      endfunction
      augroup MoveGroup
          autocmd!
          autocmd BufEnter * :call s:move_up_and_down()
      augroup END
      
      
  • 背景主題也有重要性
    • 對!這關係到可讀性與情感上用得爽不爽,所以調整好用色、字體、間距及版面是有必要的
    • 我會喜歡開 Tagbar 有一個原因就是可以把程式碼區塊往右靠一些,眼睛的重心可移到比較接近螢幕中間的部分
    • 有時候我甚至會用 :Goyo (或 vimroom)之類的套件來讓畫面只顯示必要的程式碼
  • 回饋很重要
    • 為什麼很多人覺得手邊的編輯器用起來很爽快?因為強者我朋友就是你只要快速甩幾個按鈕,Vim 就會串起一堆指令,然後把事情做好。達成你的目的這一件事情,就是編輯器給你的一個回饋
    • 然而,「如何達成的」這一件事情也頗重要,這往往是一個會讓人覺得這個東西好不好用的原因。例如,許多人會用 Ack.vim 之類的套件來取代 vimgrep,而當搜索時,畫面會一閃,block 住並且進入搜尋畫面,一個一個印出找到的資料,結束後畫面又會重新 render 出來並且將結果顯示在 quickfix 內。在剛剛的例子裡,假設總共花了 0.8 秒,那麼時間的回饋就是 0.8 秒,而「一閃」、「block」、「重新 render」、「顯示結果在 quickfix」也都是各種視覺或操作回饋,都會對使用者造成一些影響
      • 因此,在製作套件時並不一定只是採用最新的技術就可以達到最好的效果。例如,剛剛的 Ack.vim 假設直接套用了 Vim8 最新的 Async 功能而不做回饋的調整,那麼就可能會變成這樣:發出搜尋的指令,什麼事情都沒有發生,0.8 秒後突然跳出了一個 quickfix 出現了搜尋結果。這是一個由於回饋不足,使得行為有點出乎使用者意料的情況,而使用者就可能會覺得這個套件怪怪的
    • 在對回饋機制有更多了解以後,就更加能夠「了解」一個編輯器/套件的優劣與否,甚至有比較高的機會做出好用的東西
  • 讓 Vim 擁有 IDE 般的功能也沒什麼不好
    • 別緊張,我並不是贊成要把 Vim 變成 Visual Studio,然而,如果 VS 有好用的功能能夠有效增加生產力,那麼為什麼不用某種形式讓他能夠在 Vim 上面實現呢?
    • 當有人在說「Vim 並不是 IDE 時」,其實往往是在指「用了不那麼 Vim 的方法做事情」或是「這不是 Vim 原生該支援的功能」(沒說出來的是:「但是套件可以支援」)
    • 從我的角度來看,Vim 是一個 UI 受限,但是彈性無窮的編輯器。要讓他變得如同受歡迎的 IDE 一樣強大(或更強大),我是雙手贊成的。然而,根據 The Law of Leaky Abstraction,顯而易見的是,我們得懂更多。



然後咧

其實也沒有然後了,就只是一篇五年的心得文 XD

要我再說幾句話廢話的話,大概就是:

  • 請愛用 :help ooxx 閱讀 Vim 的文件,我超後悔到了今年才比較有用讀文件的習慣
  • Vim8 Async 功能對於整個套件系統的影響,可能要半年一年後才會發酵,敬請期待
    • 話說這個年代 VimScript 都開始有 Lambda 支援 Closure 是哪招 XDDD 
  • 如果想要看看大神是怎麼用 Vim 的,除了到 Github 看 dot files 以外,我強烈推薦 howivim 這個網站,裡面有許多很有意思的訪談,能夠聽到一些知名的作者的看法,對於開拓自己的想法非常有幫助
  • 最後 Vim8 與 NeoVim 該怎麼辦?我也不知道 T_T


以上,歡迎試用 vim-codequery 或向我報名 Tainan.py 演講(咦)
下一篇心得文十年後見!😉



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 編輯器的第五年