前言
vim-plug 是一個非常優(yōu)秀的 Vim 插件管理器秀存,但是隨著安裝的插件越來越多,逐漸發(fā)現(xiàn)即使使用 vim-plug,首次啟動速度仍然很慢岳服。
究其原因,雖然 vim-plug 本身提供了優(yōu)秀的延遲加載機制希俩,但是可用于延遲加載的選項相對較少,另一方面,vim-plug 對插件的延遲加載與配置無法進行統(tǒng)一绿店,很多時候,我們想對插件進行延遲加載拖吼,但是插件配置項如果調用了插件功能,則加載的時候就會報錯(因為插件此時還未加載)...
針對上述問題这吻,dein.vim 都給出了更優(yōu)秀的解決方案吊档。
注:vim-plug 是一款非常優(yōu)秀的插件管理器,具備優(yōu)秀的插件管理性能唾糯,同時操作及其簡單籍铁,且具備優(yōu)秀的 UI 顯示,通常情況下趾断,建議使用 vim-plug拒名。
但是如果當使用 vim-plug 后,啟動速度仍然很慢芋酌,那就可以考慮下 dein.vim
注:dein 本身只提供函數(shù)接口進行操作增显,沒有提供命令與 UI 顯示,對于用戶相對不友好脐帝。
不過 Github 上面已經有人對其進行了再一次封裝:
- dein-command.vim:為 dein 封裝了一些命令
- dein-ui.vim:為 dein 提供了類似 vim-plug 的 UI 界面
可以結合以上兩個插件同云,簡化 dein 使用。
優(yōu)點
- 啟動快
- 支持異步安裝
- 支持本地插件
- 支持多種 VCS(包括 git)
- 支持緩存
- 支持
merge
特性堵腹,有效減少runtimepath
層級
...
安裝
- 對于 Unix/Linux/Mac:
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
# 安裝路徑我們選擇:~/.vim/dein
sh ./installer.sh ~/.vim/dein
- 對于 Windows:
Invoke-WebRequest https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.ps1 -OutFile installer.ps1
# Allow to run third-party script
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 安裝路徑我們選擇:~/.vim/dein
./installer.ps1 ~/.vim/dein
dein 基本使用
- 最簡配置:基本結構如下:
if &compatible
set nocompatible
endif
let s:dein_path = '~/.vim/dein'
" Add the dein installation directory into runtimepath
let &runtimepath = &runtimepath.','.s:dein_path.'/repos/github.com/Shougo/dein.vim'
if dein#load_state(s:dein_path)
call dein#begin(s:dein_path)
call dein#add(s:dein_path.'/repos/github.com/Shougo/dein.vim')
" install third-party plugins
" call dein#add('tpope/vim-surround')
call dein#end()
call dein#save_state()
endif
filetype plugin indent on
syntax enable
-
插件安裝:插件基本安裝方法如下:
- 在
dein#begin()
和dein#end()
之間使用dein#add({plugin})
聲明要安裝的插件:
call dein#begin(s:dein_path) " install third-party plugins call dein#add('tpope/vim-surround') call dein#end()
- 重新打開 Vim 或者手動重新加載配置
:so %
后炸站,使用如下命令安裝插件:
:call dein#install()
注:由于 dein 沒有 UI 顯示下載進度,需等待一段時間疚顷,等下載完成后旱易,底部提示欄會有顯示通知。
也可以直接到<dein_path>/repos/
查看插件是否已安裝完成腿堤。- 關閉 Vim阀坏,再重新打開,就可以使用已安裝的插件功能了笆檀。
- 在
-
插件卸載:dein.vim 并未直接提供插件卸載功能忌堂,因此其插件卸載相對麻煩,步驟如下:
- 取消插件添加配置:將要卸載的插件進行注釋:
call dein#begin(s:dein_path) " uninstall vim-surround " call dein#add('tpope/vim-surround') call dein#end()
清除緩存:關閉再重新打開 Vim酗洒,執(zhí)行
:call dein#recache_runtimepath()
士修。
注:由于 dein 采用了merge
功能,其會將所有插件的plugin/
目錄下的內容都緩存到同一個目錄(具體為<dein_path>/.cache/init.vim/.dein/plugin
)中樱衷,因此雖然我們上一步配置文件取消了添加插件棋嘲,但由于緩存未刪除,導致本次啟動仍然會加載相應插件箫老,故還需手動進行緩存清除操作封字。關閉再重新打開 Vim,就可以發(fā)現(xiàn)插件功能已禁止(可選)
刪除插件:以上操作只是停用了插件,插件仍然存在于本地電腦阔籽,如果想進行刪除流妻,還需調用如下命令:
:call map(dein#check_clean(), "delete(v:val, 'rf')")
此時就可以看到 dein 目錄下的
repo
下的相應插件被刪除了,緩存文件夾.cache
下的.dein/plugin
相關的插件緩存也被刪除了笆制。 -
失能插件:不刪除插件绅这,只是不進行加載,步驟如下:
- 將配置文件中的
dein#add
改為dein#disable
在辆,如下所示:
call dein#begin(s:dein_path) call dein#add('tpope/vim-surround') " disable 添加到 add 后面 call dein#disable('vim-surround') call dein#end()
關閉 Vim证薇,再重新打開,執(zhí)行
:call dein#recache_runtimepath()
關閉 Vim匆篓,再重新打開浑度,就可以看到插件功能禁止了。
- 將配置文件中的
注:以上任何操作如果失敗鸦概,一律進行如下操作箩张,確保不受 dein 緩存機制影響:
- 重新打開 Vim,執(zhí)行
:call dein#clear_state()
窗市,清除狀態(tài)文件先慷,強制 dein 重新加載配置。 - 退出后重新打開 Vim咨察,執(zhí)行
:call dein#recache_runtimepath()
论熙,清除舊緩存 - 退出 Vim,再重新打開摄狱,執(zhí)行剩余操作
一些有用操作/設置
在對 dein 進行詳細介紹前脓诡,先了解下其提供的一些比較有用的操作/設置,方便理解與使用二蓝。
- 手動安裝插件:依次輸入以下命令:
" 開始塊誉券,安裝路徑可以自由更改
:call dein#begin('~/.cache/dein')
" 添加插件安裝聲明
:call dein#add('~/.vim/plugB')
" 配置塊結束,安裝自動開始
:call dein#end()
- 手動加載插件:
dein#source([{plugins}])
:call dein#source('vim-surround')
注:dein#source
會直接加載插件刊愚,無論插件是否配置了懶加載。
-
檢測插件是否已安裝:
dein#check_install({plugins})
- 返回
0
:表示插件已安裝踩验,可以正常使用 - 返回
-1
:表示是無效插件 - 返回其他:表示插件未安裝
:call dein#check_install('vim-surround')
- 返回
-
檢測插件是否已加載:
dein#is_sourced({plugin-name})
- 返回
0
:表示插件未加載 - 返回其他:表示插件存在且已加載
:call dein#is_sourced('vim-surround')
注:由于 dein 存在懶加載鸥诽,因此存在插件已安裝(
dein#check_install
)但未加載(dein#is_sourced
)的情形。 - 返回
-
檢測插件是否被禁用:
dein#tap({plugin-name})
- 返回
0
:表示插件不存在箕憾,或者被禁用 - 返回其他:表示插件存在牡借,且可以使用(懶加載插件在未加載前也是屬于可以使用狀態(tài))
:call dein#tap('vim-surround')
- 返回
插件懶加載:
call dein#add('junegunn/fzf', {
\'lzay': 1, " 非0 表示啟用懶加載
\ 'if': s:has_exec('fzf'), " 條件滿足時才加載(判斷類型`String`/`Number`)
\ 'on_if': 'winnr("$") > 1', " 條件滿足時才加載(判斷類型`String`)
\ 'on_cmd': 'FZF', " 存在 FZF 命令時才加載
\ 'on_func': 'fzf#run', " 調用了函數(shù) fzf#run 時才進行加載
\ 'on_event': ['VimEnter', 'BufRead'] " 事件發(fā)生時才加載
\ 'on_ft': 'python' " 文件類型匹配時才加載
\ 'on_map': { 'n' : ['<C-n>', '<C-p>'], 'x' : '<C-n>'}} " 匹配特定模式下的按鍵映射時才加載
\ 'on_path': '.editorconfig', " 路徑匹配時才加載
\ 'on_source': ['vim-surround'] " 插件 vim-surround 加載時才加載
\ })
注:懶加載時lazy
可忽略,dein 會自動根據(jù)其他選項自動判斷是否啟用懶加載袭异。
檢測未使用的插件目錄(可以清除):
dein#check_clean()
獲取插件配置:
dein#get([{plugin-name}])
:echo dein#get('vim-surround')
函數(shù)
以下是 dein.vim 內置的函數(shù)簡介:
-
dein#add({repo}[, {options}])
:初始化/添加插件钠龙。{repo}
:表示插件 URI 或者插件本地路徑。{options}
:對插件進行額外選項配置,具體選項請參考下文:選項(OPTIONS)
注:
dein#add
必須在dein#begin()
塊中使用碴里。 -
dein#begin({base-path}, [{vimrcs}])
:初始化 dein.vim沈矿,開啟插件配置塊。{base-path}
:表示插件下載安裝路徑{vimrcs}
:額外配置選項或者 TOML 配置文件咬腋。默認值為$MYVIMRC
注:不能在
has('vim_starting')
塊中調用dein#begin()
注:dein#begin()
會自動設置:filetype off
-
dein#build([{plugins}])
:編譯插件{plugins}
注:當使用類似
dein#add('autozimu/LanguageClient-neovim', {'build': 'bash install.sh'})
配置插件時羹膳,指定了build
選項,則可通過調用:call dein#build()
對插件進行重新編譯安裝根竿,即執(zhí)行bash install.sh
陵像。
-
dein#call_hook({hook-name})
:調用鉤子函數(shù){hook-name}
。注:如果
{hook-name}
設置為source
寇壳,那么 dein 就會觸發(fā)已加載的插件的hook_source
鉤子函數(shù)醒颖。 -
dein#check_install({plugins})
:查看插件是否已安裝。- 對于已安裝的插件
{plugins}
壳炎,該函數(shù)返回0
泞歉。 - 對于未安裝的插件
{plugins}
,該函數(shù)返回 非0 數(shù)值冕广。 - 對于無效插件疏日,該函數(shù)返回 -1。
- 如果
{plugins}
忽略不寫撒汉,則對所有插件進行檢測沟优。
" 已安裝,則返回 0 :echo dein#check_install('vim-surround')
- 對于已安裝的插件
-
dein#check_lazy_plugins()
:檢測無意義的懶加載插件睬辐。插件如果沒有
plugin/
目錄挠阁,那么對這類插件進行懶加載是沒有意義的。 dein#check_update([{plugins}])
:異步檢測插件是否可更新溯饵。dein#check_clean()
:返回未使用的插件侵俗。可以結合其他命令手動進行刪除丰刊。-
dein#clear_state()
:手動清除狀態(tài)文件隘谣。注:狀態(tài)文件的路徑為:
<dein_path>/state_vim.vim
-
dein#config({plugin-name}, {options})
/dein#config({options})
:修改插件配置選項。如果忽略
{plugin-name}
啄巧,那么配置選項作用于全局變量g:dein#name
指定的值寻歧。
如果{plugin-name}
是列表,那么一套相同的配置項就可以作用于多個插件秩仆。
如果{plugin-name}
已經加載码泛,或者是無效狀態(tài),那么忽略該配置選項{options}
澄耍。call dein#add('Shougo/deoplete.nvim') call dein#config('deoplete.nvim', { \ 'lazy' : 1, 'on_i' : 1, \ })
注:
dein#config()
必須在dein#begin()
和dein#end()
塊中調用噪珊。 -
dein#direct_install({repo}[, {options}])
:下載插件晌缘,并直接進行加載(source
),即不會加載配置塊(dein#begin()
/dein#end()
)選項痢站。" 直接加載插件 deoplete.vim call dein#direct_install('Shougo/deoplete.nvim')
注:
dein#direct_install
直接下載的插件配置文件存放于dein#get_direct_plugins_path()
磷箕,我們可以手動加載更改該文件配置。 -
dein#disable({plugins})
:失能/禁止加載插件瑟押。注:
dein#disable()
函數(shù)必須在相關插件加載之前進行使用搀捷。因為 Vim 默認機制在加載插件后,無法直接失能/禁止多望。call dein#add('skywind3000/asyncrun.vim') call dein#disable('asyncrun.vim')
dein#each({command}[, {plugins}])
:為每個插件{plugins}
執(zhí)行{command}
命令嫩舟。-
dein#end()
:dein 配置塊結束位置。注:如果使能了
g:dein#auto_recache
怀偷,那么dein#end()
會自動執(zhí)行dein#recache_runtimepath()
家厌,重新加載緩存。
注:在dein#end()
執(zhí)行后椎工,runtimepath
會被更改饭于。 -
dein#get([{plugin-name}])
:獲取插件{plugin-name}
配置選項。:echo dein#get('asyncrun.vim')
注:如果未指定
{plugin-name}
维蒙,則返回所有插件信息掰吕。 dein#get_direct_plugins_path()
:獲取直接下載安裝插件腳本路徑。dein#get_log()
:獲取插件安裝日志信息颅痊。dein#get_progress()
:獲取當前更新進程信息殖熟。dein#get_updates_log()
:打印插件更新日志。-
dein#install([{plugins}])
:異步安裝插件斑响。-
{plugins}
:指定插件名稱菱属。如果該參數(shù)未設置,則默認安裝所有插件舰罚。
-
-
dein#is_sourced({plugin-name})
:查詢插件加載狀態(tài)纽门。返回任意非 0 值表示插件存在且已加載(source
)。注:更多相關信息营罢,可參考:
:h dein#source()
赏陵、:h dein#tap()
。 -
dein#load_dict({dict}, [{options}])
:從字典{dict}
中加載插件配置選項饲漾。-
{dict}
:key
為插件 URI瘟滨,value
為dein-options
構成的字典。比如:
call dein#load_dict({ \ 'Shougo/denite.nvim': {}, \ 'Shougo/deoplete.nvim': {'name': 'deoplete'} \ })
-
-
dein#load_rollback({rollbackfile}[, {plugins}])
:以{rollbackfile}
文件回滾插件能颁。注:這是一個危險命令。
-
dein#load_state({base-path})
:從緩存腳本文件中加載 dein 狀態(tài)信息倒淫。-
{base-path}
:為插件下載存放路徑伙菊。
如果該函數(shù)返回 1,則表示緩存腳本過期,或者無效镜硕,或者不存在运翼。
if dein#load_state(path) call dein#begin(path) " My plugins here: " ... call dein#end() call dein#save_state() endif
注:dein 的狀態(tài)緩存腳本存放路徑為:
dein#util#_get_runtime_path() . '/state_' . fnamemodify(v:progname, ':r') . '.vim'
,也即:<dein_path>/.cache/init.vim/.dein/state_nvim.vim
(注:實踐中發(fā)現(xiàn)兴枯,狀態(tài)文件存儲路徑為:<dein_path>/state_nvim.vim
)
注:dein#load_state()
函數(shù)必須在dein#begin()
前進行調用血淌,因為它會清除 dein 的所有配置。
注:dein#load_state()
會完全覆蓋runtimepath
财剖,因此在動態(tài)更改runtimepath
后悠夯,千萬不要調用該函數(shù),否則前面的設置就無效了躺坟。
注:當 dein 的狀態(tài)信息已被加載時沦补,會自動跳過該塊內容。 -
dein#load_toml({filename}, [{options}])
:從{filename}
文件中以 TOML 格式加載插件配置咪橙。-
dein#local({directory}, [{options}, [{names}]])
:添加{directory}
的子目錄到runtimepath
夕膀。{names}
:為子目錄的名稱。如果指定了{names}
美侦,那么 dein 就只會加載這些子目錄(子目錄可使用通配符匹配)产舞。" Load plugin from "~/.vim/bundle". call dein#local("~/.vim/bundle") " Load plugin1 and plugin2 from "~/.vim/bundle". call dein#local("~/.vim/bundle", {}, \ ['plugin1', 'plugin2', 'vim-*', '*.vim'])
-
dein#update([{plugins}])
:安裝/更新插件。注:
dein#update()
在 Vim 8.0+ 和 Neovim 中菠剩,會以異步方式執(zhí)行易猫。 dein#plugins2toml({plugins})
:獲取插件{plugins}
TOML 格式的配置信息。dein#reinstall({plugins})
:重新安裝插件赠叼。-
dein#remote_plugins()
:加載尚未加載的遠程插件remote-plugin
擦囊,并執(zhí)行命令:UpdateRemotePlugins
。注:
dein#remote_plugins()
只在 Neovim 中可用嘴办。 -
dein#rollback({date}[, {plugins}])
:回滾到最接近{date}
指定日期的插件版本瞬场。-
{data}
:如果設置為""
,則回滾到插件最新版本涧郊。
注:
dein#rollback()
是一個危險命令贯被。 -
-
dein#recache_runtimepath()
:重新加載 dein 的runtimepath
緩存目錄,并執(zhí)行:helptags
妆艘。該命令會在安裝完成后自動調用彤灶。注:dein 中使用了一種稱為
merge
特性的功能,簡單來講批旺,就是 dein 會自動將所有插件plugin/
目錄都融合merge
到一個緩存目錄中幌陕,目的就是為了減少runtimepath
的層級,通常的插件管理器都是將插件的路徑添加到runtimepath
中汽煮,這樣runtimepath
就會變得很大搏熄,插件搜索與加載就會變慢棚唆,而 dein 采用merge
特性,將所有插件都融合到一個目錄中心例,以后無論安裝多少插件宵凌,都只需在該目錄下進行查找即可,提升了插件加載效率止后。 dein#save_rollback({rollbackfile}[, {plugins}])
:保存插件回滾信息到文件{rollbackfile}
中瞎惫。-
dein#save_state()
:保存 dein 狀態(tài)到緩存腳本中。注:
dein#save_state()
必須在dein#end()
后面被調用译株。
注:dein#save_state()
會完整保存當前runtimepath
瓜喇,因此在調用后不能再動態(tài)更改runtimepath
。 -
dein#set_hook({plugins}, {hook-name}, {hook})
:為插件設置鉤子函數(shù){hook}
古戴,鉤子函數(shù)名稱為{hook-name}
欠橘。-
{plugins}
:如果未指定,則表示為所有插件設置鉤子函數(shù)现恼。
注:
dein#set_hook()
可以在dein#begin()
/dein#end()
塊后調用肃续。
注:dein#set_hook()
如果設置在dein#load_state()
/dein#save_state()
塊中的時候,如果鉤子函數(shù)是函數(shù)類型Funcref
叉袍,那么就不起作用始锚。call dein#add('Shougo/neosnippet.vim', {'lazy': 1}) function! Foo() abort endfunction " Does not work for dein#load_state()/dein#save_state() block call dein#set_hook('neosnippet.vim', 'hook_source', function('Foo')) " Does work for dein#load_state()/dein#save_state() block call dein#set_hook('neosnippet.vim', 'hook_source', 'echomsg "foo"')
-
-
dein#source([{plugins}])
:加載(:source
)插件。-
{plugins}
:如果未指定喳逛,則會加載所有插件瞧捌。
-
-
dein#tap({plugin-name})
:如果插件存在且沒有被禁止,則返回非 0 數(shù)值润文。注:
dein#tap()
會初始化全局變量g:dein#name
和:dein#plugin
姐呐。
變量
-
g:dein#auto_recache
:是否自動調用dein#recache_runtimepath()
更新緩存。-
1
:開啟自動更新緩存典蝌。 -
0
:則關閉自動更新緩存(默認值)
注:該選項會重新加載
$MYVIMRC
-
-
g:dein#cache_directory
:設置緩存目錄曙砂。其默認緩存目錄為:
dein#begin()
指定的路徑。 -
g:dein#download_command
:默認下載命令骏掀。其默認值為:
curl --silent --location --output
鸠澈,
或者為:wget -q -O
或者使用 PowerShell。 -
g:dein#enable_name_conversion
:使能命名轉換截驮。-
1
:如果值為1
笑陈,且配置時未指定插件名,則使用dein-options-normalized_name
作為插件名稱葵袭。 -
0
:禁止命名轉換(默認值)涵妥。
" 使能命名轉換 let g:dein#enable_name_conversion = 1 if dein#load_state(s:dein_path) call dein#begin(s:dein_path) " 將 asyncrun.vim 名稱設置為 asyncrun call dein#add('skywind3000/asyncrun.vim',{'normalized_name' :'asyncrun'}) call dein#end() call dein#save_state() endif
上述代碼將插件名為
asyncrun.vim
修改為asyncrun
,現(xiàn)在使用asyncrun
可以成功訪問插件坡锡,使用asyncrun.vim
訪問會失效妹笆。 -
-
g:dein#enable_notification
:開啟通知功能块请。-
1
:表示開啟通知功能。 -
0
:表示失能通知功能(默認值)拳缠。
注:該選項涉及外部命令調用,因此在不同的平臺上贸弥,需要有相應的命令存在窟坐,具體為:
-
Windows:存在
Snarl
或Snarl_CMD
命令 -
Mac:存在
terminal-notifier
或osascript
命令 -
Linux:存在
notify-send
命令。
-
-
g:dein#install_max_processes
:設置 dein 最大進程數(shù)绵疲。其默認值為 8哲鸳,即最大開啟進程數(shù)為 8。
注:如果該值小于等于 1盔憨,則表示關閉多進程徙菠。
-
g:dein#install_process_timeout
:插件安裝/更新超時時間,單位為秒郁岩。其默認值為:120(即超時時間為 120 秒)
-
g:dein#install_progress_type
:安裝進度條輸出樣式婿奔。其值有如下幾個選項:
-
'none'
:不進行輸出 -
'echo'
:echo
區(qū)中顯示(默認值) -
'tabline'
:tabline
中顯示 -
title
:標題欄中顯示(該選項只在 Neovim 中生效)
注:如果需要在狀態(tài)欄
statusline
中進行展示,需要結合dein#get_progress()
函數(shù)问慎。 -
-
g:dein#install_message_type
:安裝消息輸出類型萍摊。其值有如下兩個選項:
-
'none'
:不輸出安裝信息 -
'echo'
:echo
區(qū)域顯示安裝信息
-
-
g:dein#install_log_filename
:安裝日志文件。該值默認為
""
如叼,表示失能日志記錄冰木。 -
g:dein#name
:當前插件名稱。注:
g:dein#name
只能在dein#tap()
塊中使用笼恰。
注:g:dein#name
已被標記為廢棄狀態(tài)deprecated
-
g:dein#notification_icon
:設置通知圖標路徑踊沸。該值默認為
""
。 -
g:dein#notification_time
:通知顯示時長社证,單位為秒逼龟。該選項默認值為:
2
,表示默認顯示時間為 2 秒猴仑。注:該選項只支持 Linux 和 Windows 平臺审轮。
-
g:dein#plugin
:當前插件。注:
g:dein#plugin
可用在dein#tap()
和dein-hooks
塊中辽俗。 -
g:dein#types#git#clone_depth
:git clone
默認歷史深度(default history depth
)疾渣。其默認值為 0。
如果該值設置為 1崖飘,則 dein 會采用淺拷貝功能榴捡。
更多信息,請參考:dein-options-type__depth
-
g:dein#types#git#command_path
:git
命令路徑朱浴。其默認值為:
git
-
g:dein#types#git#default_protocol
:git
默認使用協(xié)議吊圾。其有兩種類型可選:
https
达椰、ssh
其默認值為:https
-
g:dein#types#git#pull_command
:git pull
命令。其默認值為:
"pull --ff --ff-only"
選項(OPTIONS)
以下是 dein 提供的選項列表簡介:dein-options
:
-
augroup
:插件對于VimEnter
和GUIEnter
事件的自動命令組名稱项乒。類型:
String
-
build
:指定編譯腳本啰劲。類型:
String
注:
build
指定的命令最終由system()
函數(shù)執(zhí)行。
注:build
會在插件根目錄執(zhí)行命令檀何,如果想使用cd
命令蝇裤,必須結合使用sh -c
命令:" 在 vimproc.vim 目錄下執(zhí)行 make call dein#add('Shougo/vimproc.vim', {'build': 'make'}) " 在 command-t 目錄下執(zhí)行:sh -c "cd ruby/command-t && ruby extconf.rb && make" call dein#add('wincent/command-t', { \ 'build':'sh -c "cd ruby/command-t && ruby extconf.rb && make"' \ })
-
depends
:指定插件依賴的其他插件。類型:
String
频鉴、List
call dein#add('tpope/vim-surround', { \'on_map': {'n' : ['cs', 'ds', 'ys'], 'x' : 'S'}, \'depends' : 'vim-repeat' \})
注:
depends
列表指定的依賴 不會 自動進行安裝栓辜。
注:對于非懶加載插件,depends
指定的依賴插件加載順序無法確保有序垛孔。 -
frozen
:如果設置為1
藕甩,則表示禁止該插件自動更新。類型:
Number
-
ftplugin
:這個應該是指定插件類型路徑(不是很確定)周荐。類型:
Dictionary
狭莱,其中:- 當
key
為_
時,在加載完所有ftplugin
后羡藐,會執(zhí)行該操作贩毕。 - 當
key
為{filetype}
時,就只會加載ftplugin
目錄中的{filetype}
插件仆嗦。
- 當
-
if
:添加條件判斷辉阶。類型:
Number
、String
瘩扼,其中: -
lazy
:設置插件懶加載。類型:
Number
碍岔,其中:- 如果設置為 非0 值浴讯,表示啟用懶加載(此時 dein 不會把插件路徑添加到
runtimepath
)。 - 如果未設置
lazy
選項蔼啦,dein 會根據(jù)插件當前條件自動進行判斷是否啟用懶加載榆纽。
注:對于沒有
plugin/
目錄的插件,不要設置懶加載,因為這是沒有意義的奈籽〖⑶郑可以通過dein#check_lazy_plugins()
找到無意義的懶加載插件。 - 如果設置為 非0 值浴讯,表示啟用懶加載(此時 dein 不會把插件路徑添加到
-
merged
:啟用merged
特性衣屏。類型:
Number
躏升,其中:- 如果設置為
0
,則表示禁止merged
特性勾拉,這樣當前插件的plugin/
目錄就不會被融合進緩存目錄中煮甥,這對于插件文件存在沖突的情形下是一個很好的解決方案。
- 如果設置為
-
name
:指定插件名稱藕赞。類型:
String
注:如果未指定
name
選項,則 dein 會默認將插件名稱設置為插件倉庫尾部名稱卖局,即:skywind3000/asyncrun.vim
的名稱為asyncrun.vim
斧蜕。
注:插件名稱必須全局唯一,如果存在兩個或以上相同的插件名稱砚偶,則后面的會覆蓋前面遣蚀,此時使用name
選項自己指定名稱就可以很好地解決這個沖突竹勉。 -
normalized_name
:設置插件標準名稱。類型:
String
注:如果未指定
normalized_name
選項,則默認使用插件名稱主體部分作為其標準化名稱份蝴,如下所示:name : normalized name denite.nvim denite dein.vim dein vim-quickrun quickrun
-
on_cmd
:如果執(zhí)行了指定的命令,dein 就會加載該插件dein#source()
园匹。類型:
String
天梧、List
call dein#add('tpope/vim-fugitive', {'on_cmd' : 'Gstatus'})
上述代碼中,當我們在 Vim 中執(zhí)行
Gstatus
時仲锄,dein 就會加載vim-fugitive
插件劲妙。 -
on_event
:當指定的事件發(fā)生時,dein 就會加載該插件dein#source()
儒喊。類型:
String
镣奋、List
call dein#add('RomainEndelin/vim-projectionist', { \ 'on_event': ['VimEnter', 'BufRead'], \ 'on_if': 'findfile(".projections.json", a:event == "VimEnter" ? ";" : ".;") != ""' \ })
-
on_func
:當指定的函數(shù)被調用時,dein 就會加載該插件dein#source()
怀愧。類型:
String
call dein#add('junegunn/fzf', { \ 'if': s:has_exec('fzf'), \ 'on_cmd': 'FZF', " 存在 FZF 命令時才加載 \ 'on_func': 'fzf#run', " 調用了函數(shù) fzf#run 時才進行加載 \ })
-
on_ft
:打開指定的文件類型時侨颈,才加載插件。類型:
String
芯义、List
call dein#add('bps/vim-textobj-python', { 'on_ft' : 'python' }) call dein#add('tmhedberg/matchit', { 'on_ft' : 'html' })
-
on_if
:當滿足條件時哈垢,dein 就會加載該插件dein#source()
。類型:
String
注:
on_if
選項的默認會在事件BufRead
毕贼,BufNewFile
温赔,VimEnter
和FileType
發(fā)生時進行判斷。
如果存在dein-options-on_event
事件鬼癣,則在dein-options-on_event
事件中進行判斷陶贼,比如:call dein#add('blueyed/vim-diminactive', \ {'on_event': 'WinEnter', 'on_if': 'winnr("$") > 1'})
上述代碼中啤贩,
on_if
會在事件WinEnter
發(fā)生時進行判斷。 -
on_map
:當指定模式下拜秧,發(fā)生指定的按鍵映射時痹屹,加載該插件。類型:
Dictionary
枉氮、List
志衍、String
,其中:- 當值為
Dictionary
類型時聊替,key
為模式{mode}
指定楼肪,其余條目為按鍵映射:{mapping}
或[{mapping1},{mapping2},...]
,比如:
call dein#add('terryma/vim-multiple-cursors', { 'on_map' : { 'n' : ['<C-n>', '<C-p>'], 'x' : '<C-n>'}})
- 當值為
List
類型時惹悄,則其條目設置格式為:{mapping}
或[{mode}, {mapping1}, [{mapping2}, ...]]
春叫,比如:
call dein#add('dhruvasagar/vim-table-mode', {'on_map' : '<LocalLeader>t' }) call dein#add('terryma/vim-multiple-cursors', { 'on_map' : ['<C-n>', '<C-p>']})
注:當未指定模式
{mode}
時,則默認為nx
泣港。
注:on_map
選項支持<Plug>
按鍵映射暂殖,如果映射只指定了<Plug>
,那么實質上映射的是<Plug>(normalized_name
当纱,比如:" It is same as "'mappings': '<Plug>(anzu' call dein#add('osyo-manga/vim-anzu', {'on_map': '<Plug>'})
- 當值為
-
on_path
:當編輯指定路徑的文件時呛每,加載相應插件dein#source()
。類型:
String
坡氯、List
晨横,其中:- 如果值為
.*
,則表示編輯任何文件時廉沮,都加載插件颓遏。 - 其他情況,則只有緩沖區(qū)名稱匹配
on_path
指定的字符串時滞时,才進行加載叁幢。
call dein#add('editorconfig/editorconfig-vim', { \ 'if': has('pythonx'), \ 'on_event': 'InsertEnter', \ 'on_path': '.editorconfig', \ })
注:
on_path
選項對于文件夾瀏覽類型的插件很有用。 - 如果值為
-
on_source
:指定插件依賴關系坪稽,表示在指定的插件加載后曼玩,會加載當前插件。類型:
String
窒百、List
注:插件必須設置了懶加載選項黍判。
" ~/.vim/plugA/plugin/a.vim echom 'a.vim loaded!!' command! -nargs=0 CmdA :echom 'this is command a' echom 'a.vim done!!' " ~/.vim/plugB/plugin/b.vim echom 'b.vim loaded!!' command! -nargs=0 CmdB :echom 'this is command b' echom 'b.vim done!!' " ~/.config/nvim/init.vim call dein#add('~/.vim/plugA', { \ 'on_source': ['plugB'], \ 'on_cmd': ['CmdA'], \ 'lazy': 1}) call dein#add('~/.vim/plugB', { \ 'on_cmd': ['CmdB'], \ 'lazy':1 })
上述代碼中,當觸發(fā)加載
plugB
后篙梢,會加載plugA
顷帖。注:官方文檔寫的是:
on_source (List) or (String) Load the plugin before the listed plugins are loaded. Note: The plugins must be lazy loaded plugins.
在
on_source
指定的插件加載之前,先加載當前插件。
對應我們上面的例子贬墩,應該是當加載plugB
之前榴嗅,先加載plugA
。
但是我本地運行顯示的結果是:- 執(zhí)行
:CmdB
陶舞,觸發(fā)加載PlugB
嗽测,然后再觸發(fā)加載plugA
。 - 執(zhí)行
:CmdA
肿孵,只觸發(fā)加載plugA
唠粥,plugB
不會被加載。
因此停做,我認為官方文檔此處存在錯誤描述晤愧。
注:可通過
:scriptnames
查看已加載的插件(有序) - 執(zhí)行
-
path
:指定插件下載路徑。類型:
String
-
rev
:指定插件版本/標簽號蛉腌。類型:
String
养涮,其中:-
*
:如果選項type
為git
,則表示使用最新的released
標簽版本 - 支持通配符選擇眉抬,比如:
0.*
- 如果
type
為raw
,那么rev
必須是一個哈希值懈凹。
call dein#add('Shougo/deol.nvim', { 'rev': 'a1b5108fd5' })
-
-
rtp
:將指定目錄添加到runtimepath
蜀变。類型:
String
注:當一個倉庫中的子目錄包含 Vim 插件時,可以通過設置
rtp
選項將該目錄添加到runtimepath
中介评,從而使能插件:" 選擇倉庫 rstacruz/sparkup 的 vim 目錄作為插件添加 call dein#add('rstacruz/sparkup', {'rtp': 'vim'})
注:如果
rtp
為空字符串""
库北,那么 dein 不會將其路徑添加到runtimepath
。 -
script_type
:指定腳本類型们陆。類型:
String
注:對于沒有按照 Vim 官方文檔規(guī)定的目錄組織結構的插件寒瓦,可以通過
script_type
手動設置腳本類型,比如"indent"
坪仇,"plugin"
杂腰,"ftplugin"
...call dein#add( \ 'https://raw.githubusercontent.com/Shougo/' \ . 'shougo-s-github/master/vim/colors/candy.vim', \ {'script_type' : 'colors'}) call dein#add( \ 'https://github.com/bronzehedwick/impactjs-colorscheme', \ {'script_type' : 'colors'})
-
timeout
:安裝/更新插件的超時時間(單位:秒)。類型:
Number
注:如果忽略該選項椅文,那么超時時間由
g:dein#install_process_timeout
控制喂很。 -
trusted
:以管理員權限(sudo
)加載插件。類型:
Number
皆刺,其中:注:dein.vim 默認在
sudo
會話下,不會對插件進行加載,這是為了增加安全性忙干,否則插件在sudo
模式下可以進行任何操作器予。
但是如果一定需要在sudo
會話下加載插件,則為插件添加trusted
選項即可豪直。比如劣摇,coc.nvim
如果沒有加載的話,會一直彈出煩人的錯誤信息(暈)弓乙,那么最好為其添加trusted
選項末融,避免在sudo
會話時一直彈窗:
call dein#add('neoclide/coc.nvim', {'merged':0, 'rev': 'release', 'trusted': 1})
注:sudo
模式啟動后,dein.vim 的狀態(tài)會變更暇韧,導致下一次非sudo
會話時勾习,普通插件無法觸發(fā)加載,此時手動調用call dein#clear_state()
懈玻,然后重啟 Vim 即可巧婶。
-
type
:指定倉庫類型。類型:
String
涂乌,其值有如下幾個可選:-
none
:無倉庫 -
raw
:原始插件文本(必須指定script_type
) -
git
:Git 倉庫
注:如果忽略該選項艺栈,dein 會自動根據(jù)
{repository}
類型設置該選項 -
-
type__depth
:git clone
下載歷史深度。類型:
Number
湾盒,其中:- 如果忽略該選項湿右,則使用
g:dein#types#git#clone_depth
- 如果該值大于
0
,則使用淺拷貝罚勾,這會加快下載速度毅人。
注:淺拷貝在克隆某些倉庫時可能存在問題,具體請參考:
https://github.com/Shougo/neobundle.vim/issues/81
https://github.com/Homebrew/homebrew/issues/12024
注:建議不使用淺拷貝機制尖殃,反正時間不會增加多少丈莺。
- 如果忽略該選項湿右,則使用
鉤子函數(shù)(HOOKS)
dein 提供了一些鉤子函數(shù),對于插件的初始化操作很有用送丰。
注:函數(shù)類型的鉤子函數(shù)( Function hooks)不會被緩存缔俄,必須手動初始化。
注:對于非懶加載插件蚪战,鉤子函數(shù)的加載順序無法保證有序牵现。
注:鉤子函數(shù)的字符串表達式以命令行模式(Ex commands)進行執(zhí)行。
注:鉤子函數(shù)中涉及多個操作時邀桑,使用換行符進行分割瞎疼。
以下是 dein 提供的鉤子函數(shù)簡介:
-
hook_add
:當解析完dein#add()
行后,觸發(fā)該鉤子函數(shù)壁畸。類型:
String
贼急、Function
cal dein#add("~/.vim/plugA", { \'hook_add': "echom 'hook_add invoked!!'" \})
上述代碼為本地插件
plugA
設置了一個hook_add
鉤子茅茂,當 dein 解析到call dein#add("~/.vim/plugA")
語句后,會先調用鉤子函數(shù)hoot_add
太抓,然后再加載插件plugA
空闲。當鉤子函數(shù)涉及多個操作時,使用換行符進行分割走敌,如下所示:
call dein#add('kana/vim-niceblock', { \ 'hook_add': join(['xmap I <Plug>(niceblock-I)', 'xmap A <Plug>(niceblock-A)'], "\n") \ }) call dein#add('godlygeek/csapprox', { \ 'hook_add': " \ let g:CSApprox_konsole = 1\n \ let g:CSApprox_attr_map = \ { 'bold' : 'bold', 'italic' : '', 'sp' : '' }\n \ "})
注:不能在鉤子函數(shù)
hook_add
中調用插件內定義的函數(shù)碴倾,因此此時插件還未加載。 -
hook_done_update
:當所有插件都更新完畢后掉丽,觸發(fā)該鉤子函數(shù)跌榔。類型:
String
、Function
-
hook_post_source
:當插件加載(:source
)完成后捶障,觸發(fā)該鉤子函數(shù)僧须。類型:
String
、Function
cal dein#add("~/.vim/plugA", { \'lazy': 1, \'on_cmd': ['CmdA'], \'hook_post_source': "echom 'hook_post_source invoked!!'" \})
注:本人實驗過后项炼,發(fā)現(xiàn)
hook_post_source
只在懶加載插件上才會被回調担平,如果要想讓插件每次加載(無論是懶加載還是直接加載)時,都能觸發(fā)hook_post_source
锭部,則可以VimEnter
事件手動觸發(fā):autocmd VimEnter * call dein#call_hook('post_source')
-
hook_post_update
:當插件更新完成后暂论,觸發(fā)該鉤子函數(shù)。類型:
String
拌禾、Function
-
hook_source
:在加載(:source
)插件前空另,觸發(fā)該鉤子函數(shù)。類型:
String
蹋砚、Function
注:
hoot_source
與hook_post_source
一致,只能作用于欄加載插件摄杂,如果要想讓插件每次加載(無論是懶加載還是直接加載)時坝咐,都能觸發(fā)hook_source
,則必須手動進行觸發(fā):call dein#begin() ... call dein#end() call dein#call_hook('source')
注:
hook_source
不能跟hoo_post_source
一樣析恢,結合VimEnter
使用墨坚,因為插件直接加載發(fā)生在VimEnter
事件之前,如果hook_source
和VimEnter
結合映挂,實際上是等到插件加載完成后泽篮,才會觸發(fā)hook_source
,此時該鉤子的作用就與hook_post_source
一樣了柑船。