Чи можу я отримати плагін Vim Ctrlp для ігнорування конкретної папки в одному проекті?


17

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

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

Однак у мене є правило ігнорування, характерне для одного проекту. Я хотів би щось більше, як .gitignoreфайл.

Чи є спосіб ігнорувати певну папку в конкретному проекті без зміни моєї глобальної конфігурації?


Ви спробували відстежувати проблему плагіна?
romainl

Відповіді:


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-файли --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(заснованого на греп-рішенні Натана), я створив файл з ім’ям .ctrlpignoreі поставив шаблони, які слід ігнорувати, розділені рядками:

node_modules/
\.log$
...

І моя конфігурація ctrlp:

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

Можливо, .gitignoreсам може бути використаний для ігнорування файлів у ctrlp, не потрібно створювати новий файл, щоб зробити майже те саме.


Я додав цей фрагмент, але він порушує поведінку ctrlp в режимі overral, якщо я набираю ordercontroller, він знаходить лише файли _spec, фактичних файлів order_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може бути поміщений у будь-який dir, який був би розпізнаний ctrlp як кореневий dir. Ось приклад, з якого починається кожен рядок./

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. Білий список замість чорного списку також можливий. Більш зручно, якщо він реалізований в окремому сценарії

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.