読者です 読者をやめる 読者になる 読者になる

opener.vim と言うのを作ろうとして諦めた話

vim

昨日の続き
Vimperator に opener.js と言うプラグインがある。タブを開こうとした際に、すでに開いていたらそちらに切り替えるプラグインだ。
Vim で、これと似たようなことをする :Opener みたいなコマンドを作ろうと思った。想定する用途として、

  • :Opener {file} みたいな感じで使う。:edit などの代替で、引数は互換を持たせる。
  • 縦分割、横分割、タブオープン、すでに開いているバッファへのジャンプなどを状況に応じてよしなに切り替える。
  • プラグインにバッファを開くコマンドの設定があった場合、それに対して使えるようにする。

みたいなつもりだった。が。
バッファを開く際に、

:edit `=tempname()`

みたいなことができる(:help `=)。任意の式で開くファイルを指定できる。プラグインでは、特殊文字の対策として割とよく使われる。と言うか私は使っている。
もし、この中でスクリプトローカルな変数を参照していたら…。

" g:plugin_opener_command は "edit" とか "new" を想定
execute g:plugin_opener_command '`=s:file`'

この g:plugin_opener_command にユーザ定義コマンドを指定するとその時点でこれはうまく動かなくなる。ユーザ定義コマンドはスクリプトローカル変数を参照できないからだ。
なんとか回避できないか色々考えてみたけど、多分これは無理。もちろん s: を使ってなければ大丈夫だけど、使ってない保証はないし場合によって使えたり使えなかったりするのは正直微妙…うーん。
と言うわけで、この件はとりあえず諦めることにしたのだった。もし誰かいい案があれば教えてください。