问题描述
我希望通过在 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