5

(为 C 标签道歉,我这样做是为了语法高亮。这更像是一个 vim 问题。如果有人比我认为应该删除标签,请这样做)

假设我有这个目录结构:

Directory ~/Code/Test/     containing file1.c file2.c file4.c and Sub 
Directory ~/Code/Test/Sub/ containing file3.c

文件1.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");
}

文件2.c:

#include <stdio.h>

void function2();

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

子/file3.c:

#include "../file4.c"

void function3();

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

文件4.c:

#include <stdio.h>

void function4();

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

在这些文件中的任何一个文件中,都应该可以从其他文件跳转到它使用的函数的定义。例如,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 中工作,这就是我迄今为止所做的。但是,如果我处理将来自不同项目的单独程序集和源文件链接在一起的大型项目,这将无法扩展。

(为了公平起见,Visual Studio 也不允许您跳过程序集来查找定义,但它至少可以提供一个头文件,您可以从中“加载程序集”并导航到实际的您正在寻找的源代码)

4

1 回答 1

-18

首先要做的事情是:Vim 从来都不是,现在不是,也可能永远不会是 IDE 的合适替代品。谁让你相信应该被枪杀,你也应该因为相信这种胡说八道而被枪杀。

我只是半开玩笑。

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

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

随便……</p>

  • 默认行为(不能在您的配置中更改)<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文件放在它们各自项目的根目录下。

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

    autocmd FileType c setlocal tags=/path/to/your/global/c/tags,./tags;/,tags;/
于 2013-06-27T07:39:46.297 回答