unite-outline の outline info の仕様を拡張

unite-outline のファイルタイプ別見出し抽出方法の定義ファイルである outline info の仕様を拡張したので告知します。

後方互換性は保たれていますので、既存の outline info が使えなくなるとかいった話ではありません。*1ただ、outline info の仕様で、少し気になるところがあったので、今後の展開も踏まえて今のうちにきれいにしておこうと思った次第。

具体的には、outline info の create_heading()関数から、見出しのメタ情報を含む辞書を返せるようにしました。*2

これまでの仕様では多くの outline info に、見出しレベルに応じたインデントを設定するための以下のようなコードが見られたのですが、

    return unite#sources#outline#util#indent(level) . heading

今後は

function! s:outline_info.create_heading(which, heading_line, matched_line, context)
  let level = str2nr(matchstr(a:heading_line, '<[hH]\zs[1-6]\ze[^>]*>'))
  let heading = {
        \ 'word' : "h" . level. ". " . s:get_text_content(level, a:context),
        \ 'level': level,
        \ 'type' : 'generic',
        \ }
  return heading
endfunction

↑のように書くことが推奨されます。(ちなみにこれは HTML の例)

見出しレベルに応じたインデントの設定などは本来 create_heading()関数の呼び出し側でやるべきことで、これまでの仕様は outline info側に余計な責任を押し付けていました。今後は、「辞書に見出しのメタ情報を設定して返せば、後は呼び出し側でよきにはからってくれる」ようになります。

また、こうしておくと、見出しレベル以外のメタ情報、例えば見出し種別(これはコメントである、とか)なども unite-outline側で認識できるようになり、より柔軟な見出し一覧の作成が可能になります。*3

今後の展開

で、見出しレベル以外のメタ情報として、今後どのような属性が使えるようになるか、ですが、そっちの方の仕様はまだ固まっていません。が、見出し種別がコメントのものは(設定によって)無視する、みたいな機能を実装の予定です。

*1:それ以前に、自分で outline info を書いて使っている人がどれだけいるのかという疑問もなきにしもあらずw

*2:これまで通り文字列を返すこともできますが、辞書に正規化されてから処理されます。

*3:逆に言うと、見出しレベル以外のメタ情報を付加しないのであれば、文字列で返してもいい。しかし、unite-outline本体が認識可能なメタ情報を付加しておけば、今後、何かいいことがあるかも知れない。