@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 !
.