如果我开箱即用本地运行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的天真目录遍历确实如此。
我也尝试使用'find'来索引git存储库,但是当我这样做时,我最终会编制.git目录,目标文件以及Ctrl-P通常知道自动忽略的各种其他东西;似乎提供user_command完全取代了要忽略哪些文件的内置逻辑。我可能会破解一个反向grep以删除某些元素,但似乎有人必须找到一个更优雅的解决方案。
是否还有另一种更聪明的方法是让Ctrl-P索引git存储库中的所有文件,包括其所有子模块中的文件,而不是诉诸慢速内置搜索?
答案 0 :(得分:1)
您可以使用find with options过滤掉您不想要的文件:
find . -type f \( -name "*.cpp" -or -name "*.h" \)
或删除.git目录:
find . -path '.git' -prune -o -print
但这不是智能解决方案。
答案 1 :(得分:1)
你可以使用ack,跳过VCS目录,如.git,.svn,.hg等。
我在工作中使用了很多ack,它非常适合全局查找和替换。我使用了一次,用一个perl one liner regex将其用于xargs。不幸的是,这完全破坏了我的.git目录中的代码。我无法提交更改,无法在此时签出,重置或还原。之后我不得不重新检查代码库!尝试排除目录时,Ack比查找更容易使用,只需使用--ignore-dir标志(或--noignore-dir搜索非默认值)。
答案 2 :(得分: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"']