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
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应该引用的标签文件的方法。
理想情况下,我希望能够对任何内容进行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\nVim 是一个非常强大的面向编程的文本编辑器,但一个简单的事实是,您需要运行一个愚蠢的外部代码索引器来获得一个愚蠢的“跳转到定义”或另一个代码索引器来获得另一个愚蠢的“跳转到使用”,这应该是一个提示Vim 实际上无法与 IDE 进行比较。提示:IIDE 中的 表示“集成”,而 表示E“环境”。由于您无法获得适当的集成,并且很难将 Vim 视为一个环境,因此这里没有 IDE。只有一个带有许多插件的文本编辑器以不同的方式做不同的事情,最重要的是,没有认真的方式来理解你的代码,这是血统 IDE 的第一大功能。
许多用户/博主声称他们正在使用“Vim 作为 IDE”,或者您也可以将 Vim 变成 Python 或任何 IDE,但事实是 Vim 缺乏使这种事情成为可能的所有低级功能。如果您能够相信自己的谎言,您可以将其变成看起来像 IDE 的东西,但它可能永远不会成为IDE。
\n\n随便\xe2\x80\xa6
\n\n<C-]>或 的默认行为(无法在您的配置中更改):tag foo是跳转到tags文件中的第一个匹配项。Vim 和 Ctags 都不知道作用域。最好的情况是,您可以看到一个列表,从中选择正确的标签(:ts foo或g]),但这就是您能走多远。
根据您使用的语言,Cscope 可能更擅长对代码进行索引,但一般原则与 Ctags 相同。Cscope 提供了“跳转到使用”功能,因此可能值得为此进行切换。
确保tags使用正确的文件可能会很痛苦,令人惊讶的是,该文档在这方面并没有多大帮助。有很多插件旨在使事情变得更简单,您可以尝试,EasyTags 浮现在脑海中。
我承认我不从事非常大的项目,甚至不使用 C 语言,所以也许这看起来没什么用,但我的这一行使~/.vimrc工作变得tags更容易:
set tags=./tags;/,tags;/\n通过此设置,Vim 会不断向上(非递归)查找文件,直到/找到tags文件。这样做的要点是tags在每个项目的根目录下都有一个文件,可以从该项目中的每个文件中使用该文件,而无需告诉 Vim 在哪里查找文件tags。
处理 Java/C 混淆的一种方法是将项目放入特定于语言的目录中:
\n\nC/\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并将“全局”tags文件放在其根目录中,并将特定于项目的tags文件放在各自项目的根目录中。
处理该问题的另一种方法可能是指示 Vim 加载特定的tags根据文件类型加载特定文件:
    autocmd FileType c setlocal tags=/path/to/your/global/c/tags,./tags;/,tags;/\n| 归档时间: | 
 | 
| 查看次数: | 6830 次 | 
| 最近记录: |