よそ様で既出のネタだけど書く。
今更ながら id:m-hiyama:20080627:1214549228 を見て、JavaScriptでプロパティに関数を定義する書き方をすると、ノーマルなctagsではその関数へのタグが生成されないことに気づいた。
実際にExuberant Ctags 5.7J1で試してみたけど、記事に書いてあったように、こんな感じの書き方だとNGだった。
// 何かのオブジェクトの定義中にて foo: function (n) { return n; },
個人的には、以前JScriptで書いたツールを試しに『JavaScript: The Good Parts』を参考にしながら書き直してみて、初めて使った書き方だったりするのだけど、世間的にはそうでもないらしい。
解決策は、これまた記事の通りにオプション「--regex-javascript」でタグ解析用の正規表現を追加すること。「--regex-javascript」の「javascript」の部分は、ctagsで対応している任意の言語を指定できる。manの日本語訳によると、全体のフォーマットはこんな感じ。
--regex-<LANG>=/regexp/replacement/[kind-spec/][flags]
正規表現は大体egrep相当。オプションなのでctags実行時に指定できるけど、毎度指定するのは面倒なので.ctagsないしctags.cnfに書いておくことになる。
問題は正規表現として何を指定するかで、色々と試した結果 id:oppara:20080820:p1 を元にしてこう書くことにした。
--regex-javascript=/^[ \t]*(.*)[ \t]*:[ \t]*function/\1/m,methods/
vimを使ってtaglist.vimで関数一覧を表示する都合上、ctagsで解析できない関数だけにマッチするようにする必要があった。その辺りは別エントリで書くつもり。
おまけのボツネタ。
--regex-javascript=/^[ \t]*(var[ \t])?[ \t]*([A-Za-z0-9_.]+)[ \t]*[:=][ \t]*\{/\2/o,objects/ --regex-javascript=/^[ \t]*(['"])(.+)\1[ \t]*[:=][ \t]*\{/\2/o,objects/
リテラル表記のオブジェクトも拾えるように書いてみたけど、あまり役に立たない気がする。ほとんど未テストだし、多分無駄の多い正規表現だと思う。