Previous: , Up: tagsテーブル   [Contents][Index]


29.4.2.3 etagsのregexp

--regex’オプションは、正規表現のマッチにもとづいてetagsがタグを認識できるようにします。このオプションはファイル名と混ぜることができます。オプションは、それぞれのオプション後に続くソースファイルに適用されます。複数の‘--regex’を指定した場合、それらすべては並列に使用されます。構文は以下のとおりです:

--regex=[{language}]/tagregexp/[nameregexp/]modifiers

オプション値の肝心な部分はtagregexpで、これはタグにマッチするregexpです。これは常に位置が固定されており、行の開始だけにマッチします。インデントされたタグの場合、最初の空白文字にマッチさせるために、‘[ \t]*’で始まるregexpを使用します。

これらの正規表現では、‘\’は次の文字をクォートします。またCのエスケープ文字シーケンスのすべて、すなわち‘\a’(bell)、‘\b’(back space)、‘\e’(escape)、‘\f’(formfeed)、‘\n’(newline)、‘\r’(carriage return)、‘\t’(tab)、and ‘\v’(vertical tab)がサポートされます。これらに加えて、‘\\d’はDEL文字を意味します。

理想的には、tagregexpはタグとして認識させるのに必要な文字以上にマッチさせるべきではありません。構文がそれを求める場合、タグより多くの文字にマッチするtagregexpを記述して、そのマッチからタグだけをピックアップするために、nameregexpを追加するべきです。これはEmacsがより正しくタグを見つけて、タグ名の補完をより確実にすることを可能にします。nameregexp内においてはこれは、tagregexp内でのカッコによるグループ化にたいする“後方参照(back references)” (正規表現でのバックスラッシュを参照)として有用であり、頻繁に使用されます。たとえば、‘\\1’はそのようなカッコによる最初のグループを参照します。以下でいくつかの例を見つけることができるでしょう。

modifiers(修飾子)は、etagsがマッチングを行う方法を変更するための0文字以上の文字シーケンスです。修飾子がないregexpは、大文字小文字を区別する方法で、入力ファイルの各行にたいして順番に適用されます。修飾子とその意味は以下のとおりです:

i

このregexpのマッチングで、大文字小文字を無視します。

m

この正規表現はファイル全体にマッチするので、複数行のマッチが可能です。

s

この正規表現はファイル全体にマッチし、tagregexp内の‘.’は改行にマッチします。

-R’オプションは、それの前に‘--regex’で定義されたregexpをすべて取り消します。これは後に続くファイル名にも適用されます。以下は例です:

etags --regex=/reg1/i voo.doo --regex=/reg2/m \
    bar.ber -R --lang=lisp los.er

この例では、etagsvoo.doobar.berにたいして。ファイル内容に一致する解析用の言語を選択します。etagsは、voo.doo内の追加のタグを認識するためにreg1も使用し、bar.ber内の追加のタグを認識するためにreg1reg2の両方を使用します。voo.doobar.berの各行にたいして大文字小文字を区別せずにreg1がチェックされ、bar.berのファイル全体にたいして大文字小文字を区別してreg2がチェックされ、これは複数行へのマッチが許されます。los.erのタグの認識にはユーザー指定のregexpマッチは行わず、Lispのタグルールだけが使用されます。

オプションのプレフィクス{language}を使用して、与えられた言語だけに‘--regex’オプションを制限できます(‘etags --help’でetagsが認識する言語のリストが表示されます)。これはファイルに、etagsにたいして事前に定義された多くの正規表現が含まれている場合に便利です。以下の例は、EmacsのC言語のソースファイルのDEFVARマクロにたいするタグです:

--regex='{c}/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/\1/'

正規表現が複雑な場合、そのリストをファイルに保存することができます。以下のオプション構文は、etagsに正規表現が保存された2つのファイルを指示します。2つ目のファイルに含まれる正規表現は、大文字小文字を区別せずにマッチします。

--regex=@case-sensitive-file --ignore-case-regex=@ignore-case-file

etagsにたいするregexファイルは、行ごとに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]

さらに例を示しましょう。regexpはシェルから解釈され内容にクォートされています。