@Malabarba упомянул об использовании wgrep
пакета для редактирования результатов grep / ack / ag.
Я хотел бы написать подробное описание того, как я использую ag
пакет и wgrep-ag
пакеты, чтобы добиться редактирования «согласованных результатов» с помощью multiple-cursors
пакета.
Эти пакеты доступны через Melpa. Вам также необходимо установить ag
aka the_silver_searcher в вашей системе.
Это пошаговое руководство применимо к случаям, когда вы ищете способ сделать однострочное редактирование во всех ag
найденных / выбранных местах .
Установите ag
в вашей системе и вышеупомянутые пакеты emacs.
ag
поддерживает поиск файлов с содержимым, которое соответствует указанному регулярному выражению. Самый простой способ узнать, ag
где находится корень проекта - поместить туда пустую .git
папку. Затем выполните поиск, используя M-x ag-project-regexp
.
По умолчанию буфер результатов поиска ag не редактируется. Чтобы сделать его редактируемым, M-x wgrep-change-to-wgrep-mode
используйте или используйте wgrep
привязку -default C-c C-p
.
Теперь, если вам нужно изменить «abcdef» на «ghijkl» во всех ваших файлах, вам нужно искать «abcdef», и в буфере результатов ag будут отображаться все строки, содержащие эту строку. Затем вы делаете этот буфер редактируемым и изменяете эти строки вручную, и эти изменения будут отражаться в реальных файловых буферах при выполнении M-x wgrep-finish-edit
или использовании привязки по умолчанию C-c C-e
. Вы также можете использовать query-replace-regexp
для этого поиска заменить.
Я предпочитаю использовать multiple-cursors
для быстрого рефакторинга, чтобы в режиме реального времени видеть обратную связь о том, где одновременно происходит несколько моих правок. Выделите строку, которую вы хотите заменить, в этом буфере результатов ag и вызовите ее, M-x mc/mark-all-like-this
а затем отредактируйте с благоговением, поскольку вы видите, что материал редактируется в нескольких точках одновременно.
Как только вы будете довольны изменениями, как я упоминал выше, сделайте, C-c C-e
чтобы «отразить» изменения в реальных буферах. Буферы еще не сохранены.
Чтобы сохранить все буферы, я обычно делаю это за один раз, используя C-x s !
привязку по умолчанию для emacs .
Вот пример использования со скриншотами:
Он показывает процесс замены всех экземпляров bind-to-modi-map
to bind-to-my-map
в моем ~/.emacs.d/
.
Когда я bind-to-modi-map
выполняю поиск в моей папке установки emacs, я получаю следующий агрегированный результат:
Этот буфер только для чтения.
После того M-x wgrep-change-to-wgrep-mode
, как я выделю, -modi-map
выделите все экземпляры этого выделения, используя M-x mc/mark-all-like-this
и после редактирования этих выделений -my-map
, оно будет выглядеть следующим образом:
Синяя подсветка показывает, какие строки будут изменены при нажатии C-c C-e
.
При нажатии C-c C-e
вы можете увидеть изменения, отраженные в реальном файле на этом снимке экрана:
Затем я бы сохранил все измененные файлы, используя C-x s !
.
Вам не нужно преобразовывать буфер результатов grep во что-либо, уже есть режим, специально предназначенный для редактирования вывода grep (и, конечно, отражения изменений в файлах).
(require 'wgrep)
в вашем файле инициализации.C-c C-p
и отредактируйте!C-c C-e
Это даже работает с ack и ag.
источник
Эта функциональность существует в projectile (
projectile-replace
). Он будет использовать ag / ack / git grep / grep, если он доступен (в таком порядке), чтобы найти вхождения иtags-query-replace
выполнить запрос-замену.источник
M-g n C-x e
(т. Е. Используйтеnext-error
для прокрутки вхождений).Вот другой подход, использующий сосульки .
В
*grep*
выходном буфере Emacs нажмите Cc `(это обратная цитата Cc), которая в режиме Icicle связана с буфером*grep*
для командыicicle-compilation-search
. Это позволяет быстро перемещаться между любыми поисковыми попаданиями (grep
попаданиями) по вашему выбору в любом порядке.Ввод, который вы вводите в минибуфере, динамически фильтрует (сужает) набор поисковых запросов, и вы можете использовать прогрессивное завершение для сужения путем последовательного сопоставления нескольких шаблонов (например, подстрок, регулярных выражений).
При навигации между поисковыми попаданиями вы можете заменить любой из них по запросу - либо весь попадание (строка), либо только часть, соответствующую текущему входу минибуфера.
См. Поиск сосулек - Компилировать или Grep . Вступление к поиску Сосульки находится здесь , и информация о замене совпадений во время поиска Сосульки здесь .
источник
Я использую эту утилиту, которую я написал xah_find.el
Я написал это потому что:
Эта утилита elisp, возможно, в 5-10 раз медленнее, чем вызов unix grep в emacs, но у меня сработала нормально.
источник