deinでのvimのプラグイン管理の最終形

vimのプラグイン管理をするためのプラグインdein.vimの使い方についてです。

vimには優秀なプラグインが数多く存在しており、それらを使わない手はありせん。使用するプラグインの数が多くなればなるほど、管理が大変になってきます。

そこで活躍するのが、プラグイン管理のためのプラグインdein.vimです。

参考:私が使用している便利なプラグイン一覧
vim とても強力なプラグインたち | MY ROBOTICS

neobundleからdein.vimへ

ひと昔前は私もプラグイン管理にneobundleを使用していました。

dein.vimはNeoBundleの作者であるShougoさんが作成した新しい時代のプラグイン管理マネージャです。(Shougoさんはvim界隈では有名ですね。)NeoBundleと比べてプラグインのロード時間がかなり短縮されています。

作者自身が「NeoBundleの時代は終わったからdein.vimに移行しよう。」と言っているので、NeoBundleをお使いの皆さんはぜひdeinに乗り換えましょう。

最終的なdein.vim

最終的にこのような形態に落ち着きました。
deinを導入するためのスクリプトです。

" インストールディレクトリの指定
let s:dein_dir = expand('~/.cache/dein')
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
let s:toml_file = expand('~/.config/nvim/dein') . '/plugins.toml'
let s:toml_dir = expand('~/.config/nvim/dein/plugins')
" dein.vim ディレクトリがruntimepathに入っていない場合、追加
if match( &runtimepath, '/dein.vim' ) == -1
    " dein_repo_dir で指定した場所に dein.vim が無い場合、git cloneしてくる
    if !isdirectory(s:dein_repo_dir)
        execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
    endif
	  execute 'set runtimepath+=' . fnamemodify(s:dein_repo_dir, ':p')
endif
" dein の設定
if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)
    " 各プラグインのtomlを読み込む
    call dein#load_toml( s:toml_dir . '/tcomment_vim.toml', {} )
    call dein#load_toml( s:toml_dir . '/vim-surround.toml', {} )
    call dein#load_toml( s:toml_dir . '/yankround.vim.toml', {} )
    call dein#load_toml( s:toml_dir . '/neoterm.toml', {} )
    call dein#load_toml( s:toml_dir . '/lightline.vim.toml', {} )
    call dein#load_toml( s:toml_dir . '/ctrlp.vim.toml', {} )
    call dein#load_toml( s:toml_dir . '/iceberg.vim.toml', {} )
    call dein#load_toml( s:toml_dir . '/smart_tabline.vim.toml', {} )
    call dein#load_toml( s:toml_dir . '/vim-altercmd.toml', {} )
    
    call dein#end()
    call dein#save_state()
endif
" 各プラグインのインストールチェック(なかったら自動的に追加される)
if dein#check_install()
	call dein#install()
endif

使用するプラグインの記述は、toml形式で書かれた別ファイルを使用します。
サンプルコードでは、”~/.vim/dein/プラグイン名.toml” を読み込む設定となっています。

上記dein.vimのよう、私は各プラグインごとにtomlファイルを用意しています。
1つのtomlファイルに読み込みプラグインをまとめて記述することもできます。

tomlファイルの準備

次に、deinで管理したいプラグインを列挙したtoml形式のファイルを準備します。

[[plugins]]
repo = 'ユーザ名/リポジトリ名'
hook_add = '''
   プラグインの個別設定を記述
'''

tomlファイルの記述は上記のように行います。
例えば、yankround.vimの場合、

[[plugins]]
repo = 'LeafCage/yankround.vim'
hook_add = '''
	nmap p <Plug>(yankround-p)
	xmap p <Plug>(yankround-p)
	nmap P <Plug>(yankround-P)
	nmap gp <Plug>(yankround-gp)
	xmap gp <Plug>(yankround-gp)
	nmap gP <Plug>(yankround-gP)
	nmap <C-p> <Plug>(yankround-prev)
	nmap <C-n> <Plug>(yankround-next)
'''

hook_addには、プラグインの個別設定を記述します。
hook_addの”’~”’に記述された内容は、プラグインが追加されたタイミングで読み込まれます。

hook_add(プラグインが追加された時)
hook_source(ソースされた後)
hook_post_source(ソースされる直前)
hook_done_update(アップデートされた後)
hook_post_update(アップデートされる直前)

hook_add以外にも、個別設定の読み込みタイミングオプションは色々ありますが、特に拘りがない場合にはhook_addを使用すれば良いでしょう。

読み込みタイミングに関する詳細は公式ドキュメントを確認してみてください。
https://github.com/Shougo/dein.vim/blob/master/doc/dein.txt

遅延ロードについて

deinには遅延ロードという仕組みが導入されています。通常プラグインはvim起動直後に読み込まれますが、遅延ロードを使えば特定のタイミング(例えば、インサートモードに入った時)に読み込むことができるため、vimの起動時間を短縮することができます。

[[plugins]]
repo = 'some_user/plugin_for_python.vim'
on_ft = ['python']

遅延ロードを行う場合には on_* 系のオプションを指定します。
上の例では、ファイルタイプがpythonの場合のみプラグインをロードする指定をしています。

on_cmd
コマンドが実行されるにロード。ListかStringで指定。
on_cmd = [‘Hoge’] など。

on_event
イベントが実行される時にロード。ListかStringで指定。
on_event = [‘TabNew’] など。

on_func
関数が実行される時にロード。ListかStringで指定。
on_func = [‘Piyo’] など。

on_ft
指定されたファイルタイプの時にロード。ListかStringで指定。
on_ft=[‘Python’] など。

on_i
インサートモード移行時にロード。Numberで指定。0以外が指定されると有効となる。
on_i = 1 など。

プラグインをアップデートする

:call dein#update()

上記コマンドで、deinで追加したvimのプラグインをアップデートできます。
(githubにアクセスし、現在のローカルのプラグインが古ければpullしてくれます。)

そんなに頻繁には使わないですが、とても優秀なコマンドですので頭の片隅に留めておきましょう。

参考:私が使用している便利なプラグイン一覧
こちらに私が使用しているvimのプラグインをまとめて見ました。興味のある方は覗いてみてください。
vim とても強力なプラグインたち | MY ROBOTICS

以上、vimのプラグイン管理のためのプラグイン「dein」の使い方についてでした。