Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

dein.vimによるプラグイン管理のマイベストプラクティス

$
0
0

はじめに

vim のプラグイン管理ではこれまで NeoBundleがデファクトだったけど、今後は dein.vimを使えってことなので移行してます。
dein#addで追加したプラグインの設定をどこでどう書くかを色々試した結果、TOML管理機能を使うのが一番よさげ、という結論に至ったので、こうしておくとよさそうという現時点での僕の設定を書いておきます。

設定例

init.vim (neovimじゃない場合は.vimrcと読み替えてOK) は最終的に↓こんな感じに凄くシンプルになった。

~/.config/nvim/init.vim
if!&compatiblesetnocompatibleendif" reset augroup
augroup MyAutoCmd
  autocmd!
augroup END

" dein settings {{{" dein自体の自動インストールlets:cache_home = empty($XDG_CACHE_HOME) ? expand('~/.cache') : $XDG_CACHE_HOME
lets:dein_dir =s:cache_home . '/dein'lets:dein_repo_dir =s:dein_dir . '/repos/github.com/Shougo/dein.vim'if!isdirectory(s:dein_repo_dir)call system('git clone https://github.com/Shougo/dein.vim ' . shellescape(s:dein_repo_dir))endiflet&runtimepath=s:dein_repo_dir .",". &runtimepath" プラグイン読み込み&キャッシュ作成lets:toml_file = fnamemodify(expand('<sfile>'),':h').'/dein.toml'if dein#load_state(s:dein_dir)call dein#begin(s:dein_dir, [$MYVIMRC,s:toml_file])call dein#load_toml(s:toml_file)call dein#end()call dein#save_state()endif" 不足プラグインの自動インストールif has('vim_starting')&& dein#check_install()call dein#install()endif" }}}" プラグイン以外のその他設定が続く" :

ここまでのポイント

  • リモートのいろんな環境で自分用設定をcloneして使うことが多いので $XDG_CACHE_HOME対応はちゃんとしておく。
  • dein.vim自体が無ければ自動インストールする(事前に必要な手順とかは忘れるから何でも自動化しとくのが楽よね)
  • dein#beginの第二2引数にtomlファイルを追加する(重要)
    • こうしておくことでtomlの変更があった場合にキャッシュの自動削除が動くようになる。
    • dein#beginの第二引数が無いまま dein#load_tomlをしてると、自分で dein#clear_state()しない限りtomlの変更内容が反映されないので面倒くさい。
  • 落としてないプラグインが追加されていたら見つけたら自動インストール(自動化!自動化!)

で、プラグイン自体は dein#load_tomlで指定した先のTOML形式で管理することになります。

~/.config/nvim/dein.toml (ところでQiitaってtomlシンタックスが無いようなので対応して欲しいです)
[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]] # カーソル位置のコンテキストに合わせてftを切り替える
repo = 'osyo-manga/vim-precious'
depends = ['Shougo/context_filetype.vim']
hook_add = '''
  " NORMALモードのカーソル移動中に頻繁に切り替わるとうざいのでデフォは無効化しておく(helpは例外)
  let g:precious_enable_switch_CursorMoved = { '*': 0, 'help': 1 }
  " INSERTモードのON/OFFに合わせてトグル
  autocmd MyAutoCmd InsertEnter * :PreciousSwitch
  autocmd MyAutoCmd InsertLeave * :PreciousReset
'''

[[plugins]] # カーソル位置のコンテキストのftを判定するライブラリ
repo = 'Shougo/context_filetype.vim'
hook_add = '''
  if !exists('g:context_filetype#filetypes')
    let g:context_filetype#filetypes = {}
  endif
  " dein.toml編集用のパターンを追加
  let g:context_filetype#filetypes['toml'] = [
    \ {'filetype':'vim', 'start':'^\s*hook_\(add\|source\|post_source\)\s*=\s*\('.'""'.'"'.'\|'."''"."'".'\)', 'end':'\2'},
    \ ]
'''

[[plugins]] # toml syntax
repo = 'cespare/vim-toml'
on_ft = 'toml'

[[plugins]] # カラースキーマ
repo = 'w0ng/vim-hybrid'
hook_add = '''
  set background=dark
  " カラースキーマの適用はsource後じゃないと出来ないので遅延セット
  autocmd MyAutoCmd VimEnter * colorscheme hybrid
'''

# other plugins
# :
  • dein#addは最近 hook_add/hook_source/'hook_post_source' オプションが追加されて add や source 時に行いたい処理が書けるようになったので活用する。
    • このオプションは特にTOML管理するときに威力を発揮する。このオプションはvimコマンドを文字列で渡すので init.vim内でvimのコードとして書こうとするとエスケープやら改行の扱いやらが面倒であまり使い勝手が良いとは言えないが、逆にTOMLでは複数行表記が簡単なので気軽にvimスクリプトが書ける。正にtoml管理の為に追加されたオプションです。
    • hook_*オプション内では改行の認識や行頭コメントの利用も出来るようになっているのでTOML内では普通のvim感覚で書けて既存設定の移植も楽ちんです。
    • そしてTOML管理だとプラグインの利用宣言とそお後処理が一箇所にまとめて書けるのも良い。vimで書く場合は dein#adddein#beginブロック内で行って、プラグイン個別の設定は dein#end以降の if dein#tapブロック内という離れた場所に書かざるをえなかったのが、TOML管理にすればそれが解消されます。 − on_fton_iなど on_で始まる系のオプションが書いてあると、そのプラグインは自動で遅延ロード(source)対象になります。
    • 遅延ロードされたプラグインが実際に読み込まれる際にはその前後で、hook_soucehook_post_sourceオプションに指定したコマンドを実行させることが出来ます。

dein.vimでtoml管理する際のポイント

colorscheme は hook_add 内で autocmd を登録して遅延セットするのが良い

単純に hook_addに書いてしまうと、この時点ではまだプラグインは sourceされていないのでエラーになってしまいます。
しかし、非遅延プラグイン(on_*のオプション指定がないもの)では hook_sourcehook_post_sourceは呼ばれないという仕様があります。
dein.vimのドキュメントのFAQではプラグインで入れた colorschemedein#endの後に書けと書いてありますが、1つのプラグイン設定はやはり1箇所にまとめて書きたいです。

これらの仕様とやりたいことを考慮すると、『カラースキーマの設定は toml の hook_add内で autocmdするのがベスト』 という結論になりました。

vim-precious の導入とdein用コンテキスト設定の追加でtoml管理が快適に

vim-preciousを導入して、context_filetype.vimにdein用のコンテキスト設定を追加してやると、toml の hook_*オプションの内側にカーソルがあるときだけ、set filetype=vimさせることが出来るので、プラグインの追加設定も toml 内で快適に書けて、TOML最高!となります。

こんな感じになります。
gyazo-975d6f439513424f9a82880ed9d74e7e.gif

↑このスクショはちょっと前に撮ったやつで、ノーマルモードのカーソル移動でもftが切り替わるようになっているが、暫く使っていたら切り替えが頻繁すぎるのもちょっとどうかと思い始めたので、今では上述の設定にあるとおりINSERTモードの時のみft自動切り替えを有効化するようにしている。


Viewing all articles
Browse latest Browse all 5608

Trending Articles