Как получить 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 3

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"']