• 作成:

gtagsでctagsを有効にしてJSXのタグを生成する

放置していましたがいい加減gtagsの設定を整えることにしました.

参考: GNU GLOBALの対応言語を大幅に増やすPygmentsパーサーを導入する - Qiita

ctagsをオプション無しで有効にする

ctagsを有効にしている環境で, /etc/gtags.confを,

default:\
	:tc=gtags:tc=universal-ctags:tc=htags:

と変更します.

そして

:langmap=JavaScript\:.js.jsx:\

のように.jsと書かれている隣りに.jsxを追加します.

こうすることでgtags, ctagsの順でパーサーを探索して, jsxもタグ付けしてくれるようになります.

defaultを変更しているので, --gtagslabelを指定する必要はありません. helm-gtags-auto-updateを有効にしていれば更新でタグも追加されます.

当初はpygmentsも有効にしていたのですが, 両方有効にしているとタグ生成が完了しないプロジェクトがあるということがわかってきたのでやめました.

node_modulesを探索しないようにする

また, そのままだとnode_modulesを見に行ってメモリとディスクがいっぱいになってしまい,

/usr/bin/sort: write failed: /tmp/sortKbeFUJ: No space left on device

のようなエラーが出るため,

common:\
	:skip=HTML/,HTML.pub/,tags,TAGS,ID,y.tab.c,y.tab.h,gtags.files,cscope.files,cscope.out,cscope.po.out,cscope.in.out,SCCS/,RCS/,CVS/,CVSROOT/,{arch}/,autom4te.cache/,*.orig,*.rej,*.bak,*~,#*#,*.swp,*.tmp,*_flymake.*,*_flymake,*.o,*.a,*.so,*.lo,*.zip,*.gz,*.bz2,*.xz,*.lzh,*.Z,*.tgz,*.min.js,*min.css,app/,dist/,node_modules/:

のようにskip

  • app
  • dist
  • node_modules

ディレクトリを追加しました.

.gitignoreを見て回避してくれるのが一番良いのですが, そういうオプションは無いようですね. あったら教えてください.

ctagsとpygmentsのどちらが良いか

ctagsとpygmentsのどちらがJSXに対して良いかですが, 一長一短です.

ctagsはクラスのメソッドに対してタグを生成しません.

pygmentsはクラスのメソッドにもタグを生成しますが, メソッド呼び出しにもタグを生成してしまうので誤爆が激しいです.

私は曖昧な検索ならEmacsのhelm-agで串刺し検索を行うため, タグジャンプは厳密にクラスに対してだけあれば良いや, と思ってctagsを優先することにしました.

ctagsがメソッドに対しても厳密なタグ生成を行ってくれるのが一番良いのですが, JavaScriptの文法はよく拡張されるので難しそうですね. babelから生成するようなプロジェクトが存在してそうですが…