while ("im the true Vim master");

2008-07-22

自動的に機能が強化されるプラグイン

| 15:05

普通、:editはファイルしか開けないが、実は

:edit http://www.vim.org/

のようなURIをあたかもファイルであるかのように開ける。URIだけでなくディレクトリも開ける。これは標準添付のプラグインnetrwがBufReadCmdなどを利用して、ありえないファイルに対する読み込みや書き込みの挙動をオーバーライドしているからだ(Vim7以降の話。Vim6までは、ローカルのディレクトリに対するこの手のインターフェースはnetrwとは別のプラグインが提供していたが、Vim7でnetrwに統合された)。

ただこれには問題がある。:editがあらゆる架空のファイルを開くことができるように拡張することはできても、:editの引数の補完までは拡張できない。

という訳で、:editの代替コマンドとして:Editを作ってはどうだろうかと思った。基本は:editと同じだが、以下の点が異なる:

  • 先頭が"{scheme}:"である引数を開く場合、scheme#{scheme}#read()を用いて内容を取得する(:Editに対する:Writeを作るのであればscheme#{scheme}#write()で保存を行う)。
  • 先頭が"{shceme}:"である引数を補完する場合、scheme#{scheme}#complete()を用いて補完を行う(:help :command-complete)。
  • それ以外の場合は-complete=file相当の補完を行う(ただこの手の補完処理はVim scriptレベルに関数として公開されていない。v:command_complete_file()のような形で使えれば便利なので、この点については今度パッチを書いてvim_devにポストする予定)。
  • (利用可能な{scheme}の補完ができると便利だとは思ったけれど、どのタイミング・条件で補完するか良いアイデアが出てこないので保留)。

利用可能な{scheme}は'runtimepath'とglobpath()とmap()ですぐに求まる。ユーザーは特に何も設定せずとも、~/.vim/autoload/scheme/以下に:Edit拡張スクリプト{scheme}.vimを置くだけでいい。スクリプトを書く側からすれば、:Editと{scheme}.vimの間に密なやりとりはほとんどないため、{scheme}.vim本来の仕事に注力できる。

ただここまで書いたのは良いけれど:

  • 既に類似した考えのプラグインはあるのだろうか? vcscommandは一々VCSCommandRegisterModule()を呼ばなければならないし、プラグインのロード順序にも気をつける必要が>あるので、上記と全く同じとは言えないと考えている。
  • 上記のような:Edit (と:Write)を提供するプラグインを作ろうかと思ったけれど、良い名前が思い浮かばないので募集中。scheme.vimにしてしまうとLisp的な意味でのSchemeに誤解されてしまう。metascheme.vimもなんだかmetalua的な匂いがして駄目。安直にaltedit.vimだのyaedit.vimだのとすると:Writeの居場所がない感じがしてしまう。取り敢えずnetrwに合わせてmetarw.vim (仮)とする。

なお、このアイデア自体はku 0.1.0で試してる。まだろくにsource (ここでいう{scheme}に相当するもの)を書いていないのでアレですが(これ自体は昔に書いたbuffuzzyの焼き直しの焼き直しの作り直し)。sourcesのsourceという半分ネタ半分実用の代物も考えたけど、やはりsourceの数がある程度ないと意味がないという。

最近のコメント
あわせて読みたいブログパーツ
AX