@Malabarba mencionó el uso del wgreppaquete para editar resultados grep / ack / ag.
Me gustaría escribir un recorrido detallado de cómo uso el agpaquete y los wgrep-agpaquetes para lograr la edición de resultados 'agregados' usando el multiple-cursorspaquete.
Estos paquetes están disponibles a través de Melpa. También necesita tener agaka 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 agen su sistema y los paquetes de emacs mencionados anteriormente.
agadmite la búsqueda de archivos con contenido que coincida con la expresión regular especificada. La forma más sencilla de saber agdónde está la raíz del proyecto es colocar una .gitcarpeta 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-modeo use el wgrepenlace 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-edito usar el enlace predeterminado C-c C-e. También puede usar query-replace-regexppara hacer esa búsqueda reemplazar.
Prefiero usar multiple-cursorspara 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-thisy 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-epara "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-mapto bind-to-my-mapen my ~/.emacs.d/.
Cuando busco bind-to-modi-mapen 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-mapseleccione todas las instancias de esa selección usando M-x mc/mark-all-like-thisy 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 !.
No necesita convertir el búfer de resultados grep en nada, ya existe un modo específicamente para editar la salida grep (y reflejar los cambios en los archivos, por supuesto).
(require 'wgrep)en su archivo de inicio.C-c C-py edita!C-c C-eIncluso funciona con ack y ag también.
fuente
Esta funcionalidad existe dentro de proyectil (
projectile-replace). Utilizará ag / ack / git grep / grep si está disponible (en ese orden) para encontrar ocurrencias ytags-query-replaceejecutar la consulta de reemplazo.fuente
M-g n C-x e(es decir, usarnext-errorpara desplazarse por las ocurrencias).Aquí hay otro enfoque, usando Icicles .
En su
*grep*búfer de salida de Emacs , presione Cc `(eso es una comilla inversa de Cc), que en el modo Icicle está enlazado en el búfer*grep*al comandoicicle-compilation-search. Esto le permite navegar rápidamente entre cualquiera de los resultados de búsqueda (losgrepresultados) que elija, en cualquier orden.La entrada que escriba en el minibúfer filtra dinámicamente (reduce) el conjunto de resultados de búsqueda, y puede usar la finalización progresiva para reducir mediante la coincidencia sucesiva de múltiples patrones (por ejemplo, subcadenas, expresiones regulares).
Al navegar entre los resultados de búsqueda, puede reemplazar cualquiera de ellos a pedido, ya sea el resultado completo (línea) o solo la parte que coincide con su entrada de minibúfer actual.
Ver Icicles Search - Compilar o Grep . Una introducción a la búsqueda de Icicles está aquí , y la información sobre el reemplazo de coincidencias durante la búsqueda de Icicles está aquí .
fuente
Yo uso esta utilidad escribí xah_find.el
Lo escribí porque:
Esta utilidad elisp es quizás 5 a 10 veces más lenta que llamar a unix grep en emacs, pero funcionó bien para mí.
fuente