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

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

我个人开始在小项目中遇到问题。

  • 有什么办法可以快速“去档案”,最好用名字完成?
  • 当它在另一个文件中的时候,“去类定义”也一样

我知道所有的VIM基础知识,所以我没有问题用它来编写脚本或快速编辑一些源代码。 但是当我不得不在文件之间导航的时候,它变得非常麻烦。

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

尝试

:help tags 

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

 info ctags 

要么

 ctags --help 

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

添加到~/.vimrc.local

 set path=$PWD/** 

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

 :find user_spec.rb 

你可以使用tab-completion在文件名上find多个选项,这使得TextMate转换非常开心。

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

我会build议使用一些会话助手插件。 我会提到我使用的,但我还不满意。 只是谷歌“VIM会议”。

获得FuzzyFinder Textmate工作的一点是,它依赖于旧版本的FuzzyFinder插件,特别是v2.16。 任何更高的,你会得到错误。 但这绝对是值得的麻烦。 虽然它没有名称完成,它的search是聪明的,所以如果我searchfro/time/actionsphp它将拉起文件apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php) (括号表示它是什么匹配)。 通过文件夹名称可以很容易地选出唯一的文件。

以及无价的ctags和各种相关的命令。 我也不能没有项目插件 ,它允许你在一个单独的窗格中有一个与项目相关的感兴趣的文件。 我不记得我的设置有多less是自定义的,但是如果我想打开一个名为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的searchfunction来完成。

从Vim 7.3开始, :find命令已经完成了文件名的select。

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

使用这种方法,不需要外部工具或插件来导航到特定的文件。 虽然,可以肯定的是,使用起来并不是那么快,也不容易,也没有解决跳到定义的需要。 对于定义,我使用ctags作为其他答案build议。

如果您正在使用其他海报推荐的ctags,那么请确保您查看taglist插件。

确保您花时间阅读文档并学习关键绑定。 这里有几个让你开始(从TList窗口):

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

我使用FindFile 。 如果在项目的根目录下打开vim并运行:FC . 该插件将caching您的cwd下的所有文件名。 你可以这样做:FF打开一个完成菜单并input你想要的文件名(或者说,前几个字母)。

繁荣的标签。

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

虽然我有点希望有人会指出一个更好的解决scheme,所以我可以学到一些东西,只要我扩大了树,NERDTree对于获得具有完成名称的特定文件已经很好。 当我需要去一个文件的命令是这样的:

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

,d打开树,/进入search模式,文件的名称(或部分名称,或正则expression式,或其他),然后打开。

当然如果你没有input足够的文件名或者有重复的话,你可能需要敲几次。

我承认这样使用NERDTree就像是一种黑客攻击,尽pipe它现在已经深入到我的肌肉记忆中,甚至我都没有想过。

当然,我也使用ctags,但只有在光标附近有一个函数,并且需要在另一个文件或其他地方定义它时,这些才有用。 很多时候,我说“好吧,我现在需要在functionx上工作”,并需要导航到另一个文件,没有任何附近的ctags真正帮助的引用。

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

  • 在命令行上完成文件名的searchInRuntime 。 它与模糊查找器和查找文件类似,
  • lh标签 ,这是完全实验和无证。 它提供了两个function:自动和快速更新文件save(ing?)上的标签文件,以及默认情况下插入<cw><m-down>的标签select器。 您可能需要检查着名的taglist插件。

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

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

这就为我们打开了许多以下的可能性。

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

 :find file_name 

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

2)导航到错误的文件:
如果你想要像#include "project/path/classA.h这样的文件path。

 gf or gF - go to file under cursor. 

Ctrl6 – 在gfgF之后回到最后的光标位置

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

也语言不可知论者。

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

[i[I可以用来在光标下查找你的函数签名而不用离开你的工作空间。 [<Tab>实际去声明。 使用Ctrl6返回上一个位置。


在不扩展path ,您可以通过:Ex命令开始浏览文件:Ex命令并浏览并打开文件。 我喜欢NerdTree

尝试SourceCodeObedinece 。 这一个我开发处理C + + 1Gb源文件项目。
我用它与0scan配对 。

这两个插件是最受欢迎的Vim浏览工具的包装: ctags和cscope 。