gpt4 book ai didi

ctags - 我可以将范围信息添加到 exuberant ctags 中使用 `--regex-` 生成的标签吗?

转载 作者:行者123 更新时间:2023-12-02 04:53:01 33 4
gpt4 key购买 nike

从技术上讲,我正在使用 Tagbar在 vim 中查看文件的标签,但这个问题通常适用于 exuberant 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

我感兴趣的是第二行的最后一个字段,class:foo 。这就是bar()的范围。功能。如果我在 vim 中使用 tagbar,它会相应地将函数嵌套在类中。

现在假设我在 ~/.ctags 中添加对新语言的支持。事实上,我正在添加对此木偶文件的支持:

class foo {
include bar
}

假设我使用以下 ~/.ctags论据。 “导入”正则表达式很丑陋(呃……对于正则表达式来说很丑陋),但对于这个例子来说它已经完成了足够的工作:

--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.

最佳答案

不,不幸的是,ctags 中的正则表达式模式支持不可能实现这一点。让 ctags 生成正确范围的唯一方法是用 C 语言编写一个解析器作为附加模块。如果有时间的话,我想为 ctags 添加更好地处理新语言的支持,但到目前为止还没有解决了,但我仍然不确定最好的方法。

如果您对 Tagbar 支持最感兴趣,那么还有另一种方法:Tagbar 支持任意标记生成程序,只要它们的输出与 ctags 兼容,因此您可以用 Python 等语言编写一个简单的解析器并配置 Tagbar 以使用它。如果您可以选择,请查看 :h tagbar-extend (尤其是最后一小节“编写您自己的标记生成程序”)。

关于ctags - 我可以将范围信息添加到 exuberant ctags 中使用 `--regex-<LANG>` 生成的标签吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577876/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com