Vim を 1 つのインスタンスだけで使うためのプラグイン、singleton.vim ってのを作った。
初期版を書いたのはずーっと前だったんだけど、整理しきれてなかったのを最近になってようやく公開できそうな感じにした。
多重起動を避けるって意味では、--remote-tab-silent とか使えばいいんじゃねーの? と言う声が聞こえてきそうだけど、このプラグインを使えば起動側で特に考えなくても動くってのと、+αな機能が付いてる。
ちなみに +clientserver 機能必須。
https://github.com/thinca/vim-singleton
使い方
.vimrc に以下の1行を書くだけ。簡単!
call singleton#enable()
.vimrc 内の上の方に書いた方がいいけど、pathogen 系を使っている場合は当然その後じゃないとプラグイン見付からないので注意。
あと、いくつか設定(後述)があるのでそれをする場合は関数を呼ぶ前にする。
この設定をすることで何が起きるかは以下。
ファイルをすでに起動しているVimで開く
Vim でファイルを開いた際に、すでに起動済みの Vim があった場合はそちらで開いて即座に終了する。
g:singleton#ignore_pattern に除外するファイルのパターンを書いておけば、それらのファイルだった場合は普通に開かれる。
diff をすでに起動しているVimで開く
vimdiff や vim -d でファイルを開いた場合、起動済みの Vim で新しいタブページに diff モードで開かれる。
VCS の GUI フロントエンドの外部 diff ツールにしている場合なんかは特に便利。
ファイルをすでに起動しているVimで開きつつ、編集が終わるのを待つ
世の中には、一時ファイルをテキストエディタで開いて終了を待つことでインタラクティブなインターフェースを提供するタイプのアプリがある。visudo や crontab など古くからあるものや、各種 VCS の コミットメッセージやら git rebase -i なんてのもある。
開こうとしたファイルが g:singleton#entrust_pattern のパターンに一致した場合、singleton.vim はそのファイルを起動済みの Vim で開き、自身は終了を待機する。ここは getchar() で若干無理矢理やってる。
リモートの Vim で編集を行い、バッファを閉じると起動元の Vim は自動的に終了して目的が達成できる。
多重起動を避けると何が嬉しいか
まず、起動にかかる時間が短縮できる。
プラグインを大量に入れるタイプの人は、なんだかんだ言って Vim の起動に数秒から運が悪いと数十秒待たされるだろう。
起動済みの Vim にファイルを送ってしまえば、プラグインの読み込みなどは発生しないのでその分時間が短縮できる。
また、複数の Vim でファイルを開くと互いに連携ができないので非常に扱いづらい。コピペすら困難になる。
最初から1つの Vim だけを使っておけば、yanktmp などのプラグインは不要になる。
既存のプラグイン
実は、Vim 本体に $VIM/macros/editexisting.vim と言う似た感じのプラグインが同梱されている。Bram さんお手製だ。
このプラグインは、1 引数で Vim を起動した時に、そのファイルをすでに別の Vim で編集していた場合に限り、そちらで開く。
見ての通り低機能で、これは私が欲しいものとは程遠かった。
なぜ autoload 関数なのか
このプラグインは singleton#enable() を呼んで明示的に有効にする必要がある。
しかし、やろうと思えば plugin 以下で自動的に起動するようにすることもできた。
実はやろうかとも思ったのだけど、以下の理由からとりあえずはやらないことにした。
制限
端末側で、Vimを起動してvimrc内で終了すると、端末を復元する設定になっていても空白が空いてしまう。これ可能ならばなんとかしたいので回避する方法をご存知の方がいたら教えてください><
と言うわけで
ものがものだけに、正直バグがまだまだ残ってそうで不安ではあるけど、人柱したい人は使ってみてください。