如何在VIM中的大型项目中导航


86

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

我个人开始在任何规模较小的项目中都遇到问题。

  • 有什么方法可以快速“归档”,最好是使用名称补全?
  • 在另一个文件中时,与“转到类定义”相同

我有点了解VIM的所有基础知识,因此使用它来编写脚本或快速编辑某些源代码没有问题。但是当我不得不在文件之间导航时,这对我来说真的很麻烦。


您使用什么语言?
2009年

我希望使用与语言无关的解决方案,但我需要对C ++,PHP和Rails的支持。
雅各布·阿诺德

您接受哪个答案?@JakubArnold

@xetrasu我最终使用了NERDTree
Jakub Arnold

Answers:


33

VIM对标签具有出色的支持。为项目创建标签文件后,您可以跳转到方法,类等的定义或声明,包括跨文件跳转,全部都在同一编辑会话中进行。

尝试

:help tags

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

info ctags

要么

ctags --help

2
Vim还支持cscope,这将使您能够执行诸如查找哪些函数调用给定函数的操作-:help cscope有关信息,请参见。简介中有一个不错的功能列表(在“它旨在回答类似问题”下)。
卡斯卡贝尔

1
不幸的是,cscope对C ++的了解非常有限。
卢克·赫米特

28

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

添加 ~/.vimrc.local

set path=$PWD/**

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

:find user_spec.rb

您也可以在文件名上使用制表符补全来查找多个选项,这使TextMate转换非常满意。


1
这个解决方案比:FC和plugins'cos更为简单,因为不需要缓存,而...您让我大开眼界!谢谢!
Srikumar 2013年

1
Vim没有将wd读取为默认目录。我已经重新启动了外壳程序,但仍然无法正常工作。vim .在执行命令之前也尝试过:/
亚当·格兰特

13

我结合使用NERDTree(目录侧边栏),FuzzyFinder Textmate(类似于TextMate的CMD + T的文件)和Sessions(:h会话)来帮助我处理大型项目。

我建议使用一些会话帮助程序插件。我会提到我用的东西,但是我还不满意。只是Google的“ vim会话”。

使FuzzyFinder Textmate起作用要注意的一件事是,它取决于FuzzyFinder插件的旧版本,特别是v2.16。更高的东西会出错。但这绝对是值得的麻烦。虽然它没有名称fro/time/actionsphp补全,但是它的搜索很聪明,因此如果我搜索它,它将拉出文件apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(括号表示匹配的文件)。这使得挑选仅由其文件夹名称唯一的文件变得非常容易。


2
我找到了一个我更喜欢并且更易于设置的新插件(至少在我的情况下):CommandT。快多了。
donut 2010年

6
一个更新,功能更强大的工具,可以在vim脚本中编写代码,因此janus项目不会使用ctrlp进行外部依赖
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命令的文件名使用制表符完成。

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

使用此方法,无需外部工具或插件即可导航到特定文件。虽然,它可能不那么快捷或易于使用,并且不能满足跳转到定义的需要。对于定义,我使用ctags作为其他答案的建议。


3

如果您按照其他海报推荐的方式使用ctags,请确保您查看标签列表插件。

确保您花时间阅读文档并学习按键绑定。以下是一些入门指南(从TList窗口):

  • o-在新窗口中打开文件
  • t-在新标签页中打开文件
  • [[或Backspace-列表中的上一个文件
  • ]]或标签-列表中的下一个文件

3

茂盛的雄鹿。

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


2

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


哇,这就像最容易使用的插件。零设置。仅FC .在您的根目录中,然后:FF输入,开始键入所需的文件名即可。我仍在尝试找出如何在新标签页中启动..
测试人员

还值得注意的是,如果使用此功能,则每次启动vim时,都需要重做以:FC .将文件缓存在该目录中。
测试人员

这是带有:FT:FindTabNew gist.github.com/1104884
测试人员

2

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

然后,这带来了以下众多可能性。

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

:find file_name

您可以:find可靠地使用自动完成和通配符扩展。您键入名称,它将找到名称。这与语言无关,我确定你会喜欢的。

2)导航到cusror下的文件:
如果您想使用文件路径,例如#include "project/path/classA.h

gf or gF  - go to file under cursor.   

Ctrl--6返回到gf或之后的最后一个光标位置gF

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

[i[I可用于在不离开工作空间的情况下在光标下查找单词的功能签名。[<Tab>实际去申报。使用Ctrl-6返回上一个位置。


无需扩展path,您就可以开始通过:Ex命令导航文件,然后导航并打开文件。我NerdTree比这更喜欢。


1

尽管我有点希望有人能指出一个更好的解决方案,以便我可以学到一些东西,但是只要扩展树,NERDTree就能很好地获取具有名称补全的特定文件。当我需要获取文件时的命令如下所示:

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

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

当然,如果键入的文件名不足或重复,则可能必须多次击“ n”次。

我承认使用NERDTree这样的感觉有点像是在破解,尽管到目前为止它已经深入我的肌肉记忆中,我什至没有考虑它。

当然我也使用ctags,但是它们仅在光标附近有函数并且需要在另一个文件或其他文件中获取其定义时才有用。很多时候,我说“确定,我现在需要处理功能x”,并且需要导航到另一个文件,而附近没有ctags真正有用的引用。


3
我进一步研究了它,Fuzzyfinder看起来是项目搜索的好主意。
重力

1

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

  • searchInRuntime在命令行上完成文件名。它在某种程度上类似于Fuzzyfinder和lookupfile,
  • lh-tags完全是实验性的,没有记录。它提供了两个功能:在文件保存时自动和快速更新标记文件(ing?),以及<c-w><m-down>默认情况下插入的标记选择器。您可能需要查看著名的标签列表插件。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.