Vim 系列教程目錄:php
Vim 之因此強大, 有個很大的緣由就是他有豐富的插件. 插件能夠極大地加強 Vim 的功能. 那麼去哪裏下載插件呢? 插件怎麼安裝和管理呢, 聽我慢慢道來.python
先說到哪裏去找插件, 這裏列出兩個網站:git
在這些網站上找到合適的插件後, 就能夠進行安裝了.github
Vim 自己就提供了安裝和管理插件的方式, 可是不太方便, 我就很少說了. 如今比較流行的方式有兩種: vim-plug 和 Vundle, 這兩款插件都是用於"安裝和管理別的插件"的插件.編程
我最近在用的是 vim-plug, 下面介紹一下它的用法.vim
安裝方式很簡單, 下載 plug.vim, 放在 $VIM/vim81/autoload/ 目錄中, 就算是完成安裝了. 注意: 這裏說是下載安裝, 其實就是把該插件的源代碼保存到名爲 plug.vim
的文件, 而後放在對應的目錄裏就能夠了. 官方還提供了使用命令的方式下載安裝, 但其實還不如手動下載來得方便.bash
安裝好 vim-plug 後, 須要在 vimrc 中進行啓用配置和插件配置, 方式以下:編程語言
" 以 call plug#begin 開始, 這句命令後面的小括號裏用於指定 其餘插件的安裝目錄, 注意不要使用 'plugin' 這種默認名稱, 像我這樣的寫法就行 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() 結束
call plug#end()
複製代碼
上面就是在 vimrc 中啓用 vim-plug, 以及配置其餘插件的方式. 簡單來說, 按照 VimAwesome 上給出的插件名寫就行, 很簡單.編輯器
在 vimrc 中配置好插件以後, 須要使用 vim-plug 的命令進行安裝, vim-plug 提供了以下命令, 你能夠在命令模式下使用這些命令:oop
:PlugInstall
安裝全部插件. 注意: 要安裝插件, 須要先在 vimrc 中配置插件名稱, 而後執行這個安裝命令:PlugClean
移除無用插件. 要移除插件, 須要先在 vimrc 中把要移除的插件名稱刪掉, 而後執行這個移除命令:PlugUpdate
升級全部插件:PlugUpgrade
升級 vim-plug 自己:PlugStatus
查看插件狀態OK, vim-plug 的使用就是這麼簡單. 具體更加細節的配置能夠參考官方文檔, 這裏再也不贅述.
有些插件須要依賴 Python (好比 UltiSnip), 若是你裝了這樣的插件, 可是你的 Vim 卻不支持 Python, 啓動時就會報錯(你能夠繼續使用 Vim, 可是看到報錯會很煩).
關於 Python 依賴, 有這麼幾點須要確認:
:version
命令, 能夠看到 Vim 的版本信息以及支持的特性信息, 若是你能看到以下信息, 則說明 Vim 支持調用 Python:+python/dyn
+python3/dyn
複製代碼
version
命令查看, 在此命令輸出的最下面能夠看到以下信息:-DDYNAMIC_PYTHON_DLL=\"python27.dll\" -DDYNAMIC_PYTHON3_DLL=\"python36.dll\" 複製代碼
這說明 Vim 支持 Python 2.7 和 Python 3.6 3. 32位的 Vim 只能調用 32 位的 Python, 同理, 64位的 Vim 只能調用 64位的 Python, 要查看 Vim 的版本, 仍是使用 version
命令. 4. 系統中須要安裝了對應的 Python 版本. 5. 在命令模式下驗證是否真的沒問題. 例如 Vim 支持 Python3, 則在命令模式經過 :py3 1
這個命令查看是否真的能夠. py3
是 Vim 調用 Python 時使用的命令, 後面的 1 是此命令的參數(能夠是任意參數), 若是不報錯, 則說明系統中有對應的 Python 版本.
我所使用的 Vim8.1 是 32 位版本, 我以前電腦裏裝了64位的 3.7, 結果報錯, 改成 32 位的 3.6 就沒問題了.
主題的話, 這裏推薦兩款我比較喜歡的主題:
其中 PagerColor 是亮色主題, Dracula 是暗色主題.
PaperColor 有個很好的地方: 同時支持亮色和暗色模式. 可在 vimrc 中作以下配置:
Plug 'nlknguyen/papercolor-theme'
" 啓用亮色主題 set background=light colorscheme PaperColor " 啓用暗色主題
" set background=dark " colorscheme PaperColor
複製代碼
Dracula 是我比較喜歡的一款深色主題, 在 vimrc 中配置的時候要注意:
" 後面的配置表示把 dracula 主題放在 dracula 目錄下 Plug 'dracula/vim', { 'as': 'dracula' } " 啓用主題
colorscheme dracula
複製代碼
啓用主題以後, 你會發現 Vim 變得漂亮多了, 果真人靠衣裝.
下面我再介紹一些基本的, 通用的插件.
目錄樹插件, 上古神器, 這麼多年來一直還在更新, 不容易. 安裝就不說了, 本身參照 Awesome 上的名字進行配置便可. 幫助文檔: help NERDTree
命令 | 含義 | 備註 |
---|---|---|
:NERDTree [dir/bookmark] | 打開 NERDTree | 後面能夠跟目錄/書籤做爲參數 |
:NERDTreeToggle | 打開/關閉 NERDTree | |
:NERDTreeMirror | 將當前的 NERDTree 共享到另外一個 NERDTree, 兩者是同一個 buffer, 互相同步 | 首先得有另外一個 NERDTree |
:Bookmark [name] | 將當前節點保存爲書籤, 能夠指定名稱 | 必須在 NERDTree 中才可使用 |
:ClearBookmark [name] | 刪除書籤, 若是不給名稱, 則刪除當前節點對應書籤 | 同上 |
:EditBookmark | 編輯全部書籤 | 同上 |
如下指令都須要在 NERDTree 中才能生效
指令 | 含義 | 備註 |
---|---|---|
o | 打開文件/目錄/書籤 | 若是是在目錄上, 則是打開或關閉 |
i/s | 在新窗口/垂直新窗口打開文件 | 針對文件的命令 |
t | 在新標籤打開目錄/書籤 | 若是是目錄, 則自動打開一個新的 NERDTree |
m | 顯示 NERDTree 菜單 | 菜單中能夠選擇添加/刪除/修改文件或目錄 |
O | 遞歸打開當前節點 | |
x | 關閉當前節點的父目錄 | |
X | 遞歸關閉當前節點直到最上層目錄 | |
D | 刪除當前 Bookmark | 針對 Bookmark 的命令 |
r | 刷新當前目錄 | |
q | 關閉當前 NERDTree |
在 vimrc 中添加以下配置:
" 顯示隱藏文件 let NERDTreeShowHidden=1 " 顯示書籤
let NERDTreeShowBookmarks=1
" NERDTree 大小改成 45 字符寬度, 默認 31 let NERDTreeWinSize=45 " 顯示簡寫的 NERDTree 菜單
let NERDTreeMinimalMenu=1
" 設置箭頭樣式 let g:NERDTreeDirArrowExpandable='▸' let g:NERDTreeDirArrowCollapsible='▾' " 刪除文件時自動刪除文件對應 buffer
let NERDTreeAutoDeleteBuffer=1
" <leader>h 切換顯示 nnoremap <leader>h :NERDTreeToggle<cr> 複製代碼
前面咱們介紹過 CWD(Current Working Directory), 當前工做目錄. NERDTree 是很依賴 CWD的, 當你打開 NERDTree 的時候, NERDTree 會自動以 CWD 做爲根目錄顯示文件目錄. 使用 :NERDTree
命令時, 你能夠指定一個目錄做爲參數, 那麼此時這個目錄就是 CWD. 若是你不指定目錄參數, 則 CWD 就是用戶目錄.
在 NERDTree 中, 能夠在某個目錄節點上使用 cd
指令, 將 CWD 更改成指定目錄. 不過有時候使用 cd
指令更改 CWD 會致使一些奇怪的問題, 好比 NERDTree 失效了, 此時可使用 :NERDTree
命令重啓 NERDTree.
.
這個指令只能重複 Vim 原生的上次指令, 若是是本身映射的指令或是插件映射的指令, 是沒法重複的. repeat.vim 就是用來解決這個問題的. 無需配置, 裝上就能用了, 雖然用處不大, 可是聊勝於無.
上古神器, 能夠快速地給文本兩邊添加成對的符號, 如 ([{" 等等. 幫助文檔: help surround
下文我簡單介紹下其用法, 我會將成對的符號稱爲 "surroundings", 這也是官方文檔中的稱呼
ds<surrounding>
, 看下面幾個例子(星號表示光標的位置):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 中的一致.
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
指令, 給當前文本替換 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
, 能夠對當前行添加 surroundings, 添加時自動忽略兩邊的空格:
Old text | Command | New text ~ |
---|---|---|
Hello w*orld! | yssB | {Hello world!} |
相似 cS
, yS
也能夠在給文本添加 surroundings 的時候給文本單獨分行並進行代碼格式化, 而 ySS
則能夠給當前行添加 surroundings, 而且格式化
S<surrounding>
能夠給選中的文本添加 surroundings寫文檔時, 在中英文混輸的狀況下, 最好在英文單詞兩邊加上空格, 看着比較舒服, 也比較規範, 可是有時候常常忘記, 因此我定義了以下快捷鍵:
" 給單詞兩邊加上空格 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 這個插件, 這些指令也是可使用 .
進行重複的, 很方便.
上古神器, 在插入模式下使用 Tab 鍵進行補全. 幫助文檔: help supertab
用法其實很簡單, 這裏給一個文檔中的例子:
> 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, 當你再次輸入 b, 而後按 Tab 鍵, 會彈出一個候選列表幫你進行補全, 在補全列表出現後繼續按 Tab/Shift-Tab, 能夠在候選詞中循環.
上古神器, 是對 Vim 移動指令的加強. 幫助文檔: help easymotion
這裏簡單介紹一下用法: 加入你想找到下面這句話中的 amet 這個單詞上:
<cursor>
Lorem ipsum dolor sit amet.
<cursor>
表示你如今光標的所在處, 你須要輸入四次 w. 可是使用 EasyMotion 的話, 你可使用這個指令: <leader><leader>w
, 你會發現每一個單詞的首字母都被高亮成一個新的不重複的字母了, 你直接按被高亮的那個字母, 就能夠跳過去了.
一樣的, 若是你想跳到某一個出現字母 o 的地方, 你可使用 <leader><leader>fo
, 那麼全部字母o都被高亮成新的字母了, 你直接按下高亮的字母就能夠跳過去了.
你試試就知道個人意思了.
上古神器, 用於查找 Buffer, 文件列表, 最近使用文件等, 如今還在緩慢更新, 這幾年慢慢的被 fzf 代替了, 可是因爲 fzf 配置比較麻煩, 如今我暫時還用 CtrlP. 幫助文檔: help CtrlP
用法很簡單, 按快捷鍵 Ctrl-p 可在 Vim 底部打開一個窗口, 而後你能夠輸入文件名中的字符, CtrlP 會進行模糊匹配查找.
下面給出幾個經常使用快捷鍵, 注意下面的快捷鍵都只能在 CtrlP 的窗口中使用:
快捷鍵 | 功能 | 備註 |
---|---|---|
Ctrl-j/k | 在文件列表中上下移動 | |
Ctrl-f/Ctrl-b | 切換到下一個/上一個搜索模式 | 搜索模式有三個: Buffer, 文件目錄, MRU(最近最常使用) |
Ctrl-c | 關閉 CtrlP | |
F7 | 在 CtrlP 面板中刪除光標所在條目(buffer, mru) | |
Ctrl-s/Ctrl-v | 在水平/垂直的分割窗口中打開文件 | |
Ctrl-t | 在新 tab 中打開文件 |
注意: CtrlP 也很依賴 CWD, 它列出文件目錄中的文件時, 也是 CWD 下的文件.
" 默認使用緩衝區搜索模式打開 CtrlP let g:ctrlp_cmd='CtrlPBuffer' " 將爲多字節字符開啓輸入事件循環, 用於解決中文文件名的問題(實驗特性)
let g:ctrlp_key_loop= 1
" CtrlP 窗口最大高度和最小高度都是 10, 即固定大小 let g:ctrlp_match_window='min:10,max:10' 複製代碼
本節介紹了幾個經常使用的插件, 都是很基本和通用的, 不涉及到具體編程語言, 有了它們, 會讓你的 Vim 用起來更舒服.