VimのプラグインマネージャVoltv0.3.2がリリースされました。

VoltはGo製のVim8用のプラグインマネージャで、あんまりVim scriptを書かなくてもプラグインの管理をすることができます。

以前はdein.vimを使っていたんですが、 Windowsでmsys2だとうまく動いていたのにkaoriya-vimを起動したらどっちでもエラーを吐くようになるとかがあって。
パスの設定とかの問題だとは思うんですけど、家ではMac、会社ではWindowsを使っていて、Windowsのために時間を掛けて調査したくないなーとか考えて移行先を探してました。

パッケージマネージャとして期待する機能は以下。

  • WindowsでもMacでもちゃんと動く
  • 遅延ロードが使える(大量にプラグインをインストールしてもVimの起動時間が遅くならない)
  • 設定ファイルをgitで管理できる

そこで使うことにしたのがVoltです。

まずはインストール

リリースページからダウンロードするか、
goコマンドでインストールしましょう。

$ go get github.com/vim-volt/volt

そして使う

プラグインをインストールするにはサブコマンドgetを使います。

$ volt get Eivy/vim-html_ruby

GitHub以外から持ってくる場合はプロトコルから指定したりなんだり。 Bitbucketからならプロトコルはいらないみたい。

$ volt get bitbucket.org/Eivy/vim-vbnet

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

$ volt get -u Eivy/vim-html_ruby

-uを使います。

インストールしているプラグイン全部をアップデートしたいときは

$ volt get -u -l

とすれば一括でアップデートしてくれます。

どこになにが出来るのか

volt getしたりすると、$VOLTPATHで指定された場所(デフォルトでは~/volt)に以下のような構成が作られます。

.
├── lock.json
├── plugconf
│   ├── github.com
│   │   └── Eivy
│   │       └── vim-html_ruby
└── repos
    └── github.com
        └── Eivy
            └── vim-html_ruby

それぞれのファイルがなんなのか、簡単に説明してみます。

lock.json

voltでインストールしたリポジトリ情報が記録されたファイルです。とりあえずこいつをgitで管理すれば、各マシンでプラグインを共有できます。 トランザクション番号も記録されていますが、そのままgitで管理しても問題ないみたい。

plugconf/

実はvoltではプラグインごとに設定ファイルを分けることができて、そのファイルを保存する場所になります。設定ファイルの書き方はのちほど。

repos/

ここの下にリポジトリがクローンされます。構成はGoの管理と同じ感じです。 私はghqでgitリポジトリを管理しているので、$GHQ_ROOT$VOLTPATH/reposを追加しています。

最後に、実際にvimに読み込まれるファイルとして~/.vim/pack/volt/が作成されます。 voltはVim8から導入されたパッケージマネージャの機能を使っています。こちらの内容については割愛します。詳しいことは:h packageを読んで下さい。

そしてカスタマイズ

先ほども書きましたが、voltではプラグインごとの設定を別ファイルに分けることができます。.vimrcが小さくできますね。

で、その設定ファイルの書き方ですが、デフォルトではvolt getした時点で以下のような、そのプラグイン用の設定ファイルのひな型ができるので、それを編集します。

function! s:config()
  " Plugin configuration like the code written in vimrc.
endfunction

function! s:loaded_on()
  " This function determines when a plugin is loaded.
  "
  " Possible values are:
  " * 'start' (a plugin will be loaded at VimEnter event)
  " * 'filetype=<filetypes>' (a plugin will be loaded at FileType event)
  " * 'excmd=<excmds>' (a plugin will be loaded at CmdUndefined event)
  " <filetypes> and <excmds> can be multiple values separated by comma.
  "
  " This function must contain 'return "<str>"' code.
  " (the argument of :return must be string literal)

  return 'start'
endfunction

function! s:depends()
  " Dependencies of this plugin.
  " The specified dependencies are loaded after this plugin is loaded.
  "
  " This function must contain 'return [<repos>, ...]' code.
  " (the argument of :return must be list literal, and the elements are string)
  " e.g. return ['github.com/tyru/open-browser.vim']

  return []
endfunction

s:config()

v0.3.4で変更されました。s:on_load_pre()s:on_load_post()に分かれました。

ここに.vimrcに書くようなプラグインの設定を書きます。

let g:ale_open_list=0
let g:caw_no_default_keymappings=1
nmap <silent> <leader>g <Plug>(caw:hatpos:toggle:operator)

みたいなやつですね。

今のところ、プラグインがロードされる前にこのファンクションが呼ばれる作りなので、プラグインがロードされていることが前提の設定、例えばUnite.vim

call unite#filters#matcher_default#use(['matcher_fuzzy'])

みたいなファンクションを呼ぶタイプのものは動作しません。

私はこれを回避するために、.vimrcに以下のように書いて、無理やり先にプラグインをロードするようにしています。

packadd github.com_Shougo_unite.vim
call unite#custom#profile('default', 'context', {'direction': 'belowright', 'winheight':10, 'auto-resize': 1, 'start_insert': 1})

たぶんこれ、いいやり方ではなくて、Unite.vimのほうに違う設定方法があったりとかするんじゃないかと思います。面倒臭いので調べてませんが・・・。そもそもUnite.vimももうdeplecatedだし・・・。

s:loaded_on()

ここはプラグインがいつロードされるか、つまり遅延ロードの設定を書きます。

現状対応している遅延ロードのタイミングはコマンドの実行時と、ファイルタイプの設定時の二つみたいです。

書き方としてはreturnのあとの文字列を書き換えます。遅延ロードしないときは'start'のまま。
コマンドでロードしたいときは'excmd=QuickRun'みたいに書きます。
ファイルタイプでロードしたいときは'filetype=vim'みたいな感じ。

コマンドもファイルタイプも複数指定に対応していて、,で区切って並べればO.K.です。

s:depends()

ここにはプラグインが依存している別のプラグインを書きます。使いたいプラグインより先に読み込まれていないと困るやつを書くところです。

returnのあとの[]の中に'github.com/tyru/open-browser.vim'と文字列で書きます。ここはVimの配列の書き方なので、依存するものが複数あるときはやはり,で区切って並べます。

Voltの動きもカスタマイズ

voltにも設定を書くことができて、$VOLTPATHの下に、以下のような内容のconfig.tomlというファイルを用意します。

[get]
create_skeleton_plugconf = true
fallback_git_cmd = true
[build]
strategy = "symlink"

get.create_skeleton_plugconf

volt getしたときにそのプラグインの設定ファイルの雛形を自動で作るかどうかの設定です。

get.fallback_git_cmd

voltが使っているgo-gitでエラーが発生したときに、代わりにgitコマンドを使うかどうかの設定、なのかな? 実際にgo-gitでエラーが起きたときに、gitコマンドが動いているところを見たことがないのでちょっとわからないです。設定したことないし・・・。

build.strategy

"copy""symlink"が使えます。"copy"なら、~/.vim/pack/volt/opt/以下にプラグインのファイルのハードコピーが作成されます。"symlink"ならリンクが貼られるだけ。デフォルトは”symlink”です。

最後に

とりあえずREADMEに書いてあることをかいつまんで、簡単に書いてみましたが、バージョンもまだv0.3.2ですし、まだまだ機能も追加されたり、設定の書き方が変わったりがあるかもしれません。READMEはちゃんと読むようにしましょう。