Como seguimiento a esta pregunta , está tratando de descubrir cómo hacer algo como esto, lo que debería ser fácil, que especialmente me impide acostumbrarme más a usar Emacs y, en cambio, iniciar el editor con el que ya estoy familiarizado. Utilizo el ejemplo aquí con bastante frecuencia en la edición de múltiples archivos.
En Ultraedit, haría Alt + s y luego p para mostrar un cuadro de diálogo con las opciones: Buscar (incluye el uso de expresiones regulares en varias líneas), Reemplazar con, En archivos / tipos, Directorio, Casos coincidentes, Solo palabras completas, Lista Archivos modificados y subdirectorios de búsqueda. Por lo general, primero usaré el mouse para hacer clic y arrastrar, seleccionar el texto que quiero reemplazar.
Usando solo Emacs en sí (en Windows XP), sin llamar a ninguna utilidad externa, cómo reemplazar todo foo \ nbar con bar \ nbaz *.c
y *.h
archivos en alguna carpeta y todas las carpetas debajo de ella. Quizás Emacs no sea la mejor herramienta para hacer esto, pero ¿cómo se puede hacer fácilmente con un comando mínimo?
C-x s !
para guardar todos los archivos a la vez.M-,
para continuar buscando y reemplazando (por ejemplo, después del mensaje "revertir archivo" si el archivo cambió en el disco).M-x find-name-dired RET
M->
) hasta quefind finished
aparezca " " para asegurarse de que todos se hayan cargado.t
para "alternar marca" para todos los archivos encontradosQ
"Query-Replace in Files ...": se le solicitarán expresiones regulares de consulta / sustitución.y
para reemplazar y pasar a la siguiente coincidencia, n para omitir una coincidencia, etc.N
para omitir todos los reemplazos posibles para el resto del archivo actual. (soloN
es emacs 23+)Y
.C-x C-b
si está vinculado a ibuffer, oM-x ibuffer RET
) para enumerar todos los archivos abiertos.* u
para marcar todos los archivos no guardados, escribaS
para guardar todos los archivos marcados* * RET
para desmarcar todas las marcas o escribirD
para cerrar todos los archivos marcadosEsta respuesta se combina a partir de esta respuesta , de este sitio y de mis propias notas. Usando Emacs 23+.
fuente
ibuffer
no está obligadoC-x C-b
por defecto.C-x C-b
aibuffer
, porque es mucho mejor que la unión por defecto. Simplemente agréguelo(global-set-key (kbd "C-x C-b") 'ibuffer)
a su archivo .emacs. De lo contrario, useM-x ibuffer RET
en las instrucciones anteriores.bla-bla-bla
se visita como de solo lectura y deja de buscar. ¿Cómo evitar / ignorar eso y seguir reemplazando? Gracias.ibuffer
cuando puedesC-x s
(save-some-buffers
) y escribes!
? No quiero despotricar, solo curiosidad. PS plus para describir!
,N
yY
.Las respuestas proporcionadas son excelentes, sin embargo, pensé que agregaría un enfoque ligeramente diferente.
Es un método más interactivo, y requiere
wgrep
,rgrep
yiedit
. Ambosiedit
ywgrep
deben instalarse a través de MELPA o Marmalade (usandoM-x package-list-packages
)Primero corre
M-x rgrep
para encontrar la cadena que estás buscando.Podrá especificar los tipos de archivo / patrón y la carpeta para repetir.
A continuación, deberá ejecutar
wgrep
comenzar conC-s C-p
.Wgrep le permitirá editar los
rgrep
resultados, por lo que establecer una región de la cadena para que coincida y empezariedit-mode
conC-;
(dependiendo de su terminal puede que tenga que volver a enlazar este)Todos los sucesos serán editables a la vez.
C-x C-s
a cometerwgrep
. LuegoC-x s !
para guardar los archivos modificados.El principal beneficio de este método es que puede usar
iedit-mode
para desactivar ciertas coincidenciasM-;
. También puede usar los resultadosrgrep
para saltar a los archivos, por ejemplo, si tiene una coincidencia inesperada.Me resulta muy útil para realizar ediciones de origen y renombrar símbolos (variables, nombres de funciones, etc.) en un proyecto.
Si aún no conoce / utiliza el modo iedit, es una herramienta muy útil, le recomiendo que le eche un vistazo.
fuente
wgrep
es porC-c C-p
cierto.El proyectil es realmente agradable: Cc pr ejecuta el comando projectile-replace
fuente
Generalmente uso otras herramientas para realizar esta tarea, y parece que muchos de los enfoques mencionados en la entrada de EmacsWiki Buscar y reemplazar entre archivos se abren , pero el Paquete Findr parece muy prometedor.
Robar parte del archivo fuente :
fuente
Fuente de información: 1
Para usuarios de emacs pro:
Guía paso a paso para principiantes de Emacs
Seleccionar archivos de destino
Inicie emacs escribiendo "emacs" en el indicador de la interfaz de línea de comandos. (O haga doble clic en el icono de Emacs si se encuentra en un entorno de interfaz gráfica de usuario)
Seleccionar archivos en un directorio
Primero debe seleccionar los archivos que desea reemplazar. Use el menú gráfico 〖Archivo ▸ Abrir directorio〗. Emacs le pedirá una ruta de directorio. Escriba la ruta del directorio, luego presione Entrar.
Ahora, se le mostrará la lista de archivos, y ahora debe marcar los archivos en los que desea que funcione la búsqueda / reemplazo de expresiones regulares. Marque un archivo moviendo el cursor al archivo que desee y luego presione m. Desmarque presionando u. (Para enumerar subdirectorios, mueva el cursor al directorio y presione i. El contenido del subdirectorio aparecerá en la parte inferior.) Para marcar todos los archivos por una expresión regular, escriba 【% m】, luego escriba su patrón de expresión regular. Por ejemplo, si desea marcar todos los archivos HTML, escriba 【% m】 y luego .html $. (Puede encontrar una lista de los comandos de marca en el menú gráfico "Marcar" (este menú aparece cuando está en el modo directo).)
Selección de archivos en un directorio y todos sus subdirectorios
Si desea buscar / reemplazar en archivos dentro de un directorio, incluidos cientos de subdirectorios, aquí hay un método para seleccionar todos estos archivos.
Llame a find-dired. (puede llamar a un comando presionando 【Alt + x】) Luego, escriba un nombre de directorio, ⁖ / Users / mary / myfiles
Nota: si está utilizando emacs en un terminal de texto no gráfico de Unix, y si 【Alt + x】 no funciona, la pulsación de tecla equivalente es 【Esc x】.
Emacs le preguntará con el mensaje "Ejecutar find (con args):". Si necesita reemplazar los archivos HTML, escriba -name "* html". Si no le importa qué tipo de archivo, sino simplemente todos los archivos que se encuentran en ese directorio, escriba "-tipo f".
Ahora, marque los archivos como se describe arriba.
Buscar / reemplazar interactivo
Ahora, está listo para hacer el reemplazo interactivo de búsqueda. Para simplificar, supongamos que solo desea reemplazar la palabra "rápido" por "super". Ahora, llame a dired-do-query-replace-regexp. Le pedirá la cadena de expresiones regulares y la cadena de reemplazo. Escriba "rápido", ingrese, luego "super".
Ahora, emacs usará su patrón y verificará los archivos, y se detendrá y le mostrará cada vez que ocurra una coincidencia. Cuando esto sucede, emacs le avisará, y usted tiene la opción de hacer el cambio o saltear el cambio. Para hacer el cambio, escriba y. Para omitir, escriba n. Si simplemente desea que emacs continúe y realice todos los cambios en el archivo actual, escriba!.
Si desea cancelar toda la operación sin guardar los cambios que haya realizado, escriba 【Ctrl + g】, luego salga de emacs usando el menú 〖Archivo ▸ Salir de Emacs〗.
Guardar los archivos modificados
Ahora, después de pasar por la prueba anterior, hay un paso más que debe hacer, y es guardar los archivos modificados.
Si está utilizando emacs versión 22 o posterior, llame a ibuffer para ingresar al modo de listado de búfer, luego escriba 【* u】 para marcar todos los archivos no guardados, luego escriba S para guardarlos a todos. (eso es shift-s)
Si está utilizando una versión 21 de emacs, puede hacer esto: llamar a los buffers de lista, luego mover el cursor al archivo que desea guardar y escribir s. Marcará el archivo para guardarlo más tarde. Escriba u para desmarcar. Una vez que haya terminado, escriba x para ejecutar el almacenamiento de todos los archivos marcados para guardar. (en emacs, el archivo abierto se llama "búfer". No tenga en cuenta otras cosas allí).
Alternativa a las opciones anteriores, también puede llamar a save-some-buffers 【Ctrl + xs】. Luego, emacs mostrará cada archivo no guardado y le preguntará si desea guardarlo.
Nota: la expresión regular de emacs no es la misma que Perl o Python, pero es similar. Para un resumen y patrones comunes, vea: Emacs Regex.
fuente
Usar dired para recurrir a un árbol de directorios profundo será un poco lento para esta tarea. Puede considerar usar tags-query-replace . Esto significa desembolsar para crear una tabla de etiquetas, pero eso a menudo es útil de todos modos, y es rápido.
fuente
Para los buffers abiertos, esto es lo que hago:
fuente
M-X Dired
, yt para marcar todos los archivos yQ
para consultar el texto de reemplazo en todos ellos. Puede expandir un subdirectorio utilizando eli
comando antes de la consulta de reemplazo. La información clave que estoy agregando es que si le das un prefijo (control-u) al comando i, te pedirá arg, y el argumento -R expandirá recursivamente todosubdirs
en eldired
búfer. Por lo tanto, ahora puede realizar búsquedas de búsqueda en todos los archivos de un directorio completo.fuente
Otra opción es usar la búsqueda de Icicles . Este es un tipo diferente de búsqueda incremental que utiliza la finalización de su entrada de minibúfer contra los resultados de búsqueda. A medida que modifica su entrada actual, el conjunto de coincidencias se actualiza en el búfer
*Completions*
.Puede buscar cualquier número de archivos, almacenamientos intermedios o ubicaciones marcadas, que puede elegir utilizando la coincidencia de patrón de minibúfer (por ejemplo, expresiones regulares).
Cuando visita un hit de búsqueda, puede reemplazar a pedido el hit completo o solo una parte que coincida con su entrada de minibúfer actual. El reemplazo bajo demanda significa que no se le consulta sobre cada búsqueda por turno; accede a los éxitos que desea directamente, en cualquier orden. Este enfoque puede ser más efectivo que el reemplazo de consultas si tiene que realizar un número limitado de reemplazos: omite las instrucciones exhaustivas
y/n
.La búsqueda se realiza en contextos de búsqueda que usted define: no está limitado a buscar todo el texto en los archivos de destino (por ejemplo, puede omitir comentarios o tipos particulares de secciones de programa). Un ejemplo simple de un contexto de búsqueda es una línea, como en
grep
, pero un contexto puede ser cualquier bloque de texto que coincida con un patrón que desee. Por lo general, define los contextos de búsqueda utilizando una expresión regular, pero en su lugar puede utilizar una función. Además de definir el suyo propio, hay comandos de búsqueda de Icicles predefinidos para diferentes tipos de contextos: bloques de propiedades de texto o propiedades de superposición, cosas de punto en punto, etc.También puede ordenar los resultados de búsqueda en varios órdenes de clasificación para facilitar el acceso / navegación.
fuente
find-name-dired
está bien, pero:find-dired
es más flexible en ese sentido, pero también está hecho para usar reglas generales (incluso si pueden ser arbitrariamente complejas). Y, por supuesto,find
tiene su propio lenguaje complejo.find(-name)-dired
búfer, debe marcarlos o eliminar / omitir las líneas de aquellos en los que no desea actuar.Una alternativa es usar los comandos Dired + que actúan sobre (a) los archivos marcados y (b) todos los archivos marcados (o todos los archivos, si ninguno está marcado) en los subdirectorios marcados ... encontrados de forma recursiva . Esto le brinda generalidad y un control sencillo sobre la elección del archivo. Estos comandos "aquí y abajo" están todos en la tecla de prefijo
M-+
en modo Dired.Por ejemplo,
M-+ Q
es lo mismo queQ
--- query-replace, pero los archivos de destino son todos aquellos marcados en el directorio actual y en cualquier subdirectorio marcado, abajo, abajo, abajo ...Sí, una alternativa al uso de estos comandos aquí y abajo es insertar todos los subdirectorios y sus subdirectores, de forma recursiva, y luego utilizar un comando de nivel superior como
Q
. Pero a menudo puede ser conveniente no molestarse con los subdirectores insertados.Y para hacerlo, de todos modos necesita una forma rápida de insertar todos esos subdireccionamientos de forma recursiva . Aquí también, Dired + puede ayudar.
M-+ M-i
inserta todos los subdirs marcados y sus propios subdirs marcados, de forma recursiva. Es decir, es comoM-i
(que inserta los subdirs marcados en Dired + ), pero actúa de forma recursiva en subdirs.(Todos los comandos Dired + "aquí y abajo" están en el menú Múltiple > Marcado aquí y abajo ).
También puede realizar operaciones Dired en una Emacs conjunto de archivos , que es un conjunto guardado de nombres de archivos que se encuentran en cualquier lugar. Y si usa Icicles , puede abrir un búfer Dired solo para los archivos en un conjunto de archivos u otros tipos de listas de archivos guardados.
También puede marcar cualquier búfer Dired, incluido uno que cree usando
find(-name)-dired
. Esto le brinda una forma rápida de volver a ese conjunto (por ejemplo, un conjunto de proyectos) más adelante. Y si usa Bookmark +, luego marcar un búfer Dired registra (a) susls
interruptores, (b) qué archivos están marcados, (c) qué subdirectorios se insertan y (d) qué (sub) directorios están ocultos. Todo eso se restaura cuando "saltas" al marcador. Bookmark + también le permite marcar un árbol completo de buffers Dired --- saltar al marcador restaura todos los buffers en el árbol.fuente
Me gustaría sugerir una gran herramienta más que aún no se ha mencionado, a saber, Helm .
Es un gran reemplazo para muchas operaciones estándar de Emacs que implican la finalización, búsqueda, etc. En particular,
helm-find-files
permite realizar el reemplazo de consultas (incluida la expresión regular) dentro de múltiples archivos seleccionados.Simplemente abra
helm-find-files
, marque los archivos relevantes conM-SPC
y luego useF6
oF7
para ejecutar la consulta reemplazar o la consulta reemplazar regexp en los archivos seleccionados.fuente
helm-find-files
marcar por regexp en lugar deM-SPC
?No es Emacs, pero xxdiff viene con una herramienta llamada xx-rename que lo hará para múltiples cadenas a la vez (por ejemplo, De A, A, DE A), con mensajes interactivos, guarda copias de seguridad de todos los archivos modificados y produce un breve registro de cambios realizados con contexto. Eso es lo que suelo usar cuando hago cambios grandes / globales.
fuente