Vim :tnext 不会将光标移动到下一个标签

Vim :tnext doesn't move cursor to the next tag

我尝试将 ctags 与 vim 一起使用,但我发现了以下问题:

首先我们来看下图: 如果我按 C-],那么光标将移动到第 7 行,如您所见:

但是如果我输入命令 :tn 光标仍然在第 7 行而不是第 14 行,下一个标记所在的位置。为什么会发生这种情况,我该如何解决?如果您查看左下角的下图 ,它会显示:"tag 2 of 3" 所以这意味着 :tn 有效,我认为,但光标没有移动。

如果您查看 tags 文件,您会发现 fc() 的三个定义是相同的:

fc  pam.cpp /^        void fc() {$/;"   f   class:A
fc  pam.cpp /^        void fc() {$/;"   f   class:B
fc  pam.cpp /^        void fc() {$/;"   f   class:C

默认情况下,Ctags 不向 Vim 提供 line:column 信息,它仅提供搜索模式。由于所有三个标签的搜索模式相同,Vim 始终执行相同的搜索并始终在相同的位置结束。使用 :tag fc<C-]>:tnext:tselect 或他们的任何朋友都没关系。

使用 -n 选项,Ctags 输出行号而不是搜索模式:

fc  pam.cpp 14;"    f   class:B
fc  pam.cpp 21;"    f   class:C
fc  pam.cpp 7;" f   class:A

更好,因为 Vim 现在可以跳转到正确的行,但标签的顺序不正确。解决此问题的一种方法是使用 -u 选项:

A   pam.cpp 5;" c   file:
fc  pam.cpp 7;" f   class:A
B   pam.cpp 12;"    c   file:
fc  pam.cpp 14;"    f   class:B
C   pam.cpp 19;"    c   file:
fc  pam.cpp 21;"    f   class:C

总之,您应该使用 -n-u 选项生成 tags。类似于:

$ ctags -Rnu .

参见 $ man ctags