プログラマすごろく:_vimrcを開いてしまった!2回休み。

あ、タイトルはどこかで見かけたネタのパクりです。ごめんなさい。

ほぼひとりBazaar Advent Calendarも折り返し点を過ぎて、深刻なネタ不足に見舞われております。
仕方ないので partake.in あたりからネタをパクりたいと思います。

@yuitowestさんのエントリで、「 zshでmercurialのactive branchesを補完する - yuitowest's blog 」というのがあります。便利そうなのでBazaarでもやってみよう、と思ったんですが、僕はどざーなのでzshが便利になってもあんまりうれしくありませんでした。
そこで、かわりにvimコマンドラインでBazaarコマンドの補完ができるようにならないか試してみることにしました。

ベース

VimからBazaarの操作をするためのプラグインはいくつかあるみたいですが、とりあえずこいつをベースにします。
Display output of shell commands in new window | Vim Tips Wiki | FANDOM powered by Wikia
:BzrコマンドでBazaarを呼び出して、出力をバッファに戻すだけの単純なやつですね。

方針

  • command-line-modeでの補完を実装する
  • Bazaarのコマンド名を補完できるようにする
  • コマンドを指定したあとは、オプションも補完できるといいな
  • Bazaarのブランチは物理的なディレクトリだから、特別補完はいらないはず。でもColocatedブランチは、colo:って打ったら補完できるようにしたい
  • 文脈にそった補完もしたい。-rのあとにはrevisionspecのセレクタを出すとか、-r tag: の後にはタグのリストを出すとか
  • insert-modeでも補完できるようにしたい。
おまけ
  • Pythonに逃げない。Vim scriptで頑張る。

結果

この辺で時間切れになりました。Vim力低いですね。

  • [済] command-line-modeでの補完を実装する
  • [済] Bazaarのコマンド名を補完できるようにする
  • [済] コマンドを指定したあとは、オプションも補完できるといいな
  • [済] Bazaarのブランチは物理的なディレクトリだから、特別補完はいらないはず。でもColocatedブランチは、colo:って打ったら補完できるようにしたい
  • [未] 文脈にそった補完もしたい。-rのあとにはrevisionspecのセレクタを出すとか、-r tag: の後にはタグのリストを出すとか
  • [未] insert-modeでも補完できるようにしたい。

現状のコードはこんな感じです。
VimのコマンドラインでBazaarコマンドの補完をしてみる · GitHub

説明がいるような高度なコードwでもないですが、ざっと説明すると、

GetCommands
`bzr help commands`の出力を適当にパースして、コマンドのリストを生成しています。
GetCommandOptions
同じく、`bzr COMMAND-NAME --help`の出力を適当にパースして、そのコマンドのオプションを生成しています。
GetBzrDir
指定されたフォルダから上に上がりながら、.bzrフォルダを探しています。
GetRoot
GetBzrDirとだいたい一緒です。
GetColoBranches
.bzr/branchesの中にあるフォルダをリストアップしています。
Complete
commandline-modeの補完関数の実体です。要リファクタリングですね。
BzrAsync
qbzr系のコマンドなんかは結果をもらう必要ないですし、コマンドを投げっぱなしにしたいので、vimprocを使って非同期実行するコマンドも追加しています。

まとめ

  • 宿題が増えました。
  • _vimrcとかを触るのは時間泥棒すぎてヤバいです。