Vim 系列教程目錄:
Vim 插件網(wǎng)站
Vim 之所以強(qiáng)大, 有個(gè)很大的原因就是他有豐富的插件. 插件可以極大地增強(qiáng) Vim 的功能. 那么去哪里下載插件呢? 插件怎么安裝和管理呢, 聽(tīng)我慢慢道來(lái).
先說(shuō)到哪里去找插件, 這里列出兩個(gè)網(wǎng)站:
- 官方插件網(wǎng)址 界面丑, 速度慢, 有時(shí)候還打不開(kāi), 不建議使用...
- VimAwesome 比較推薦的一個(gè)插件網(wǎng)站, 好看好用, 每個(gè)插件都有介紹, 還有安裝方式說(shuō)明, 以及每個(gè)插件官網(wǎng)的鏈接.
在這些網(wǎng)站上找到合適的插件后, 就可以進(jìn)行安裝了. 我后面會(huì)介紹幾個(gè)插件, 你可以到 VimAwesome 上自行查找.
插件管理: vim-plug
Vim 本身就提供了安裝和管理插件的方式, 但是不太方便, 我就不多說(shuō)了. 現(xiàn)在比較流行的方式有兩種: vim-plug 和 Vundle, 這兩款插件都是用于"安裝和管理別的插件"的插件.
我最近在用的是 vim-plug, 下面介紹一下它的用法.
安裝 vim-plug
安裝方式很簡(jiǎn)單, 下載 plug.vim, 放在 $VIM/vim81/autoload/ 目錄中, 就算是完成安裝了. 注意: 這里說(shuō)是下載安裝, 其實(shí)就是把該插件的源代碼保存到名為 plug.vim 的文件, 然后放在對(duì)應(yīng)的目錄里就可以了. 官方還提供了使用命令的方式下載安裝, 但其實(shí)還不如手動(dòng)下載來(lái)得方便.
在 vimrc 中配置
安裝好 vim-plug 后, 需要在 vimrc 中進(jìn)行啟用配置和插件配置, 方式如下:
" 以 call plug#begin 開(kāi)始, 這句命令后面的小括號(hào)里用于指定 其他插件的安裝目錄, 注意不要使用 'plugin' 這種默認(rèn)名稱, 像我這樣的寫(xiě)法就行
call plug#begin('$VIM/vimfiles/vim-plug')
" 配置插件, 方式有三種:
" 1. 插件的短別名(即 Github 中的 用戶名/倉(cāng)庫(kù)名), 2. 插件的 Github 倉(cāng)庫(kù)地址, 3. 本地路徑
Plug 'altercation/vim-colors-solarized'
Plug 'nlknguyen/papercolor-theme'
Plug 'scrooloose/nerdtree'
" 以 call plug#end() 結(jié)束
call plug#end()
上面就是在 vimrc 中啟用 vim-plug, 以及配置其他插件的方式. 簡(jiǎn)單來(lái)講, 按照 VimAwesome 上給出的插件名寫(xiě)就行, 很簡(jiǎn)單.
插件的安裝, 移除, 升級(jí)
在 vimrc 中配置好插件之后, 需要使用 vim-plug 的命令進(jìn)行安裝, vim-plug 提供了如下命令, 你可以在命令模式下使用這些命令:
-
:PlugInstall安裝所有插件. 注意: 要安裝插件, 需要先在 vimrc 中配置插件名稱, 然后執(zhí)行這個(gè)安裝命令 -
:PlugClean移除無(wú)用插件. 要移除插件, 需要先在 vimrc 中把要移除的插件名稱刪掉, 然后執(zhí)行這個(gè)移除命令 -
:PlugUpdate升級(jí)所有插件 -
:PlugUpgrade升級(jí) vim-plug 本身 -
:PlugStatus查看插件狀態(tài)
OK, vim-plug 的使用就是這么簡(jiǎn)單. 具體更加細(xì)節(jié)的配置可以參考官方文檔, 這里不再贅述.
關(guān)于插件依賴的 Python
有些插件需要依賴 Python (比如 UltiSnip), 如果你裝了這樣的插件, 但是你的 Vim 卻不支持 Python, 啟動(dòng)時(shí)就會(huì)報(bào)錯(cuò)(你可以繼續(xù)使用 Vim, 但是看到報(bào)錯(cuò)會(huì)很煩).
關(guān)于 Python 依賴, 有這么幾點(diǎn)需要確認(rèn):
- 確認(rèn) Vim 本身支持調(diào)用 Python. 通過(guò)
:version命令, 可以看到 Vim 的版本信息以及支持的特性信息, 如果你能看到如下信息, 則說(shuō)明 Vim 支持調(diào)用 Python:
+python/dyn
+python3/dyn
- 確認(rèn) Vim 支持的 Python 版本, 同樣使用
version命令查看, 在此命令輸出的最下面可以看到如下信息:
-DDYNAMIC_PYTHON_DLL=\"python27.dll\"
-DDYNAMIC_PYTHON3_DLL=\"python36.dll\"
這說(shuō)明 Vim 支持 Python 2.7 和 Python 3.6
-
32位的 Vim 只能調(diào)用 32 位的 Python, 同理, 64位的 Vim 只能調(diào)用 64位的 Python, 要查看 Vim 的版本, 還是使用
version命令. - 系統(tǒng)中需要安裝了對(duì)應(yīng)的 Python 版本.
- 在命令模式下驗(yàn)證是否真的沒(méi)問(wèn)題. 例如 Vim 支持 Python3, 則在命令模式通過(guò)
:py3 1這個(gè)命令查看是否真的可以.py3是 Vim 調(diào)用 Python 時(shí)使用的命令, 后面的 1 是此命令的參數(shù)(可以是任意參數(shù)), 如果不報(bào)錯(cuò), 則說(shuō)明系統(tǒng)中有對(duì)應(yīng)的 Python 版本.
我所使用的 Vim8.1 是 32 位版本, 我之前電腦里裝了64位的 3.7, 結(jié)果報(bào)錯(cuò), 改為 32 位的 3.6 就沒(méi)問(wèn)題了.
主題
主題的話, 這里推薦兩款我比較喜歡的主題:
其中 PagerColor 是亮色主題, Dracula 是暗色主題.
PaperColor 有個(gè)很好的地方: 同時(shí)支持亮色和暗色模式. 可在 vimrc 中做如下配置:
Plug 'nlknguyen/papercolor-theme'
" 啟用亮色主題
set background=light
colorscheme PaperColor
" 啟用暗色主題
" set background=dark
" colorscheme PaperColor
Dracula 是我比較喜歡的一款深色主題, 在 vimrc 中配置的時(shí)候要注意:
" 后面的配置表示把 dracula 主題放在 dracula 目錄下
Plug 'dracula/vim', { 'as': 'dracula' }
" 啟用主題
colorscheme dracula
啟用主題之后, 你會(huì)發(fā)現(xiàn) Vim 變得漂亮多了, 果然人靠衣裝.
下面我再介紹一些基本的, 通用的插件.
The NERD tree
目錄樹(shù)插件, 上古神器, 這么多年來(lái)一直還在更新, 不容易. 安裝就不說(shuō)了, 自己參照 Awesome 上的名字進(jìn)行配置即可. 幫助文檔: help NERDTree
常用命令
| 命令 | 含義 | 備注 |
|---|---|---|
| :NERDTree [dir/bookmark] | 打開(kāi) NERDTree | 后面可以跟目錄/書(shū)簽作為參數(shù) |
| :NERDTreeToggle | 打開(kāi)/關(guān)閉 NERDTree | |
| :NERDTreeMirror | 將當(dāng)前的 NERDTree 共享到另一個(gè) NERDTree, 二者是同一個(gè) buffer, 互相同步 | 首先得有另一個(gè) NERDTree |
| :Bookmark [name] | 將當(dāng)前節(jié)點(diǎn)保存為書(shū)簽, 可以指定名稱 | 必須在 NERDTree 中才可以使用 |
| :ClearBookmark [name] | 刪除書(shū)簽, 如果不給名稱, 則刪除當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)書(shū)簽 | 同上 |
| :EditBookmark | 編輯所有書(shū)簽 | 同上 |
常用指令
以下指令都需要在 NERDTree 中才能生效
| 指令 | 含義 | 備注 |
|---|---|---|
| o | 打開(kāi)文件/目錄/書(shū)簽 | 如果是在目錄上, 則是打開(kāi)或關(guān)閉 |
| i/s | 在新窗口/垂直新窗口打開(kāi)文件 | 針對(duì)文件的命令 |
| t | 在新標(biāo)簽打開(kāi)目錄/書(shū)簽 | 如果是目錄, 則自動(dòng)打開(kāi)一個(gè)新的 NERDTree |
| m | 顯示 NERDTree 菜單 | 菜單中可以選擇添加/刪除/修改文件或目錄 |
| O | 遞歸打開(kāi)當(dāng)前節(jié)點(diǎn) | |
| x | 關(guān)閉當(dāng)前節(jié)點(diǎn)的父目錄 | |
| X | 遞歸關(guān)閉當(dāng)前節(jié)點(diǎn)直到最上層目錄 | |
| D | 刪除當(dāng)前 Bookmark | 針對(duì) Bookmark 的命令 |
| r | 刷新當(dāng)前目錄 | |
| q | 關(guān)閉當(dāng)前 NERDTree |
配置
在 vimrc 中添加如下配置:
" 顯示隱藏文件
let NERDTreeShowHidden=1
" 顯示書(shū)簽
let NERDTreeShowBookmarks=1
" NERDTree 大小改為 45 字符寬度, 默認(rèn) 31
let NERDTreeWinSize=45
" 顯示簡(jiǎn)寫(xiě)的 NERDTree 菜單
let NERDTreeMinimalMenu=1
" 設(shè)置箭頭樣式
let g:NERDTreeDirArrowExpandable='?'
let g:NERDTreeDirArrowCollapsible='?'
" 刪除文件時(shí)自動(dòng)刪除文件對(duì)應(yīng) buffer
let NERDTreeAutoDeleteBuffer=1
" <leader>h 切換顯示
nnoremap <leader>h :NERDTreeToggle<cr>
關(guān)于 CWD
前面我們介紹過(guò) CWD(Current Working Directory), 當(dāng)前工作目錄. NERDTree 是很依賴 CWD的, 當(dāng)你打開(kāi) NERDTree 的時(shí)候, NERDTree 會(huì)自動(dòng)以 CWD 作為根目錄顯示文件目錄. 使用 :NERDTree 命令時(shí), 你可以指定一個(gè)目錄作為參數(shù), 那么此時(shí)這個(gè)目錄就是 CWD. 如果你不指定目錄參數(shù), 則 CWD 就是用戶目錄.
在 NERDTree 中, 可以在某個(gè)目錄節(jié)點(diǎn)上使用 cd 指令, 將 CWD 更改為指定目錄. 不過(guò)有時(shí)候使用 cd 指令更改 CWD 會(huì)導(dǎo)致一些奇怪的問(wèn)題, 比如 NERDTree 失效了, 此時(shí)可以使用 :NERDTree 命令來(lái)重啟 NERDTree.
repeat.vim
. 這個(gè)指令只能重復(fù) Vim 原生的上次指令, 如果是自己映射的指令或是插件映射的指令, 是無(wú)法重復(fù)的. repeat.vim 就是用來(lái)解決這個(gè)問(wèn)題的. 無(wú)需配置, 裝上就能用了, 雖然用處不大, 但是聊勝于無(wú).
surround.vim
上古神器, 可以快速地給文本兩邊添加成對(duì)的符號(hào), 如 ([{" 等等. 幫助文檔: help surround
下文我簡(jiǎn)單介紹下其用法, 我會(huì)將成對(duì)的符號(hào)稱為 "surroundings", 這也是官方文檔中的稱呼
使用方法
- 刪除 surroundings
指令為 ds (Delete Surroudings), 可以將文本兩邊的 surroundings 刪掉, 用法為ds<surrounding>,
看下面幾個(gè)例子(星號(hào)表示光標(biāo)的位置):
| Old Text | command | New Text |
|---|---|---|
| "Hello *world!" | ds" | Hello *world |
| (123+4*56)/2 | ds) | 123+4*56/2 |
<div>Yo!*</div> |
dst | Yo!* |
注意, dst 這個(gè)指令中, t 是個(gè)文本對(duì)象, a tag, surround 中的文本對(duì)象和 Vim 中的一致.
- 改變 surroundings
指令為 cs (Change Surroundings), 可以改變文本兩邊的 surroundings, 用法為:cs<old surrounding><new surrouding>,
下面給出幾個(gè)例子:
| Old text | Command | New text ~ |
|---|---|---|
| "Hello *world!" | cs"' | 'Hello world!' |
| "Hello *world!" | cs"<q> |
<q>Hello world!</q> |
| (123+4*56)/2 | cs)] | [123+456]/2 |
| (123+4*56)/2 | cs)[ | [ 123+456 ]/2 |
<div>Yo!*</div> |
cst<p> |
<p>Yo!</p> |
除了 cs 指令, 還有一個(gè) cS 指令, 給當(dāng)前文本替換 surroundings 的時(shí)候, 會(huì)給當(dāng)前文本單獨(dú)
分配一行, 并進(jìn)行代碼格式化.
- 添加 surroundings
指令為 ys (You Surroundings), 給文本添加 surroundings, 用法為ys<text object><surrounding>,
下面給出一些例子:
| Old text | Command | New text ~ |
|---|---|---|
| Hello w*orld! | ysiw) | Hello (world)! |
| Ti*tle | ysiw<h1> |
<h1>Title</h1> |
| 很Geek的做法 | ysiw<space><space> |
很 Geek 的做法 |
有一個(gè)特殊指令: yss, 可以對(duì)當(dāng)前行添加 surroundings, 添加時(shí)自動(dòng)忽略兩邊的空格:
| Old text | Command | New text ~ |
|---|---|---|
| Hello w*orld! | yssB | {Hello world!} |
類似 cS, yS 也可以在給文本添加 surroundings 的時(shí)候給文本單獨(dú)分行并進(jìn)行代碼格式化,
而 ySS 則可以給當(dāng)前行添加 surroundings, 并且格式化
- 可視模式指令
按 v 進(jìn)入可視模式, 接下來(lái)按S<surrounding>可以給選中的文本添加 surroundings
我的一些配置
寫(xiě)文檔時(shí), 在中英文混輸?shù)那闆r下, 最好在英文單詞兩邊加上空格, 看著比較舒服, 也比較規(guī)范, 但是有時(shí)候經(jīng)常忘記, 所以我定義了如下快捷鍵:
" 給單詞兩邊加上空格
nmap <leader><space><space> ysiw<space><space>
" 給單詞左邊加上空格
nmap <leader><space>h wbi<space><esc>w
" 給單詞右邊加上空格
nmap <leader><space>l ea<space><esc>b
這些配置依賴 surround.vim, 所以要先裝插件. 另外, 有了 repeat.vim 這個(gè)插件, 這些指令也是可以使用 . 進(jìn)行重復(fù)的, 很方便.
SuperTab
上古神器, 在插入模式下使用 Tab 鍵進(jìn)行補(bǔ)全. 幫助文檔: help supertab
用法其實(shí)很簡(jiǎn)單, 這里給一個(gè)文檔中的例子:
> Example ('|' denotes the cursor location):
> bar
> baz
> b|`<Tab>` Hitting `<Tab>` here will start the completion, allowing you to
> then cycle through the suggested words ('bar' and 'baz').
意思就是說(shuō), 你先輸入過(guò) bar, 又輸入過(guò) baz, 當(dāng)你再次輸入 b, 然后按 Tab 鍵, 會(huì)彈出一個(gè)候選列表幫你進(jìn)行補(bǔ)全, 在補(bǔ)全列表出現(xiàn)后繼續(xù)按 Tab/Shift-Tab, 可以在候選詞中循環(huán).
EasyMotion
上古神器, 是對(duì) Vim 移動(dòng)指令的增強(qiáng). 幫助文檔: help easymotion
這里簡(jiǎn)單介紹一下用法: 加入你想找到下面這句話中的 amet 這個(gè)單詞上:
<cursor>Lorem ipsum dolor sit amet.
<cursor> 表示你現(xiàn)在光標(biāo)的所在處, 你需要輸入四次 w. 但是使用 EasyMotion 的話, 你可以使用這個(gè)指令: <leader><leader>w, 你會(huì)發(fā)現(xiàn)每個(gè)單詞的首字母都被高亮成一個(gè)新的不重復(fù)的字母了, 你直接按被高亮的那個(gè)字母, 就可以跳過(guò)去了.
同樣的, 如果你想跳到某一個(gè)出現(xiàn)字母 o 的地方, 你可以使用 <leader><leader>fo, 那么所有字母o都被高亮成新的字母了, 你直接按下高亮的字母就可以跳過(guò)去了.
你試試就知道我的意思了.
CtrlP
上古神器, 用于查找 Buffer, 文件列表, 最近使用文件等, 現(xiàn)在還在緩慢更新, 這幾年慢慢的被 fzf 代替了, 但是由于 fzf 配置比較麻煩, 現(xiàn)在我暫時(shí)還用 CtrlP. 幫助文檔: help CtrlP
用法很簡(jiǎn)單, 按快捷鍵 Ctrl-p 可在 Vim 底部打開(kāi)一個(gè)窗口, 然后你可以輸入文件名中的字符, CtrlP 會(huì)進(jìn)行模糊匹配查找.
常用快捷鍵
下面給出幾個(gè)常用快捷鍵, 注意下面的快捷鍵都只能在 CtrlP 的窗口中使用:
| 快捷鍵 | 功能 | 備注 |
|---|---|---|
| Ctrl-j/k | 在文件列表中上下移動(dòng) | |
| Ctrl-f/Ctrl-b | 切換到下一個(gè)/上一個(gè)搜索模式 | 搜索模式有三個(gè): Buffer, 文件目錄, MRU(最近最常使用) |
| Ctrl-c | 關(guān)閉 CtrlP | |
| F7 | 在 CtrlP 面板中刪除光標(biāo)所在條目(buffer, mru) | |
| Ctrl-s/Ctrl-v | 在水平/垂直的分割窗口中打開(kāi)文件 | |
| Ctrl-t | 在新 tab 中打開(kāi)文件 |
注意: CtrlP 也很依賴 CWD, 它列出文件目錄中的文件時(shí), 也是 CWD 下的文件.
配置
" 默認(rèn)使用緩沖區(qū)搜索模式打開(kāi) CtrlP
let g:ctrlp_cmd='CtrlPBuffer'
" 將為多字節(jié)字符開(kāi)啟輸入事件循環(huán), 用于解決中文文件名的問(wèn)題(實(shí)驗(yàn)特性)
let g:ctrlp_key_loop= 1
" CtrlP 窗口最大高度和最小高度都是 10, 即固定大小
let g:ctrlp_match_window='min:10,max:10'
小結(jié)
本節(jié)介紹了幾個(gè)常用的插件, 都是很基本和通用的, 不涉及到具體編程語(yǔ)言, 有了它們, 會(huì)讓你的 Vim 用起來(lái)更舒服.