@Malabarba згадав про використання wgrep
пакета для редагування результатів grep / ack / ag.
Я хотів би написати детальну інформацію про те, як я використовую ag
пакет і wgrep-ag
пакети, щоб досягти редагування 'побіжних результатів за допомогою multiple-cursors
пакета.
Ці пакети доступні через Melpa. Вам також потрібно мати ag
ака-файл the_silver_searcher у вашій системі.
Цей покроковий опис застосовується до випадків, коли ви шукаєте спосіб зміни редагування одного рядка у всіх / вибраних місцях ag
.
Встановіть ag
у вашу систему та вищезгадані пакети emacs.
ag
підтримує пошук файлів із вмістом, який відповідає вказаному регексу. Найпростіший спосіб сказати, ag
де корінь проекту - помістити туди порожню .git
папку. Потім виконайте пошук, використовуючи M-x ag-project-regexp
.
Буфер результатів пошуку за замовчуванням не можна редагувати. Щоб зробити його редагованим, виконайте M-x wgrep-change-to-wgrep-mode
або використовуйте wgrep
прив'язку за замовчуванням 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
щоб 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 !
.