@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 !
.
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-p
y edita!C-c C-e
Incluso 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-replace
ejecutar la consulta de reemplazo.fuente
M-g n C-x e
(es decir, usarnext-error
para 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 (losgrep
resultados) 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