如何在VIM中导航大型项目

如何在VIM中导航大型项目,vim,editor,Vim,Editor,如何仅使用VIM管理大型项目(数百个文件) 我个人开始在任何比小项目更大的问题 有没有办法快速“转到文件”,最好是用完整的名称 “转到类定义”在另一个文件中时也是如此 我有点了解VIM的所有基础知识,所以在编写脚本或快速编辑一些源代码时使用它不会有问题。但是当我必须在文件之间导航时,它会变得非常混乱。VIM非常支持标记。为项目创建标记文件后,可以跳转到方法、类等的定义或声明,包括在同一个编辑会话中跨文件跳转 试一试 要为C/C++生成标记文件,请转到shell提示符(我假设您的系统是*nix

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

我个人开始在任何比小项目更大的问题

  • 有没有办法快速“转到文件”,最好是用完整的名称
  • “转到类定义”在另一个文件中时也是如此

我有点了解VIM的所有基础知识,所以在编写脚本或快速编辑一些源代码时使用它不会有问题。但是当我必须在文件之间导航时,它会变得非常混乱。

VIM非常支持标记。为项目创建标记文件后,可以跳转到方法、类等的定义或声明,包括在同一个编辑会话中跨文件跳转

试一试

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


我使用NERDTree(目录侧边栏)(像TextMate的CMD+T一样转到文件)和Sessions(:h Sessions)的组合来帮助我处理大型项目

我建议使用一些会话助手插件。我想提一下我用的是什么,但我还不满意。只需谷歌“vim会话”


让FuzzyFinder Textmate工作需要注意的一点是,它依赖于旧版本FuzzyFinder插件,特别是v2.16。任何更高的值都会出现错误。但这绝对值得费心。虽然它没有名称补全,但它的搜索是智能的,因此如果我搜索
fro/time/actionsphp
,它将调出文件
apps/(fro)ntend/modules/(time)\u tracking/actions/(actions).class.(php)
(括号表示匹配的内容)。它可以很容易地找出只有文件夹名称才唯一的文件。

虽然我有点希望有人能指出更好的解决方案,以便我能学到一些东西,但NERDTree对我来说很好,因为只要我扩展了目录树,就可以获得名称完整的特定文件。需要访问文件时的命令类似于:

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

,d打开树,/进入搜索模式,输入文件名(或部分名称,或regex,或其他),然后打开o

当然,如果您没有键入足够的文件名或存在重复文件名,您可能需要点击“n”几次

我承认,像这样使用NERDTree感觉有点像黑客,尽管它已经深入到我的肌肉记忆中,我甚至都没想过它


当然,我也使用CTAG,但只有当光标附近有一个函数并且需要在另一个文件或其他文件中获取其定义时,这些才有用。很多时候,我会说“好的,我现在需要使用feature x”,并且需要导航到另一个没有任何引用的文件,而ctags确实可以提供帮助。

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

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

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

以及宝贵的CTAG和各种相关命令。我也离不开,它允许您将与项目相关联的感兴趣的文件放在单独的窗格中。我不记得有多少设置是定制的,但是如果我想打开一个名为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
“打开项目窗格
/De”搜索“De”,这可能足以找到Debug.c或Debug.h
“打开所选文件并关闭项目窗格
我经常这样做:

: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.
:vsp“垂直拆分窗口
“重新打开项目窗格
#“返回搜索以查找具有相同名称的上一个条目(以查找
如果我在Debug.c:我的头在headers/和中
我的源代码位于source/中,因此标题位于列表的前面
而不是来源)。很明显,我习惯走另一条路。
“在另一个窗口中打开头文件,然后关闭项目窗口。

通过这个相对较短的序列,我可以以垂直分割的方式打开任何文件及其标题。因为项目插件窗口只是一个文本文件,所以可以通过使用Vim的搜索功能来完成。如果您使用的是其他海报推荐的CTAG,那么请确保查看插件

请确保您花时间阅读文档并学习密钥绑定。以下是一些帮助您入门的方法(从TList窗口):

  • o-在新窗口中打开文件
  • t-在“新建”选项卡中打开文件
  • [[或退格-列表中的上一个文件
  • ]]或选项卡-列表中的下一个文件
  • 尝试。我开发的是一个C++ C++ 1GB源文件Project。 我用它来搭配

    这两个插件是最流行的Vim浏览工具的包装:和。

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

    旺盛的CTAG


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

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

    添加到
    ~/.vimrc.local

    set path=$PWD/**
    
    然后在编辑器中键入此项,以在当前工作目录(pwd)中的任何位置查找文件


    您还可以使用文件名上的制表符完成来查找多个选项,这使TextMate转换非常愉快。

    从Vim 7.3开始,
    :find
    命令具有文件名的制表符完成功能

    因此,如果您设置您的
    “路径”
    opt
    <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.
    
    set path=$PWD/**
    
    :find user_spec.rb
    
    :find file_name
    
    gf or gF  - go to file under cursor.