如何在VIM中浏览大型项目

90

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

对于我个人而言,在小型项目之外,我开始遇到问题。

  • 是否有任何快速“转至文件”的方法,最好带有名称自动完成功能?
  • 同样适用于“转至类定义”,当它在另一个文件中时。

我基本掌握了所有VIM的基础知识,所以我在编写脚本或快速编辑某些源代码方面没有问题。但是当我必须在文件之间导航时,情况变得非常混乱。


你使用的是什么编程语言? - LB40
我更喜欢通用性的解决方案,但我需要支持C++、PHP和Rails。 - Jakub Arnold
你接受了哪个答案?@JakubArnold - user8389458
@xetrasu 我最终使用了 NERDTree - Jakub Arnold
我使用银色搜索器 https://github.com/ggreer/the_silver_searcher - yehudahs
12个回答

35

VIM非常支持标签。一旦您为项目创建了标签文件,您可以跳转到方法、类等的定义或声明,甚至跨越文件,所有这些都在同一个编辑会话中完成。

试试吧。

:help tags

要为C/C++生成标签文件,请转到您的shell提示符(我假设您的系统是*nix / Cygwin),然后输入以下命令:

info ctags
或者
ctags --help

2
Vim还支持cscope,可以让您执行诸如查找调用给定函数的函数之类的操作-有关信息,请参见:help cscope。在介绍中有一个很好的功能列表(在“它旨在回答以下问题”下)。 - Cascabel
1
很遗憾,cscope对C++的理解非常有限。 - Luc Hermitte

30

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

将以下内容添加到~/.vimrc.local

set path=$PWD/**

然后在编辑器中输入以下内容,即可在当前工作目录(pwd)中查找文件。

:find user_spec.rb
你可以使用文件名的Tab键自动补全功能,以便查找多个选项,这将使得像TextMate这样的编辑器非常高兴。

1
这个解决方案比:FC和插件简单得多,因为不需要缓存...你让我感到非常开心!谢谢! - Srikumar
1
Vim没有将wd读取为默认目录。我已经重新启动了shell,但仍然无法工作。在执行命令:/之前也尝试过“vim .”。 - Adam Grant

14

我使用NERDTree(目录侧边栏),FuzzyFinder Textmate(类似于TextMate的CMD+T的文件跳转),以及Sessions(:h sessions)来帮助处理大型项目。

我建议使用一些会话(session)辅助插件。我可以提到我正在使用的插件,但我对它还不满意。只需在Google中搜索“vim sessions”即可。

需要注意的一点是,要让FuzzyFinder Textmate正常工作,它依赖于旧版本的FuzzyFinder插件,具体是v2.16。任何更高版本都会出现错误。但是这绝对是值得付出努力的。虽然它没有名称自动完成功能,但如果我搜索fro / time / actionsphp,它会找到文件apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(括号表示匹配内容)。这样非常容易挑选出仅由文件夹名称区分的文件。


2
我找到了一个新的插件,我更喜欢它,而且设置更容易(至少在我的情况下):CommandT。速度快得多。 - donut
6
一个较新、更强大的工具,采用 Vim 脚本编写,因此没有外部依赖。这个工具叫做 ctrlp,被 janus 项目 使用。 - alexandru.topliceanu

7

除了不可或缺的ctags和各种相关命令外,我还离不开项目插件,它允许你将感兴趣的文件与项目关联在一个单独的窗格中。我记不清我的设置有多少是自定义的了,但如果我想打开一个名为Debug.c的源文件,我会按下:

<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

我经常这样做:
: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的搜索功能实现自动完成。


4
从Vim 7.3开始,:find 命令支持文件名的tab补全。所以,如果你把'path'选项设置为包含整个项目(可能使用**通配符允许递归搜索子目录),那么你可以使用带有补全的:find:sfind:tabfind等命令来访问您项目中的任何文件。此方法还允许直接通过gf和其他类似命令跳转到文本中的文件名,例如在include指令中。
使用这种方法,无需外部工具或插件即可导航到特定文件。虽然,它可能并不像使用外部插件那样快速和便捷,也不能解决跳转到定义的需求。对于定义,我使用如其他答案所建议的ctags。

3

从源代码文件的根目录打开vim,并扩展path选项以包括其中的所有子目录。
例如,对于C++头文件,使用set path+=/usr/include/c++/**,对于源目录,使用set path+=**

这样,就会打开以下各种可能性。

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

:find file_name

你可以放心地使用 :find 进行自动补全和通配符扩展。你只需输入文件名称,它就可以定位到该文件,此方法与语言无关。我相信你会喜欢它。
2) 在光标下导航到文件:
如果你想要进入类似于 #include "project/path/classA.h" 的文件路径。
gf or gF  - go to file under cursor.   

Ctrl-6 - 用于在使用 gfgF 后返回上一个光标位置

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

[i[I 可以用于在不离开工作区的情况下查找光标下单词的函数签名。使用 [<Tab> 真正转到声明位置。使用 Ctrl-6 返回上一个位置。


如果不扩展 path,您可以通过 :Ex 命令开始导航文件并导航和打开您的文件。虽然我更喜欢 NerdTree


1
谢谢,路径选项非常强大。关于 [<Tab> 在哪里可以找到文档?我在任何地方都找不到它。 - Mosaaleb
[<Tab> 我从Bram Moolenar的《高效编辑的七个习惯》中得到了这句话,我想。 - dlmeetei
1
谢谢。找到了 https://moolenaar.net/habits_2007.pdf - Mosaaleb

3

Exuberant ctags.

使用 Ctrl-] 跳转到光标下的标签。


3
如果你像其他帖子建议的那样使用ctags,请确保查看taglist插件。
请确保花时间阅读文档并学习关键绑定。以下是一些初始绑定(从TList窗口):
- o - 在新窗口中打开文件 - t - 在新标签页中打开文件 - [[ 或退格键 - 列表中的上一个文件 - ]] 或 Tab 键 - 列表中的下一个文件

2

我使用FindFile插件。如果你在项目的根目录下打开vim,并执行:FC .命令,该插件将缓存当前工作目录下所有的文件名。接着,你可以执行:FF命令打开一个完成菜单,并输入你想要找的文件名(或者前几个字符)。


哇,这就像是最容易使用的插件。没有任何设置要求。 只需在您的根目录中键入 FC .,然后输入 :FF,开始键入您想要的文件名,完成了。不过我还在尝试弄清楚如何在新标签页中启动... - tester
值得注意的是,如果您使用此功能,每次启动vim时,您都需要重新执行 :FC . 来缓存该目录中的文件。 - tester
这是一个更新的FindFile.vim版本,支持:FT或者:FindTabNew https://gist.github.com/1104884 - tester

1

虽然我希望有人能指出更好的解决方案,这样我就可以学到更多东西,但是NERDTree对于使用名称完成来获取特定文件对我非常有用,只要我展开了树。当我需要访问文件时,命令如下:

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

,d打开树,/进入搜索模式,输入文件的名称(或部分名称、正则表达式等),然后按o打开。

当然,如果您没有输入足够的文件名或存在重复项,则可能需要按“n”几次。

我承认像这样使用NERDTree感觉有点像黑客,尽管现在它已经深入我的肌肉记忆中,我甚至不会考虑它。

当然,我也使用ctags,但那些只在光标附近有函数并且需要转到另一个文件中的定义时才有用。很多时候我会说“好的,现在我需要处理x功能”,而没有任何参考附近,ctags真的没有什么帮助。


3
我再仔细研究了一下,模糊查找器似乎是项目搜索的好主意。 - gravitation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接