Який найпростіший спосіб пошуку всіх корисних файлів в одному проекті?


28

Який найпростіший спосіб пошуку повторної копії вмісту всіх файлів у поточному проекті, пропускаючи непотрібні файли?

Марні файли - це такі, як компільовані файли, імпортні бібліотеки, файли з контролем версій тощо.

Я знаю rgrep, але це просто все шукає. Чи є пакет, який шукає "інтелігентно" і знає про декілька різних мов програмування, тож мені не доведеться конфігурувати його для кожного окремого проекту?


Ваш коментар "він просто шукає все" rgrepтрохи заплутаний, враховуючи, що він за замовчуванням виключає всі файли, що відповідають вашим критеріям "непотрібних файлів".
філс

Відповіді:


32

Пошук на базі проекту в Emacs можна здійснити за допомогою снаряда .

Він дозволяє конфігурувати файли ігнорування (у <projectroot>\.projectileфайлі) за проектом або задавати підкаталоги для моніторингу та ігнорування всіх інших.

Він може працювати grep, ack(потрібно ack-and-a-half.el) і ag( ag.el) на файли в певному проекті (або на основі .projectileфайлу або знаходячи підтримуваний VC - файл , щоб визначити корінь проекту).

Корисні команди

(Що стосується пошуку корисних файлів)

Відповідно до Readme Readme

  • C-c p s g :: Запуск grepфайлів у проекті.
  • C-c p s a :: Працює ackнад проектом. Вимагає присутності в півтора.
  • C-c p s s :: Працює agнад проектом. Потрібна наявність аг.ел.
  • C-c p f :: Відобразить список усіх файлів у проекті.
  • C-c p d :: Відобразить список усіх каталогів проекту.
  • C-c p a :: Перемикання між файлами з однаковою назвою, але різним розширенням у проекті.
  • C-c p o:: Працює multi-occurз усіма відкритими в даний час буферами проектів.

Вони діятимуть лише у файлах, визначених як частина проекту (або знайдених, коли кеш генерується / регенерується).


Дякую, яку команду снаряда я можу використовувати для цього?
Малабарба

Відредагував його, щоб включити підмножину команд (ті, що займаються пошуком, пошуку-файлом та діред). Повний список знаходиться в пакеті readme.
Джонатан Ліч-Пепін

13

Пошук у межах проекту лише відповідних файлів можна здійснити за допомогою agaka the_silver_searcher .

Чому аг?

  • Він ігнорує шаблони файл з .gitignore, .hgignore, svn:ignore. Ви можете вибрати для своїх пошуків НЕ використовувати список ігнорів зі списку ігнорувань версії за допомогою -Uперемикача.
  • Якщо у вихідному репо-файлі є файли, які ви не хочете шукати, просто додайте їхні шаблони у .agignoreфайл.
    • Глобальний .agignoreфайл може бути поміщений у ваш, $HOMEа потім ви можете розмістити більше .agignoreфайлів, визначених для проекту, у коренях проекту.

Налаштування agта emacs

  • Встановіть agaka the_silver_searcher у вашій системі.
  • Налаштуйте .agignoreфайл. Я вважаю за краще мати лише глобальний .agignoreфайл у своєму $HOME.
  • Встановіть agпакет (доступний у Melpa).
  • Потім ви можете скористатися функцією ag-projectабо ag-project-regexp(яка постачається разом з agпакетом) для пошуку загальнопроектних пошукових файлів.
    • За замовчуванням ці функції використовують корінь репо VCS як каталог для пошуку. Ви можете змінити це, встановивши або налаштувавши ag-project-root-function.
    • Навіть якщо ваш проект не контролюється git, ви можете позначити корінь проекту для пошукових запитів ag-project/ ag-project-regexpна основі, вставивши порожню .gitпапку в корінь проекту. Тоді вам не потрібно налаштовувати ag-project-root-function.

4

Якщо ваш проект використовує Git, вам потрібен лише counsel https://github.com/abo-abo/swiper

  • counsel-git знайти файл

  • counsel-git-grep грепати

Єдина залежність - git

Відображення тексту швидше, ніж шукач срібла (AG)

Адвокат пропонує також інші потужні інструменти. Наприклад, після запуску counsel-git-grepви можете натиснути C-c C-oта C-x C-qувійти, wgrep-modeщоб легко замінити текст у межах проекту.

Є стаття https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/, що пояснює деталі. Ця стаття використовує counsel-ag(інша команда, вбудована в пораду), але cousnel-git-grepвикористовує точно такий же робочий процес.


Але як прийти текстове схвалення швидше, ніж ag? Чи можете ви, будь ласка, докладно?
denis631

1
agтакож є програма греп, як git-grep. Я не можу сказати, що швидше. Дивіться сторінку github.com/BurntSushi/ripgrep, де порівнюється ефективність популярних програм grep (включаючи agі git-grep)
Чень Бін

1

Перша відповідь прекрасна, але вона залишає деякі критичні деталі про сучасні версії Emacs. Я сам знав Emacs, тому інші прибульці можуть не знати про це. З огляду на те, що ваша мета - пошук тексту ВІД файлу в ПРОЕКТІ, ви спочатку встановите Projectile за допомогою сховища MELPA.

Це встановлює пакет у .emacs.d і додає базову конфігурацію до .emacs у вашому каталозі $ USER (якщо припустити, що ви створили файл .emacs), наприклад, вимагаючи Projectile у вашій установці Emacs.

Однак вам все-таки потрібно ввімкнути його та пов’язати префікси клавіатури, щоб ви могли викликати його у міні-буфері.

У прийнятій відповіді згадується така команда:

C-c p s g

Це не спрацює, якщо ви не налаштуєте Projectile з цим префіксом картки. Але я налаштував його на використання Cc Cp як команди для Project у .emacs:

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

Враховуючи це, я можу виконувати пошук тексту у файлах проекту за допомогою grep:

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

Щоб зламати його, C-c C-pвикличе Projectile і s gздійснить пошук grep. Ви отримаєте такий прекрасний вихід, якщо припустити, що Ви шукаєте visit_contactі шукаєте rspec Ruby в проекті:

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.