Exuberant CtagsのJavaScript解析能力を微妙に向上させた

よそ様で既出のネタだけど書く。

今更ながら 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/

リテラル表記のオブジェクトも拾えるように書いてみたけど、あまり役に立たない気がする。ほとんど未テストだし、多分無駄の多い正規表現だと思う。