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版。再高一点就会出错。但这绝对值得麻烦。虽然它没有名称完成,但它的搜索是智能的,因此如果我搜索
以及无价的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开始,
因此,如果您将
使用这种方法,不需要外部工具或插件来导航到特定的文件。尽管如此,它可能不会像以前那样快速或易于使用,也不会满足跳转到定义的需要。对于定义,我使用CTags作为其他答案的建议。
活力四射。
使用ctrl-]跳转到光标下的标记。
如果你按照其他海报的建议使用ctags,那么一定要查看标签列表插件。
确保花时间阅读文档并学习键绑定。以下是一些要开始的内容(从tlist窗口):
- o-在新窗口中打开文件
- t-在新选项卡中打开文件
- [或退格键-列表中的上一个文件
- ]]或选项卡-列表中的下一个文件
我使用findfile。如果在项目根目录下打开vim并运行
从源文件的根目录打开
然后,这就开启了一系列以下可能性。
1)按名称或部分打开文件
1 | :find file_name |
您可以在
2)导航到"错误"下的文件:如果您想使用像
1 | gf or gF - go to file under cursor. |
ctrl-6-返回到
1 | gd - go to definition for word under cursor within the file. |
也是语言不可知论者。
3)API查找和导航到API位置
可以使用
在不扩展
我正在使用我的两个插件:
- 在命令行上完成文件名的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的包装。