有没有办法在 ctags 中使用相同的标签名称?

问题描述

我希望通过在 ctags 中使用自定义语言来编写 foos、bars、bazs。它工作正常,我 可以跳转标签,但我只允许有一个唯一的标签名称。我会 喜欢能够使用名为的标签跳过不同文件中的所有标签 待办事项1。 Ctags 不会生成多个相同的标签名称。如果我解决了这个问题,那么下一个问题将是如何在 vim 中跳转到相同的标签名称?我认为 :tn 可能不起作用,因为我过去曾尝试在 asciidoc 中使用相同的标签名称

例如:

[待办事项1] 这在 some/file/path/foo.txt 中很重要

[待办事项1] 这在另一个/path/bar.txt 中很重要

[foo] 其他一些 foo。

我的 ctags 配置文件

--langdef=text
--langmap=text:.txt
--regex-text=/^\[([A-Za-z0-9]+)\]/\1/s,section/

在 vim 中。

:! ctags -f ~/text/.tags -R ~/text/
:setlocal tags=~/text/.tags

ctags --version

Universal Ctags 5.9.0(b49410f),copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8,copyright (C) 1996-2009 Darren Hiebert
  Compiled: Dec 16 2020,11:27:14
  URL: https://ctags.io/
  Optional compiled features: +wildcards,+regex,+iconv,+option-directory,+xpath,+packcc

解决方法

tags 不会生成多个相同的标签名称。如果我解决了这个问题,那么下一个问题将是如何在 vim 中跳转到相同的标签名称?

我会尽量回答第一个。

将 --fields=+n 选项(或通用 Ctags 中的 --fields=+'{line}' 选项)添加到 ctags 命令行。这会为每个标签条目添加一个 line: 字段。 line: 字段可以使标签条目独一无二。

,

Ctags 绝对允许在任意数量的文件中具有多个同名标签:

$ cat todo.txt
[todo1] This is something important in some/file/path/foo.txt
[todo1] This is something important in another/path/bar.txt
[foo] Some other foo.

$ cat tags
!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   0   /0=unsorted,1=sorted,2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME  Exuberant Ctags //
!_TAG_PROGRAM_URL   http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.8 //
todo1   todo.txt    /^[todo1] This is something important in     some\/file\/path\/foo.txt$/;"  s
todo1   todo.txt    /^[todo1] This is something important in another\/path\/bar.txt$/;" s
foo todo.txt    /^[foo] Some other foo.$/;" s

不过,您的问题似乎与 ctags 无关,而与您使用 Vim 的方式有关。

  • 执行 :tag foo 或在 <C-]> 上按 foo 会跳转到 Vim 知道的 foo 文件中的第一个 tags。这就是您所在的位置,您确实可以执行 :tnext 跳转到下一个标签。
  • :3tag foo 或在 2<C-]> 上按 foo 会跳转到第三 foo
  • 执行 :tselect foo 或在 g] 上按 foo 会显示 foo 标签列表,您可以从中选择。
  • :tjump foo或在g<C-]上按foo结合了:tag:tselect的优点,当只有一个的时候表现得像:tag标记或喜欢 :tselect(如果有更多)。

参考:

:help :tag
:help ctrl-]
:help :tselect
:help g]
:help :tjump
:help g_ctrl-]

:help tags,真的。

,

答案很简单,但很多人不知道这一点,所以我将发布答案,以便将来可以帮助某人。

我不确定 ctags 是否允许使用同名标签,但这无关紧要。您可以按照:help tags-file-format 中的说明生成自己的标签。这可以通过包含少于 20 行代码的脚本和类似 rip grep 的程序来完成,或者您可以使用实现此功能的 vimwiki 插件。

下面是一个简单的跳转到 bar 的标签文件的例子:

bar exampleFile.txt 9
bar exampleFile.txt 17