【问题标题】:How to navigate in large project in VIM如何在 VIM 中导航大型项目
【发布时间】:2010-11-30 06:17:42
【问题描述】:

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

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

  • 有什么方法可以快速“转到文件”,最好是完成名称?
  • “转到类定义”在另一个文件中时也是如此

我有点了解所有 VIM 基础知识,所以我在使用它来编写脚本或快速编辑一些源代码时没有问题。但是当我必须在文件之间导航时,这对我来说真的很乱。

【问题讨论】:

  • 你使用什么语言?
  • 我更喜欢与语言无关的解决方案,但我需要对 C++、PHP 和 Rails 的支持。
  • 您接受了哪个答案? @JakubArnold
  • @xetrasu 我最终使用了NERDTree

标签: vim editor


【解决方案1】:

VIM 对 标签 有很好的支持。为项目创建标签文件后,您可以跳转到方法、类等的定义或声明,包括跨文件跳转,所有这些都在同一个编辑会话中。

试试

:help tags

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

info ctags

ctags --help

【讨论】:

  • Vim 还支持 cscope,它可以让你做一些事情,比如查找调用给定函数的函数 - 请参阅 :help cscope 获取信息。简介中有一个很好的功能列表(在“它旨在回答类似问题”下)。
  • 很遗憾,cscope 对 C++ 的理解非常有限。
【解决方案2】:

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

添加到~/.vimrc.local

set path=$PWD/**

然后在编辑器中输入这个以在当前工作目录(pwd)的任意位置查找文件

:find user_spec.rb

您也可以在文件名上使用制表符补全来查找多个选项,让这个 TextMate 转换非常愉快。

【讨论】:

  • 这个解决方案比 :FC 和插件简单得多,因为不需要缓存,而且......谢谢!
  • Vim 没有读取 wd 作为默认目录。我已经重新启动了shell,它仍然无法正常工作。在执行命令之前还尝试了vim .:/
【解决方案3】:

我结合使用 NERDTree(目录侧边栏)、FuzzyFinder Textmate(像 TextMate 的 CMD+T 一样的转到文件)和会话(:h 会话)来帮助我处理大型项目。

我建议使用一些会话助手插件。我会提到我使用的东西,但我对它还不满意。只需谷歌“vim 会话”。

让 FuzzyFinder Textmate 工作需要注意的一点是,它依赖于旧版本的 FuzzyFinder 插件,特别是 v2.16。任何更高的东西,你都会得到错误。但这绝对值得麻烦。虽然它没有名称完成,但它的搜索很智能,所以如果我搜索fro/time/actionsphp,它会提取文件apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(括号表示它匹配的内容)。它可以很容易地挑选出仅以其文件夹名称唯一的文件。

【讨论】:

  • 我找到了一个我更喜欢并且更容易设置的新插件(至少在我的情况下):CommandT。更快。
  • 一个更新,更强大的工具,写在vim脚本中,所以ctrlp没有外部依赖被janus project使用
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    从 Vim 7.3 开始,:find 命令具有文件名的制表符补全。

    因此,如果您将'path' 选项设置为包含整个项目(可能使用** 通配符以允许递归搜索子目录),那么您可以使用:find:sfind:tabfind 等. 命令完成以获取项目中的任何文件。如果文件名在您的文本中,例如在包含指令中,这也允许直接使用gf 和朋友跳转到文件。

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

    【讨论】:

      【解决方案6】:

      如果您按照其他海报的建议使用 ctags,请务必查看 taglist 插件。

      确保您花时间阅读文档并学习键绑定。这里有一些可以帮助您入门(从 TList 窗口):

      • o - 在新窗口中打开文件
      • t - 在新标签页中打开文件
      • [[ 或退格 - 列表中的前一个文件
      • ]] 或制表符 - 列表中的下一个文件

      【讨论】:

        【解决方案7】:

        丰富的 ctags。

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

        【讨论】:

          【解决方案8】:

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

          然后,这开启了许多以下可能性。

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

          :find file_name
          

          您可以可靠地使用 :find 的自动完成和通配符扩展。您键入名称,它会找到该名称。这与语言无关。我相信你会喜欢的。

          2) 导航到光标下的文件:
          如果你想去像#include "project/path/classA.h这样的文件路径。

          gf or gF  - go to file under cursor.   
          

          Ctrl-6 - 返回到gfgF 之后的最后一个光标位置

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

          [i[I 可用于在不离开工作区的情况下查找光标下单词的函数签名。 [&lt;Tab&gt; 实际去申报。使用 Ctrl-6 返回上一个位置。


          不扩展path,您可以通过:Ex 命令开始导航文件并导航并打开您的文件。不过我更喜欢NerdTree

          【讨论】:

          • 谢谢,路径选项非常强大。在哪里可以找到关于 [&lt;Tab&gt; 的文档,在任何地方都找不到?
          • [&lt;Tab&gt; 我认为这是从 Bram Moolenar 的 7 七个高效编辑习惯中得到的,我认为
          • 谢谢。找到了moolenaar.net/habits_2007.pdf
          【解决方案9】:

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

          【讨论】:

          • 哇,这就像最容易使用的插件。涉及零设置.. 只需在您的根目录中FC .,然后输入:FF,开始输入您想要的文件名,您就完成了。我仍在尝试弄清楚如何在新标签中启动..
          • 另外值得注意的是,如果你使用这个,每次你启动vim,你都需要重做:FC .来缓存那个目录中的文件。
          • 这里是 FindFile.vim 的更新版本,带有 :FT:FindTabNew gist.github.com/1104884
          【解决方案10】:

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

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

          ,d 打开树,/ 进入搜索模式,文件的名称(或部分名称,或正则表达式,或其他),然后 o 打开。

          当然,如果您没有输入足够多的文件名或有重复文件名,您可能需要按几次“n”。

          我承认像这样使用 NERDTree 感觉有点像 hack,尽管它已经深入到我的肌肉记忆中,以至于我什至都没有考虑过。

          当然,我也使用 ctags,但只有当您在光标附近有一个函数并且需要在另一个文件或其他文件中找到它的定义时,它们才有用。很多时候我说“好的,我现在需要处理功能 x”并且需要导航到另一个文件,而附近没有任何 ctags 真正可以帮助的引用。

          【讨论】:

          • 我又看了一些,fuzzyfinder 看起来是个项目搜索的好主意。
          【解决方案11】:

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

          • searchInRuntime 在命令行上完成文件名。它有点类似于fuzzyfinder 和lookupfile,
          • lh-tags 完全是实验性的,没有记录。它提供两个功能:在文件保存时自动快速更新标记文件(ing?),以及默认插入到&lt;c-w&gt;&lt;m-down&gt; 的标记选择器。您可能需要检查著名的 taglist 插件。

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

          【讨论】:

            【解决方案12】:

            试试SourceCodeObedinece。这是我为处理 C++ 1Gb 源文件项目而开发的。
            我将它与0scan 配对使用。

            这两个插件封装了最流行的 Vim 浏览工具:ctagscscope

            【讨论】:

              猜你喜欢
              • 2013-01-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-12-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-14
              相关资源
              最近更新 更多