tkhrsskの日記

技術ネタなど

Atomのctags (Symbols View)について

Atom 1.0.0 Windows版をトライしてみました。

前に試した Sublime Text 2 より、導入はスムーズ。
デフォルトで Symbols Viewというプラグインがあり、プロジェクト全体のシンボル検索(Ctrl+Shit+r)ができます。
ctagsの出力結果(tags)を参照しているのですが、ちょっと難あり。

マクロ定義の行ジャンプができない。

ctags -R .でtagsを生成したところ関数とかには飛べるようになりました。
しかし、C言語のマクロ定義(#define HOGEHOGEとか)のシンボルは、ファイルは開くけど定義行までジャンプしてくれないのです。

マクロ定義は、標準で行番号形式で出力されるのですが、対応していない模様。
オプション(--excmd=pattern)で、pattern形式に強制するもまだだめ。
どうもパターンの出力結果が微妙に違うのが問題になっていそう。

SOMEDEF  .\hoge.c    /^#define SOMEDEF   /;" d   file:
main    .\hoge.c    /^int main()$/;"    f

正規表現で検索するなら問題ないはずなので、ちょっと実装をのぞいてみた。

https://github.com/atom/symbols-view/blob/master/lib/symbols-view.coffee#L101

  getTagLine: (tag) ->
    # Remove leading /^ and trailing $/
    pattern = tag.pattern?.replace(/(^^\/\^)|(\$\/$)/g, '').trim()

うーん、強引に行全体マッチだけを使っているようですね。
行番号形式もだめなわけです。

回避方法

以下のオプションを追加して、少し強引に行全体マッチの出力を追加するようにした。

--regex-C=/^[ \t]*#define ([A-Z_][A-Z0-9_]*)/\1/C,constant/
--C-kinds=-d

上記を記述したctags.cnfというファイルを、実行するディレクトリ直下においておけばよさそう。
#defineではじまる定義を定数のシンボルとして読み込んで、マクロ定義は出力対象外にしています。

キーマップ

とりあえずジャンプできるようになったので、下記の内容をkeymap.csonに記述。
※メニューの「ファイル」→「キーマップを開く」で編集画面。

'atom-text-editor':
  'f12': 'symbols-view:go-to-declaration'
  'shift-f12': 'symbols-view:return-from-declaration'

これで、F12でカーソルにあるシンボルの定義場所に移動。
Shift-F12で、元に戻ることができるようになった。

参考

ctagsの説明はこの辺。

Manpage of CTAGS日本語対応版