Hatena::ブログ(Diary)

Alone Like a Rhinoceros Horn

2011-01-30

unite-outline が見出しとして抽出するコメントの形式と見出しレベル

前回のエントリで、unite-outline では、飾り枠線で装飾されたコメントを積極的に見出しとして拾うようにしていると書きました。*1

プログラミング言語用の outline info では、見出しとして抽出されるコメントの形式と設定される見出しレベルに一貫した決まりがあるので、今回はそれについて説明します。

といっても話は簡単で、outline info の "heading-1" なマッチにおいて、「線」と見なされるコメント行の下にある行が見出しとして抽出される、というだけです。そして、その見出しレベルは、マッチした「線」のパターンによって以下の表のように設定されます。

インデント線を構成する文字長さ*2見出しレベル
なし=41〜1
なし=11〜402
なし-
その他*3
41〜2
なし-
その他
11〜403
あり=, -
その他
11〜ファイルタイプによって 5 または 6 に固定*4
またはインデントの深さ + 3

コメント以外の見出しは見出しレベル 4以降からとなります。


この事実を利用して、例えば以下のようにコメントを付加すると、

"=============================================================================
" 見出し1

"-----------------------------------------------------------------------------
" 見出し2

"---------------------------------------
" 見出し3

function! s:foo()
  "---------------------------------------
  " 見出し5
endfunction

function! s:bar()
  "---------------------------------------
  " 見出し5
endfunction

見出し一覧は以下のようになります↓

f:id:h1mesuke:20110129234023p:image

これを積極的に利用することで、Vim script のような関数の定義がフラットに並ぶだけのような言語においても、その見出しを擬似的に階層表示させることができます。

追記

コメント以外の見出しがレベル 4以降からと聞いて、それではコメント見出しがない場合に、見出し一覧の全体が右に寄り過ぎるのではないかと思われたかも知れません。

unite-outline はその辺はうまく処理するようになっていて、例えば抽出された見出しのレベルが [4, 4, 5, 5, 4] の場合、それを [1, 1, 2, 2, 1] に変換してから表示します。

また、[1, 3, 3, 5, 7, 1] のような、中間レベルの見出しがない場合、見かけ上それをないものとして扱い、[1, 2, 2, 3, 4, 1] とします。

*1:実のところこれは unite-outline本体の機能というわけではなく、同梱しているデフォルトの outline info の実装上のポリシーに過ぎない。

*2:長さは大体の目安。桁位置ではないことに注意。

*3C/C++ では */ も「線」を構成する文字と見なされるなど。

*4:インデントの深さがそのまま見出しレベルとなるような言語(RubyPython など)ではインデントの深さ + 3 となり、それ以外では 5 または 6 に固定される。Vim script では関数の見出しレベルが 4 であり、インデントされたコメント見出しはすなわち関数定義の中にあると見てそれより低い 5 となる。