一般在vim / Tag组织中一次使用多个标记文件

时间:2013-06-27 06:37:43

标签: 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

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");
}

file2.c中:

#include <stdio.h>

void function2();

void function2() {
   printf("2\n");
}

子/ file3.c中:

#include "../file4.c"

void function3();

void function3() {
   printf("3\n");
   function4();
}

file4.c:

#include <stdio.h>

void function4();

void function4() {
   printf("4\n");
}

在任何一个文件中,应该可以从其他文件跳转到它使用的函数的定义。因此,例如,file1应该能够跳转到file2,file1应该能够将目录跳转到file3,file3应该能够将目录跳转到file4,这里是踢球者; 所有文件都应该能够跳转到printf的定义。我也不应该将c库实现的标签复制到Test目录中来执行此操作。

我想知道如何做到这一点。我真的不热衷于单片标签文件。有一个vim范围的标签文件吓坏了我。每个目录的标签文件让我烦恼。每个项目的标签文件是可以忍受的。但我真正喜欢的是每个源文件的标签文件,然后指定vim应该引用哪些标签文件。

理想情况下,我希望能够对任何事情进行控制,并让vim根据范围内的内容跳转到正确的定义,就像visual studio一样。我开始怀疑这不可能做到,如果是(通过插件的某些组合)它会非常慢,这真的很烦人,因为我完全在“Vim可以做任何你新奇的IDE可以做的事情“在那里呆了几个星期。是的,它绝对是我遇到的最强大的文本编辑器,但作为一个IDE,它是非常粗糙的。当我使用“转到定义”命令时,我希望得到正确的定义,无论它是一个局部变量,一个不同的文件,一个标准库等等。到目前为止,Vim给了我一些搞笑的结果,比如跳过一个java文件到ac文件。而且你必须使用一个单独的命令来跳转到局部变量的定义......什么? (如果有这背后的原因,我有兴趣知道)

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

(为了公平对待vim,visual studio不允许你跳过程序集来查找定义,但它至少有一个很好的优点来提供一个头文件,你可以从中“加载程序集”并导航到您正在寻找的实际源代码)

1 个答案:

答案 0 :(得分:-13)

首先要做的事情是: Vim从来没有,也不会,也可能永远不会成为IDE的正确替代品。 无论谁让你相信应该被射杀你因为相信这样的废话也应该被拍摄。

我只是半开玩笑。

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

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

...无论

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

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

  • 确保使用正确的tags文件可能会很痛苦,而且在这方面,文档显然不是很有帮助。有一堆插件旨在使您可以尝试更简单,EasyTags浮现在脑海中。

    我承认我不会在非常大的项目上工作,甚至不在C中工作,所以这似乎没有用,但我~/.vimrc中的这一行使得tags的工作更容易:

    set tags=./tags;/,tags;/
    

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

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

    C/
      c.tags
      proj1/
        tags
        …
      proj2/
        tags
        …
    Java/
      j.tags
      proj3/
        tags
        …
      proj4/
        tags
        …
    

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

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

    autocmd FileType c setlocal tags=/path/to/your/global/c/tags,./tags;/,tags;/