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

Is there a way to have the same tag name in ctags?

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

例如:

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

中很重要

[待办事项 1] 这在 another/path/bar.txt

中很重要

[富] 其他一些 foo.

我的 ctags 配置文件是

--langdef=text
--langmap=text:.txt
--regex-text=/^\[([A-Za-z0-9]+)\]//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

答案很简单,但很多人不知道,所以我要post答案,以便将来可以帮助到其他人。

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

这里是一个跳转到栏的简单标签文件的例子:

bar exampleFile.txt 9
bar exampleFile.txt 17

tags is not generating more than one of the same tag name. If I fix this then the next question would be how to jump in vim to the same tag names?

我尽量回答第一个

将 --fields=+n 选项(或 Universal 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.

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

参考:

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

:help tags,真的。