Могу ли я заставить плагин Vim Ctrlp игнорировать определенную папку в одном проекте?

17

Плагин Vim Ctrlp имеет возможность глобально игнорировать определенные имена папок. Например:

let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'

Тем не менее, у меня есть правило игнорирования, характерное для одного проекта. Я хотел бы что-то более похожее на .gitignoreфайл.

Есть ли способ игнорировать определенную папку в конкретном проекте без изменения моей глобальной конфигурации?

Натан Лонг
источник
Вы пробовали трекер проблем с плагином?
Ромен

Ответы:

20

Используйте пользовательскую команду листинга

Ctrlp позволяет вам указать, какую команду использовать для получения списка файлов в папке. Поэтому, если вы хотите исключить что-либо по имени beets.txt, вы можете сделать:

let g:ctrlp_user_command = 'find %s -type f | grep -v "beets.txt"'

Это глобально, но оно начинает указывать на ответ: введите собственную команду оболочки.

Более того, Ctrlp позволяет вам вводить несколько команд оболочки с маркерами, что означает «если вы видите этот маркер в корневом каталоге, используйте эту команду».

Я нашел это :help ctrlpи немного изменил, основываясь на комментарии автора к проблеме.

let g:ctrlp_user_command = {
  \ 'types': {
    \ 1: ['.git', 'cd %s && git ls-files --cached --exclude-standard --others'],
    \ 2: ['.hg', 'hg --cwd %s locate -I .'],
    \ },
  \ 'fallback': 'find %s -type f'
  \ }

Это означает: «Если вы видите .gitв папке, используйте git ls-files.... В противном случае, если вы видите .hg, используйте hg --cwd..., в противном случае используйте обычный find».

Таким образом, чтобы игнорировать определенную папку в одном проекте, разработайте команду, которая будет игнорировать эту папку, а затем поместите уникальный маркер в этом проекте, чтобы позволить Ctrlp использовать эту специальную команду здесь .

(В моем случае я на самом деле хотел игнорировать файлы, которые были внутри .gitignore, поэтому git ls-filesкоманда выше работает для меня.)

Натан Лонг
источник
Это потрясающе, большое спасибо за этот ответ.
Денис
git -C% s ls-files --cached --exclude-standard - остальные должны работать для git.
Арунпрасад Раджкумар
11

Если вы используете бэкэнд Silver Searcher для CtrlP (что намного быстрее), просто добавьте .agignoreфайл в каталог вашего проекта в том же формате, что и .gitignore:

.git/
.hg/
.svn/

Кроме того, сохранить глобальный ~/.agignoreфайл.

Добавьте Silver Searcher в качестве бэкэнда с этим в вашем .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
Адарш
источник
1
Спасибо за публикацию этого. Чтобы добавить еще один пункт данных: я адаптировал это if executable("ag") let g:ctrlp_user_command = 'ag %s -l --nocolor --depth 8 -g ""' endif . Ограничение глубины полезно, если я случайно нажал ctrl-p при редактировании файла в моей домашней папке. Я обнаружил, что скрытый флаг будет включать файлы в .git /
Эрик Ху
6

Определяет намеренно неотслеживаемые файлы в файле

Чтобы решить это с помощью файла, как .gitignore (основанного на решении Nathan grep), я создал файл с именем .ctrlpignoreи поместил шаблоны, которые следует игнорировать, разделив их строками:

node_modules/
\.log$
...

И моя конфигурация ctrlp:

let g:ctrlp_user_command = 'find %s -type f | grep -v "`cat .ctrlpignore`"'

Возможно, .gitignoreсам по себе можно использовать для игнорирования файлов в ctrlp, без необходимости создавать новый файл, чтобы сделать почти то же самое.

19WAS85
источник
Я добавил этот фрагмент, но он нарушает общее поведение ctrlp, если я набираю orderscontroller, он находит только файлы _spec, а не фактический файл orders_controller.rb.
джедай
1

Как сказал Вагнер Андраде , .ctrlpignoreбыло бы неплохо использовать отдельно .

Более надежная и удобная настройка vim выглядит следующим образом:

let g:ctrlp_user_command = 'cd %s;
  \ commonfilter="\.(jpg|bmp|png|jar|7z|zip|tar|gz|tgz|bz)$";
  \ if [ ! -r ".ctrlpignore" ]; then
  \   find . -type f | grep -Evi "$commonfilter";
  \ else
  \   find . -type f | grep -vF "$(cat .ctrlpignore)" | grep -Evi "$commonfilter";
  \ fi'

.ctrlpignoreможет быть помещен в любой каталог, который будет распознан как корневой каталог ctrlp. Вот пример, каждая строка начинается с./

vim ~/.ctrlpignore

./Desktop
./R
./.vim
./.local/lib
.....

Замечания:

  1. grep -Fбудет интерпретировать шаблон, напр. «./.tmp», как фиксированная строка, если вы не хотите, чтобы ваш «./ptmp» был отфильтрован. Есть еще некоторые тривиальные ошибки: './.tmp' также отфильтрует './.tmp2'. Забудь об этом, мне не нравится\.

  2. g:ctrlp_custom_ignoreбудет проигнорировано, если g:ctrlp_user_commandустановлено. Это можно сделать в более сложномg:ctrlp_user_command

  3. белый список вместо черного списка также возможен. Более удобно, если реализовано в отдельном скрипте

Жажа
источник