@Malabarba упомянул об использовании wgrepпакета для редактирования результатов grep / ack / ag.
Я хотел бы написать подробное описание того, как я использую agпакет и wgrep-agпакеты, чтобы добиться редактирования «согласованных результатов» с помощью multiple-cursorsпакета.
Эти пакеты доступны через Melpa. Вам также необходимо установить agaka 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-mapto 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 !.