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