通常在vim /标签组织中一次使用多个标签文件

The*_*kle 5 c vim ctags exuberant-ctags

(为C标签道歉,我这样做是为了突出显示语法。这更多是一个vim问题。如果有人比我了解的更多,我认为应该删除该标签,请这样做)

说我有这个目录结构:

Directory ~/Code/Test/     containing file1.c file2.c file4.c and Sub 
Directory ~/Code/Test/Sub/ containing file3.c
Run Code Online (Sandbox Code Playgroud)

file1.c:

#include <stdio.h>
#include "file2.c"
#include "Sub/file3.c"

void function1();

int main (int argc, char *argv[]) {
   function1();
   function2();
   function3();
   return 0;
}

void function1() {
   printf("1\n");
}
Run Code Online (Sandbox Code Playgroud)

file2.c:

#include <stdio.h>

void function2();

void function2() {
   printf("2\n");
}
Run Code Online (Sandbox Code Playgroud)

子/file3.c:

#include "../file4.c"

void function3();

void function3() {
   printf("3\n");
   function4();
}
Run Code Online (Sandbox Code Playgroud)

file4.c:

#include <stdio.h>

void function4();

void function4() {
   printf("4\n");
}
Run Code Online (Sandbox Code Playgroud)

在这些文件中的任何一个文件中,都应该可以从其他文件中跳转到其使用的功能的定义。因此,例如,file1应该能够跳转到file2,file1应该能够跳转到file3的目录,file3应该能够跳转到file4的目录,这就是关键所在;所有文件都应该能够跳转到printf的定义。我也不必为此将c库实现的标签复制到Test目录中。

我想知道如何才能做到这一点。我真的不喜欢单片标签文件。拥有vim范围的标签文件使我感到恐惧。每个目录的标签文件让我很烦。每个项目的标签文件都是可以接受的。但是我真正想要的是每个源文件的标签文件,然后是一种指定vim应该引用的标签文件的方法。

理想情况下,我希望能够对任何内容进行ctrl-]处理,并使vim根据范围内的内容跳转到正确的定义,就像Visual Studio一样。我开始怀疑这是不可能完成的,而且如果这样做(通过插件的某种组合)会非常慢,这确实很烦人,因为我完全同意“ Vim可以完成您新奇的IDE可以做的任何事情在那里呆了几个星期。是的,它绝对是我遇到过的最强大的文本编辑器,但作为IDE,它却极其粗糙。当我使用“转到定义”命令时,无论它是局部变量,在其他文件中,在标准库等中,我都希望获得正确的定义。到目前为止,Vim给了我滑稽的结果,例如从java文件转换为ac文件。而且您必须使用单独的命令来跳转到局部变量的定义...什么?(如果有这个原因,我很想知道)

我知道set tags=./tags我的.vimrc有问题,这就是我到目前为止所做的。但是,如果我要进行大量工作,将单独的程序集和源文件从单独的项目链接在一起,那么这将无法扩展。

(为了公平起见,对于vim来说,Visual Studio也不允许您跳转到程序集来查找定义,但是它至少具有很好的宽限度,可以提供一个头文件,您可以从中“加载程序集”并导航到实际的头文件。您正在寻找的源代码)

rom*_*inl -18

首先,Vim 从来都不是、现在不是、也可能永远不会成为 IDE 的合适替代品。谁让你相信这些,就应该被枪杀,你也应该因为相信这种废话而被枪杀。

\n\n

我只是半开玩笑。

\n\n

Vim 是一个非常强大的面向编程的文本编辑器,但一个简单的事实是,您需要运行一个愚蠢的外部代码索引器来获得一个愚蠢的“跳转到定义”或另一个代码索引器来获得另一个愚蠢的“跳转到使用”,这应该是一个提示Vim 实际上无法与 IDE 进行比较。提示:IIDE 中的 表示“集成”,而 表示E“环境”。由于您无法获得适当的集成,并且很难将 Vim 视为一个环境,因此这里没有 IDE。只有一个带有许多插件的文本编辑器以不同的方式做不同的事情,最重要的是,没有认真的方式来理解你的代码,这是血统 IDE 的第一大功能。

\n\n

许多用户/博主声称他们正在使用“Vim 作为 IDE”,或者您也可以将 Vim 变成 Python 或任何 IDE,但事实是 Vim 缺乏使这种事情成为可能的所有低级功能。如果您能够相信自己的谎言,您可以将其变成看起来像 IDE 的东西但它可能永远不会成为IDE。

\n\n

随便\xe2\x80\xa6

\n\n
    \n
  • <C-]>或 的默认行为(无法在您的配置中更改):tag foo是跳转到tags文件中的第一个匹配项。Vim 和 Ctags 都不知道作用域。最好的情况是,您可以看到一个列表,从中选择正确的标签(:ts foog]),但这就是您能走多远。

    \n\n

    根据您使用的语言,Cscope 可能更擅长对代码进行索引,但一般原则与 Ctags 相同。Cscope 提供了“跳转到使用”功能,因此可能值得为此进行切换。

  • \n
  • 确保tags使用正确的文件可能会很痛苦,令人惊讶的是,该文档在这方面并没有多大帮助。有很多插件旨在使事情变得更简单,您可以尝试,EasyTags 浮现在脑海中。

    \n\n

    我承认我不从事非常大的项目,甚至不使用 C 语言,所以也许这看起来没什么用,但我的这一行使~/.vimrc工作变得tags更容易:

    \n\n
    set tags=./tags;/,tags;/\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    通过此设置,Vim 会不断向上(非递归)查找文件,直到/找到tags文件。这样做的要点是tags在每个项目的根目录下都有一个文件,可以从该项目中的每个文件中使用该文件,而无需告诉 Vim 在哪里查找文件tags

    \n\n

    处理 Java/C 混淆的一种方法是将项目放入特定于语言的目录中:

    \n\n
    C/\n  c.tags\n  proj1/\n    tags\n    \xe2\x80\xa6\n  proj2/\n    tags\n    \xe2\x80\xa6\nJava/\n  j.tags\n  proj3/\n    tags\n    \xe2\x80\xa6\n  proj4/\n    tags\n    \xe2\x80\xa6\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

并将“全局”tags文件放在其根目录中,并将特定于项目的tags文件放在各自项目的根目录中。

\n\n

处理该问题的另一种方法可能是指示 Vim 加载特定的tags根据文件类型加载特定文件:

\n\n
    autocmd FileType c setlocal tags=/path/to/your/global/c/tags,./tags;/,tags;/\n
Run Code Online (Sandbox Code Playgroud)\n

  • 感受仇恨在你身上流淌……不,但说真的,使用正确的插件集,你通常可以从 IDE 获得你真正想要的所有功能,而不会出现所有你不想要的臃肿和东西。有了 IDE,您要么得到全部,要么什么也得不到。使用 VIM,您基本上可以组装一个具有您想要的确切功能的“IDE”。最好的部分?如果没有插件可以满足您的要求,那么编写自己的插件并不难。 (13认同)
  • 这是一个危险的信息,因为越多的人相信 Vim 是一个文本编辑器,因此它无法实现代码定义查找的 IDE 级别质量,这就越成为一种自我实现的信念。如果没有插件或非常高级的配置,Vim 无法提供上下文驱动的查找。我们需要的是更多的人致力于此类插件,而不是对 Vim 的能力感到悲观。现在,如果您想提供导致几乎不可能制作此类插件的固有限制的证据,这可能会有所帮助。 (4认同)
  • 前两段是不需要的,应该从这个“答案”中删除。 (4认同)
  • 提出了一些非常好的观点,一个完全不准确的陈述,一些有用的提示,但总体上是危险和破坏性的信息。当尝试使用标签来获得良好的代码定义查找工作时,理解 Vim 和 ctags 都不考虑上下文以及 Vim 如何查找匹配标签的要点非常重要。有关设置标签的不同方法的提示很有帮助。“`&lt;C-]&gt;` 的默认行为(...无法在您的配置中更改)”这一说法是完全错误的。我曾经在我的配置中更改过它。 (3认同)