如何仅使用VIM来管理大型项目(数百个文件)?
对于我个人而言,在小型项目之外,我开始遇到问题。
- 是否有任何快速“转至文件”的方法,最好带有名称自动完成功能?
- 同样适用于“转至类定义”,当它在另一个文件中时。
我基本掌握了所有VIM的基础知识,所以我在编写脚本或快速编辑某些源代码方面没有问题。但是当我必须在文件之间导航时,情况变得非常混乱。
VIM非常支持标签。一旦您为项目创建了标签文件,您可以跳转到方法、类等的定义或声明,甚至跨越文件,所有这些都在同一个编辑会话中完成。
试试吧。
:help tags
要为C/C++生成标签文件,请转到您的shell提示符(我假设您的系统是*nix / Cygwin),然后输入以下命令:
info ctags
或者ctags --help
:help cscope
。在介绍中有一个很好的功能列表(在“它旨在回答以下问题”下)。 - Cascabel我喜欢简单的解决方案,目前我最喜欢的导航方式是:
将以下内容添加到~/.vimrc.local
中
set path=$PWD/**
然后在编辑器中输入以下内容,即可在当前工作目录(pwd)中查找文件。
:find user_spec.rb
你可以使用文件名的Tab键自动补全功能,以便查找多个选项,这将使得像TextMate这样的编辑器非常高兴。我使用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)
(括号表示匹配内容)。这样非常容易挑选出仅由文件夹名称区分的文件。
除了不可或缺的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的搜索功能实现自动完成。
:find
命令支持文件名的tab补全。所以,如果你把'path'
选项设置为包含整个项目(可能使用**
通配符允许递归搜索子目录),那么你可以使用带有补全的:find
、:sfind
、:tabfind
等命令来访问您项目中的任何文件。此方法还允许直接通过gf
和其他类似命令跳转到文本中的文件名,例如在include指令中。从源代码文件的根目录打开vim
,并扩展path
选项以包括其中的所有子目录。
例如,对于C++头文件,使用set path+=/usr/include/c++/**
,对于源目录,使用set path+=**
。
这样,就会打开以下各种可能性。
1)按名称或部分名称打开文件
:find file_name
:find
进行自动补全和通配符扩展。你只需输入文件名称,它就可以定位到该文件,此方法与语言无关。我相信你会喜欢它。#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
。
[<Tab>
在哪里可以找到文档?我在任何地方都找不到它。 - MosaalebExuberant ctags.
使用 Ctrl-] 跳转到光标下的标签。
我使用FindFile插件。如果你在项目的根目录下打开vim,并执行:FC .
命令,该插件将缓存当前工作目录下所有的文件名。接着,你可以执行:FF
命令打开一个完成菜单,并输入你想要找的文件名(或者前几个字符)。
FC .
,然后输入 :FF
,开始键入您想要的文件名,完成了。不过我还在尝试弄清楚如何在新标签页中启动... - tester:FC .
来缓存该目录中的文件。 - tester:FT
或者:FindTabNew
https://gist.github.com/1104884 - tester虽然我希望有人能指出更好的解决方案,这样我就可以学到更多东西,但是NERDTree对于使用名称完成来获取特定文件对我非常有用,只要我展开了树。当我需要访问文件时,命令如下:
,d/foo.pyo (其中foo.py是文件名)
,d打开树,/进入搜索模式,输入文件的名称(或部分名称、正则表达式等),然后按o打开。
当然,如果您没有输入足够的文件名或存在重复项,则可能需要按“n”几次。
我承认像这样使用NERDTree感觉有点像黑客,尽管现在它已经深入我的肌肉记忆中,我甚至不会考虑它。
当然,我也使用ctags,但那些只在光标附近有函数并且需要转到另一个文件中的定义时才有用。很多时候我会说“好的,现在我需要处理x功能”,而没有任何参考附近,ctags真的没有什么帮助。
NERDTree
。 - Jakub Arnold