unite-outline に特定の種類の見出しを非表示にする機能を追加

unite-outline では、「見出し」をプログラミング言語の構文上の要素に限定せず、「ジャンプ先として適当なもの」と大きくゆるくとらえており、飾り枠線で装飾されたコメントなんかも積極的に見出しとして拾うようにしています。


▲ 飾り枠線で装飾されたコメントを見出しとして抽出している例
 関数の機能的なまとまりが把握しやすくなっている。

これは、クラス、モジュールといった構造化(手続きのグループ化)の機能をもたない言語においても、見出しを論理的な階層構造にまとめて見せるために重要な役割を果たします。上の画像の例*1でいえば、本来であれば関数の名前が単にフラットに並ぶだけ(下の画像を参照)のところを、飾り枠線で装飾されたコメントを上位レベルの見出しとして拾うことで、関数の機能的なまとまりを(言語の機能上は存在しない)階層構造として見せることに成功しています。


▲ 上に揚げた見出し一覧からコメント見出しを除いたもの
 単に関数の名前が並ぶだけでそこに論理的な構造は見えない。


そんなわけで、コメントからも積極的に見出しを拾う、という路線は今後も堅持したいと考えているのですが……

人によっては最初の画像の見出し一覧より、二番目のそれの方がすっきりしていていいと感じるかも知れません。また、オブジェクト指向言語など、手続きをグループにまとめる機能が言語に備わっている場合は、単にクラス、メソッドと拾っていくだけできれいに見出しが階層化されるので、コメントから拾った見出しがかえってうるさく感じられることもあるでしょう。

あるファイルタイプにおいてはコメントから見出しを抽出したいが、あるファイルタイプでは無視したい、というような状況があると思われます。

本題

ということで、ファイルタイプごとに、非表示にする見出しの種類を設定できるようなオプション変数をもうけました。詳しくはヘルプを参照していただきたいのですが、設定例はこんな感じになります。(間に余計な変数が入っていますが、これは変数名が長過ぎるからです (^^;)

let ignore_heading_types = {}
let ignore_heading_types['*'] = ['comment']
let ignore_heading_types.cpp  = ['comment', '#define', 'typedef', 'enum']
let g:unite_source_outline_ignore_heading_types = ignore_heading_types
unlet ignore_heading_types

これですべてのファイルタイプ("*")において、コメント見出しは非表示になります。

上記の C++ の設定例からもわかる通り、コメント以外の種類も指定できますが、指定可能な見出しの種類はそのファイルタイプの outline info の定義に依存します。現状、unite-outline に同梱されている outline info は、一部の例外を除き "comment"以外は大雑把に "generic" に分類するだけなので、"comment"以外を指定したい場合は outline info の定義を確認して下さい。*2

*1:筆者の vimrc における、プラグイン設定の見出し一覧

*2:あまり事細かな分類をやりたくない理由は、create_heading()関数に余計な条件分岐が増えるから。また、クラスやメソッドなど、詳細に分類したところでそれを見出しとして無視することも考えにくく、あまりやる価値を見出せないというのもある。でも、要望があれば対応しますよー。