Как получить Vim Ctrl-P плагин для индексирования файлов внутри подмодуля git
Если я запускаю Ctrl-P изначально из коробки, он работает на 100% так, как я хочу, за исключением того, что с размером кодовой базы, с которой я работаю, индексирование каталогов занимает очень много времени.
Чтобы Ctrl-P справлялся с размерами проекта, с которым я имею дело, я использую следующую (довольно популярную) настройку user_command в моем .файл vimrc для предоставления собственных вспомогательных утилит для более быстрого предоставления 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, включая файлы во всех его подмодулях, кроме использования его медленного встроенного поиска?3 ответа:
Вы можете использовать find with options, чтобы отфильтровать файл, который вам не нужен, например:
find . -type f \( -name "*.cpp" -or -name "*.h" \)
Или удаление .каталоги git:
find . -path '.git' -prune -o -print
Но это не умное решение.
Вы можете использовать ack, который пропускает VCS dirs, как .мерзавец, .СВН, .hg и др.
Я часто использую ack на работе, он отлично подходит для глобального поиска и замены. Я когда-то найти, трубопроводов, которые в размер с Perl и один лайнер регулярных выражений. К сожалению, это полностью уничтожило код в моем .ГИТ реж. Я не смог зафиксировать свои изменения, а также не смог извлечь, сбросить или отменить их в этот момент. После этого мне пришлось заново проверять кодовую базу! Ack значительно легче использовать, чем найти при попытке исключите каталоги, просто используйте флаг --ignore-dir (или --noignore-dir для поиска в каталогах, отличных от стандартных).
Я использую 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"']