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