@Malabarba mencionó el uso del wgrep
paquete para editar resultados grep / ack / ag.
Me gustaría escribir un recorrido detallado de cómo uso el ag
paquete y los wgrep-ag
paquetes para lograr la edición de resultados 'agregados' usando el multiple-cursors
paquete.
Estos paquetes están disponibles a través de Melpa. También necesita tener ag
aka the_silver_searcher instalado en su sistema.
Este recorrido se aplica a los casos en los que está buscando una forma de realizar ediciones de una sola línea en todas las ubicaciones seleccionadas ag
.
Instale ag
en su sistema y los paquetes de emacs mencionados anteriormente.
ag
admite la búsqueda de archivos con contenido que coincida con la expresión regular especificada. La forma más sencilla de saber ag
dónde está la raíz del proyecto es colocar una .git
carpeta vacía allí. Luego haga la búsqueda usando M-x ag-project-regexp
.
El búfer de resultados de la búsqueda ag no es editable por defecto. Para hacerlo editable, haga M-x wgrep-change-to-wgrep-mode
o use el wgrep
enlace predeterminado C-c C-p
.
Ahora, si necesita cambiar 'abcdef' a 'ghijkl' en todos sus archivos, buscaría 'abcdef' y el búfer de resultados ag mostrará todas las líneas que contienen esa cadena. Luego, hace que el búfer sea editable y cambie esas cadenas manualmente y esos cambios se reflejarán en los búferes de archivo reales al hacer M-x wgrep-finish-edit
o usar el enlace predeterminado C-c C-e
. También puede usar query-replace-regexp
para hacer esa búsqueda reemplazar.
Prefiero usar multiple-cursors
para una refactorización rápida para poder ver una retroalimentación en tiempo real de dónde están ocurriendo mis ediciones múltiples simultáneamente. Resalte la cadena que desea reemplazar en ese búfer de resultados ag y llame M-x mc/mark-all-like-this
y luego edite con asombro mientras ve que las cosas se editan en varios puntos al mismo tiempo.
Una vez que esté satisfecho con las ediciones, como mencioné anteriormente, hágalo C-c C-e
para "reflejar" los cambios en los búferes reales. Los buffers aún no se han guardado.
Para guardar todos los búferes, generalmente lo hago de una vez, usando el C-x s !
enlace predeterminado de emacs .
Aquí hay un ejemplo de caso de uso con capturas de pantalla:
Muestra el proceso de reemplazar todas las instancias de bind-to-modi-map
to bind-to-my-map
en my ~/.emacs.d/
.
Cuando busco bind-to-modi-map
en mi carpeta de configuración de emacs, obtengo el siguiente resultado 'ag'ged:
Este búfer es de solo lectura.
Después M-x wgrep-change-to-wgrep-mode
, resalto, -modi-map
seleccione todas las instancias de esa selección usando M-x mc/mark-all-like-this
y después de editar esas selecciones -my-map
, se ve a continuación:
El resaltado azul muestra qué líneas se modificarán cuando presione C-c C-e
.
Al golpear C-c C-e
, puede ver el cambio reflejado en el archivo real en esta captura de pantalla:
Luego guardaría todos los archivos modificados usando C-x s !
.