如何在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.
Ctrl – 6 – 在gf
或gF
之后回到最后的光标位置
gd - go to definition for word under cursor within the file.
也语言不可知论者。
3)API查找和导航到API位置
[i
或[I
可以用来在光标下查找你的函数签名而不用离开你的工作空间。 [<Tab>
实际去声明。 使用Ctrl – 6返回上一个位置。
在不扩展path
,您可以通过:Ex
命令开始浏览文件:Ex
命令并浏览并打开文件。 我喜欢NerdTree
。
尝试SourceCodeObedinece 。 这一个我开发处理C + + 1Gb源文件项目。
我用它与0scan配对 。
这两个插件是最受欢迎的Vim浏览工具的包装: ctags和cscope 。