tutorial mac commands emacs editor

commands - emacs ubuntu



Usar Emacs para buscar y reemplazar recursivamente en archivos de texto que aún no están abiertos (13)

  1. Mx find-name-dired : se le solicitará un directorio raíz y un patrón de nombre de archivo.
  2. Presione t para "marcar marca" para todos los archivos encontrados.
  3. Presione Q para "Reemplazar consulta en archivos ...": se le solicitará que regexps de consulta / sustitución.
  4. Proceda como con query-replace-regexp : SPACE para reemplazar y pasar a la siguiente coincidencia, n para omitir una coincidencia, etc.
  5. Presione Cx s para guardar los buffers. (Luego puede presionar y , n o ! Para guardar todo a la vez)

Como seguimiento a esta pregunta , está tratando de descubrir cómo hacer algo como esto que debería ser fácil, lo que 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 varios 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, Coincidir mayúsculas y minúsculas, Solo coincidir palabra entera, Lista Archivos modificados y subdirectorios de búsqueda. Por lo general, primero usaré el mouse para hacer clic y arrastrar y seleccionar el texto que deseo reemplazar.

Usando solo el propio Emacs (en Windows XP), sin llamar a ninguna utilidad externa, cómo reemplazar todos los archivos foo / nbar con bar / nbaz en los *.c .cy *.h en alguna carpeta y todas las carpetas debajo. Tal vez Emacs no sea la mejor herramienta para hacer esto, pero ¿cómo se puede hacer fácilmente con un comando mínimo?


El proyectil es realmente bueno: Cc pr ejecuta el comando proyectile-replace


El uso de dired para reducir un árbol de directorios profundo va a ser un poco lento para esta tarea. Podría considerar el uso de tags-query-replace . Esto significa deshacerte para crear una tabla de etiquetas, pero a menudo es útil y rápido.


Fuente de información: 1

Para usuarios de emacs pro:

  1. Llame a dired para enumerar archivos en dir, o llame a find-dired si necesita todos los subdirectorios.
  2. Marca los archivos que quieras. Puede marcar por expresiones regulares escribiendo 【% m】.
  3. Escriba Q para llamar dired-do-query-replace-regexp.
  4. Escriba su encontrar expresiones regulares y reemplazar la cadena. Pattern pattern patrón de expresión regular elisp común
  5. Para cada aparición, escriba y para reemplazar, n para omitir. Escriba 【Ctrl + g】 para abortar toda la operación.
  6. Tipo ! para reemplazar todas las apariciones en el archivo actual sin preguntar, N para omitir todas las posibles sustituciones para el resto del archivo actual. (N es solo Emacs 23)
  7. Para realizar la sustitución en todos los archivos sin más preguntas, escriba Y. (solo Emacs 23)
  8. Llame a ibuffer para listar todos los archivos abiertos. Escriba 【* u】 para marcar todos los archivos no guardados, escriba S para guardar todos los archivos marcados, escriba D para cerrarlos todos.

Guía paso a paso para principiantes de Emacs

Seleccionar archivos de destino

Para iniciar emacs, escriba "emacs" en el indicador de la interfaz de la línea de comandos. (O bien, haga doble clic en el icono de Emacs si se encuentra en un entorno de interfaz de usuario de gráficos)

Selección de archivos en un directorio

Primero debes seleccionar los archivos que deseas reemplazar. Utilice el menú gráfico 〖Archivo ▸ Abrir directorio〗. Emacs te pedirá una ruta de directorio. Escriba la ruta del directorio, luego presione Enter.

Ahora, se le mostrará la lista de archivos, y ahora debe marcar los archivos en los que desea que funcione / reemplace la expresión regular. Marque un archivo moviendo el cursor al archivo que desea, luego presione m. Desmarque presionando u. (Para enumerar los 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 dired)).

Selección de archivos en un directorio y todos sus subdirectorios

Si desea buscar / reemplazar archivos dentro de un directorio, incluidos cientos de subdirectorios, aquí tiene un método para seleccionar todos estos archivos.

Llame a find-dired. (llama a un comando presionando 【Alt + x】) Luego, escriba un nombre de directorio, ⁖ / Usuarios / mary / myfiles

Nota: si está utilizando emacs en un terminal de texto no gráfico de Unix, y si 【Alt + x】 no funciona, el golpe de tecla equivalente es 【Esc x】.

Emacs le preguntará con el mensaje "Ejecutar búsqueda (con argumentos):". Si necesita realizar la sustitución en todos los archivos HTML, escriba -name "* html". Si no te importa qué tipo de archivo, sino simplemente todos los archivos bajo ese directorio, entonces escribe "-type f".

Ahora, marque los archivos como se describe anteriormente.

Búsqueda / reemplazo interactivo

Ahora, usted está listo para hacer el reemplazo de búsqueda interactiva. Para simplificar, digamos 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 revisará los archivos, y se detendrá y le mostrará cada vez que ocurrió una coincidencia. Cuando esto suceda, emacs lo indicará, y usted tiene la opción de hacer el cambio o saltearlo. Para hacer el cambio, escriba y. Para omitir, escriba n. Si simplemente desea que emacs siga adelante y realice todos los cambios en el archivo actual, escriba!.

Si desea cancelar toda la operación sin guardar los cambios realizados, escriba 【Ctrl + g】, luego salga de emacs usando el menú 〖Archivo ▸ Salir de Emacs.

Guardar los archivos modificados

Ahora, después de haber pasado 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 entrar en un modo de listado de búfer, luego escriba 【* u】 para marcar todos los archivos no guardados, luego escriba S para guardarlos todos. (eso es shift-s)

Si está utilizando un emacs versión 21, puede hacer esto: llamar a la lista de buffers, luego mover el cursor al archivo que desea guardar y escribir s. Marcará el archivo para guardarlo más tarde. Escribe u para desmarcar. Una vez que haya terminado, escriba x para ejecutar el guardado de todos los archivos marcados para guardar. (en emacs, el archivo abierto se llama "búfer". Ignore otras cosas allí).

Como alternativa a las opciones anteriores, también puede llamar a guardar algunos 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 lo mismo que Perl o Python''s, pero es similar. Para un resumen y patrones comunes, ver: Emacs Regex.



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 e iedit . Tanto iedit como wgrep deben instalarse a través de MELPA o Marmalade (utilizando Mx package-list-packages )

Primero ejecuta Mx rgrep para encontrar la cadena que estás buscando.

Podrás especificar los tipos de archivo / patrón y la carpeta a repetir.

A continuación, deberá ejecutar wgrep start it con Cs Cp .

Wgrep le permitirá editar los resultados de rgrep , así que configure una región en la cadena para que coincida y comience iedit-mode con C-; (Dependiendo de su terminal, es posible que tenga que volver a enlazar esto)

Todas las ocurrencias serán editables a la vez. Cx Cs para cometer wgrep . Entonces Cx s ! para guardar los archivos modificados.

El principal beneficio de este método es que puede usar iedit-mode para desactivar ciertas coincidencias M-; . También puede usar los resultados en rgrep para saltar a los archivos, por ejemplo, si tiene una coincidencia inesperada.

Me resulta muy útil para realizar ediciones de origen y cambiar el nombre de los símbolos (variables, nombres de funciones, etc.) en un proyecto.

Si aún no conoces / utilizas el modo iedit, es una herramienta muy útil, te recomiendo que le eches un vistazo.


Me gustaría sugerir una gran herramienta más que aún no se ha mencionado, a saber, Helm .

Es un excelente reemplazo para muchas operaciones estándar de Emacs que incluyen la finalización, la búsqueda, etc. En particular, helm-find-files permite realizar la sustitución de consultas (incluyendo regexp) dentro de múltiples archivos seleccionados.

Simplemente abra helm-find-files , marque los archivos relevantes con M-SPC y luego use F6 o F7 para ejecutar la consulta de reemplazo o la consulta de reemplazo de expresiones regulares en los archivos seleccionados.


No es Emacs, pero xxdiff viene con una herramienta llamada xx-rename que lo hará para varias cadenas a la vez (por ejemplo, De a desde a DE A A), con indicaciones interactivas, guarda copias de seguridad de todos los archivos modificados y produce un breve resumen. Registro de cambios realizados con contexto. Eso es lo que tiendo a usar cuando hago cambios de nombre grandes / globales.


Otra opción es utilizar la búsqueda de carámbanos . 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, buffers o ubicaciones marcadas, que puede elegir mediante el uso de patrones de minibuffer (por ejemplo, regexp).

Cuando visita un golpe de búsqueda, puede replace a pedido el golpe completo o solo la parte del mismo que coincida con su entrada de minibúfer actual. Reemplazo a pedido significa que no se le consulta sobre cada resultado de búsqueda por turno; Usted accede a los hits que desea directamente, en cualquier orden. Este enfoque puede ser más efectivo que la sustitución por consulta si tiene que realizar un número limitado de reemplazos: omite las indicaciones y/n exhaustivas.

La búsqueda se realiza a través de los contextos de búsqueda que defina: no está limitado a buscar todo el texto en los archivos de destino (por ejemplo, puede omitir comentarios o tipos particulares de secciones de programas). 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 de patrón que desee. Normalmente, define los contextos de búsqueda utilizando una expresión regular, pero en su lugar puede utilizar una función. Además de definir los suyos propios, existen 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.


Para buffers abiertos, esto es lo que hago:

(defun px-query-replace-in-open-buffers (arg1 arg2) "query-replace in all open files" (interactive "sRegexp:/nsReplace with:") (mapcar (lambda (x) (find-file x) (save-excursion (goto-char (point-min)) (query-replace-regexp arg1 arg2))) (delq nil (mapcar (lambda (x) (buffer-file-name x)) (buffer-list)))))


MX Dired , y t para marcar todos los archivos, y Q para consultar reemplazar el texto en todos ellos. Puede expandir un subdirectorio utilizando el comando i antes de la sustitución de consulta. La información clave que estoy agregando es que si le das un prefijo (control-u) al comando i, te pedirá que argeas, y el argumento -R expandirá recursivamente todos los subdirs en el búfer dired . Así que ahora puede consultar y buscar cada archivo en un directorio completo.


find-name-dired está bien, pero:

  • Todos los archivos que obtienes coinciden con la misma expresión única.
  • find-dired es más flexible en ese sentido, pero también está find-dired para usar reglas generales (incluso si pueden ser arbitrariamente complejas). Y, por supuesto, find tiene su propio lenguaje complejo.
  • Si luego desea actuar solo en algunos de los archivos cuyos nombres se recopilaron en el búfer find(-name)-dired , debe marcarlos o eliminar / omitir las líneas de aquellos en los que no desea actuar.

Una alternativa es usar comandos Dired+ que actúen sobre (a) los archivos marcados y (b) todos los archivos marcados (o todos los archivos, si no hay ninguno marcado) en los subdirectorios marcados ... que se encuentran recursivamente . Esto le da tanto generalidad como un fácil control sobre la elección de archivos. Estos comandos de "aquí y abajo" están todos en la tecla de prefijo M-+ en modo Dired.

Por ejemplo, M-+ Q es el mismo que Q --- 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 tales comandos aquí y abajo es insertar todos los subdirios y sus subdirios, recursivamente, y luego usar un comando de nivel superior como Q Pero a menudo puede ser conveniente no molestarse con los subdirectores insertados.

Y para hacer eso, de todos modos necesita una forma rápida de insertar recursivamente todos los subdirectorios . Aquí también, Dired + puede ayudar. M-+ Mi inserta todos los subdirectorios marcados y sus propios subdirios marcados, recursivamente. Es decir, es como Mi (que inserta los subdires marcados en Dired + ), pero actúa recursivamente en subdirs.

(Todos los comandos Dired + de "aquí y abajo" se encuentran en el menú Múltiple > Marcado aquí y abajo .)

También puede realizar operaciones Dired en un conjunto de archivos de Emacs, que es un conjunto guardado de nombres de archivos ubicados en cualquier lugar. Y si utiliza Icicles , puede abrir un búfer Dired solo para los archivos de 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 regresar a dicho conjunto (por ejemplo, un conjunto de proyectos) más adelante. Y si usa Bookmark+ luego Bookmark+ registros de un búfer Dired (a) sus conmutadores ls , (b) qué archivos están marcados, (c) qué subdirectorios están insertados y (d) qué (sub) directorios están ocultos. Todo eso se restaura cuando "saltas" al marcador. Bookmark + también le permite marcar un árbol entero de búferes Dired --- saltando al marcador restaura todos los búferes en el árbol.


  • Mx find-name-dired RET
    • puede tomar algún tiempo para que todos los archivos aparezcan en la lista, desplácese hasta la parte inferior ( M-> ) hasta que aparezca " find finished " para asegurarse de que todos se hayan cargado
  • Presione t para "marcar marca" para todos los archivos encontrados
  • Presione Q para "Reemplazar consulta en archivos ...": se le solicitará que regexps de consulta / sustitución.
  • Proceda como con query-replace-regexp: SPACE o y para reemplazar y pasar a la siguiente coincidencia, n para omitir una coincidencia, etc.
    • Tipo ! para reemplazar todas las apariciones en el archivo actual sin preguntar, N para omitir todas las posibles sustituciones para el resto del archivo actual. ( N es emacs 23+ solamente)
    • Para hacer el reemplazo en todos los archivos sin pedir más, escriba Y
  • Llame a “ibuffer” ( Cx Cb si está vinculado a ibuffer, o Mx ibuffer RET ) para listar todos los archivos abiertos.
  • Escriba * u para marcar todos los archivos no guardados, escriba S para guardar todos los archivos marcados
  • * * RET para desmarcar todas las marcas, o escriba D para cerrar todos los archivos marcados

Esta respuesta se combina a partir de esta respuesta , de este sitio y de mis propias notas. Utilizando Emacs 23+.