@Malabarba ha menzionato l'uso del wgrep
pacchetto per la modifica dei risultati grep / ack / ag.
Vorrei scrivere una descrizione dettagliata di come uso il ag
pacchetto e i wgrep-ag
pacchetti per ottenere la modifica dei risultati "modificati" usando il multiple-cursors
pacchetto.
Questi pacchetti sono disponibili tramite Melpa. Devi anche avere ag
aka the_silver_searcher installato sul tuo sistema.
Questa procedura dettagliata si applica ai casi in cui stai cercando un modo per apportare modifiche a riga singola in tutte le / posizioni selezionate che sono state ag
trovate.
Installa ag
sul tuo sistema e sui pacchetti emacs sopra menzionati.
ag
supporta la ricerca di file con contenuti che corrispondono al regex specificato. Il modo più semplice per dire ag
dove la radice del progetto è mettere .git
lì una cartella vuota . Quindi esegui la ricerca utilizzando M-x ag-project-regexp
.
Il buffer dei risultati della ricerca ag non è modificabile per impostazione predefinita. Per renderlo modificabile, esegui M-x wgrep-change-to-wgrep-mode
o usa l' wgrep
associazione -default C-c C-p
.
Ora se hai bisogno di cambiare 'abcdef' in 'ghijkl' in tutti i tuoi file, dovresti cercare 'abcdef' e il buffer dei risultati ag mostrerà tutte le righe che contengono quella stringa. Quindi si rende quel buffer modificabile e si modificano manualmente quelle stringhe e tali modifiche si rifletteranno nei buffer di file effettivi quando si esegue M-x wgrep-finish-edit
o si utilizza l'associazione predefinita C-c C-e
. Puoi anche usare query-replace-regexp
per sostituire quella ricerca.
Preferisco utilizzare multiple-cursors
per il refactoring rapido in modo da poter vedere un feedback in tempo reale su dove avvengono le mie modifiche multiple contemporaneamente. Evidenzia la stringa che vuoi sostituire in quel buffer dei risultati di AG e chiama M-x mc/mark-all-like-this
e poi modifica in soggezione quando vedi cose che vengono modificate in più punti contemporaneamente.
Una volta che sei soddisfatto delle modifiche, come ho detto sopra, fai C-c C-e
"riflesso" delle modifiche nei buffer effettivi. I buffer non sono ancora stati salvati.
Per salvare tutti i buffer, di solito lo faccio in una volta sola, usando l' C-x s !
associazione predefinita emacs .
Ecco un esempio di utilizzo con schermate:
Mostra il processo di sostituzione di tutte le istanze di bind-to-modi-map
to bind-to-my-map
in my ~/.emacs.d/
.
Quando cerco bind-to-modi-map
nella mia cartella di installazione di emacs, ottengo il risultato 'invecchiato' di seguito:
Questo buffer è di sola lettura.
Dopo M-x wgrep-change-to-wgrep-mode
, evidenzio, -modi-map
selezionare tutte le istanze di quella selezione usando M-x mc/mark-all-like-this
e dopo aver modificato quelle selezioni -my-map
, appare come di seguito:
L'evidenziazione blu mostra quali linee verranno modificate quando premo C-c C-e
.
Colpendo C-c C-e
, puoi vedere il cambiamento riflesso nel file reale in questo screenshot:
Vorrei quindi salvare tutti i file modificati utilizzando C-x s !
.