基本編
Vim プラグインを作っているときに、その動作を確認したいことがよくあります。
そういうときは、下のようなコマンドを vimrc に書いておくと便利です。
command! -bang -nargs=* PluginTest call PluginTest()
function! PluginTest()
execute '!vim -u NONE -i NONE -N --cmd "set rtp+=' . getcwd() . '"'
endfunction
"}}}
これで :PluginTest
とやると、現在のカレントディレクトリが runtimepath
に追加された状態の真新しい Vim を (サブシェル上で) 立ち上げることができます。
(プラグインの動作を確認するときは vimrc を読み込まずに素の Vim を起動したほうが設定に依存した問題に
気づけたりするので良いです)
まぁなので前提としてプラグインを作成しているときはカレントディレクトリがプロジェクトのルートに
あることを期待しています。
応用編
人によっては現在編集中のバッファの親ディレクトリがカレントになるようにしている人もいることでしょう。
その場合は適宜プロジェクトルートを探すような処理
(例えば git rev-parse --show-toplevel
)
を挟むと良いでしょう。
それと、全くの素の Vim だとシンタックスハイライトや ftplugin さえ無効になるのでさすがに辛いです。
なので予め下記のような最低限の設定をした min.vimrc みたいなものを用意しておいて、
それを -u min.vimrc
で読み込むようにしておくと ftplugin や filetype に依存するプラグインでもストレスなく
動作確認ができます。
syntax on
filetype plugin indent on
あとは GVim はサブシェルという考え方がないので !vim
が使えません。
あるいは端末 Vim の場合でも GVim 固有の動作 (e.g. balloon-eval
) を確認したい時もあるので
gvim
と vim
を切り替えられるようにしておくと便利です。
さらに、Ex コマンドから立ち上げるのがメインのプラグイン (e.g. unite.vim, vimfiler, agit.vim)
だと毎回 Ex コマンドを打ち込むのは面倒なので引数でコマンド名を受け取るようにしましょう。
ということで僕の vimrc に書いてあるバージョンは下記のような感じになっています。
command! -bang -nargs=* PluginTest call PluginTest(<bang>0, <q-args>)
function! PluginTest(is_gui, extraCommand)
let cmd = a:is_gui ? 'gvim' : 'vim'
let extraCommand = empty(a:extraCommand) ? '' : ' -c"au VimEnter * ' . a:extraCommand . '"'
execute '!' . cmd . ' -u ~/.vim/.min.vimrc -i NONE -N --cmd "set rtp+=' . getcwd() . '"' . extraCommand
endfunction
"}}}
謝辞
実はこのアイデアは僕のオリジナルではないです。
thinca さんがライブコーディングでこれと似たようなことをやっていたのを見て参考にしました。
thinca さんの実装がどうなっているかは知らないのですが、基本は似たようなことをしていて、
あとは上の応用編にあるような追加のオレオレ設定をしているのではないかなと予想します。
みなさんもオレオレ :PluginTest
コマンドを作りましょう。