物置き

--remote-waitオプション

自分の環境では、.vimperatorrc

set editor='C:/Path/To/vim72-kaoriya-w32j/gvim.exe --remote-wait'

などと設定した状態で外部エディタとしてVimを起動すると、
たまにVimでの編集を終了してもVimperator側が復帰しない(Vimの終了を待ち続ける)ことがあって、なんだろうなあとは思いつつも、特に原因について調べるようなことはしていなかった。


で先日、2009-11-12 rrhelper.vim - KBDAHOLIC - やぬすさんとこを見て、remote-wait周りの処理がrrhelper.vimで行われていることを知り、この周りを調べれば問題の原因がなんかわかるかもと思って調べたところ、なんとなく原因がわかったので以下にメモ。


どうもこの現象は、Vimでファイルを開いた後でバッファのカレントディレクトリを変更すると起こるみたい。
(BufEnterイベントで自動的にディレクトリを変更するような設定をしていると遭遇しやすいかも)


vimで開く

別のバッファに移動

元のバッファに戻る(BufEnter) <- ここでディレクトリ変更が発生

バルス


こんな感じで、カレントディレクトリを変更した際にファイル(バッファ)名が変わってしまって(C:/Path/To/filename -> filename)
そのせいで、rrhelper.vim内でautocmdに追加されたパターンと一致しなくなってしまっている模様。

rrhelper.vim内での処理

サーバ側でファイルを開く際、 そのファイルのバッファがアンロードされる時にクライアント側に何か応答を返すための処理がautocmd BufUnloadイベントとして追加される。
(rrhelper.vimのSetupRemoteReplies関数)

その際、autocmdに加える時のパターンがファイルのフルパスで登録される。
ところが、:lcdでカレントディレクトリをバッファのファイルと同じディレクトリに変更すると、
ファイル名が、途中のディレクトリが省略されたものになってしまう(例:/path/to/filename -> filename)

すると、BufUnloadイベントが発生した時のファイル名とパターンとの比較で合致しなくなる

クライアントへの応答処理が呼ばれないまま

Vimを終了するまでクライアント(Vimperator)側は待機したままになる。

ということで

この現象を回避するようrrhelper.vimを修正したのでここに晒しておきます。
(「vimperator」,「remote-wait」でぐぐってもほとんどヒットしないので、こんな現象に嵌っている人は他にはいなそうですが..)


rrhelper.vim 修正版

Vim7以降でしか動作しません。Windows上でしか動作確認してません。