読者です 読者をやめる 読者になる 読者になる

ctags で JavaScript のタグを生成

エディタを使う上でわりと欠かせないのが、ctags(じゃなくてもいいけど)によるタグの生成です。あらかじめタグを作っておけば、関数などの補完も効くし、タグジャンプで即座にソースが読めて非常に便利です。
しかしながら現在の Exuberant Ctags の最新版では、JavaScript のタグ生成が

function funcname(){}

という関数の書き方にしか対応しておらず、最近の JavaScript プログラミングでよく使われるプロパティに関数を定義するタイプの

funcname: function(){}

という書き方ではタグ生成がされず悲しいです。で、prototype.js やら MochiKit やらを多用してるとタグジャンプがないのは不便すぎて悲しくなってきたので、当初は jstags という rubyJavaScript タグ生成のプログラムを作って代用してました。が、ふと ctags のソースを読んだら正規表現を付け足すだけでプロパティに関数定義する書き方でも対応することができたのでパッチを作ってみました。
http://rails2u.com/misc/jscript.property_style_function.diff
この patch を当てることで、

なにやら ML 読んでいたら、このシンタックス( funcname = function(){} とか)はあんまり一般的じゃないのでデフォルトでは使わないよ。使いたければ config に --regex-javascript で書いてね(意訳)と書いてありました。なんだってー。試しに patch を当てずに ~/.ctags に

--regex-javascript=/^[ \t]*(['"]?)([A-Za-z0-9_.]+)\1[ \t]*[:=][ \t]*function[ \t]*\(/\2/I,inner/i

を書いたらそれだけでうまくいったという…。というわけで、このようにコンフィグを設定すると、例えば MochiKit/Base.js のタグは

$ ctags -f - ~/src/mochikit/MochiKit/Base.js | tail -n 5
updatetree      /home/gorou/src/mochikit/MochiKit/Base.js       /^    updatetree: function (self, obj\/*, ...*\/) {$/;" f
xfilter /home/gorou/src/mochikit/MochiKit/Base.js       /^    xfilter: function (fn\/*, obj... *\/) {$/;"       f
xmap    /home/gorou/src/mochikit/MochiKit/Base.js       /^    xmap: function (fn\/*, obj... *\/) {$/;"  f
xor     /home/gorou/src/mochikit/MochiKit/Base.js       /^        xor: function (a, b) { return a ^ b; },$/;"   f
zrshift /home/gorou/src/mochikit/MochiKit/Base.js       /^        zrshift: function (a, b) { return a >>> b; },$/;"     f

とうまく出力されるようになりました。これでタグが無いと悲しくて枕を涙でぬらす人でも安心して JavaScript プログラミングができるようになりますね!