【问题标题】:How to get Vim Ctrl-P plugin to index files inside a git submodule如何让 Vim Ctrl-P 插件在 git 子模块中索引文件
【发布时间】:2013-02-06 07:17:24
【问题描述】:

如果我开箱即用地运行 Ctrl-P,它可以 100% 正常工作,除了我使用的代码库的大小,索引目录需要很长时间。

为了让 Ctrl-P 适应我正在处理的项目大小,我在我的 .vimrc 文件中使用以下(相当流行的)user_command 设置来提供本机帮助工具,以便更快地为 Ctrl-P 提供可用文件列表:

if has("unix")
    let g:ctrlp_user_command = {
    \ 'types': {
        \ 1: ['.git/', 'cd %s && git ls-files']
    \ },
    \ 'fallback': 'find %s -type f | head -' . g:ctrlp_max_files
    \ }
endif

这种方法使索引速度非常快,但是当以这种方式配置时,Ctrl-P 不会像在没有帮助程序的情况下运行时那样了解 git 子模块的内容(因为 'git ls-files' 不会递归进入子模块,而 Ctrl-P 的幼稚目录遍历确实如此)。

我也尝试使用“查找”来索引 git 存储库,但是当我这样做时,我最终会索引 .git 目录、目标文件以及 Ctrl-P 通常知道会自动忽略的各种其他东西;似乎提供 user_command 完全取代了有关要忽略哪些文件的内置逻辑。我可能可以组合一个逆 grep 来删除某些元素,但似乎有人必须想出一个更优雅的解决方案。

除了依靠其缓慢的内置搜索之外,还有其他更聪明的方法可以让 Ctrl-P 索引 git 存储库中的所有文件,包括其所有子模块中的文件?

【问题讨论】:

  • It looks 就像 Git 不会跟踪子模块中的文件。您必须主动添加它们以供git ls-files 显示。

标签: git vim git-submodules vim-plugin


【解决方案1】:

您可以使用带有选项的 find 来过滤掉您不想要的文件:

find . -type f \( -name "*.cpp" -or -name "*.h" \)

或删除 .git 目录:

find . -path '.git' -prune -o -print

但这不是一个智能解决方案。

【讨论】:

  • -path '.git' 命令对我不起作用,因为find . 提供了前面带有“./”的路径。 find * -path '.git' -prune -o -print(排除顶层的“.git”目录)或find . -name '.git' -prune -o -print(排除搜索中任何位置的“.git”文件和目录)都可以。正如您所说,这些并不是真正的智能解决方案,但它们会在紧要关头发挥作用,而后者是我目前实际使用的。
【解决方案2】:

您可以使用ack,它会跳过 VCS 目录,例如 .git、.svn、.hg 等。

我在工作中经常使用 ack,它非常适合全局查找和替换。我曾经 find 一次,用 perl one liner 正则表达式将其管道传输到 xargs 中。不幸的是,这完全破坏了我的 .git 目录中的代码。我无法提交我的更改,也无法在那时结帐、重置或恢复。之后我不得不重新检查代码库!在尝试排除目录时,Ack 比 find 更容易使用,只需使用 --ignore-dir 标志(或 --noignore-dir 来搜索非默认目录)。

【讨论】:

  • 我认为这与列出文件无关,但我同意 ack 对于程序员来说是 grep 的绝佳替代品。我最近从 ack 切换到 the silver searcher ("ag"),它甚至更快.. 并且可能与 'grep' 工具一样快,而无需像 ctags 那样预先构建索引。值得一看,如果您还没有这样做的话。
  • 其实挺相关的。您可以很容易地将 ag 挂接到 CtrlP 中。没有无用的文件会以荒谬的速度阻塞您的比赛。这是我的配置:github.com/Wolfy87/vim-config/blob/…
【解决方案3】:

我使用 git-submodule-foreach 进入子模块并在那里运行ls-files(将子模块路径添加到这些文件名):

let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard && git submodule foreach "git ls-files -co --exclude-standard | while read i; do echo \"\$path/\$i\"; done"']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2012-04-20
    • 2010-11-28
    相关资源
    最近更新 更多