這篇博文主要是寫給那些對 Vim 有一些瞭解的新人,然後想要進階自己的 Vim 技巧。說實話在講很多技巧之前,有一個很關鍵的點,需要說明,這是在我用了 Vim 許久之後,才確確實實感悟到的。每個人在配置 Vim 和學習 Vim 時,都要帶有自己的個人哲學。像我自己的配置就非常的極簡,我不喜歡臃腫的 IDE 配置,因為高效對我來說很重要,這樣在服務器端用起來也更加方便簡潔。但是也存在很多人,喜歡把 Vim 配置的功能齊全,加上 導航欄 或者 自動補全 等功能的插件,我沒有任何 against 的意思,這完全是個人選擇問題。只是希望大家不要盲目抄寫別人的配置,要在配置中加入自己的想法,形成自己獨特的 workflow。

# Vim 配置文件 vimrc 和 dotfiles

Vim 的配置文件也就是 vimrc,在 Unix 系統中常被命名爲 .vimrc。這類文件被稱之爲 dotfiles,也就是隱藏文件。如果在 Github 進行搜索,會找到許多人的 dotfiles,這裏不光是 Vim 的配置,還有工具諸如 zsh 和 tmux 等等。我建議經常使用 Unix 環境的用戶,最好創建一個自己的 dotfiles 集合,這樣就不用每次去重新配置那些工具了。

其實 vimrc 的配置相對簡單,主要就是那麼幾個大的方面: 顏色主題、插件、編輯環境、快捷鍵。顏色主題主要針對高亮語法和背景與字體,找到一個適合自己的主題,會讓編程體驗更加愉悅♂。配置流程的話,需要先用插件管理器去下載顏色主題,然後使用 colorscheme theme 進行設置。插件管理器是一個很重要的工具,一般插件的安裝都需要通過插件管理器來安裝和卸載,非常建議使用插件管理器去管理插件,這樣會節約很多時間,等一下會詳細介紹比較流行的插件管理器。

編輯環境和快捷鍵設置不像前兩部分那樣,這裏的配置只能靠自己的使用和總結,然後每次去 vimrc 進行微調,也就是說用 Vim 的時間越久,你的配置也會更加完善,使用 set rule 進行編輯環境的設置,然後使用 map/noremap src_command dst_command 設置快捷鍵。這兩個部分的設置涉及到了 Vim 的 mode 概念,Vim 有非常多的 mode,不過我自己常用的也就3個: normal, insert, view。其他 mode 的使用,對我來說不是很必要。set 指令是針對所有 mode 的,而 map/noremap 可以指定針對的 mode。

舉一些我自己常用的例子:

# common options
set nocompatible    # require to be iMproved
set number          # show line numbers on the sidebar
set backspace=2     # using backspace to delete text

# indent options
set tabstop=2       # indent using 2 spaces
set shiftwidth=2    # shift using 2 spaces
set expandtab       # convert tab to spaces
set shiftround      # indent multi shiftwidth

# quick window navigate
# 'n' as normal mode
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l

## 插件管理器

現在主流的插件管理器,也就 Vundle 和 vim-plug。Vundle 屬於老牌插件管理器,值得信賴,我用過很長一段時間,沒有出現任何問題。vim-plug 是近幾年才出現的,說實話功能跟 Vundle 幾乎差不多吧,插件管理器也就是安裝和更新插件了,有可能安裝速度上面 vim-plug 要快一些。要說推薦哪個,我覺得兩個都可以吧,如果插件多的話,可以用 vim-plug。我雖然換成了 vim-plug,但是用不到太多功能,自己的插件也少的可憐,安裝速度也看不出什麼區別。

他們兩個的插件指令,其實也都差不多:

# setup in vundle
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'plugin'
Plugin ...
call vundle#end()
filetype plugin indent on

# setup in vim-plug
call plug#begin('~/.vim/plugged')
Plug 'plugin'
Plug ...
call plug#end()

然後就是推薦插件的時間了,說實話我自己只用了一個插件,那就是 ctrlp 的查找功能。要是再推薦一個的話,估計我會選擇 ctags 可以進行標籤跳轉,感覺也挺方便的。剛入門 Vim 的時候,我也是狂裝插件玩的,NERDTree 和 YouCompleteMe 也都是裝過玩過,但是現在玩不動了,偏向極簡型的設置。在 Youtube 上,也有一個 Vim Talk 是關於這個主題的,我也一直深信 Vim 的主旨並不是功能齊全,而是方便編輯與節省時間,如果希望功能齊全,可以出門左轉找 Emacs,開玩笑啦233。

How to Do 90% of What Plugins Do (With Just Vim)

# 進階導航指令

新人剛入門 Vim 時,最常用的導航指令就是 h j k l,然後很多人就放棄了 Vim。真相卻是這四個鍵並不是 Vim 最常用的導航按鍵,是的你們都被欺騙了,但是他們經常被用在組合鍵上,象徵着 左 上 下 右 的四個方位。如果在 normal mode,按下了 30j 那就是 下 30行 的意思。我在 vimrc 的行數設置是 relative number,也就是相對行數,這樣不需要我去計算需要移動的行數。

如果使用的是 absolute number,也就是絕對行數,可以用 :30 去指定行數,也就是 到 第30行 的意思,但是對比前一種移動的話,這種方法是比較不方便的。

上面兩種指令是比較精確的移動,而大部分情況下,瀏覽文件是不需要精確移動的。我最常用的瀏覽移動指令是 ctrl dctrl u,向下和向上滾半屏,非常的方便。不進行滾屏或者翻頁的瀏覽指令,可以使用 H M L,這三個命令代表着 頂 中 底,但是我自己是很少用到的。想要看到超出 buffer 區域的地方,需要使用 ctrl ectrl y,向下和向上滾一行。整頁滾動可以使用 ctrl fctrl b

接下來就是單行的移動指令,經常用到的是 eb,是根據單詞 結尾 和 開頭 進行移動。其他的例如 $^ 可以移動到 行尾 和 行首,gg 可以回到第一行,G 跳到最後一行,然後 A 可以在 行尾 直接編輯。

# 進階編輯指令

編輯很重要的一點,就是如何精確到要修改的位置,這裏需要一個很好的搜索辦法。最普通的搜索只需要 /pattern,然後用 N 向後查找或者 n 向前查找。如果是查找當前行的話,可以用 shift v + /pattern。查找替換可以用 :%s/search/replace/c,如果想要進行全局查找替換,只需要把最後的 /c 去掉。

接下來就是比較高階的編輯手法了,在 Vim 中被稱爲文字對象,iw is i( i{ 這些特徵也就是文字對象,分別代表着 單詞 句子 (內的文字) {內的文字}。只要看到這些文字的特徵,便可以使用 編輯指令 + 文字對象,進行強大的編輯。例如 diw 可以直接刪除單詞。再例如 di( 可以直接刪除(內的文字)。

編輯還可以劃分窗口用 :split 或者 :vsplit 進行操作。

說實話 Vim 的操作是不可能用一篇博文就寫完的,比如編譯部分我就沒有寫,這篇博文主要提供的是一個思路,如何去精進自己的 Vim 技巧,從哪幾個方面去尋找更簡潔的方法。如果真能提高編輯和移動的話,那麼你已經可以使用 Vim 進行很高級的操作了。希望大家在調試 Vim 中,可以找到自己的哲學,也理解 Vim 的精髓,不要去隨意引戰其他編輯器,而是用 Vim 耐心的去解決問題,用到實際。