dein.vimにお引越し
vimrcの分割管理
最近周囲で何人かの人がNeoBundle
から dein.vim
に移行していて,deinだと設定ファイルの分割読み込みがもっと便利にできるという話を聞いたので私も移行してみました.
wakame.hatenablog.jp
how to use
:h dein
して公式のヘルプドキュメントを見る感じになりそう.あんまりこれという使い方を提示するのでなく,好きなようにカスタマイズしてくれという雰囲気.コマンドの提供はなく,すべて関数としてユーザに見せている.
dein.vim/dein.txt at master · Shougo/dein.vim · GitHub
dein#check_install([{plugins}]) | {plugins}がinstallされてるかチェック |
dein#check_clean() | disabled されてるpluginのリストを返す |
dein#install([{plugins}]) | pluginsをインストール |
dein#check_update([{plugins}]) | {plugins}のupdateをチェック |
dein#reinstall([{plugins}]) | {plugins}を再インストール |
dein#update([{plugins}]) | {plugins}をupdate |
大体{plugins}配列がnullのときは全てのpluginに対しての操作になる.
これら(もっとあるけど)を組みわせていい感じに:call
して使ってきます.
dein#load_toml()
deinではtoml形式でpluginリストを記述し,様々な設定を付加することができる.*1
vimprocの場合はビルドコマンドを指定したり,hook_addでプラグインをロードした後に設定スクリプトを読み込むなどの指定ができる.短い設定なら直接展開して書き下せば良いわけだ.便利.
いろんなhookについては :help dein-hooks
を見てください.
plugins.toml
[[plugins]] repo = 'Shougo/dein.vim' [[plugins]] repo = 'Shougo/vimproc.vim' build = 'make' [[plugins]] repo = 'Shougo/unite.vim.git' hook_add = 'source ~/.vim/userautoload/plugins/plugins-unite.vim' [[plugins]] repo = "https://github.com/tyru/caw.vim.git" hook_add = ''' vmap - <Plug>(caw:I:toggle) '''
また,条件指定でpluginをロードすることによって,例えばgoファイルを編集するときだけvim-goを読み込むとかが簡単に出来る.*2
plugins-lazy.toml
[[plugins]] repo = "davidhalter/jedi-vim" on_ft = ['python'] [[plugins]] repo = 'fatih/vim-go' on_ft = ['go']
また依存関係がある場合は,dependsオプションで指定することができる*3.
[[plugins]] repo = 'Shougo/unite.vim' hook_add = 'source ~/.vim/userautoload/plugins/plugins-unite.vim' [[plugins]] repo = 'Shougo/unite-outline' depends = ['unite'] hook_add = 'source ~/.vim/userautoload/plugins/plugins-unite-outline.vim' [[plugins]] repo = 'hewes/unite-gtags' hook_add = 'source ~/.vim/userautoload/plugins/plugins-unite-gtags.vim' depends = ['unite']
NeoBundleClean()はどこ行ったのか
dein.txt
をもくもく読んでると以下の記述がありました.
Q: How to remove the disabled plugins?
A: You can remove them like below.
Note: You need Vim 7.4.1107+ or latest version of neovim.
>
call map(dein#check_clean(), "delete(v:val, 'rf')")
起動時にdein#check_clean()
して自動でdeleteすることもできますが,一時的にdisableしてるだけのこともあるので雑にコマンド化して置いとくことにしました
function! s:deinClean() if len(dein#check_clean()) call map(dein#check_clean(), 'delete(v:val, "rf")') else echo '[ERR] no disabled plugins' endif endfunction command! DeinClean :call s:deinClean()
お通知
utilを見てたらログを通知で出せることを発見した.terminal-notifierが入ってたらそっち,なければ林檎スクリプトで通知を出せるみたい.
repos/github.com/Shougo/dein.vim/autoloadl/dein/util.vim
if executable('terminal-notifier') let cmd = 'terminal-notifier -title ' \ . string(title) . ' -message ' . string(a:msg) if icon != '' let cmd .= ' -appIcon ' . string(icon) endif else let cmd = printf("%s osascript -e 'display notification " \ ."\"%s\" with title \"%s\"'", \ (exists('$TMUX') && executable('reattach-to-user-namespace') ? \ 'reattach-to-user-namespace' : ''), a:msg, title) endif
deinの設定で通知を有効化しておくと使えるようになる.terminal-notifier*4も一応試したが,tmuxと相性悪かった*5ので林檎スクリプトで通知を出してもらうことにした.
let g:dein#enable_notification = 1
引っ越した
ディレクトリ構成
こんな感じにした *6
.vimrc .vim/colors .vim/snippets .vim/dein # dein本体 .vim/userautoload # わたしの設定が集まるところ ├── init # わたしの基本設定(plugin依存なし) │ ├── basic.vim │ ├── color.vim │ ├── indent.vim │ ├── latex.vim │ ├── mapping.vim │ └── util.vim ├── dein # わたしのdein設定 │ ├── rc.vim │ ├── plugins.toml │ ├── plugins-lazy.toml ├── plugins # わたしのプラグイン設定 │ ├── plugins-dein.vim │ ├── plugins-caw.vim │ ├── plugins-ctrlp.vim │ ├── plugins-jedi-vim.vim │ ├── plugins-lightline.vim │ ├── plugins-neocomplete.vim │ ├── plugins-neosnippet.vim │ ├── plugins-syntastic.vim │ ├── plugins-unite.vim │ ├── plugins-vim-fugitive.vim │ ├── plugins-vim-go.vim │ ├── plugins-vim-latex.disabled │ ├── plugins-vim-quickrun.vim │ ├── plugins-vim-snowdrop.vim │ ├── plugins-vim-submode.vim │ └── plugins-vimfiler.vim
vimrc
こうしておくと2行目を消せばいつでもプラグイン無しで動かせる
runtime! userautoload/init/*.vim runtime! userautoload/dein/*.vim
dein/rc.vim
とりあえず起動時にインストールされてないものがあったら入れてもらうようにした.
if &compatible set nocompatible endif let s:dein_path = expand('~/.vim/dein') let s:dein_repo_path = s:dein_path . '/repos/github.com/Shougo/dein.vim' " deinなかったらcloneでもってくる if !isdirectory(s:dein_repo_path) execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_path endif execute 'set runtimepath^=' . s:dein_repo_path " let g:dein#install_progress_type = 'title' let g:dein#enable_notification = 1 call dein#begin(s:dein_path) call dein#load_toml('~/.vim/userautoload/dein/plugins.toml', {'lazy': 0}) call dein#load_toml('~/.vim/userautoload/dein/plugins-lazy.toml', {'lazy': 1}) call dein#end() if dein#check_install() call dein#install() endif
感想
参考にさせていただきました
*1:toml使わなくても読めはする
*2:各言語のfiletypeは:set filetypeとかして適当に調べてください
*3:depends指定しただけではインストールされないので,別に記述する必要がある
*5:tmux上でterminal-notifierを使うとハングする問題が起きる
*6:正確には, 全部dots以下にあって`ln -s ~/dots/vimrc ~/.vimrc && ln -s ~/dots/vimfiles ~/.vim`してある
*7:速くなりすぎて一瞬何が起きたかわからない
*8:一方,普段vimの設定をしない人には少し敷居が高くなった