Какой самый простой способ поиска всех полезных файлов внутри одного проекта?

28

Какой самый простой способ поиска регулярного выражения по всему содержимому всех файлов в текущем проекте, пропуская ненужные файлы?

Бесполезные файлы - это такие вещи, как скомпилированные файлы, импортированные библиотеки, файлы контроля версий и т. Д.

Я в курсе rgrep, но он просто ищет все. Есть ли пакет, который выполняет «интеллектуальный» поиск и знает несколько разных языков программирования, поэтому мне не пришлось бы настраивать его для каждого отдельного проекта?

Malabarba
источник
Ваш комментарий «он просто ищет все» rgrepнемного сбивает с толку, учитывая, что он исключает все файлы, соответствующие критериям «бесполезных файлов» по ​​умолчанию.
Филс

Ответы:

32

Поиск по проекту в Emacs может быть выполнен с использованием снаряда .

Это позволяет для конфигурации проекта игнорировать файлы (в <projectroot>\.projectileфайле) или определять подкаталоги для мониторинга и игнорирования всех остальных.

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

Полезные команды

(Что касается поиска полезных файлов)

В соответствии с меткой снаряда

  • 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на всех открытых буферах проекта.

Они будут действовать только на файлы, определенные как часть проекта (или найденные при создании / восстановлении кэша).

Джонатан Лич-Пепин
источник
Спасибо, какую команду снаряда я могу использовать для этого?
Малабарба
Отредактировал его, включив в него подмножество команд (те, которые занимаются поиском, find-file и dired). Полный список находится в пакете readme.
Джонатан Лич-Пепин
13

Поиск всего релевантных файлов в рамках проекта можно выполнить с помощью aga_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 grep

Единственная зависимость это мерзавец

Текстовое копирование выполняется быстрее, чем поиск серебра (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это также программа grep, как git-grep. Я не могу сказать, что быстрее. См. Github.com/BurntSushi/ripgrep, в котором сравнивается производительность популярных программ grep (включая agи git-grep)
chen bin
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 Руби в проекте:

./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
Донато
источник