Я использую Emacs в течение достаточно долгого времени, и я до сих пор почему-то не могу понять, каков наилучший (рекурсивно) grep для строки в каталоге (проекта) и получения результатов, представленных в виде буфера с задержкой или в некоторых других полезный способ. Пожалуйста, просветите меня.
14
helm-projectile-grep
команду (если у вас установлен снаряд шлем) илиprojectile-grep
?helm
илиprojectile
есть, но если это рекомендуемый инструмент, я бы установил и изучил его.projectile-grep
. Также я НАСТОЯТЕЛЬНО рекомендую вам установитьhelm
пакет. Я не могу представить себе запуск Emacs безhelm
иhelm-projectile
. Вы также можете быть заинтересованы вhelm-ag
пакете (который предоставляет интерфейс helm для поисковика серебра в emacs, который предположительно быстрее, чем grep или ack).M-x grep
не делает то, что вам нужно. Это даст вам произвольную командную строку, которую я иногда используюfind
там, когда мне нужна рекурсия.Ответы:
Ну, поскольку оригинальный вопрос не упоминается
rgrep
, я пойду дальше и укажу здесь. Это самый простой вариант, уже встроенный в Emacs, и я обнаружил, что его более чем достаточно для большинства вещей.Из документации,
Поиск ограничен именами файлов, соответствующими шаблону оболочки FILES.
Так, например, чтобы найти все файлы питона под моей домашней директории для использования
some_function
, я бы назвал егоsome_function
,*.py
, в~/
качестве аргументов. Результаты отображаются в новом буфере.источник
find-grep-dired
find-grep-dired
себя, не стесняйтесь добавлять его в ответ.rgrep
, есть смысл , но в Emacs такая хорошая работа направлена на поиск, что между ними не было значительных различий в скорости. (Я хочу сказать, что в некоторых случаях rgrep был немного быстрее , но точно не помню.)next-error
иprevious-error
может использоваться для навигации по набору результатов. Я нахожуM-g M-n
иM-g M-p
самые удобные из стандартных привязок.find-grep-dired
не дает мне буфер с перекрестными ссылками.rgrep
делает это для меня, и это последнее предложение оnext-error
previous-error
фантастическом! Единственное, что я могу сказать, это то, что все запутанные команды выводятся в начале буфера.Я с удовольствием пользуюсь
M-x find-grep-dired
годами. Он возвращает результаты в виде буфера Dired, который вы можете использовать.источник
find-ls-option
), и в конце концов вы получите нечто довольно многословное, потому что оно не работает без даты перед именем файла!Решение 1 (лучшее решение):
Установить адвокат ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Потом
M-x counsel-git-grep
.Никаких настроек не требуется (git знает корень проекта и файлы для исключения). И то,
git grep
и другоеcounsel
эффективно.Проект должен управляться git.
адвокат требует режима плюща.
Решение 2:
Это решение использует grep и работает на любом проекте. Он уступает Solution 1, потому что он медленнее и требует ручной настройки. Он также основан на режиме плюща.
Вам нужно создать .dir-locals.el для настройки
simple-project-root
, см. Https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html для технических деталей.Код в решении 2 - просто прототип. Моя реальная реализация намного сложнее. Смотрите
counsel-etags-grep
в https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.elРезюме:
Это два лучших решения, которые я знаю.
Если существуют какие-либо другие лучшие решения, они должны по крайней мере решить следующие проблемы, чтобы быть готовыми к производству,
как получить ключевое слово для grep (например, получить ключевое слово из выбранного региона)
избежать ключевого слова
если существует более эффективная программа grep, мы должны использовать ее (ripgrep, the_silver_searcher / ag, ... и т. д.), либо использовать альтернативный вариант grep по умолчанию
Окно кандидата должно использовать всю ширину экрана, и пользователи могут фильтровать кандидатов в интерактивном режиме (именно поэтому люди используют плющ или шлем)
мы должны показать относительный путь в окне кандидата
возможность повторно использовать предыдущий результат. Таким образом, предыдущий результат должен быть сохранен. Вы можете использовать
ivy-resume
отivy
илиhelm-resume
отhelm
Когда вы сохраняете предыдущий полученный результат, контекст предыдущего результата также должен быть сохранен. Например, в коде решения 2.
default-directory
есть контекст. См. Https://github.com/abo-abo/swiper/issues/591 для получения дополнительной информации.Расширенное регулярное выражение следует использовать, потому что оно проще и уже используется
counsel-git-grep
the_silver_searcher / ag.источник
Я хотел бы добавить еще одно решение к решению @chen bin, которое также использует
counsel
(но для этого вам не нужно поддерживать проектgit
).Вам нужно установить ag (серебряный поисковик) и
counsel
предоставить команду,counsel-ag
которая ищет в текущем каталоге введенную строку.Если вы хотите искать в проекте (а не только в текущем рабочем каталоге), добавьте это в
.emacs
:Эта функция будет использоваться
ag
для рекурсивного поиска в корневом каталоге проекта.Редактировать : вышеупомянутая функция по умолчанию является символом в точке поиска. Если вам не нравится это поведение, замените
(thing-at-point 'symbol)
наnil
. И если вы хотите результаты поиска в своем собственном буфере, нажмитеC-c C-oEdit2 : если вы
ripgrep
установили, вы можете заменитьcounsel-ag
сcounsel-rg
в приведенной выше функции , и это будет так же , как нормально :)источник
projectile-project-root
найти корневой проект Rails?rag/...
?rag/
префикса, и это облегчает их поискM-x
:)Вот пример пользовательской функции grep, которая рекурсивно подбирает содержимое файла (используя регулярное выражение для поискового запроса) в каталоге и его подкаталогах и отображает результаты со строками контекста до и после. Встроенные библиотеки
compile.el
иgrep.el
библиотеки предоставляют несколько методов для перехода к местоположению в файле, содержащем результаты поиска. Нет необходимости устанавливать что-либо еще, чтобы этот пример работал - все, что нужно, - это полная версия Emacs и компьютер сgrep
установленной утилитой. Переменнаяgrep-program
может быть скорректирована так, чтобы указывать на конкретное местоположениеgrep
утилиты, если значение по умолчанию недостаточно.источник
multiple-cursors
иwgrep
. Это делает изменение нескольких файлов одним махом на одном дыхании. Указанные библиотеки, однако, должны быть установлены, если эти функции желательны.rgrep
?rgrep
требует много времени для настройки в соответствии с моими предпочтительными критериями поиска регулярных выражений, и я решил жестко закодировать все в пользовательской функции (которую я использую несколько раз каждый день). Если вы хотите написать альтернативный ответ, который описывает, как настроитьrgrep
, это будет полезно для других читателей форума в будущем.