gpt4 book ai didi

Vim 跳转到错误的标签

转载 作者:行者123 更新时间:2023-12-04 01:21:50 36 4
gpt4 key购买 nike

标题说明了问题,所以这里是上下文。我有一个很小的 ​​C++ 文件

void f(
int x
) { }

void f(
) { }

我在上面运行 ctags。
ctags --recurse --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f tags f.C

检查标签文件会按预期显示 f 的两个条目,并且具有正确的签名。

当我尝试在 Vim 中使用它时,Vim 使用 ctrl-] 定位该函数,但是当我使用 :tnext 和 :tprev 时,消息显示 tag 1 of 2tag 2 of 2但光标不会在它们之间移动。

最佳答案

如果你看 :help tags-file-format , Vim 使用第三列(名为 {tagaddress} )作为(搜索)命令( :help tag-search )。在生成的标签文件中,它看起来像这样:

f   foo.cpp /^void f($/;"   f   signature:( )
f foo.cpp /^void f($/;" f signature:( int x )

两个重载 ( /^void f($/ ) 的搜索模式是相同的 ;这就是为什么每次标签跳转都会定位第一个实例!换句话说,虽然标签程序添加了签名很好,但不幸的是 Vim 没有考虑它。

有了这个,解决这个问题的显而易见的方法是重新格式化源代码,以便(部分)签名包含在同一行中。然后,会有不同的模式:
b   bar.cpp /^void b()$/;"  f   signature:()
b bar.cpp /^void b(int x)$/;" f signature:(int x)

解决此问题的更正确(但也更复杂)的途径是扩展 ctags程序来识别这些歧义,然后用积极的前瞻来增强模式,以考虑下一行中的内容。
f   foo.cpp /^void f(\%(\n\s*int x\)\@=/;"  f   signature:( )
f foo.cpp /^void f(\n\s*)/;" f signature:( int x )

不幸的是,Vim 似乎不理解这种语法(无论有没有前瞻);我刚收到 E435: Couldn't find tag, just guessing! .

关于Vim 跳转到错误的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192033/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com