技術的には、vim でTagbarを使用してファイルのタグを表示していますが、この質問は一般的に熱狂的な ctags v5.8 に適用されます。
次の python ファイルがあるとしますfoo.py
。
class foo:
def bar(baz):
print(baz)
実行してみましょうctags
: ctags foo.py
. 結果のtags
ファイルは次のようになります。
!_ some ctags version / formatting stuff not worth pasting
bar foo.py /^ def bar(baz):$/;" m class:foo
foo foo.py /^class foo:$/;" c
私が興味を持っているビットは、2 行目の最後のフィールドですclass:foo
。それがbar()
機能の範囲です。vimでtagbarを使用すると、それに応じて関数がクラスにネストされます。
ここで、 に新しい言語のサポートを追加するとします~/.ctags
。実際、この puppet ファイルのサポートを追加しています。
class foo {
include bar
}
次の~/.ctags
引数を使用するとします。'import' 正規表現は醜い (err... regex としては醜い) ですが、この例では十分に機能します:
--langdef=puppet
--langmap=puppet:.pp
--regex-puppet=/^class[ \t]*([:a-zA-Z0-9_\-]+)[ \t]*/\1/c,class,classes/
--regex-puppet=/^\ \ \ \ include[ \t]*([:a-zA-Z0-9_\-]+)/\1/i,include,includes/
tags
これにより、ファイルに次のタグが生成されます。
bar foo.pp /^ include bar$/;" i
foo foo.pp /^class foo {$/;" c
どちらの行にもスコープ情報が含まれていないことに注意してください。私の質問は次のとおりです。タグのスコープに関する情報を収集するために、一般的に--regex-puppet
引数または行を構築する方法はありますか? --regex-<LANG>
おそらく、基準 A を満たすタグは常に基準 B を満たすタグのスコープ親になると宣言するには?
man ctags
任意のスコープ情報を追加する明確な方法はありませんが、別の解決策を見落としている可能性があります (強調するために少し省略しています)。
--regex-<LANG>=/regexp/replacement/[kind-spec/][flags]
Unless modified by flags, regexp is interpreted as a Posix extended regular expression. The replacement should expand for all matching lines to a non-empty string of
characters, or a warning message will be reported. An optional kind specifier for tags matching regexp may follow replacement, which will determine what kind of tag is
reported in the "kind" extension field (see TAG FILE FORMAT, below). The full form of kind-spec is in the form of a single letter, a comma, a name (without spaces), a
comma, a description, followed by a separator, which specify the short and long forms of the kind value and its textual description (displayed using --list-kinds). Either
the kind name and/or the description may be omitted. If kind-spec is omitted, it defaults to "r,regex". Finally, flags are one or more single-letter characters having the
following effect upon the interpretation of regexp:
b The pattern is interpreted as a Posix basic regular expression.
e The pattern is interpreted as a Posix extended regular expression (default).
i The regular expression is to be applied in a case-insensitive manner.