16

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

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

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

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

4 ответа4

19

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

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 работает для меня.)

9

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

.git/
.hg/
.svn/

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

Добавьте Серебряный Искатель как бэкэнд с этим в вашем .vimrc

let g:ctrlp_user_command = 'ag %s -l --nocolor --hidden -g ""'
5

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

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

node_modules/
\.log$
...

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

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

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

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. белый список вместо черного списка также возможен. Более удобно, если реализовано в отдельном скрипте

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .