Hatena::ブログ(Diary)

Alone Like a Rhinoceros Horn

2011-09-07

unite-outline が見出しを自動更新するようになりました

やった! これで <C-l> ともおさらばだ!

unite-outline の「なんでこれができないの?」の筆頭であった見出しの自動更新をついに実装しました。詳細はヘルプで g:unite_source_outline_filetype_options、unite-outline-filetype-option-auto-update*1 の辺り見てもらいたいのですが、ここで簡単にその設定について解説してみます。

なお、以下の設定はファイルタイプごとに、g:unite_source_outline_filetype_options変数に設定します。とりあえずデフォルトを変更したい場合は「すべてのファイルタイプ」を意味する "*" の設定を変更すれば OK です。

auto_update

見出しを自動更新するかどうか。

1 に設定すると見出しの自動更新が有効になります。
0 に設定するとこれまで通り。見出しを更新したい場合は自分で <C-l> を押します。

デフォルト値は 1 です。

auto_update_event

見出しの自動更新の契機となるイベント、以下のどれか。

  • "write"
    バッファをファイルに書き込んだ時点で見出しが更新されます。通常はこれで十分です。
  • "hold"
    "write" のタイミングに加え、一定時間('updatetime' に設定された時間)カーソルを放置したタイミングでも見出しを更新します。-no-quit な場合に真価を発揮する少しアグレッシブな設定です。*2

デフォルト値は "write" です。

自動更新をオンにしていると unite.vim のウィンドウが開くタイミングでも更新がかかるので、実のところ見出しの一覧を -no-quit で表示させない限り "hold" を選択する意味はあまりありません。-no-quit で使うなら "hold" を使うかどうかを選択、そうでないなら "write" のままがいいでしょう。*3

ファイルタイプごとの特性を見極めて

ファイルタイプによって、見出しの抽出に要する時間や、扱うファイルの平均的なサイズも変化してくるので、そういったファイルタイプごとの特性を見極めた上で、

  1. 自動更新を使わない
  2. 自動更新を使う(更新契機は "write")
  3. 自動更新を使う(更新契機は "hold")

から最適なものを選択して下さい。

以下は、デフォルトでは "write"、C++ では自動更新なし、Markdown では "hold" に設定している例です。*4

        let g:unite_source_outline_filetype_options = {
              \ '*': {
              \   'auto_update': 1,
              \   'auto_update_event': 'write',
              \ },
              \ 'cpp': {
              \   'auto_update': 0,
              \   'ignore_types': ['enum', 'typedef', 'macro'],
              \ },
              \ 'javascript': {
              \   'ignore_types': ['comment'],
              \ },
              \ 'markdown': {
              \   'auto_update_event': 'hold',
              \ },
              \}
追記

Windows では外部プログラムの呼び出しに予想以上に時間がかかる*5ようで、見出し抽出に ctags を使っているファイルタイプ(C, C++, Java, Python)では自動更新にともなう待ち時間が許容できないレベルになることがあるようです。

そのような場合は残念ですが自動更新をオフにして下さい。

この問題を解決するためには外部プログラムの呼び出し部分を非同期にするなどの変更が必要になり、作者の勉強時間も含めてしばらく時間がかかると思われます……

*1:名前が長くてすいません(汗 名前が何かと長くなるのはプラグインプラグインの宿命です。

*2:'updatetime' のデフォルト値は 4000(4秒)でこのままだと少し待たないと更新がかからないので、1000 くらいに設定するといいかも知れません。

*3:-no-quit でない状況で "hold" を使っても、細かな更新作業が増えるだけで恩恵は一切受けられない(見出しの更新に連動して表示を更新させるはずのウィンドウが開いていない)ので、"write" の方が Vim にやさしいです。

*4:これは unite-outline のヘルプにある例のための例です。作者の推奨する設定ではありません。

*5:ちなみに作者は主に Vim を Ubuntu上で使っており、unite-outline の開発ももっぱら Ubuntu でやっているので、そういう問題に気付きにくいのです。