3

如果我开箱即用地运行 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 存储库中的所有文件,包括其所有子模块中的文件?

4

3 回答 3

2

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

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

或删除 .git 目录:

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

但这不是一个聪明的解决方案。

于 2013-02-06T13:23:16.900 回答
1

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

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

于 2013-02-23T08:34:40.390 回答
0

我使用 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"']
于 2017-09-08T18:47:05.053 回答