Exuberant Ctags で飛べないファイルを飛べるようにする

Exuberant Ctags で特殊なファイルのタグジャンプしたいとき、ありませんか?
例えば、テーブル定義を記載した SQL ファイルとか、ストアドプロシージャの定義を記載した SQL ファイルとか。
他にもサポートされているはずなのに、タグファイルに載らずにジャンプ出来ないとか。

そんな時は .ctags ファイルに設定を書いてタグファイルに追記されるようにしましょう。

今回は、SQL の CREATE TABLE 文に飛べるようにしてみようと思います。

設定をどこに書くか

ctags -R を実行するディレクトリ直下に .ctags ファイルを置くといいです。
~/.ctags に置くのも手ですが、こういう特殊なファイルはフォーマットがバラけたり、タグに入れなくても良い場合が多いので、適宜設定する方法でもいいかと思います。

設定を書く

ファイルタイプの定義

$ ctags --list-languages
Ant
Asm
Asp
... (略) ...
VHDL
Vim
YACC

ここに記載されているのが Exuberant Ctags で現状サポートされている言語一覧です。
ない場合は新しい定義を追加しましょう。

SQL は上記リストにすでにありますが、今回は別言語 "create_table_sql" をでっち上げて登録してみることにします。

言語の登録は --langdef=<name> で行います。

$ cat .ctags
--langdef=create_table_sql
$ ctags --list-languages
... (略) ...
YACC
create_table_sql

追加されました。

対象となるファイルの定義

次に、ファイルタイプとファイル名の紐付けをしましょう。

$ ctags --list-maps
Ant      *.build.xml
Asm      *.asm *.ASM *.s *.S *.A51 *.29[kK] *.[68][68][kKsSxX] *.[xX][68][68]
Asp      *.asp *.asa
... (略) ...
SQL      *.sql
... (略) ...
VHDL     *.vhdl *.vhd
Vim      *.vim
YACC     *.y

いまだとすでに *.sql ファイルが SQL というファイルタイプに紐付いていますが、上書きしてしまいましょう。ファイルタイプとファイル名の紐付けは --langmap=<name>:<file_ext> で行います。

$ cat .ctags
--langdef=create_table_sql
--langmap=create_table_sql:.sql
$ ctags --list-maps
... (略) ...
SQL
... (略) ...
YACC     *.y
create_table_sql *.sql

SQL の設定が消えて、create_table_sql が .sql ファイルに紐付きました。

タグにしたい内容の定義

今回は、SQL 文にある、

CREATE TABLE `hoge` (
  ....
);

といった内容の hoge をタグの内容にして、CREATE TABLE の行に飛べるようにしたいわけです。そこでこの hoge が引っかかるような正規表現を記載します。
正規表現の設定は --regex-<name>=/<regexp>/<replacement>/[kind-spec/][flags] で行います。

<regexp>正規表現を記載し、 <replacement> がその正規表現からタグとなる部分を抜き出す部分として使い、<kind-spec> はこのタグの内容が指し示すものを記載します。

$ cat .ctags
--langdef=create_table_sql
--langmap=create_table_sql:.sql
--regex-create_table_sql=/^[ \t]*CREATE[ \t]+TABLE[ \t]+`?([a-zA-Z0-9_]+)`?/\1/t,tables/

<replacement> に書いた \1Perl正規表現で言う $1 と同じで、<regexp> にある ([a-zA-Z0-9_]+) にマッチした部分が入ります。

このような設定になり、 .ctags の設定は完了です。

さっそくタグジャンプ

$c->dbh->selectrow_arrayref('SELECT * FROM l[i]ve');

ブラケットでくくったところにカーソルがあるとして、ここで、Ctrl+] !

CREATE TABLE live (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  ...
);

ここに華麗に飛びます。

これで、社内用の特殊なフォーマットなファイルにも簡単に飛べるようになりますね。