Vim 插件管理器 - dein.vim

前言

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 使用。

優(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
  • 插件安裝:插件基本安裝方法如下:

    1. 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()
    
    1. 重新打開 Vim 或者手動重新加載配置:so %后炸站,使用如下命令安裝插件:
    :call dein#install()
    

    :由于 dein 沒有 UI 顯示下載進度,需等待一段時間疚顷,等下載完成后旱易,底部提示欄會有顯示通知。
    也可以直接到<dein_path>/repos/查看插件是否已安裝完成腿堤。

    1. 關閉 Vim阀坏,再重新打開,就可以使用已安裝的插件功能了笆檀。
  • 插件卸載:dein.vim 并未直接提供插件卸載功能忌堂,因此其插件卸載相對麻煩,步驟如下:

    1. 取消插件添加配置:將要卸載的插件進行注釋:
    call dein#begin(s:dein_path)
    
    " uninstall vim-surround
    " call dein#add('tpope/vim-surround')
    
    call dein#end()
    
    1. 清除緩存:關閉再重新打開 Vim酗洒,執(zhí)行:call dein#recache_runtimepath()士修。
      :由于 dein 采用了merge功能,其會將所有插件的plugin/目錄下的內容都緩存到同一個目錄(具體為<dein_path>/.cache/init.vim/.dein/plugin)中樱衷,因此雖然我們上一步配置文件取消了添加插件棋嘲,但由于緩存未刪除,導致本次啟動仍然會加載相應插件箫老,故還需手動進行緩存清除操作封字。

    2. 關閉再重新打開 Vim,就可以發(fā)現(xiàn)插件功能已禁止(可選)

    3. 刪除插件:以上操作只是停用了插件,插件仍然存在于本地電腦阔籽,如果想進行刪除流妻,還需調用如下命令:

    :call map(dein#check_clean(), "delete(v:val, 'rf')")
    

    此時就可以看到 dein 目錄下的repo下的相應插件被刪除了,緩存文件夾.cache下的.dein/plugin相關的插件緩存也被刪除了笆制。

  • 失能插件:不刪除插件绅这,只是不進行加載,步驟如下:

    1. 將配置文件中的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()
    
    1. 關閉 Vim证薇,再重新打開,執(zhí)行:call dein#recache_runtimepath()

    2. 關閉 Vim匆篓,再重新打開浑度,就可以看到插件功能禁止了。

:以上任何操作如果失敗鸦概,一律進行如下操作箩张,確保不受 dein 緩存機制影響:

  1. 重新打開 Vim,執(zhí)行:call dein#clear_state()窗市,清除狀態(tài)文件先慷,強制 dein 重新加載配置。
  2. 退出后重新打開 Vim咨察,執(zhí)行:call dein#recache_runtimepath()论熙,清除舊緩存
  3. 退出 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瘟滨,valuedein-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():重新加載 deinruntimepath緩存目錄,并執(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:表示失能通知功能(默認值)拳缠。

    :該選項涉及外部命令調用,因此在不同的平臺上贸弥,需要有相應的命令存在窟坐,具體為:

  • 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_depthgit clone默認歷史深度(default history depth)疾渣。

    其默認值為 0。
    如果該值設置為 1崖飘,則 dein 會采用淺拷貝功能榴捡。
    更多信息,請參考:dein-options-type__depth

  • g:dein#types#git#command_pathgit命令路徑朱浴。

    其默認值為:git

  • g:dein#types#git#default_protocolgit默認使用協(xié)議吊圾。

    其有兩種類型可選:https达椰、ssh
    其默認值為:https

  • g:dein#types#git#pull_commandgit pull命令。

    其默認值為:"pull --ff --ff-only"

選項(OPTIONS)

以下是 dein 提供的選項列表簡介:dein-options

  • augroup:插件對于VimEnterGUIEnter事件的自動命令組名稱项乒。

    類型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:添加條件判斷辉阶。

    類型NumberString瘩扼,其中:

    • 如果其值為0谆甜,則 dein 不會注冊該插件,相當于禁止加載插件集绰。
    • 如果其值為String類型规辱,dein 會執(zhí)行字符串指令。
    • 如果未設置if指令栽燕,dein 默認會使能/啟用該插件罕袋。
  • lazy:設置插件懶加載。

    類型Number碍岔,其中:

    • 如果設置為 非0 值浴讯,表示啟用懶加載(此時 dein 不會把插件路徑添加到runtimepath)。
    • 如果未設置lazy選項蔼啦,dein 會根據(jù)插件當前條件自動進行判斷是否啟用懶加載榆纽。

    :對于沒有plugin/目錄的插件,不要設置懶加載,因為這是沒有意義的奈籽〖⑶郑可以通過dein#check_lazy_plugins()找到無意義的懶加載插件。

  • 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温赔,VimEnterFileType發(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查看已加載的插件(有序)

  • path:指定插件下載路徑。

    類型String

  • rev:指定插件版本/標簽號蛉腌。

    類型String养涮,其中:

    • *:如果選項typegit,則表示使用最新的released標簽版本
    • 支持通配符選擇眉抬,比如:0.*
    • 如果typeraw,那么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皆刺,其中:

    • 如果設置為 非0 值少辣,dein 就會使用管理員權限加載插件。
    • 如果未設置羡蛾,dein 不會進行加載漓帅。

    :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__depthgit 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ù)跌榔。

    類型StringFunction

  • hook_post_source:當插件加載(:source)完成后捶障,觸發(fā)該鉤子函數(shù)僧须。

    類型StringFunction

    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_sourcehook_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_sourceVimEnter結合映挂,實際上是等到插件加載完成后泽篮,才會觸發(fā)hook_source,此時該鉤子的作用就與hook_post_source一樣了柑船。

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鞍时,隨后出現(xiàn)的幾起案子亏拉,更是在濱河造成了極大的恐慌扣蜻,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件及塘,死亡現(xiàn)場離奇詭異莽使,居然都是意外死亡,警方通過查閱死者的電腦和手機笙僚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門芳肌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肋层,你說我怎么就攤上這事亿笤。” “怎么了槽驶?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵责嚷,是天一觀的道長。 經常有香客問我掂铐,道長罕拂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任全陨,我火速辦了婚禮爆班,結果婚禮上,老公的妹妹穿的比我還像新娘辱姨。我一直安慰自己柿菩,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布雨涛。 她就那樣靜靜地躺著枢舶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪替久。 梳的紋絲不亂的頭發(fā)上凉泄,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音蚯根,去河邊找鬼后众。 笑死,一個胖子當著我的面吹牛颅拦,可吹牛的內容都是我干的蒂誉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼距帅,長吁一口氣:“原來是場噩夢啊……” “哼右锨!你這毒婦竟也來了?” 一聲冷哼從身側響起碌秸,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤陡蝇,失蹤者是張志新(化名)和其女友劉穎痊臭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體登夫,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡广匙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恼策。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸦致。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涣楷,靈堂內的尸體忽然破棺而出分唾,到底是詐尸還是另有隱情,我是刑警寧澤狮斗,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布绽乔,位于F島的核電站,受9級特大地震影響碳褒,放射性物質發(fā)生泄漏折砸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一沙峻、第九天 我趴在偏房一處隱蔽的房頂上張望睦授。 院中可真熱鬧,春花似錦摔寨、人聲如沸去枷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽删顶。三九已至,卻和暖如春淑廊,著一層夾襖步出監(jiān)牢的瞬間翼闹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工蒋纬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坚弱。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓蜀备,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荒叶。 傳聞我的和親對象是個殘疾皇子碾阁,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348