关于编辑器:如何在VIM中的大型项目中导航

How to navigate in large project in VIM

如何仅使用VIM管理大型项目(数百个文件)?

我个人开始在任何比小项目更大的项目中遇到问题。

  • 是否有任何方法可以快速"转到文件",最好是名称完整?
  • 当它在另一个文件中时,"转到类定义"相同

我有点了解VIM的所有基础知识,所以使用它编写脚本或快速编辑一些源代码没有问题。但当我必须在文件之间导航时,它会让我非常混乱。


VIM对标签有很好的支持。一旦为项目创建了一个标记文件,就可以跳到方法、类等的定义或声明,包括跨文件跳到同一个编辑会话中。

尝试

1
:help tags

若要生成C/C++的标记文件,请转到shell提示(我假设您的系统是*nix/CygWin)和类型

1
info ctags

1
ctags --help


我喜欢简单的解决方案,目前我最喜欢的导航方式是:

添加到EDOCX1[2]

1
set path=$PWD/**

然后在编辑器中键入该文件,以在当前工作目录(pwd)中的任何位置查找该文件。

1
:find user_spec.rb

您也可以在文件名上使用制表符完成功能来查找多个选项,使得这个textmate转换非常高兴。


我使用nerdtree(目录侧边栏)、fuzzyfinder textmate(像textmate的cmd+t这样的文件)和sessions(:h sessions)的组合来帮助我处理大型项目。

我建议使用一些会话助手插件。我会提到我用的是什么,但我还不满意。只需谷歌"VIM会话"。

让fuzzyfinder textmate工作需要注意的一点是,它依赖于旧版本的fuzzyfinder插件,特别是2.16版。再高一点就会出错。但这绝对值得麻烦。虽然它没有名称完成,但它的搜索是智能的,因此如果我搜索fro/time/actionsphp,它将调出文件apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(括号表示它匹配的内容)。这样就可以很容易地挑选出仅按文件夹名称唯一的文件。


以及无价的ctags和各种相关的命令。我也不能生活没有项目插件,这允许你有兴趣的文件与项目在一个单独的窗格关联。我不记得有多少设置是自定义的,但是如果我想打开一个名为debug.c的源文件,我点击:

1
2
3
<F12>    " Opens the project pane
/De      " Searches for"De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>  " Opens the selected file and closes the project pane

我经常这样做:

1
2
3
4
5
6
7
:vsp     " Vertically split the window
<F12>    " Reopen project pane
#        " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>  " Open the header file in the other window and close the project window.

使用这个相对较短的序列,我可以打开任何文件,它的头文件是垂直拆分的。由于项目插件窗口只是一个文本文件,所以使用VIM的搜索功能可以完成。


从VIM 7.3开始,:find命令有文件名的制表符完成。

因此,如果您将'path'选项设置为包含整个项目(可能使用**通配符允许递归搜索子目录),那么您可以使用:find:sfind:tabfind等命令完成后获取项目中的任何文件。如果文件名在您的文本中(例如include指令中),这还允许直接跳转到与gf和friends一起的文件。

使用这种方法,不需要外部工具或插件来导航到特定的文件。尽管如此,它可能不会像以前那样快速或易于使用,也不会满足跳转到定义的需要。对于定义,我使用CTags作为其他答案的建议。


活力四射。

使用ctrl-]跳转到光标下的标记。


如果你按照其他海报的建议使用ctags,那么一定要查看标签列表插件。

确保花时间阅读文档并学习键绑定。以下是一些要开始的内容(从tlist窗口):

  • o-在新窗口中打开文件
  • t-在新选项卡中打开文件
  • [或退格键-列表中的上一个文件
  • ]]或选项卡-列表中的下一个文件

我使用findfile。如果在项目根目录下打开vim并运行:FC .,插件将缓存CWD下的所有文件名。然后,您可以执行:FF操作,打开完成菜单并键入所需文件的名称(或者更确切地说,键入前几个字母)。


从源文件的根目录打开vim,并扩展path选项以包含其中的所有子目录。例如,对于您的源目录,EcOX1对C++头和EDCOX1的引用为12(13)。

然后,这就开启了一系列以下可能性。

1)按名称或部分打开文件

1
:find file_name

您可以在:find中可靠地使用自动完成和通配符扩展。这是语言不可知论。

2)导航到"错误"下的文件:如果您想使用像#include"project/path/classA.h这样的文件路径。

1
gf or gF  - go to file under cursor.

ctrl-6-返回到gfgf之后的最后一个光标位置。

1
gd - go to definition for word under cursor within the file.

也是语言不可知论者。

3)API查找和导航到API位置

可以使用[i[i在光标下查找函数签名,而不必离开工作区。实际去申报。使用ctrl-6返回到最后一个位置。

在不扩展path的情况下,可以通过:Ex命令启动文件导航,并导航和打开文件。不过,我更喜欢NerdTree


我正在使用我的两个插件:

  • 在命令行上完成文件名的searchinruntime。它在某种程度上类似于fuzzyfinder和lookupfile,
  • lh标签是完全实验性的,未记录在案。它提供两个功能:文件保存时自动和快速更新标记文件(ing?)和默认插入到的标记选择器。您可能需要检查著名的标签列表插件。

两者都需要我的viml库lh vim lib。


虽然我有点希望有人能指出更好的解决方案,这样我就能学到一些东西,但只要我扩展了树,NerdTree就可以很好地访问具有名称完成功能的特定文件。当我需要访问文件时,命令如下:

,d/foo.pyo(其中foo.py是文件名)

,d打开树,/进入搜索模式,文件名(或部分名称,或regex,或其他名称),然后o打开。

当然,如果键入的文件名不够或有重复的文件名,您可能需要点击"n"几次。

我承认这感觉有点像一个黑客使用像这样的书呆子树,虽然它已经进入我的肌肉记忆到目前为止,我甚至没有想过它。

当然,我也使用ctags,但是只有当您在光标附近有一个函数,并且需要在另一个文件或其他东西中找到它的定义时,这些函数才有用。很多时候我都会说"好的,我现在需要处理功能X",并且需要导航到另一个文件,而不需要CTags真正帮助的附近的任何引用。


尝试sourcecodeobedine。这是我开发的一个处理C++ 1GB源文件的项目。我将它与0扫描配合使用。

这两个插件是最流行的VIM浏览工具:CTags和CScope的包装。