藻ログ

都会でOLをしています

dein.vimにお引越し

vimrcの分割管理

最近周囲で何人かの人がNeoBundleから dein.vim に移行していて,deinだと設定ファイルの分割読み込みがもっと便利にできるという話を聞いたので私も移行してみました.
wakame.hatenablog.jp

dein.vim

Dein.vim is a dark powered Vim/Neovim plugin manager.

github.com

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()

お通知

f:id:nisimur:20161009164018p:plain
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

感想

  • neobundleに比べておそろしく速くなった *7
  • 自由度が高くなり,自分でカスタマイズする人には便利になった *8
  • 移行タイミングとしてはちょっと早かった気がする *9
  • しゅって移行できると聞いてたので軽い気持ちで始めたが,色々試してたらけっこう時間が経ってやばみを感じた *10

参考にさせていただきました

github.com

*1:toml使わなくても読めはする

*2:各言語のfiletypeは:set filetypeとかして適当に調べてください

*3:depends指定しただけではインストールされないので,別に記述する必要がある

*4:brewからでも入れれる

*5:tmux上でterminal-notifierを使うとハングする問題が起きる

*6:正確には, 全部dots以下にあって`ln -s ~/dots/vimrc ~/.vimrc && ln -s ~/dots/vimfiles ~/.vim`してある

*7:速くなりすぎて一瞬何が起きたかわからない

*8:一方,普段vimの設定をしない人には少し敷居が高くなった

*9:githubでひとさまの設定tomlを漁ったり,deinドキュメントをもくもく読むことになった

*10:もうvimの設定は弄らないと誓ったのに