有没有办法在 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
,真的。
我想在 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
,真的。