etags の ‘--regex’
オプションを指定すると、正規表現マッチングによってタグを認識できるようになります。このオプションはファイル名と組み合わせて使用でき、それぞれがその後に続くソースファイルに適用されます。複数の
‘--regex’
オプションを指定した場合、それらはすべて並列に使用されます。構文は以下の通りです:
--regex=[{language}]/tagregexp/[nameregexp/]modifiers
オプション値の中核となる部分は、タグマッチング用の正規表現 tagregexp です。これは常にアンカー付きで使用されます。つまり、行頭にのみマッチします。インデントされたタグを許可したい場合は、先頭の空白にマッチする正規表現を使用してください。その際は ‘[ \t]*’ で始めてください。
これらの正規表現では、‘\’は次の文字をクォートし、すべてのC言語の文字エスケープシーケンスがサポートされています。具体的には、‘\a’はベル、‘\b’はバックスペース、‘\e’はエスケープ、‘\f’はフォームフィード、‘\n’は改行、‘\r’はキャリッジリターン、‘\t’はタブ、‘\v’は垂直タブを表します。さらに、‘\d’はDEL文字を表します。それ以外の点では、正規表現の構文はEmacsと同じですが、バックスラッシュによるエスケープがGNU
grepと同様である点(例えば、シャイグループはサポートされていないことを意味します)と、‘[:ascii:]’、‘[:multibyte:]’、‘[:nonascii:]’、‘[:word:]’、および‘[:unibyte:]’がサポートされていない点が異なります。
理想的には、tagregexp はタグ付けしたい内容を認識するために必要な文字数以上にマッチすべきではありません。構文上、タグ自体以外の文字にもマッチさせるために tagregexp と記述する必要がある場合は、タグ部分だけを抽出するために nameregexp を追加してください。これにより、Emacs はタグをより正確に検出でき、タグ名の補完もより確実に行えるようになります。nameregexp では、tagregexp 内の括弧で囲まれたグループ「\( … \)」に対して、「後方参照」(正規表現におけるバックスラッシュ を参照)を利用するのが便利な場合が多くあります。例えば、「\1」はそのような括弧で囲まれたグループの最初の一つを指します。以下にいくつかの例を挙げます。
modifiers は、etags
のマッチング方法を変更する 0
文字以上の文字列です。修飾子のない正規表現は、入力ファイルの各行に対して、大文字小文字を区別して順次適用されます。修飾子とその意味は以下の通りです。
この正規表現にマッチさせる際は、大文字小文字を区別しない。
複数行のマッチが可能になるよう、この正規表現をファイル全体に適用してください。
この正規表現をファイル全体にマッチさせ、tagregexp 内の ‘.’ を改行にマッチさせるようにします。
‘-R’オプションは、それより前に定義された‘--regex’オプションで定義されたすべての正規表現を無効にします。また、これ以降に続くファイル名にも適用されます。以下に例を示します。
etags --regex=/reg1/i voo.doo --regex=/reg2/m \
bar.ber -R --lang=lisp los.er
ここでは、etags が voo.doo
と bar.ber の内容に応じて解析言語を選択します。etags も reg1 を用いて voo.doo 内の追加タグを認識し、reg1 と reg2 の両方が bar.ber
内の追加タグを認識します。reg1 は voo.doo
と bar.ber の各行に対して、大文字小文字を区別せずに照合されます。一方、reg2 は bar.ber
ファイル全体に対して、複数行にわたる一致を許容し、大文字小文字を区別して照合されます。etags は、ユーザー指定の正規表現マッチングを用いず、Lisp のタグルールのみを使用して los.er 内のタグを認識します。
オプションのプレフィックス {language} を使用することで、「--regex」オプションのマッチ対象を特定の言語のファイルのみに限定できます。(「etags --help」は、etags
で認識される言語の一覧を表示します。)これは、etags
用に定義済みの正規表現を多数ファイルに保存する場合に特に有用です。以下の例では、Emacs のソースファイル内にある DEFVAR マクロに、C 言語のみを対象としたタグを付けています:
--regex='{c}/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/\1/'
複雑な正規表現を扱う場合は、その一覧をファイルに保存できます。以下のオプション構文を指定すると、etags
は2つの正規表現ファイルを読み込みます。2番目のファイルに含まれる正規表現は、大文字小文字を区別せずに照合されます。
--regex=@case-sensitive-file --ignore-case-regex=@ignore-case-file
etags
用の正規表現ファイルには、1行につき1つの正規表現が記述されます。空行、およびスペースまたはタブで始まる行は無視されます。行の先頭文字が
‘@’ である場合、etags
はその行の残りの部分が別の正規表現ファイルの名前であるとみなします。したがって、あるファイルが別のファイルを参照することが可能です。それ以外のすべての行は正規表現として扱われます。行内の最初の非空白文字が
‘--’ である場合、その行はコメントとなります。
例えば、次のような内容の ‘emacs.tags’ というファイルを作成できます。
-- This is for GNU Emacs C source files
{c}/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/\1/
そして、次のように使います:
etags --regex=@emacs.tags *.[ch] */*.[ch]
さらにいくつか例を挙げます。正規表現は、シェルによる解釈を防ぐためにクォートで囲んでいます。
etags --language=none \
--regex='/[ \t]*function.*=[ \t]*\([^ \t]*\)[ \t]*(/\1/' \
--regex='/###key \(.*\)/\1/' \
--regex='/[ \t]*global[ \t].*/' \
*.m
なお、スクリプトにはタグが生成されないため、そこへジャンプしたい場合は、‘###key scriptname’ という形式の行を手動で追加する必要があります。
etags --language=none --regex='/proc[ \t]+\([^ \t]+\)/\1/' *.tcl
etags --language=none \ --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ ]* +OF/' \ --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\ \( BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'