19 Manejo de Archivos

El sistema operativo almacena datos permanentemente en archivos con nombre, por lo que la mayor parte del texto que edita con Emacs proviene de un archivo y finalmente se guarda en uno de ellos.

Para editar un fichero, debe decirle a Emacs que lea el archivo y prepare un búfer que contenga una copia del texto del mismo. Esto se llama visitar el archivo. Los comandos de edición se aplican directamente al texto en el búfer; es decir, a la copia dentro de Emacs. Sus cambios aparecerán en el propio archivo sólo cuando guarde el búfer de nuevo en el archivo.

Además de visitar y guardar ficheros, Emacs puede borrar, copiar, renombrar y añadir a ficheros, mantener múltiples versiones de ellos y operar en directorios de ficheros.

19.1 Nombres de Archivos

Muchos comandos de Emacs que operan sobre un archivo requieren que se especifique el mismo utilizando el minibúfer (ver 9.2 Minibuffers para nombres de ficheros).

Mientras esté en el minibúfer, puede usar los comandos habituales de completado e historial (vea 9 El Minibúfer). Tenga en cuenta que el completado de nombres de archivo ignora los nombres de archivo cuyas extensiones aparecen en la variable completion-ignored-extensions (vea 9.4.5 Opciones de Completado). Observe también que la mayoría de los comandos usan completado permisivo con confirmación para leer nombres de archivo: se le permite enviar un nombre de archivo inexistente, pero si teclea RETURN (RET) inmediatamente después de completar hasta un nombre de archivo inexistente, Emacs imprime [Confirm] (Confirmar) y debe teclear un segundo RETURN (RET) para confirmar. Ver 9.4.3 Salida del Completado, para más detalles.

Los comandos de historial del minibúfer ofrecen algunas características especiales para la lectura de nombres de ficheros, véase 9.5 Historial del Minibúfer.

Cada búfer tiene un directorio por defecto, almacenado en la variable local del búfer default-directory. Siempre que Emacs lee un nombre de archivo usando el minibúfer, normalmente inserta el directorio por defecto en el minibúfer como contenido inicial. Puede inhibir esta inserción cambiando la variable insert-default-directory a nil (vea 9.2 Minibuffers para nombres de ficheros). En cualquier caso, Emacs siempre asume que cualquier nombre de archivo relativo es relativo al directorio por defecto, por ejemplo, introducir un nombre de archivo sin un directorio especifica un fichero en el directorio por defecto.

Cuando visita un archivo, Emacs establece default-directory en el búfer en el que visita al directorio de su archivo. Cuando crea un búfer nuevo que no está visitando un fichero, mediante un comando como C-x b, su directorio por defecto es normalmente copiado del búfer que estaba activo en ese momento (vea 20.1 Creación y Selección de Búferes). Puede usar el comando M-x pwd para ver el valor de default-directory (directorio-por-defecto) en el búfer actual. El comando M-x cd pide el nombre de un directorio, y establece el directorio por defecto del búfer a ese directorio (esto no cambia el nombre de archivo del búfer, si lo hay).

Por ejemplo, cuando visita el archivo /u/rms/gnu/gnu.tasks, el directorio predeterminado se establece en /u/rms/gnu/. Si invoca un comando que lee un nombre de archivo, al introducir sólo foo en el minibúfer, con un directorio omitido, se especifica el archivo /u/rms/gnu/foo; al introducir ../.login se especifica /u/rms/.login; y al introducir new/foo se especifica /u/rms/gnu/new/foo.

Al escribir un nombre de archivo en el minibúfer, puede hacer uso de un par de atajos: una barra doble ignora todo lo que hay antes de la segunda barra del par, y ~/ es su directorio personal. Vea 9.2 Minibuffers para nombres de ficheros.

El carácter $ se usa para sustituir una variable de entorno en un nombre de fichero. El nombre de la variable de entorno consiste en todos los caracteres alfanuméricos después del $; alternativamente, se puede encerrar entre llaves después del $. Por ejemplo, si ha utilizado el comando de shell export FOO=rms/hacks para establecer una variable de entorno llamada FOO, entonces tanto /u/$FOO/test.c como /u/${FOO}/test.c son abreviaturas de /u/rms/hacks/test.c. Si la variable de entorno no está definida, no se produce ninguna sustitución, de modo que el carácter $ se representa a sí mismo. Tenga en cuenta que las variables de entorno establecidas fuera de Emacs sólo afectan a Emacs si se aplican antes de que se inicie Emacs.

Para acceder a un fichero con $ en su nombre, si el $ causa expansión, teclee $$ ($$). Este par se convierte en un único $ al mismo tiempo que se realiza la sustitución de variables para un único $. También puede entrecomillar todo el nombre del archivo con /: (consulte 19.6 Guardado Automático: Protección Frente a Desastres). Los nombres de archivo que comienzan con un literal ~ también deben entrecomillarse con /:.

Puede incluir caracteres no ASCII en los nombres de archivo. Consulte 23.11 Sistemas de Codificación de Nombres de Archivos.

19.2 Visitar Archivos

Ctrl-x Ctrl-f (C-x C-f)

Visita un archivo (find-file).

Ctrl-x Ctrl-r (C-x C-r)

Visita un archivo para visualizarlo, sin permitir cambios en él (find-file-read-only).

Ctrl-x Ctrl-v (C-x C-v)

Visita un archivo diferente en lugar del último visitado (find-alternate-file).

Ctrl-x 4f (C-x 4 f)

Visita un archivo, en otra ventana (find-file-other-window). No altera lo que se muestra en la ventana seleccionada

Ctrl-x 5f (C-x 5 f)

Visita un archivo, en un nuevo marco (find-file-other-frame). No altera lo que se muestra en el marco seleccionado.

Alt-x find-file-literally (M-x find-file-literally)

Visita un archivo sin conversión del contenido.

Visitar un archivo significa leer su contenido en un buffer de Emacs para poder editarlo. Emacs crea un nuevo buffer para cada archivo que visita.

Para visitar un archivo, teclee Ctrl-x Ctrl-f (C-x C-f, find-file, buscar-archivo) y use el minibuffer para introducir el nombre del archivo requerido. Mientras esté en el minibúfer, puede abortar el comando tecleando Ctrl-g (C-g). Consulte 19.1 Nombres de Archivos , para más detalles sobre la introducción de nombres de archivos en los minibúferes.

Si el archivo especificado existe pero el sistema no le permite leerlo, se muestra un mensaje de error en el área de eco (en sistemas GNU y Unix podría ser capaz de visitar tal archivo usando los métodos su o sudo; vea 19.5 Reversión Automática: Mantener los Búferes Actualizados Automáticamente). De otro modo, puede saber que C-x C-f se ha completado con éxito por la aparición de nuevo texto en la pantalla, y por el nombre del buffer mostrado en la línea de modo (vea 1.3 La Línea de Modo). Emacs normalmente construye el nombre del buffer a partir del nombre del archivo, omitiendo el nombre del directorio. Por ejemplo, un archivo llamado /usr/rms/emacs.tex es visitado en un búfer llamado emacs.tex. Si ya existe un búfer con ese nombre, Emacs construye un nombre único; el método normal es añadir un sufijo basado en el nombre del directorio (e.g., <rms>, <tmp>, y así sucesivamente), pero puede elegir otros métodos. Consulte 20.7.1 Hacer que los Nombres de los Búferes sean Únicos.

Para crear un nuevo archivo, simplemente visítelo usando el mismo comando, Ctrl-x Ctrl-f (C-x C-f). Emacs muestra (New file) (Archivo nuevo) en el área de eco, pero en otros aspectos se comporta como si hubiera visitado un archivo vacío existente.

Después de visitar un archivo, los cambios que haga con los comandos de edición se hacen en el búfer de Emacs. No tienen efecto en el archivo visitado, hasta que guarde el búfer (vea 19.3 Guardar Archivos). Si un búfer contiene cambios que no han sido guardados, decimos que el búfer está modificado. Esto implica que algunos cambios se perderán si no se guarda el búfer. La línea de modo muestra dos asteriscos cerca del margen izquierdo para indicar que el búfer está modificado.

Si visita un archivo que ya está en Emacs, C-x C-f cambia al búfer existente en lugar de hacer otra copia. Antes de hacerlo, comprueba si el archivo ha cambiado desde la última vez que lo visitó o lo guardó. Si el fichero ha cambiado, Emacs ofrece releerlo.

Si se intenta visitar un archivo mayor que el umbral de advertencia de archivo grande (por defecto es 10000000, que son unos 10 megabytes), Emacs pide confirmación primero. Puede responder y para proceder a visitar el archivo o l para visitarlo literalmente (ver más abajo). Visitar archivos grandes literalmente acelera la navegación y edición de tales archivos, porque varias características potencialmente complejas están desactivadas. Tenga en cuenta, sin embargo, que Emacs no puede visitar ficheros que sean más grandes que el tamaño máximo del búfer, que está limitado por la cantidad de memoria que el Editor puede asignar y por los enteros que puede representar (vea 20 Uso de Varios Búferes). Si lo intenta, Emacs muestra un mensaje de error diciendo que se ha excedido el tamaño máximo del búfer.

Si intenta visitar un archivo cuyo modo principal (ver 24.1 Modos Mayores (o Principales)) usa la biblioteca de análisis sintáctico tree-sitter, Emacs mostrará una advertencia si el tamaño del archivo en bytes es mayor que el valor de la variable treesit-max-buffer-size. El valor por defecto es 40 megabytes para Emacs de 64 bits y 15 megabytes para Emacs de 32 bits. Esto evita el peligro de que el Editor se quede sin memoria impidiendo la activación de modos principales basados en tree-sitter en búferes tan grandes, porque un típico analizador tree-sitter necesita unas 10 veces más memoria que el texto que analiza.

Si el nombre de archivo que especifica contiene caracteres comodín del tipo shell, Emacs visita todos los archivos que coincidan con él. (En los sistemas de ficheros que no distinguen entre mayúsculas y minúsculas, Emacs busca los comodines sin tener en cuenta las mayúsculas y minúsculas). Los comodines incluyen las secuencias ?, * y [...]. Para introducir el comodín ? en un nombre de archivo en el minibúfer, debe teclear Ctrl-q ? (C-q ?) Consulte 19.16 Nombres de Archivos Entrecomillados, para obtener información sobre cómo visitar un archivo cuyo nombre contiene realmente caracteres comodín. Puede desactivar la función de comodines personalizando find-file-wildcards.

Si está pidiendo visitar un archivo que ya ha sido visitado en un búfer, pero el archivo ha cambiado externamente, Emacs normalmente le pregunta si quiere releer el archivo desde el disco. Pero si configura query-about-changed-file a nil, Emacs no le preguntará, sino que simplemente mostrará el contenido del búfer antes de los cambios, y mostrará un mensaje en el echo-area diciéndole cómo revertir el búfer desde el archivo.

Si visita el archivo equivocado sin querer al escribir su nombre de manera incorrecta, escriba Ctrl-x Ctrl-v (C-x C-v, find-alternate-file) para visitar el archivo que realmente quería. C-x C-v es similar a C-x C-f, pero elimina el búfer actual (después de ofrecer primero guardarlo si se modifica). Cuando C-x C-v lee el nombre del archivo a visitar, inserta todo el nombre del archivo por defecto en el búfer, con el punto justo después de la parte del directorio; esto es conveniente si cometió un pequeño error al teclear el nombre.

Si visita un archivo que en realidad es un directorio, Emacs invoca Dired, el navegador de directorios de Emacs. Ver 31 Dired, el Editor de Directorios. Puede desactivar este comportamiento estableciendo la variable find-file-run-dired a nil; en ese caso, es un error intentar visitar un directorio.

Los archivos que en realidad son colecciones de otros archivos, o archivos de archivos, se visitan en modos especiales que invocan un entorno similar a Dired para permitir operaciones sobre los miembros de dichos archivo. Ver 19.14 Archivos de Archivos, para más información sobre estas características.

Si visita un archivo que el sistema operativo no le permite modificar, o que está marcado como de sólo lectura, Emacs hace que el búfer también sea de sólo lectura, para que no haga cambios que después le cueste guardar. Puede hacer que el búfer sea escribible (que deje de ser de sólo lectura) con C-x C-q (read-only-mode , modo de sólo lectura). Vea 20.3 Operaciones Varias del Búfer.

Si desea visitar un archivo como sólo-lectura para protegerse de introducir cambios accidentalmente, visítelo con el comando C-x C-r (find-file-read-only, buscar-archivo-sólo-lectura) en lugar de C-x C-f.

C-x 4 f (find-file-other-window, buscar-archivo-otra-ventana) es como C-x C-f excepto en que el búfer que contiene el archivo especificado se selecciona en otra ventana. La ventana que estaba seleccionada antes de C-x 4 f sigue mostrando el mismo búfer que ya estaba mostrando. Si se usa este comando cuando sólo se está mostrando una ventana, esa ventana se divide en dos, con una ventana mostrando el mismo búfer que antes, y la otra mostrando el nuevo archivo solicitado. Véase 21 Varias Ventanas.

C-x 5 f (find-file-other-frame) es similar, pero abre un nuevo marco, o selecciona cualquier marco existente que muestre el archivo especificado. Véase 22 Marcos y Pantallas Gráficas.

En pantallas gráficas, hay dos métodos adicionales para visitar archivos. En primer lugar, cuando Emacs se construye con un conjunto de herramientas GUI adecuado, los comandos invocados con el ratón (pulsando en la barra de menús o en la barra de herramientas) usan el diálogo de selección de archivos estándar del conjunto de herramientas en lugar de pedir el nombre del archivo en el minibúfer. En GNU/Linux y plataformas Unix, Emacs hace esto cuando se construye con los toolkits GTK+, LessTif y Motif; en MS-Windows y Mac, la versión GUI lo hace por defecto. Para más información sobre cómo personalizarlo, véase 22.18 Uso de Cuadros de Diálogo.

En segundo lugar, Emacs soporta arrastrar y soltar: soltar un archivo en una ventana ordinaria dentro de él, esto visita el archivo usando esa ventana. Como excepción, soltar un archivo en una ventana que muestre un búfer Dired mueve o copia el fichero en el directorio mostrado. Para más detalles, vea 22.14 Arrastrar y Soltar, y 31.20 .

En terminales en modo texto y en pantallas gráficas cuando Emacs se construyó sin un conjunto de herramientas GUI, puede visitar archivos a través del menú File (Archivo) de la barra de menú, que tiene los ítems Visit New File (Visitar Nuevo Archivo) y Open File (Abrir Archivo).

Cada vez que visita un archivo, Emacs escanea automáticamente su contenido para detectar qué codificación de caracteres y qué convención de fin de línea utiliza, y los convierte a la codificación interna de Emacs y a la convención de fin de línea dentro del búfer. Cuando guarda el buffer, Emacs lleva a cabo la conversión inversa, escribiendo el fichero en el disco con su codificación original y la convención de final de línea. Ver 23.5 Sistemas de Codificación.

Si desea editar un archivo como una secuencia de caracteres ASCII sin codificación especial o conversión, use el comando M-x find-file-literally. Esto visita un archivo, como C-x C-f, pero no hace conversión de formato (vea Conversión de Formato en el Manual de Referencia de Emacs Lisp), conversión de código de caracteres (vea 23.5 Sistemas de Codificación), o descompresión automática (vea 19.13. Acceso a Archivos Comprimidos), y no añade una nueva línea final debido a require-final-newline (vea 19.3.3 Personalizar el Guardado de Archivos). Si ya ha visitado el mismo archivo de la manera habitual (no literal), este comando le pregunta si desea visitarlo literalmente en su lugar.

A veces, los archivos están (vagamente) ligados a otros archivos, y podría llamar a estos archivos: hermanos. Por ejemplo, al editar archivos C, si tiene un archivo llamado "foo.c", a menudo también tiene un archivo llamado "foo.h", y ese podría ser su archivo hermano. O puede tener diferentes versiones de un archivo, por ejemplo "src/emacs/emacs-27/lisp/allout.el" y "src/emacs/emacs-28/lisp/allout.el" podrían considerarse hermanos. Emacs proporciona el comando find-sibling-file para saltar entre ficheros de este tipo, pero es imposible adivinar qué archivos puede querer un Usuario que se consideren hermanos, así que Emacs permite configurarlo libremente alterando la opción de Usuario find-sibling-rules. Se trata de una lista de elementos de coincidencia/expansión.

Por ejemplo, para hacer el mapeo ".c" a ".h", se podría indicar:

(setq find-sibling-rules
  '(("\\([^/]+\\)\\.c\\'" "\\1.h")))

(ff-find-related-file ofrece una funcionalidad similar especialmente orientada a archivos C, vea 27.12.4 Otros comandos para el Modo C).

O, si quiere considerar todos los ficheros bajo "src/emacs/DIR/nombre-archivo" como hermanos de otros directorios, se podría escribir:

(setq find-sibling-rules
   '(("src/emacs/[^/]+/\\(.*\\)\\'" "src/emacs/.*/\\1")))

Como puede ver, se trata de una lista de elementos (MATCH EXPANSION…). La coincidencia es una expresión regular que se corresponde con el nombre del archivo visitado, y cada expansión puede referirse a grupos de coincidencias utilizando \\1 y así sucesivamente. La cadena de expansión resultante se aplica entonces al sistema de archivos para ver si algún archivo coincide con esta expansión (interpretada como una expreg).

Dos variables gancho especiales permiten a las extensiones modificar el funcionamiento de la visita de archivos. Al visitar un archivo que no existe, se ejecutan las funciones de find-file-not-found-functions; esta variable contiene una lista de funciones, que se llaman una a una (sin argumentos) hasta que una de ellas devuelve un valor no nulo. No se trata de un gancho normal, y el nombre termina en -functions en lugar de -hook para indicarlo.

La visita exitosa de cualquier archivo, existente o no, llama a las funciones en find-file-hook, sin argumentos. Esta variable es un gancho normal. En el caso de un archivo inexistente, se ejecutan primero las funciones find-file-not-found. Véase 50.2.2 Ganchos (Hooks).

Hay varias formas de especificar automáticamente el modo principal para editar el archivo (véase 24.3 Elección de los Modos de Archivo), y de especificar variables locales definidas para ese archivo (véase 50.2.4. Variables locales en Archivos).

19.3 Guardar Archivos

Guardar un búfer en Emacs significa volver a escribir su contenido en el archivo que se visitó en dicho búfer.

19.3.1 Comandos para Guardar Archivos

Estos son los comandos relacionados con guardar y escribir archivos.

Ctrl-x Ctrl-s (C-x C-s)

Guarda el búfer actual en su archivo (save-buffer).

Ctrl-x s (C-x s)

Guarda uno o todos los búferes en sus archivos (save-some-buffers).

Alt-~ (M-~)

Olvida que el búfer actual ha sido modificado (not-modified). Con argumento prefijo (C-u), marca el búfer actual como modificado.

Ctrl-x Ctrl-w (C-x C-w)

Guarda el búfer actual con un nombre de archivo especificado (write-file).

Alt-x set-visited-file-name (M-x set-visited-file-name)

Cambia el nombre de archivo con el que se guardará el búfer actual.

Alt-x rename-visited-file (M-x rename-visited-file)

Lo mismo que M-x set-visited-file-name, pero además renombra el archivo que el buffer está visitando (si lo hay).

Cuando desee guardar el archivo y hacer permanentes los cambios, escriba Ctrl-x Ctrl-Ctrl-s (C-x C-s, save-buffer). Una vez guardado, C-x C-s muestra un mensaje como éste:

Wrote (Escribió) /u/rms/gnu/gnu.tasks

Si el búfer actual no se modifica (no se han realizado cambios en él desde que se creó el búfer o se guardó por última vez), el guardado no se realiza realmente, ya que no tendría ningún efecto. En su lugar, C-x C-s muestra un mensaje como éste en el área de eco:

(No changes need to be saved)

(No es necesario guardar ningún cambio)

Con un argumento prefijo, C-u C-x C-s, Emacs también marca el búfer para hacer una copia de seguridad cuando se haga el siguiente guardado. Ver 19.3.2 Archivos de Copia de Seguridad.

El comando C-x s (save-some-buffers, guardar-algunos-búferes) ofrece guardar cualquiera o todos los búferes modificados. Le pregunta qué hacer con cada búfer. Las respuestas posibles son análogas a las de query-replace:

y (y)
SPACE (SPC)

Guarda este búfer y pregunta por el resto de los búferes.

n (n)
DEL (DEL)

No guarda este búfer, pero pregunta por el resto de los búferes.

! (!)

Guarda este búfer y todos los demás sin más preguntas.

q (q)
RET (RET)

Termina el guardado de algunas carpetas sin guardar más.

. (.)

Guarda este búfer, luego sale de (save-some-buffers, guardar-algunos-búferes) sin siquiera preguntar por otros búferes.

Ctrl-r (C-r)

Visualiza el búfer sobre el que se le pregunta en ese momento. Al salir del modo Vista, se vuelve a save-some-buffers, que vuelve a hacer la pregunta.

Ctrl-f (C-f)

Sale de save-some-buffers y visita el buffer por el que se le está preguntando en ese momento.

d (d)

Compara el búfer con su archivo correspondiente, para que pueda ver qué cambios estaría guardando. Para ello se invoca el comando diff-buffer-with-file (véase 19.9 Comparación de Archivos).

Ctrl-h (C-h)

Muestra un mensaje de ayuda sobre estas opciones.

Puede personalizar el valor de save-some-buffers-default-predicate para controlar sobre qué búferes preguntará Emacs.

C-x C-c, la secuencia de teclas para salir de Emacs, invoca save-some-buffers y por tanto hace las mismas preguntas.

Si ha cambiado un búfer pero no desea guardar los cambios, debería tomar alguna medida para evitarlo. De lo contrario, cada vez que utilice C-x s o C-x C-c, es probable que guarde este búfer por error. Una cosa que puede hacer es teclear M-~ (not-modified), que borra la indicación de que el búfer está modificado. Si hace esto, ninguno de los comandos de guardado creerá que el búfer necesita ser guardado. (~ se usa a menudo como símbolo matemático de «not» (negación); por tanto, M-~ es «not», metafied). Alternativamente, puede cancelar todos los cambios realizados desde que el archivo fue visitado o guardado, leyendo de nuevo el texto del archivo. Esto se llama revertir. Vea 19.4 Revertir un Búfer. (También podría deshacer todos los cambios repitiendo el comando deshacer C-x u hasta que haya deshecho todos los cambios; pero revertir es más fácil).

M-x set-visited-file-name altera el nombre del archivo que el búfer actual está visitando. Lee el nuevo nombre de archivo utilizando el minibúfer. Entonces marca el búfer como visitando ese nombre de archivo, y cambia el nombre del búfer correspondientemente. set-visited-file-name no guarda el búfer en el nuevo archivo visitado; sólo altera los registros dentro de Emacs en caso de que los guardes más tarde. También marca el búfer como modificado para que C-x C-s en ese búfer se guarde.

Si quiere marcar el búfer como visitado en un archivo diferente y guardarlo inmediatamente, use C-x C-w (write-file). Esto es equivalente a set-visited-file-name seguido de C-x C-s, excepto que C-x C-w pide confirmación si el archivo existe. C-x C-s utilizado en un búfer que no está visitando un archivo tiene el mismo efecto que C-x C-w; es decir, lee un nombre de archivo, marca el búfer como visitando ese archivo y lo guarda allí. El nombre de archivo por defecto en un búfer que no está visitando un fichero se hace combinando el nombre del búfer con el directorio por defecto del búfer (ver 19.1 Nombres de Archivos). Si el nuevo nombre de archivo implica un modo principal, entonces C-x C-w cambia a ese modo principal, en la mayoría de los casos. El comando set-visited-file-name también hace esto. Ver 24.3 Elección de los Modos de Archivo.

Si Emacs está a punto de guardar un archivo y ve que la fecha de la última versión en disco no coincide con lo que Emacs leyó o escribió por última vez, le notifica este hecho, porque probablemente indica un problema causado por la edición simultánea y requiere su atención inmediata. Ver 19.3.4 Protección contra la Edición Simultánea.

19.3.2 Archivos de Copia de Seguridad

En la mayoría de los sistemas operativos, reescribir un archivo destruye automáticamente todo registro de lo que el archivo solía contener. Por lo tanto, guardar un archivo desde Emacs se elimina el contenido antiguo del archivo, o lo haría, excepto que el Editor copia cuidadosamente el contenido antiguo a otro archivo, llamado archivo de copia de seguridad, antes de guardarlo.

Emacs hace una copia de seguridad de un archivo sólo la primera vez que éste se guarda desde un buffer. No importa cuántas veces guarde posteriormente ese archivo, su copia de seguridad permanecerá inalterada. Sin embargo, si elimina el búfer y vuelve a visitar el archivo, se creará un nuevo archivo de copia de seguridad.

Para la mayoría de los archivos, la variable make-backup-files determina si se hacen archivos de copia de seguridad. En la mayoría de los sistemas operativos, su valor por defecto es t, para que Emacs escriba archivos de copia de seguridad.

Para archivos gestionados por un sistema de control de versiones (ver 29.1 Control de Versiones), la variable vc-make-backup-files determina si se hacen copias de seguridad de los archivos. Por defecto es nil, ya que los archivos de copia de seguridad son redundantes cuando se almacenan todas las versiones anteriores en un sistema de control de versiones. Ver 29.1.13.1. Opciones Generales.

A su elección, Emacs puede mantener una única copia de seguridad para cada archivo, o hacer una serie de copias de seguridad numeradas para cada archivo que edite. Ver 19.3.2.1 Copias de Seguridad Simples o Numeradas.

El valor por defecto de la variable backup-enable-predicate evita que se escriban archivos de copia de seguridad para archivos en los directorios usados para archivos temporales, especificados por temporary-file-directory o small-temporary-file-directory.

Puede decirle explícitamente a Emacs que haga otro archivo de copia de seguridad a partir de un búfer, aunque ese búfer se haya guardado antes. Si guarda el buffer con Ctrl-u Ctrl-x Ctrl-s (C-u C-x C-s), la versión así guardada se convertirá en un archivo de copia de seguridad si guarda el búfer de nuevo. Ctrl-u Ctrl-u Ctrl-x Ctrl-s C-u C-u C-x C-s guarda el búfer, pero primero convierte el contenido del archivo anterior en una nueva copia de seguridad. Ctrl-u Ctrl-u Ctrl-u Ctrl-x Ctrl-s C-u C-u C-u C-x C-s lleva a cabo ambas cosas: hace una copia de seguridad de los contenidos anteriores, y se dispone a hacer otra de los contenidos recién guardados si guarda de nuevo.

Puede personalizar la variable backup-directory-alist para especificar que los archivos que coinciden con ciertos patrones deben ser respaldados en directorios específicos. Un uso típico es añadir un elemento ("." . dir) para hacer todas las copias de seguridad en el directorio con nombre absoluto dir. Emacs modifica los nombres de los archivos de copia de seguridad para evitar conflictos entre archivos con los mismos nombres originados en directorios diferentes. Alternativamente, añadiendo, ("." . ".~") haría las copias de seguridad en el subdirectorio invisible .~ del directorio del archivo original. Si es necesario, Emacs crea el directorio para hacer la copia de seguridad.

19.3.2.1 Copias de Seguridad Simples o Numeradas

Cuando Emacs crea un archivo de copia de seguridad, su nombre se construye normalmente añadiendo ~ al nombre del archivo que se está editando; así, el archivo de copia de seguridad para eval.c sería eval.c~.

Si el control de acceso impide a Emacs escribir archivos de copia de seguridad con los nombres habituales, escriba el archivo de copia de seguridad como ~/.emacs.d/%backup%~. Sólo puede existir un archivo de este tipo, por lo que sólo está disponible la copia de seguridad más reciente.

Emacs también puede hacer archivos de copia de seguridad numerados. Los nombres de archivos de copia de seguridad numerados contienen .~, el número, y otro ~ después del nombre del archivo original. Así, los archivos de copia de seguridad de eval.c se llamarían eval.c.~1~, eval.c.~2~, y así sucesivamente, hasta nombres como eval.c.~259~ y más allá.

La variable version-control determina si se hacen archivos de copia de seguridad individuales o múltiples archivos de copia de seguridad numerados. Sus valores posibles son:

nil

Crea copias de seguridad numeradas para los archivos que ya tienen copias de seguridad numeradas. En caso contrario, crea copias de seguridad individuales. Esta es la opción por defecto.

t

Crea copias de seguridad numeradas.

never

Nunca haga copias de seguridad numeradas; sólo copias individuales.

La forma habitual de establecer esta variable es globalmente, a través de su archivo init o del búfer de personalización. Sin embargo, puede configuar version-control localmente en un búfer individual para controlar la realización de copias de seguridad del archivo de ese búfer (consulte 50.2.3 Variables Locales). Algunos modos, como el modo Rmail, establecen esta variable. También puede hacer que Emacs establezca el control de versiones localmente cada vez que visite un archivo dado (vea 50.2.4. Variables locales en Archivos).

Si establece la variable de entorno VERSION_CONTROL, para indicar a varias utilidades GNU qué hacer con los archivos de copia de seguridad, Emacs también obedece a la variable de entorno estableciendo la variable Lisp version-control en consecuencia al inicio. Si el valor de la variable de entorno es t o numbered, entonces version-control se convierte en t; si el valor es nil o existing, entonces version-control se convierte en nil; si es never o simple, entonces version-control se convierte en never.

Si establece la variable make-backup-file-name-function a una función Lisp adecuada, puede anular la forma habitual en que Emac construye los nombres de los archivos de copia de seguridad.

19.3.2.2 Borrado Automático de Copias de Seguridad

Para evitar un consumo excesivo de espacio en disco, Emacs puede borrar automáticamente las versiones numeradas de las copias de seguridad. Generalmente mantiene tanto las primeras como las últimas copias de seguridad, borrando todas las que se encuentran entre ellas. Esto ocurre cada vez que se hace una nueva copia de seguridad.

Las dos variables kept-old-versions y kept-new-versions controlan este borrado. Sus valores son, respectivamente, el número de copias de seguridad más antiguas (con el número más bajo) y el número de copias más nuevas (con el número más alto) que se deben conservar, cada vez que se hace una nueva copia de seguridad. Las copias de seguridad intermedias (excluidas las más antiguas y las más recientes) son las versiones intermedias sobrantes: esas copias de seguridad se eliminan. Los valores de estas variables se utilizan cuando llega el momento de eliminar las versiones sobrantes, justo después de realizar una nueva versión de copia de seguridad; la copia de seguridad recién realizada se incluye en el recuento de versiones nuevas conservadas. Por defecto, ambas variables son 2.

Si delete-old-versions es t, Emacs borra los archivos de copia de seguridad sobrantes silenciosamente. Si es nil, el valor por defecto, Emacs le pregunta si debería borrar el exceso de versiones de copia de seguridad. Si tiene cualquier otro valor, entonces Emacs nunca borra automáticamente las copias de seguridad.

El comando . (Punto) de Dired también puede usarse para borrar versiones antiguas. Ver 31.4 Marcar Varios Archivos a la Vez.

19.3.2.3 Copiar vs. Renombrar

Los archivos de copia de seguridad se pueden crear copiando el archivo antiguo o renombrándolo. Esto supone una diferencia cuando el archivo antiguo tiene varios nombres (enlaces duros). Si se cambia el nombre del archivo antiguo al archivo de copia de seguridad, los nombres alternativos se convierten en nombres para el archivo de copia de seguridad. Si, por el contrario, se copia el archivo antiguo, los nombres alternativos seguirán siendo los nombres del archivo que se está editando, y el contenido al que se acceda con esos nombres será el nuevo contenido.

El método de creación de un archivo de copia de seguridad también puede afectar al propietario y al grupo del archivo. Si se utiliza la copia, éstos no cambian. Si se usa renombrar, Usted se convierte en el propietario del archivo, y el grupo del archivo se convierte en el predeterminado (diferentes sistemas operativos tienen diferentes valores predeterminados para el grupo).

La elección entre renombrar o copiar se lleva a cabo del siguiente modo:

  • Si la variable backup-by-copying no es nula (por defecto es nula), se utiliza la copia.

  • En caso contrario, si la variable backup-by-copying-when-linked no es nula (por defecto es nula) y el archivo tiene varios nombres, se utilizará la copia.

  • En caso contrario, si la variable backup-by-copying-when-mismatch es distinta de nil (por defecto es t), y renombrar cambiaría el propietario o grupo del archivo, usa copiar.

    Si cambia backup-by-copying-when-mismatch a nil, Emacs comprueba el user-id numérico del propietario del archivo y el group-id numérico del grupo del archivo.

  • Si cualquiera de ellos no es mayor que backup-by-copying-when-privileged-mismatch, se comporta como si backup-by-copying-when-mismatch no fuera nulo.

  • De lo contrario, renombrar es la opción por defecto.

Cuando un archivo se gestiona con un sistema de control de versiones (ver 29.1 Control de Versiones), Emacs normalmente no hace copias de seguridad de la forma habitual para ese archivo. Pero commiting (también conocido como check in (registro de entrada), ver 29.1.1.3 Conceptos de Control de Versiones) nuevas versiones de archivos es similar en algunos aspectos a hacer copias de seguridad. Una desafortunada similitud es que estas operaciones normalmente rompen enlaces duros, desconectando el nombre de archivo que visitó de cualquier nombre alternativo para el mismo archivo. Esto no tiene nada que ver con Emacs, lo hace el sistema de control de versiones.

19.3.3 Personalizar el Guardado de Archivos

Si el valor de la variable require-final-newline es t, al guardar o escribir un archivo se pone silenciosamente una nueva línea al final si aún no hay una. Si el valor es visit, Emacs añade una nueva línea al final de cualquier archivo que no la tenga, justo después de visitar el archivo. (Esto marca el búfer como modificado, y se puede deshacer.) Si el valor es visit-save, Emacs añade esas nuevas líneas tanto al visitar como al guardar. Si el valor es nil, Emacs deja el final del archivo sin cambios; cualquier otro valor que no sea nil significa que Emacs le pregunta si quiere añadir una nueva línea. El valor por defecto es nil.

Algunos modos principales están diseñados para tipos específicos de archivos que siempre deben terminar en nuevas líneas. Estos modos principales establecen la variable require-final-newline al valor de mode-require-final-newline, que por defecto es t. Estableciendo esta última variable, puede controlar cómo estos modos manejan las nuevas líneas finales.

Si esta opción no es nula y está visitando un archivo a través de un enlace simbólico, Emacs romperá el enlace simbólico al guardar el búfer, y escribirá el búfer en un archivo con el mismo nombre que el enlace simbólico, si el valor de file-precious-flag no es nulo (vea Guardar Búferes en Manual de Referencia de Emacs Lisp). Si quiere que Emacs guarde el búfer en el archivo al que apunta el enlace simbólico (preservando así el enlace) en estos casos, personalice la variable file-preserve-symlinks-on-save a t.

Normalmente, cuando un programa escribe un archivo, el sistema operativo almacena brevemente los datos del archivo en la memoria principal antes de transferirlos al disco. Esto puede mejorar enormemente el rendimiento; por ejemplo, cuando se ejecuta en ordenadores portátiles, puede evitar un giro del disco cada vez que se escribe un archivo. Sin embargo, se corre el riesgo de perder datos si el sistema operativo se bloquea antes de transferir la caché al disco.

Para reducir este riesgo, Emacs puede invocar la llamada al sistema fsync después de guardar un archivo. El uso de fsync no elimina el riesgo de pérdida de datos, en parte porque muchos sistemas no lo implementan correctamente, y en parte porque el procedimiento de guardado de archivos de Emacs normalmente depende también de actualizaciones de directorio que podrían no sobrevivir a una caída incluso si este funciona correctamente.

La variable write-region-inhibit-fsync controla si Emacs invoca fsync después de guardar un archivo. El valor por defecto de la variable es nil cuando Emacs es interactivo, y t cuando Emacs se ejecuta en modo batch (ver batch en C.2 Opciones Iniciales).

Emacs nunca usa fsync cuando escribe archivos auto-guardados, ya que de todas formas estos archivos pueden perder datos.

19.3.4 Protección contra la Edición Simultánea

La edición simultánea se produce cuando dos Usuarios visitan el mismo archivo, ambos realizan cambios y los guardan. Si no se informa a nadie de que esto está ocurriendo, cualquiera de ellos que guarde primero se encontrará más tarde con que sus cambios se han perdido.

En algunos sistemas, Emacs se da cuenta inmediatamente cuando el segundo Usuario empieza a cambiar el archivo, e inmediatamente emite un aviso. En todos los sistemas, Emacs comprueba cuando guarda el archivo, y avisa si está a punto de sobrescribir los cambios de otro Usuario. Puede evitar la pérdida del trabajo del otro Participante tomando las medidas de corrección adecuada en lugar de guardar el archivo.

Cuando se hace la primera modificación en un búfer de Emacs que está visitando un archivo, éste registra que el archivo está bloqueado por Usted. (Lo hace creando un enlace simbólico [7] especialmente nombrado con contenidos especiales en el mismo directorio. Ver Bloqueo de Archivos en el Manual Lisp, para más detalles). Emacs elimina el bloqueo cuando guarda los cambios. La idea es que el archivo esté bloqueado siempre que un búfer de Emacs que lo visite tenga cambios sin guardar.

Puede evitar la creación de archivos de bloqueo estableciendo la variable create-lockfiles a nil. Precaución: al hacerlo perderá las ventajas que proporciona esta función. También puede controlar dónde se escriben los archivos de bloqueo utilizando la variable lock-file-name-transforms.

Si empieza a modificar el búfer mientras el archivo visitado está bloqueado por otra Persona, esto constituye una colisión. Cuando Emacs detecta una colisión, le pregunta qué hacer, llamando a la función Lisp ask-user-about-lock. Puede redefinir esta función para personalizarla. La definición estándar de esta función le hace una pregunta y acepta tres posibles respuestas:

s

Recupera el bloqueo. Quien ya estaba modificando el archivo lo pierde y lo adquiere Ud.

p

Procede. Sigue adelante y edita el archivo a pesar de que esté bloqueado por otra persona.

q

Cancela. Esto provoca un error (archivo bloqueado), y el contenido del búfer permanece inalterado: la modificación que intentaba hacer realmente no tiene lugar.

Si Emacs o el sistema operativo se bloquean, pueden quedar archivos de bloqueo obsoletos, por lo que ocasionalmente puede recibir advertencias sobre colisiones no válidas. Cuando determine que la colisión es espuria, simplemente use p para decirle a Emacs que siga adelante de todas formas.

Tenga en cuenta que el bloqueo funciona en base al nombre del archivo; si un archivo tiene varios nombres, Emacs no impide que dos Usuarios lo editen simultáneamente con nombres diferentes.

En algunos casos no se puede escribir un archivo de bloqueo, por ejemplo, si Emacs carece de los permisos del sistema o no puede crear archivos de bloqueo por alguna otra razón. En estos casos, Emacs todavía puede detectar la colisión cuando se intenta guardar un archivo, comprobando la fecha de última modificación del archivo. Si el archivo ha cambiado desde la última vez que Emacs lo visitó o guardó, eso implica que se han hecho cambios de alguna otra forma, y se perderán si Emacs procede a guardarlo. A continuación, el Editor muestra un mensaje de advertencia y pide confirmación antes de guardar; responda yes (sí) para guardar, y no o C-g para cancelar el guardado.

Una forma de comparar el búfer con su archivo es el comando M-x diff-buffer-with-file. Véase 19.9 Comparación de Archivos.

Puede evitar la creación de archivos de bloqueo remotos estableciendo la variable remote-file-name-inhibit-locks a t.

El modo menor lock-file-mode, llamado interactivamente, cambia el valor local de create-lockfiles en el búfer actual.

19.3.5 Archivos Sombra

Puede mantener copias de seguridad idénticas de ciertos archivos en más de un lugar, posiblemente en diferentes máquinas. Para hacer esto, primero debe configurar un grupo de archivos sombra, que es un conjunto de archivos con nombres idénticos compartidos entre una lista de sitios. El grupo de archivos es permanente y se aplica a futuras sesiones de Emacs, así como a la actual. Una vez configurado el grupo, cada vez que salga de Emacs, éste copiará el archivo que haya editado a los demás archivos de su grupo. También puede hacer la copia sin salir de Emacs, tecleando Alt-x shadow-copy-files (M-x shadow-copy-files).

Un cluster sombra (shadow cluster) es un conjunto de hosts que comparten directorios, de forma que copiar a o desde uno de ellos es suficiente para actualizar el archivo en todos ellos. Cada shadow cluster tiene un nombre, y especifica la dirección de red de un host primario (al que copiamos los archivos), y una expresión regular que coincide con los nombres de host de todos los demás hosts del cluster. Puede definir un shadow cluster con M-x shadow-define-cluster.

Alt-x shadow-initialize (M-x shadow-initialize)

Configura el seguimiento de archivos.

Alt-x shadow-define-literal-group (M-x shadow-define-literal-group)

Declara un único archivo para compartir entre sitios.

Alt-x shadow-define-regexp-group (M-x shadow-define-regexp-group)

Hace que todos los archivos que coincidan con cada uno de un grupo de archivos sean compartidos entre hosts.

Alt-x shadow-define-cluster RETURN nombre RETURN
(M-x shadow-define-cluster RET nombre RET)

Define un nombre de clúster de archivos sombra.

Alt-x shadow-copy-files (M-x shadow-copy-files)

Copia todos los archivos sombra pendientes.

Alt-x shadow-cancel (M-x shadow-cancel)

Cancela la instrucción de ocultar algunos archivos.

Para configurar un grupo de archivos sombra, use M-x shadow-define-literal-group o M-x shadow-define-regexp-group. Consulte sus cadenas de documentación para más información.

Antes de copiar un archivo a sus sombras (o copias idénticas), Emacs pide confirmación. Puede responder «no» para evitar la copia de este archivo, por esta vez. Si desea cancelar el copiado de sombras (shadowing) permanentemente para un determinado archivo, use M-x shadow-cancel para eliminar o cambiar el grupo de archivos sombra.

El shadowing de archivos no está disponible en MS Windows.

19.3.6 Actualización Automática de Marcas de Tiempo

Puede colocar una marca de tiempo en un archivo para que se actualice automáticamente cada vez que edite y guarde el archivo. La marca de tiempo debe estar en las primeras ocho líneas del archivo, y debe insertarla de la siguiente manera:

Time-stamp: <>

o de esta otra forma:

Time-stamp: " "

A continuación, añada la función time-stamp al gancho before-save-hook (véase 50.2.2 Ganchos (Hooks)). Cuando guarde el archivo, esta función actualizará automáticamente la marca de tiempo con la fecha y hora actuales. También puede usar el comando M-x time-stamp para actualizar la marca de tiempo manualmente. Por defecto, la marca de tiempo se formatea de acuerdo con su configuración regional (consulte 50.4. El Archivo de Inicialización de Emacs) y zona horaria (consulte Hora del Día en el Manual de Referencia de Emacs Lisp). Para personalizaciones, vea el grupo Personalizar Marca de Tiempo.

19.4 Revertir un Búfer

Si ha hecho cambios extensos en un búfer que visita un archivo y luego cambia de opinión, puede revertir los cambios y volver a la versión guardada del archivo. Para ello, teclee Ctrl-x xg (C-x x g). Como revertir involuntariamente podría hacer perder mucho trabajo, Emacs pide confirmación antes de volver a modificar ese búfer.

El comando revert-búfer intenta posicionar el punto de tal manera que, si el archivo fue editado sólo ligeramente, estará aproximadamente en la misma parte del texto que antes. Pero si ha realizado cambios importantes, el punto puede acabar en una ubicación totalmente diferente.

Revertir marca el búfer como no modificado. Sin embargo, añade los cambios revertidos como una única modificación al historial de deshacer del búfer (véase 17.1 Deshacer). Así, después de revertir, puede teclear Ctrl-/ (C-/) o sus alias para recuperar los cambios revertidos, si cambia de opinión.

Para revertir un búfer de forma más conservadora, puede usar el comando revert-buffer-with-fine-grain. Este comando actúa como revert-buffer, pero intenta ser lo menos destructivo posible, haciendo un esfuerzo por preservar todos los marcadores, propiedades y superposiciones del búfer. Dado que revertir de esta forma puede ser muy lento cuando se ha realizado un gran número de cambios, puede modificar la variable revert-buffer-with-fine-grain-max-seconds para especificar una cantidad máxima de segundos que debe tardar la sustitución del contenido del búfer de esta forma. Tenga en cuenta que no se garantiza que la ejecución completa de revert-buffer-with-fine-grain no tarde más que esto.

Algunos tipos de búferes que no están asociados a archivos, como los búferes Dired, también pueden revertirse. Para ellos, revertir significa recalcular su contenido. Los búferes creados explícitamente con C-x b no pueden revertirse; revert-buffer informa de un error si se intenta.

Cuando edita un archivo que cambia automática y frecuentemente, por ejemplo, un registro de salida de un proceso que continúa ejecutándose, puede ser útil para Emacs revertir el archivo sin preguntarle. Para solicitar este comportamiento, establezca la variable revert-without-query en una lista de expresiones regulares. Cuando un nombre de archivo coincide con una de estas expresiones regulares, find-file y revert-buffer lo revertirán automáticamente si ha cambiado, siempre que el propio búfer no se modifique. (Si ha editado el texto, sería un error descartar sus cambios).

La combinación de teclas Ctrl-x xg (C-x x g) está vinculada al comando revert-buffer-quick. Es como el comando revert-búfer, pero da menos indicaciones. A diferencia de revert-buffer, no preguntará si el búfer actual visita un archivo, y el búfer no se modifica. También respeta la opción de Usuario revert-buffer-quick-short-answers. Si esta opción no es nula, usa una consulta y/n más corta en lugar de una consulta sí/no más larga.

También puede decirle a Emacs que revierta los búferes automáticamente cuando sus archivos visitados cambien en el disco; vea 19.5 Reversión Automática: Mantener los Búferes Actualizados Automáticamente.

19.5 Reversión Automática: Mantener los Búferes Actualizados Automáticamente

Un búfer puede desincronizarse con respecto a su archivo visitado en disco si ese archivo es modificado por otro programa. Para mantenerlo actualizado, puede activar el modo Auto Revert escribiendo Alt-x auto-revert-mode (M-x auto-revert-mode). Esto revierte automáticamente el búfer cuando su archivo visitado cambia en el disco. Para hacer lo mismo con todos los búferes de archivos, escriba Alt-x global-auto-revert-mode (M-x global-auto-revert-mode) para activar el modo de Reversión Automática Global.

La reversión automática no revertirá un búfer si tiene cambios sin guardar, o si su archivo en el disco se borra o cambia de nombre.

Uno de los usos del modo Auto Revert es «seguir» un archivo, como un registro del sistema, para que los cambios realizados en ese archivo por otros programas se muestren continuamente. Para ello, basta con mover el punto al final del búfer, y permanecerá allí mientras cambia el contenido del archivo. Sin embargo, si está seguro de que el archivo sólo cambiará creciendo al final, use en su lugar el modo Cola de Reversión Automática (auto-revert-tail-mode). Es más eficiente para esto. El modo Auto Revert Tail también funciona para archivos remotos.

Cuando un búfer es auto-revertido, se genera un mensaje. Esto puede suprimirse estableciendo auto-revert-verbose a nil.

Los modos de auto-reversión no comprueban ni revierten archivos remotos, porque eso suele ser demasiado lento. Este comportamiento puede cambiarse estableciendo la variable auto-revert-remote-files a no-nil.

Por defecto, el modo Auto Revert funciona usando notificaciones de archivos, mediante las cuales los cambios en el sistema de archivos son reportados a Emacs por el sistema operativo. Puede desactivar el uso de notificaciones de archivos personalizando la variable auto-revert-use-notify a un valor nulo, entonces Emacs comprobará los cambios en los archivos mediante sondeo cada cinco segundos. Puede cambiar el intervalo de sondeo a través de la variable auto-revert-interval.

No todos los sistemas admiten notificaciones de archivos; en los casos en que no se admitan, la opción auto-revert-use-notify será nula por defecto.

Por defecto, el Auto Revert mode (modo de Reversión Automática) sondeará periódicamente los archivos en busca de cambios, incluso cuando se utilicen las notificaciones de archivos. El sondeo es innecesario en muchos casos, y desactivarlo puede ahorrar energía al confiar sólo en las notificaciones. Para ello, establezca la variable auto-revert-avoid-polling a no nulo. Sin embargo, la notificación es ineficaz en ciertos sistemas de archivos; principalmente en sistemas de archivos de red en máquinas tipo Unix, donde los archivos pueden ser alterados desde otras máquinas. Para estos sistemas de archivo, puede ser necesario el sondeo. Para forzar el sondeo cuando auto-revert-avoid-polling no es nulo, establezca auto-revert-notify-exclude-dir-regexp para que coincida con los archivos que deben ser excluidos del uso de la notificación.

En los búferes de Dired (vea 31 Dired, el Editor de Directorios), el modo Auto Revert refresca el búfer cuando se crea o borra un archivo en el directorio del búfer.

Vea 29.1.8 Deshacer Acciones de Control de Versiones, para comandos para revertir a versiones anteriores de archivos bajo control de versiones. Vea 29.1.2 Control de Versiones y la Línea de Modo, para las peculiaridades de la Reversión Automática cuando se visitan archivos bajo control de versiones.

19.5.1 Reversión Automática de Búferes que no son de Archivo

El Global Auto Revert Mode (Modo de Reversión Automática Global) normalmente sólo revierte los búferes de archivo. Hay dos maneras de revertir automáticamente ciertos búferes que no son de archivo: activando el Modo de Reversión Automática en esos búferes (usando M-x auto-revert-mode); y estableciendo global-auto-revert-non-file-buffers a un valor no nulo. Esta última opción activa la reversión automática para todos los tipos de búferes para los que está implementada (listados en el menú inferior).

Al igual que los búferes de archivo, los búferes que no son de archivo normalmente no deberían revertirse mientras se está trabajando en ellos, o mientras contienen información que podría perderse tras la reversión. Por lo tanto, no se revierten si se modifican. Esto puede resultar complicado, ya que decidir cuándo un búfer que no es de archivo debe marcarse como modificado suele ser más difícil que en el caso de los búferes de archivo.

Otro detalle delicado es que, por razones de eficiencia, la reversión automática a menudo no intenta detectar todos los cambios posibles en el búfer, sino sólo los cambios importantes o fáciles de detectar. Por lo tanto, habilitar la reversión automática para un búfer que no sea de archivos no siempre garantiza que toda la información del búfer esté actualizada, y no hace necesariamente inútiles las reversiones manuales.

En el otro extremo, algunos búferes se revierten automáticamente según el tiempo definido en auto-revert-interval (intervalo de auto-reversión). (En este caso, la reversión automática no imprime ningún mensaje durante la reversión, incluso cuando auto-revert-verbose no es nulo.

Algunos búferes que no son archivos pueden actualizarse de forma fiable mediante la notificación de archivos en su directorio por defecto; los búferes Dired son un ejemplo. El modo principal puede indicar esto estableciendo buffer-auto-revert-by-notification a un valor no nulo en ese búfer, permitiendo que Auto Revert evite el sondeo periódico. Dicha notificación no incluye los cambios en los archivos de ese directorio, sólo en el directorio en sí.

Los detalles dependen de los tipos concretos de búferes y se explican en las secciones correspondientes.

19.5.1.1 Reversión Automática del Menú de Búferes

Si la auto-reversión de búferes que no son archivos está activada, el Menú de Búferes (ver 20.5 Trabajar con Varios Búferes) se revierte automáticamente cada intervalo de auto-reversión de segundos, haya o no necesidad de ello. (Probablemente se tardaría más en comprobar si hay necesidad que en revertir realmente).

Si el menú de búferes se marca inapropiadamente como modificado, simplemente reviertalo manualmente usando g y la auto-reversión se reanudará. Sin embargo, si marcó ciertos búferes para ser borrados o para ser mostrados, tiene que tener cuidado, porque revertir borra todas las marcas. El hecho de que al añadir marcas se establezca la bandera de modificado del búfer impide que la reversión automática borre dichas marcas.

19.5.1.2 Reversión Automática de Búferes Dired

Los búferes antiguos sólo se auto-revierten cuando cambia la lista de archivos del directorio principal del búfer (por ejemplo, cuando se añade o elimina un nuevo archivo). No se auto-revierten cuando cambia la información sobre un archivo en particular (por ejemplo, cuando cambia el tamaño) o cuando cambian los subdirectorios insertados. Para estar seguro de que toda la información listada está actualizada, es necesario revertir manualmente usando g, incluso si la auto-reversión está activada en el búfer Dired. A veces, puede dar la impresión de que modificar o guardar archivos listados en el directorio principal provoca la auto-reversión. Esto se debe a que hacer cambios en un archivo, o guardarlo, muy a menudo provoca cambios en el propio directorio; por ejemplo, a través de archivos de copia de seguridad o archivos de autoguardado. Sin embargo, esto no está garantizado.

Si el buffer Dired está marcado como modificado y no hay cambios que quiera proteger, entonces la mayoría de las veces puede hacer que la auto-reversión se reanude revirtiendo manualmente el buffer usando g. Hay una excepción. Si marca archivos, puede revertir el buffer de forma segura. Esto no borrará las banderas o marcas (a menos que el archivo marcado haya sido borrado, por supuesto). Sin embargo, el buffer permanecerá modificado, incluso después de revertir, y la auto-reversión no se reanudará. Esto se debe a que, si marca archivos, es posible que esté trabajando en el buffer y no quiera que éste cambie sin previo aviso. Si quiere que la auto-reversión se reanude en presencia de marcas y banderas, marque el buffer como no modificado usando M-~. Sin embargo, si añade, borra o cambia marcas o banderas, volverá a marcarlo como modificado.

Actualmente, los búferes remotos Dired auto-revertidos. Tampoco lo son los buffers Dired para los que se usaron comodines del shell o argumentos de archivo para listar sólo algunos de los archivos. Los buffers *Find* y *Locate* tampoco se auto-revierten.

Tenga en cuenta que la auto-reversión de los buffers Dired puede no funcionar satisfactoriamente en algunos sistemas.

19.6 Guardado Automático: Protección Frente a Desastres

De vez en cuando, Emacs guarda automáticamente cada archivo visitado en un archivo separado, sin alterar el archivo que realmente usa. Esto se llama auto-guardado. Evita que se pierda más que una cantidad limitada de trabajo si el sistema se bloquea.

Cuando Emacs determina que es el momento del auto-guardado, considera cada búfer, y cada uno es auto-guardado si el auto-guardado está habilitado para él y ha sido cambiado desde la última vez que fue auto-guardado. Cuando la variable auto-save-no-message está en nil (por defecto), el mensaje Auto-saving... (Auto guardando…) se muestra en el área de eco durante el auto-guardado, si algún archivo es realmente auto-guardado; para desactivar estos mensajes, personalice la variable a un valor no nil. Los errores que se producen durante el autoguardado se capturan para que no interfieran con la ejecución de los comandos que ha estado escribiendo.

19.6.1 Autoguardar Archivos

El auto-guardado normalmente no guarda en los archivos que visitó, porque puede ser muy indeseable guardar un cambio que no quería hacer permanente. En su lugar, este procedimiento se realiza en un archivo diferente llamado archivo de auto-guardado, y el archivo visitado se cambia sólo cuando Usted solicita guardar explícitamente (como con C-x C-s).

Normalmente, el nombre del archivo de autoguardado se hace añadiendo # al principio y al final del nombre del archivo visitado. Así, un búfer que visita el archivo foo.c se autoguarda en un archivo #foo.c#. La mayoría de los búferes que no visitan archivos se autoguardan sólo si Usted lo solicita explícitamente; cuando se autoguardan, el nombre del archivo autoguardado se hace añadiendo # al principio y al final del nombre del búfer, y luego añadiendo dígitos y letras al final para que sea único. Por ejemplo, el búfer *mail* en el que escribe los mensajes que va a enviar puede guardarse automáticamente en un archivo llamado #*mail*#704juu. Los nombres de archivo de auto-guardado se hacen así a menos que reprograme partes de Emacs para hacer algo diferente (las funciones make-auto-save-file-name y auto-save-file-name-p). El nombre de archivo a usar para auto-guardado en un búfer se calcula cuando se activa el auto-guardado en ese búfer.

La variable auto-save-file-name-transforms permite un cierto grado de control sobre el nombre del archivo de autoguardado. Permite especificar una serie de expresiones regulares y sustituciones para transformar el nombre del archivo de autoguardado. El valor predeterminado coloca los archivos de autoguardado para archivos remotos (véase 19.15 Archivos Remotos) en el directorio de archivos temporales de la máquina local.

Cuando borra una parte sustancial del texto en un búfer grande, el autoguardado se desactiva temporalmente en ese búfer. Esto se debe a que si ha borrado el texto sin querer, puede que el archivo de autoguardado le resulte más útil si contiene el texto borrado. Para volver a activar el guardado automático después de que esto ocurra, guarde el búfer con C-x C-s, o utilice el modo de guardado automático C-u 1 M-x.

Si desea que el autoguardado se realice en el archivo visitado en lugar de en un archivo de autoguardado separado, active el modo menor global auto-save-visited-mode. En este modo, el autoguardado es idéntico al guardado explícito. Tenga en cuenta que este modo es ortogonal al modo de autoguardado descrito anteriormente; puede activar ambos al mismo tiempo. Sin embargo, si el modo de autoguardado está activo en algún búfer y la variable obsoleta auto-save-visited-file-name tiene un valor no nulo, ese búfer no se verá afectado por auto-save-visited-mode.

Puede utilizar la variable auto-save-visited-interval para personalizar el intervalo entre operaciones de auto-guardado en auto-save-visited-mode; por defecto es de cinco segundos. auto-save-interval y auto-save-timeout no tienen efecto sobre auto-save-visited-mode. Vea 19.6.2. Control del Autoguardado, para más detalles sobre estas variables.

El archivo de auto-guardado de un búfer se borra cuando guarda el búfer en su archivo visitado. (Cambiar el nombre del archivo visitado con C-x C-w o set-visited-file-name renombra cualquier archivo autoguardado para que vaya con el nuevo nombre visitado.

Matar un búfer, por defecto, no elimina el archivo de autoguardado del búfer. Si kill-buffer-delete-auto-save-files no es nulo, matar un búfer que tiene un archivo de autoguardado hará que Emacs pregunte al Usuario si el archivo de autoguardado debe ser borrado. (Esto se inhibe si delete-auto-save-files es nil).

19.6.2. Control del Autoguardado

Cada vez que visita un archivo, se activa el autoguardado para el búfer de ese archivo si la variable auto-save-default es distinta de nil (pero no en modo por lotes; vea C.2 Opciones Iniciales). El valor predeterminado de esta variable es t, por lo que el autoguardado es la práctica habitual para los búferes que visitan archivos. Para activar el autoguardado en el búfer actual, escriba Alt-x save-mode (M-x auto-save-mode). El modo de auto-guardado actúa como un modo menor local del búfer (ver 24.2 Modos Menores).

Emacs auto-guarda periódicamente basándose en cuántos caracteres ha tecleado desde el último auto-guardado. La variable auto-save-interval especifica cuántos caracteres hay entre auto-guardados. Por defecto, es 300. Emacs no acepta valores demasiado pequeños: si personaliza auto-save-interval a un valor inferior a 20, Emacs se comportará como si el valor fuera 20.

El autoguardado también tiene lugar cuando deja de teclear durante un rato. Por defecto, lo hace después de 30 segundos de inactividad (en este momento, Emacs también puede realizar la recolección de basura; ver Recolección de Basura en el Manual de Referencia de Emacs Lisp). Para cambiar este intervalo, personalice la variable auto-save-timeout. El periodo de tiempo real es más largo si el búfer actual es largo; esto es una heurística que pretende mantenerse fuera de su camino cuando está editando búferes largos, en los que el auto-guardado toma una cantidad apreciable de tiempo. El auto-guardado durante periodos de inactividad consigue dos cosas: primero, se asegura de que todo su trabajo se guarda si se aleja de la terminal durante un tiempo; segundo, puede evitar algún auto-guardado mientras está escribiendo.

Cuando el modo auto-guardado-visitado (auto-save-visited-mode) está activado, Emacs auto-guardará los búferes de archivos visitados después de cinco segundos de inactividad. Puede personalizar la variable auto-save-visited-interval para cambiar el intervalo de tiempo de inactividad.

Emacs también auto-guarda cada vez que recibe un error fatal. Esto incluye matar el trabajo de Emacs con un comando del shell como kill %emacs, o desconectar una línea telefónica o una conexión de red.

Puede realizar un auto-guardado explícitamente con el comando M-x do-auto-save.

19.6.3 Recuperación de Datos de Autoguardados

Puede utilizar el contenido de un archivo de autoguardado para recuperarse de una pérdida de datos con el comando M-x recover-file RET archivo RET. Esto visita el archivo y luego (después de su confirmación) restaura el contenido de su archivo de autoguardado #archivo#. A continuación, puede guardar con C-x C-s para poner el texto recuperado en el propio archivo. Por ejemplo, para recuperar el archivo foo.c del archivo autoguardado #foo.c#, haga:

M-x recover-file RET foo.c RET
yes RET
C-x C-s

Antes de pedir confirmación, M-x recover-file muestra un listado de directorios que describe el archivo especificado y el archivo de autoguardado, para que pueda comparar sus tamaños y fechas. Si el archivo de autoguardado es más antiguo, M-x recover-file no ofrece leerlo.

Si Emacs o el ordenador se bloquean, puede recuperar todos los archivos que estaba editando desde sus archivos de autoguardado con el comando M-x recover-session. Esto le muestra primero una lista de sesiones interrumpidas grabadas. Mueva el puntero hasta la que elija y escriba C-c C-c.

A continuación, recover-session pregunta por cada uno de los archivos que se estaban editando durante esa sesión, preguntando si desea recuperar ese archivo. Si la respuesta es y (si), se llama a recover-file, que funciona de forma normal. Muestra las fechas del archivo original y de su archivo de autoguardado, y vuelve a preguntar si se desea recuperar ese archivo.

Cuando recover-session termina, los archivos que haya elegido recuperar están presentes en los búferes de Emacs. A continuación, debe guardarlos. Sólo esto -guardarlos- actualiza los propios archivos.

Emacs registra información sobre sesiones interrumpidas en archivos llamados .saves-pid-hostname~ en el directorio ~/.emacs.d/auto-save-list/. Este directorio está determinado por la variable auto-save-list-file-prefix. Si establece auto-save-list-file-prefix a nil, las sesiones no se registran para su recuperación.

19.7 Alias de Nombres de Archivo

Tanto los enlaces simbólicos como los enlaces duros permiten que varios nombres de archivo se refieran al mismo archivo. Los enlaces duros son nombres alternativos que se refieren directamente al archivo; todos los nombres son igualmente válidos, y no hay ninguno de preferencia. Por el contrario, un enlace simbólico es una especie de alias definido: cuando foo es un enlace simbólico a bar, puede utilizar cualquiera de los dos nombres para referirse al archivo, pero bar es el nombre real, mientras que foo es sólo un alias. Los casos más complejos se dan cuando los enlaces simbólicos apuntan a directorios.

Normalmente, si consulta un archivo que Emacs ya está visitando con un nombre diferente, muestra un mensaje en el área de eco y utiliza el búfer existente visitando ese archivo. Esto puede ocurrir en sistemas que soportan enlaces duros o simbólicos, o si usa un nombre de archivo largo en un sistema que trunca nombres de archivo largos, o en un sistema de archivos que no distingue mayúsculas de minúsculas. Puede suprimir el mensaje asignando a la variable find-file-suppress-same-file-warnings un valor distinto de cero. Puede desactivar completamente esta función estableciendo la variable find-file-existing-other-name a nil: entonces, si visita el mismo archivo con dos nombres diferentes, obtendrá un búfer distinto para cada nombre de archivo.

Si la variable find-file-visit-truename es distinta de nil, entonces el nombre de archivo registrado para un búfer es el nombre real del archivo (obtenido reemplazando todos los enlaces simbólicos por sus nombres de destino), en lugar del nombre que especifique. La configuración de find-file-visit-truename también implica el efecto de find-file-existing-other-name.

A veces, se accede normalmente a un directorio a través de un enlace simbólico, y podría querer que Emacs mostrara preferentemente su nombre enlazado. Para ello, personalice directory-abbrev-alist. Cada elemento de esta lista debe tener la forma (de . a), lo que significa sustituir de por a siempre que aparezca de en un nombre de directorio. La cadena de es una expresión regular (véase 16.6 Sintaxis de las Expresiones Regulares). Se compara con nombres de directorio anclados en el primer carácter, y debe empezar por \` (para soportar nombres de directorio con nuevas líneas incrustadas, lo que anularía ^). La cadena a debe ser un nombre de directorio absoluto ordinario que apunte al mismo directorio. No use ~ para representar un directorio personal en la cadena de; Emacs realiza estas sustituciones por separado. Aquí hay un ejemplo, de un sistema en el que /home/fsf se accede normalmente a través de un enlace simbólico llamado /fsf:

(("\\`/home/fsf" . "/fsf"))

19.8 Directorios de Archivos

El sistema de archivos agrupa los archivos en directorios. Un listado de directorios es una lista de todos los archivos de un directorio. Emacs proporciona comandos para crear y borrar directorios, y para hacer listados de directorios en formato breve (sólo nombres de archivos) y en formato detallado (tamaños, fechas y otros atributos incluidos). Emacs también incluye una característica de navegador de directorios llamada Dired, que puede invocar con Ctrl-x d (C-x d); vea 31 Dired, el Editor de Directorios.

Ctrl-x Ctrl-d directorio-o-patrón RETURN (C-x C-d directorio-o-patrón RET)

Muestra un breve listado de directorios (list-directory).

Ctrl-u Ctrl-x Ctrl-d directorio-o-patron RETURN
(C-u C-x C-d directorio-o-patrón RET)

Muestra un listado detallado de directorios.

Alt-x make-directory RETURN nombredir RETURN (M-x make-directory RET nombredir RET)

Crea un nuevo directorio llamado nombredir.

Alt-x delete-directory RETURN nombredir
(M-x delete-directory RET nombredir RET)

Borra el directorio llamado nombredir. Si no está vacío, se le preguntará si desea eliminarlo de forma recursiva.

El comando para mostrar un listado de directorios es C-x C-d (list-directory). Lee utilizando el minibuffer un nombre de archivo que puede ser un directorio a listar o un patrón que contenga comodines para los archivos a listar. Por ejemplo,

C-x C-d /u2/emacs/etc RET

lista todos los archivos del directorio /u2/emacs/etc. He aquí un ejemplo de especificación de un patrón de nombres de archivo:

C-x C-d /u2/emacs/src/*.c RET

Normalmente, C-x C-d muestra un breve listado de directorios que sólo contiene los nombres de los archivos. Un argumento numérico (independientemente del valor) le indica que haga un listado detallado que incluya tamaños, fechas y propietarios (como ls -l).

El texto de un listado de directorios se obtiene principalmente ejecutando ls en un proceso inferior. Dos variables de Emacs controlan las opciones pasadas a ls: list-directory-brief-switches es una cadena que da las opciones a usar en listados breves ("-CF" por defecto), y list-directory-verbose-switches es una cadena que da las opciones a usar en un listado detallado ("-l" por defecto).

En los listados detallados de directorios, Emacs añade información sobre la cantidad de espacio libre en el disco que contiene el directorio.

El comando M-x delete-directory pregunta por el nombre de un directorio usando el minibuffer, y borra el directorio si está vacío. Si el directorio no está vacío, se le preguntará si desea borrarlo recursivamente. En los sistemas que disponen de la función «Papelera» (o «Papelera de reciclaje»), puede hacer que este comando mueva el directorio especificado a la Papelera en lugar de borrarlo directamente, cambiando la variable delete-by-moving-to-trash a t. Consulte 19.12 Operaciones Varias con Archivos, para obtener más información sobre el uso de la Papelera.

19.9 Comparación de Archivos

El comando M-x diff pregunta por dos nombres de archivo, usando el minibúfer, y muestra las diferencias entre los dos archivos en un búfer llamado *diff*. Esto funciona ejecutando el programa diff, usando opciones tomadas de la variable diff-switches. El valor de diff-switches debe ser una cadena; el valor por defecto es "-u" para especificar un diff de contexto unificado. Vea Diff en Comparar y Fusionar Archivos, para más información sobre el programa diff.

La salida del comando diff se muestra usando un modo principal llamado modo Diff. Vea 19.10 Modo Diff.

Una alternativa (mucho más sofisticada) es M-x ediff (ver Ediff en El Manual de Ediff).

El comando M-x diff-backup compara un archivo especificado con su copia de seguridad más reciente. Si especifica el nombre de un archivo de copia de seguridad, diff-backup lo compara con el archivo fuente del que es una copia de seguridad. En todos los demás aspectos, se comporta como M-x diff.

El comando M-x diff-buffer-with-file compara un búfer especificado con su archivo correspondiente. Esto muestra los cambios que se harían en el archivo si se guarda el búfer.

El comando M-x diff-buffers compara el contenido de dos búferes especificados.

El comando M-x compare-windows compara el texto en la ventana actual con el de la ventana que era la ventana seleccionada antes de que Usted seleccionara la actual. (Para más información sobre ventanas en Emacs, vea 21 Varias Ventanas) La comparación comienza en el punto en cada ventana, después de empujar cada valor inicial del punto en el anillo de marcas (vea 12.4 El Anillo de Marcas) en su respectivo búfer. Luego se mueve el punto hacia adelante en cada ventana, un carácter a la vez, hasta que llega a los caracteres que no coinciden. A continuación, el comando finaliza.

Si el punto en las dos ventanas está seguido por texto no coincidente cuando se inicia el comando, M-x compare-windows intenta heurísticamente avanzar hasta el texto coincidente en las dos ventanas, y luego sale. Por lo tanto, si utiliza M-x compar-windows repetidamente (véase 8.11 Repetición de una orden), cada vez se salta un rango coincidente o encuentra el inicio de otro.

Con un argumento numérico, compare-windows ignora los cambios en los espacios en blanco. Si la variable compare-ignore-case es distinta de nil, la comparación también ignora las diferencias entre mayúsculas y minúsculas. Si la variable compare-ignore-whitespace no es nula, compare-windows ignora por defecto los cambios en los espacios en blanco, pero un argumento prefijo lo desactiva para esa única invocación del comando.

Puede usar M-x smerge-mode para activar el modo Smerge, un modo menor para editar la salida del programa diff3. Esto es típicamente el resultado de una fusión fallida de una actualización del sistema de control de versiones fuera de VC, debido a cambios conflictivos en un archivo. El modo Smerge proporciona comandos para resolver conflictos seleccionando cambios específicos.

Vea 29.6 Fusión de Archivos con Emerge, para la herramienta Emerge, que proporciona una potente interfaz para fusionar archivos.

19.10 Modo Diff

El modo diff es un modo principal utilizado para la salida de M-x diff y otros comandos similares. Este tipo de salida se llama revisión (o parche), porque puede pasarse al comando patch para aplicar automáticamente los cambios especificados. Para seleccionar el modo diff manualmente, escriba Alt-x diff-mode (M-x diff-mode).

Los cambios especificados en un parche se agrupan en hunks, que son trozos, bloques, segmentos o elementos contiguos de texto que contienen una o más líneas modificadas. Los trozos también suelen incluir líneas sin cambios para proporcionar contexto a los cambios. Cada trozo va precedido de una cabecera de bloque, que especifica los números de línea antiguos y nuevos en los que se producen los cambios del mismo. El modo Diff resalta cada cabecera de trozo, para distinguirla del contenido real de este.

El primer bloque de un parche va precedido de una cabecera de archivo, que muestra los nombres de las versiones nueva y antigua del archivo, y sus marcas de tiempo. Si un parche muestra cambios para más de un archivo, cada archivo tiene una cabecera de este tipo antes del primer trozo de los cambios de ese archivo.

Puede editar un búfer en modo Diff como cualquier otro búfer. (Si es de sólo lectura, necesita hacerlo escribible primero; vea 20.3 Operaciones Varias del Búfer). Siempre que edite un trozo, el modo Diff intenta corregir automáticamente los números de línea en las cabeceras del trozo, para asegurarse de que el parche sigue siendo correcto, y aún podría ser aplicado por parche. Para desactivar la corrección automática del número de línea, cambie la variable diff-update-on-the-fly a nil.

El modo diff hace que los hunks sean tratados como mensajes de error del compilador por M-g M-n y otros comandos que manejan mensajes de error (vea 28.2 Modo Compilación). Así, puede usar los comandos del modo de compilación para visitar las ubicaciones de código fuente correspondientes.

Además, el modo Diff proporciona los siguientes comandos para navegar, manipular y aplicar partes de parches:

Alt-n (M-n)

Avanza al siguiente hunk-start (segmento-de-inicio) (diff-hunk-next). Con el argumento prefijo n, avanza al nèsimo bloque (hunk) siguiente.

Por defecto, el modo Diff refina los elementos (hunks) intermedios a medida que Emacs los muestra, resaltando sus cambios con mejor granularidad. Alternativamente, si establece diff-refine a la navegación por símbolos, el modo Diff sólo refina el bloque (hunk) al que se mueve con este comando o con diff-hunk-prev.

Alt-p (M-p)

Se mueve al inicio de bloque anterior (diff-hunk-prev). Con el argumento de prefijo n, retrocede al nésimo trozo anterior. Al igual que M-n, este comando refina el segmento (hunk) al que se desplaza si establece diff-refine en el símbolo de navegación.

Alt:-} (M-})

Avanza al inicio del siguiente archivo, en un parche de varios archivos (diff-file-next). Con el argumento prefijo n, avanza hasta el inicio del nésimo archivo siguiente.

Atl-{ (M-{)

Se desplaza al inicio del archivo anterior, en un parche de varios archivos (diff-file-prev). Con el argumento prefijo n, retrocede al inicio del nésimo archivo anterior.

Alt-k (M-k)

Mata al trozo (hunk) en el punto (diff-hunk-kill).

Alt-K (M-K)

En un parche de varios archivos, mata la parte del archivo actual. (diff-file-kill).

Ctrl-c Ctrl-a (C-c C-a)

Aplica este fragmento (hunk) a su archivo de destino (diff-apply-hunk). Con un argumento prefijo C-u, revierte este trozo, es decir, aplica la inversa del trozo, que cambia la versión «nueva» por la versión «antigua». Si diff-jump-to-old-file no es nulo, aplica el fragmento a la versión «antigua» del archivo.

Ctrl-c Ctrl-b (C-c C-b)

Resalta los cambios del trozo (hunk) en el punto con una granularidad más fina (diff-refine-hunk). Esto le permite ver exactamente qué partes de cada línea cambiada fueron realmente cambiadas.

Por defecto, el modo Diff refina los «hunks» tal y como Emacs los muestra, así que puede que encuentre útil este comando si personaliza diff-refine a un valor no predeterminado.

Ctrl-c Ctrl-c (C-c C-c)

Va al archivo fuente y a la línea correspondiente a este bloque (hunk) (diff-goto-source). Por defecto, salta a la versión «nueva» del archivo, la que aparece primero en la cabecera del archivo. Con un argumento prefijo, salta a la versión «antigua» en su lugar. Si diff-jump-to-old-file no es nulo, este comando salta por defecto al archivo «antiguo», y el significado del argumento prefijo se invierte. Si el argumento prefijo es un número mayor que 8 (por ejemplo, si escribe Ctrl-u Ctrl-u Ctrl-c Ctrl-c (C-u C-u C-c C-c)), este comando también establece diff-jump-to-old-file para la siguiente invocación. Si el archivo fuente está bajo control de versiones (véase 29.1 Control de Versiones), esto salta al archivo de trabajo por defecto. Con un argumento prefijo, salta a la revisión «antigua» del archivo (vea 29.1.6 Revisión y Comparación de Versiones Anteriores), cuando el punto está en la línea antigua, o de otro modo salta a la revisión «nueva».

Ctrl-c Ctrl-e (C-c C-e)

Inicia una sesión Ediff con el parche (diff-ediff-patch). Consulte Ediff en El manual de Ediff.

Ctrl-c Ctrl-n (C-c C-n)

Restringe la vista al bloque actual (diff-restrict-view). Véase 15.5 Estrechamiento. Con un argumento de prefijo, restringe la vista al archivo actual de un parche de varios archivos. Para volver a ampliar, usar C-x n w ( widen, ampliar).

Ctrl-c Ctrl-r (C-c C-r)

Invierte la dirección de comparación para todo el búfer (diff-reverse-direction). Con un argumento prefijo, invierte la dirección sólo dentro de la región actual (véase 12 La marca y la región). Invertir la dirección significa cambiar los bloques (hunks) y las cabeceras de inicio de archivo para producir un parche que cambiaría la versión «nueva» por la «antigua».

Ctrl-c Ctrl-s (C-c C-s)

Divide el bloque (hunk) en el punto (diff-split-hunk) en dos bloques separados. Esto inserta una cabecera de bloque y modifica la cabecera del bloque actual. Este comando es útil para editar parches manualmente, y sólo funciona con el formato diff unificado producido por las opciones -u o --unified del programa diff. Si necesita dividir un bloque en el formato de contexto diff producido por las opciones -c o --context de diff, primero convierta el búfer al formato diff unificado con C-c C-u.

Ctrl-c Ctrl-d (C-c C-d)

Convierte todo el búfer al formato diff de contexto (diff-unified->context). Con un argumento prefijo, convierte sólo los trozos (hunks) dentro de la región.

Ctrl-c Ctrl-u (C-c C-u)

Convierte todo el búfer a formato diff unificado (diff-context->unified). Con un argumento de prefijo, convierte el formato unificado al formato de contexto. Cuando la marca está activa, solo convierte los fragmentos dentro de la región.

Ctrt-c Ctrl-l (C-c C-l)

Vuelve a generar el segmento (hunk) actual (diff-refresh-hunk).

Ctrl-c Ctrl-w (C-c C-w)

Vuelve a generar el bloque (hunk) actual, sin tener en cuenta los cambios en los espacios en blanco (diff-ignore-whitespace-hunk).

Ctrl-x 4 A (C-x 4 A)

Genera una entrada ChangeLog, como hace C-x 4 a (ver 29.3 Registro de Cambios (Change Logs)), para cada uno de los bloques (diff-add-change-log-entries-other-window). Esto crea un esqueleto del registro de cambios que puede rellenar más tarde con las descripciones reales de los cambios. El propio C-x 4 a en modo Diff opera en nombre del archivo del bloque actual, pero obtiene el nombre de la función del propio parche. Esto es útil para hacer entradas de registro para las funciones que son eliminadas por el parche.

Los parches a veces incluyen espacios en blanco al final de las líneas modificadas, como un cambio involuntario y no deseado. Hay dos formas de solucionar este problema. En primer lugar, si activa el modo de espacios en blanco en un búfer de Diff (vea 15.17 Espacios en Blanco Innecesarios), automáticamente resaltará los espacios en blanco al final de las líneas modificadas. En segundo lugar, puede usar el comando M-x diff-delete-trailing-whitespace, que busca los espacios en blanco en las líneas modificadas por el parche, y los elimina tanto en el parche como en los archivos fuente parcheados. Este comando no guarda las modificaciones que realiza, por lo que puede decidir si desea guardar los cambios (la lista de archivos modificados se muestra en el área de eco). Con un argumento prefijo, intenta modificar los archivos fuente originales («antiguos») en lugar de los archivos fuente parcheados («nuevos»).

Si diff-font-lock-syntax es distinto de nil, los fragmentos del código fuente en los «hunks» se resaltan según el modo principal apropiado.

19.11 Copiar, Nombrar y Renombrar Archivos

Emacs tiene varios comandos para copiar, nombrar y renombrar archivos. Todos ellos leen dos nombres de archivo, antiguo (anterior o destino) y nuevo, usando el minibúfer, y luego copian o ajustan el nombre de un archivo en consecuencia; no aceptan nombres de archivo comodín.

En todos estos comandos, si el argumento nuevo es sólo un nombre de directorio (véase Nombres de Directorio en el Manual de Referencia de Emacs Lisp), el verdadero nombre nuevo está en ese directorio, con el mismo componente no-directorio que anterior. Por ejemplo, el comando Alt-x rename-file RETURN ~/foo RETURN ~/tmp/foo RETURN (M-x rename-file RET ~/foo RET /tmp/foo RET) renombra ~/foo a /tmp/foo. En GNU y otros sistemas POSIX, los nombres de directorio terminan en /.

Todos estos comandos piden confirmación cuando nuevo nombre de archivo ya existe.

M-x copy-file copia el contenido de archivo anterior en archivo nuevo.

M-x copy-directory copia directorios, de forma similar al comando de shell cp -r. Si nuevo es un nombre de directorio, crea una copia del directorio anterior y la coloca en nuevo. En caso contrario, copia todo el contenido del directorio anterior en uno nuevo. Si copy-directory-create-symlink es distinto de nil y antiguo es un enlace simbólico, este comando copiará el enlace simbólico. Si es nil, este comando seguirá el enlace y copiará el contenido en su lugar. (Esta es la opción por defecto).

M-x rename-file renombra al archivo antiguo como nuevo. Si nombre de archivo nuevo ya existe, debe confirmar con yes (si) o no se llevará a cabo el renombrado; esto se debe a que el renombramiento hace que se pierda el significado anterior del nombre nuevo. Si antiguo y nuevo están en sistemas de archivos diferentes, el archivo antiguo se copia y se borra.

Si un archivo está bajo control de versiones (véase 29.1 Control de Versiones), deberá renombrarlo usando M-x vc-rename-file en lugar de M-x rename-file. Consulte 29.1.12.2 Borrar y Renombrar Archivos Controlados por Versión.

M-x add-name-to-file añade un nombre adicional a un archivo existente sin eliminar nombre anterior. El archivo de nombre nuevo se crea como un enlace duro al archivo existente. El fichero de nombre nuevo debe pertenecer al mismo sistema de ficheros que el archivo a renombrar. En MS-Windows, este comando sólo funciona si el archivo reside en un sistema de archivos NTFS. En MS-DOS, y algunos tipos de sistemas remotos, funciona copiando el archivo.

M-x make-symbolic-link crea un enlace simbólico llamado nuevo, que apunta al archivo anterior. El efecto es que los futuros intentos de abrir el archivo nuevo se referirán al archivo que se llame destino en el momento de la apertura, o se producirá un error si el nombre destino no existe en ese momento. Este comando no expande el argumento destino, por lo que permite especificar un nombre relativo como destino del enlace. Sin embargo, este comando expande el ~ inicial en destino para que pueda especificar fácilmente directorios de inicio, y elimina el /: inicial para que pueda especificar nombres relativos que comiencen con ~ o /: literales. Véase 19.16 Nombres de Archivos Entrecomillados. En MS-Windows, este comando sólo funciona en MS Windows Vista y versiones posteriores. Cuando nuevo es remoto, funciona dependiendo del tipo de sistema.

19.12 Operaciones Varias con Archivos

Emacs tiene comandos para realizar muchas otras operaciones con archivos. Todos operan sobre un fichero; no aceptan nombres de archivo comodín.

M-x delete-file solicita un archivo y lo borra. Si está borrando muchos archivos en un directorio, puede ser más conveniente usar Dired en lugar de delete-file. Consulte 31.3 Borrar Archivos con Dired.

M-x move-file-to-trash mueve un archivo a la Papelera del sistema (o Papelera de Reciclaje). Se trata de una función disponible en la mayoría de los sistemas operativos; los archivos que se mueven a la Papelera pueden recuperarse más tarde si cambia de opinión. (La forma de restaurar los archivos de la papelera depende del sistema).

Por defecto, los comandos de borrado de Emacs no utilizan la Papelera. Para usar la Papelera (cuando esté disponible) para los comandos comunes de borrado, cambie la variable delete-by-moving-to-trash a t. Esto afecta a los comandos M-x delete-file y M-x delete-directory (ver 19.8 Directorios de Archivos), así como a los comandos de borrado en Dired (ver 31.3 Borrar Archivos con Dired). Suministrar un argumento prefijo a M-x delete-file o M-x delete-directory hace que se borren directamente, en lugar de usar la Papelera, independientemente de delete-by-moving-to-trash.

Si tiene configurado delete-by-moving-to-trash, y quiere borrar archivos manualmente en Emacs desde el directorio Trash, usar comandos como D (dired-do-delete) no funciona bien en este directorio (sólo le dará un nuevo nombre al archivo, pero no borrará nada). Si desea poder hacer esto, debe crear un archivo .dir-locals.el que contenga algo como lo siguiente en el directorio Papelera:

((dired-mode . ((delete-by-moving-to-trash . nil))))

Tenga en cuenta, sin embargo, que si usa el comando del sistema «vaciar papelera», es probable que también borre este archivo .dir-locals.el, por lo que esto sólo debería hacerse si borra archivos del directorio Papelera manualmente.

Si un archivo está bajo control de versiones (vea 29.1 Control de Versiones), debería borrarlo usando M-x vc-delete-file en lugar de M-x delete-file. Consulte :ref:`` 29.1.12.2 Borrar y Renombrar Archivos Controlados por Versión.

M-x insert-file (también C-x i) inserta una copia del contenido del archivo especificado en el búfer actual en el punto, dejando el punto sin cambios antes del contenido. La posición después del contenido insertado se añade al anillo de marcas, sin activar la marca (véase 12.4 El Anillo de Marcas).

M-x insert-file-literally es como M-x insert-file, excepto que el archivo se inserta literalmente: se trata como una secuencia de caracteres ASCII sin codificación especial ni conversión, de forma similar al comando M-x find-file-literally (ver 19.2 Visitar Archivos).

M-x write-región es el comando inverso de M-x insert-file; copia el contenido de la región en el archivo especificado. M-x append-to-file añade el texto de la región al final del archivo especificado. Véase 13.4 Acumular Texto. La variable write-region-inhibit-fsync se aplica a estos comandos, así como al guardado de archivos; véase 19.3.3 Personalizar el Guardado de Archivos.

M-x set-file-modes lee un nombre de archivo seguido de un modo de archivo y aplica ese modo de archivo al archivo especificado. Los modos de archivo, también llamados permisos de archivo, determinan si un archivo puede leerse, escribirse o ejecutarse, y quién puede hacerlo. Este comando lee los modos de archivo usando el mismo formato simbólico u octal aceptado por el comando chmod; por ejemplo, u+x significa añadir permiso de ejecución para el Usuario propietario del archivo. No tiene efecto en sistemas operativos que no soportan modos de archivo. chmod es un alias de conveniencia para esta función.

19.13. Acceso a Archivos Comprimidos

Emacs descomprime automáticamente los archivos comprimidos cuando los visita, y los recomprime automáticamente si los modifica y guarda. Emacs reconoce los archivos comprimidos por sus nombres. Los nombres de archivo que terminan en .gz indican un archivo comprimido con gzip. Otras terminaciones indican otros programas de compresión.

La descompresión y compresión automáticas se aplican a todas las operaciones en las que Emacs usa el contenido de un archivo. Esto incluye visitarlo, guardarlo, insertar su contenido en un búfer, cargarlo y compilarlo en bytes.

Para desactivar esta función, escriba el comando Alt-x auto-compression-mode (M-x auto-compression-mode). Puede desactivarla permanentemente personalizando la variable auto-compression-mode.

19.14 Archivos de Archivos

Un fichero cuyo nombre termina en .tar es normalmente un archivo hecho por el programa tar. Emacs visualiza estos archivos en un modo especial llamado modo Tar que proporciona una lista de contenidos similar a Dired (ver 31 Dired, el Editor de Directorios). Puede moverse por la lista como lo haría en Dired, y visitar los subarchivos contenidos en el archivo. Sin embargo, no todos los comandos de Dired están disponibles en modo Tar.

Si el modo de compresión automática está activado (ver 19.13. Acceso a Archivos Comprimidos), entonces el modo Tar se usa también para archivos comprimidos, archivos con extensiones .tgz, .tar.Z y .tar.gz.

Las teclas e (e), f (f) y RETURN (RET) extraen un archivo contenedor a su propio búfer. Puede editarlo allí y, si guarda el búfer, la versión editada sustituirá a la del búfer Tar. Hacer clic con el ratón sobre el nombre del archivo en el búfer Tar hace lo mismo. v extrae un archivo a un búfer en modo Visualizar (ver 15.6 Modo Vista). o extrae el archivo y lo muestra en otra ventana, de forma que pueda editar el archivo y operar en el archivo simultáneamente.

La tecla I (I) añade un nuevo archivo (normal) al archivo. El archivo está inicialmente vacío, pero puede editarse fácilmente usando los comandos anteriores. El comando inserta el nuevo archivo antes que el actual, de modo que usarlo en la primera línea del búfer Tar hace que el nuevo archivo sea el primero del archivo, y usarlo al final del búfer hace que sea el último.

d (d) marca un archivo para que se borre cuando más tarde use x (x), y u (u) desmarca un archivo, como en Dired. C (C) copia un archivo del archivo al disco y R (R) renombra un archivo dentro del archivo. g (g) revierte el búfer del archivo al disco. Las teclas M (M), G (G) y O (O) cambian los bits de permiso, el grupo y el propietario del archivo, respectivamente.

Al guardar el búfer Tar se escribe una nueva versión del archivo en el disco con los cambios realizados en los componentes.

No necesita el programa tar para usar el modo Tar: Emacs lee los archivos directamente. Sin embargo, para acceder a archivos comprimidos se necesita el programa de descompresión adecuado.

Se usa un modo de archivo separado pero similar para los archivos arc, jar, lzh, zip, rar, 7z y zoo, así como para los archivos exe que son ejecutables autoextraíbles.

Las combinaciones de teclas del modo Archivo son similares a las del modo Tar, con la adición de la tecla m (m), que marca un archivo para operaciones posteriores, y M-DEL, que desmarca todos los archivos marcados. Además, la tecla a activa la visualización de información detallada del archivo, para aquellos tipos de archivo en los que no cabe en una sola línea. Operaciones como renombrar un subarchivo, o cambiar su modo o propietario, sólo están soportadas para algunos de los formatos de archivo.

A diferencia del modo Tar, el modo Archivo ejecuta los programas de archivado para descomprimir y volver a empaquetar los archivos. Sin embargo, no necesita estos programas para ver la tabla de contenidos del archivo, sólo para extraer o manipular los subarchivos del archivo. Los detalles de los nombres de los programas y sus opciones se pueden configurar en el grupo de personalización Archive (ver 50.1.1 Grupos de Personalización).

19.15 Archivos Remotos

Puede hacer referencia a archivos de otras máquinas usando una sintaxis especial de nombres de archivo:

/method:host:nombrearchivo
/method:usuario@host:nombrearchivo
/method:usuario@host#port:nombrearchivo

Para llevar a cabo esta petición, Emacs usa un programa de inicio de sesión remoto como ssh. Siempre debe especificar en el nombre del archivo qué método usar-por ejemplo, /ssh:usuario@host:nombredearchivo usa ssh. Cuando se especifica el pseudo-método - en el nombre del archivo, Emacs elige el método de la siguiente manera:

  1. Si el nombre de host empieza por ftp. (con punto), Emacs usa FTP.

  2. Si el nombre de Usuario es ftp o anonymous, Emacs usa FTP.

  3. Si la variable tramp-default-method es ftp, Emacs usa FTP.

  4. Si ssh-agent se está ejecutando, Emacs usa scp.

  5. Si no, Emacs usa ssh.

Puede desactivar completamente la función de nombre de archivo remoto estableciendo la variable tramp-mode a nil. Puede desactivar la función en casos individuales entrecomillando el nombre de archivo con /: (consulte 19.16 Nombres de Archivos Entrecomillados).

El acceso remoto a archivos a través de FTP se gestiona mediante el paquete Ange-FTP, que se documenta a continuación. El acceso remoto a archivos a través de otros métodos es gestionado por el paquete Tramp, que tiene su propio manual. Ver El Manual de Tramp.

Cuando se usa el paquete Ange-FTP, Emacs entra a través de FTP usando el nombre usuario, si se especifica en el nombre del archivo remoto. Si no especifica usuario, Emacs inicia la sesión usando su nombre de Usuario en el sistema local; pero si establece la variable ange-ftp-default-user a una cadena, se usará esa cadena en su lugar. Al iniciar sesión, Emacs también puede pedir una contraseña.

Por razones de rendimiento, Emacs no hace por defecto copias de seguridad de los archivos a los que se accede por FTP. Para hacerlo, cambie la variable ange-ftp-make-backup-files a un valor no nulo.

Por defecto, los archivos de autoguardado para archivos remotos se realizan en el directorio de archivos temporales de la máquina local, tal y como especifica la variable auto-save-file-name-transforms. Véase 19.6.1 Autoguardar Archivos.

Para visitar archivos accesibles por FTP anónimo, se usan nombres de Usuario especiales anonymous o ftp. Las contraseñas para estos nombres de Usuario se tratan de forma especial. La variable ange-ftp-generate-anonymous-password controla lo que ocurre: si el valor de esta variable es una cadena, entonces esa cadena se usa como contraseña; si no es nula (por defecto), entonces se usa el valor de user-mail-address; si es nula, Emacs le pide una contraseña como siempre (vea 9.7 Ingresar Contraseñas).

A veces puede que no pueda acceder a los archivos de una máquina remota porque un cortafuegos intermedio bloquea la conexión por razones de seguridad. Si puede conectarse a una máquina pasarela desde la que se pueda acceder a los archivos de destino, y cuyo servidor FTP admita las funciones de pasarela, puede seguir usando nombres de archivo remotos; todo lo que tiene que hacer es especificar el nombre de la máquina pasarela configurando la variable ange-ftp-gateway-host, y configurar ange-ftp-smart-gateway como t. De lo contrario, puede hacer que funcionen los nombres de archivo remotos, pero el procedimiento es complejo. Puede leer las instrucciones escribiendo Alt-x finder-commentary RETURN ange-ftp RETURN (M-x finder-commentary RET ange-ftp RET).

19.16 Nombres de Archivos Entrecomillados

Puede entrecomillar un nombre de archivo absoluto para evitar que los caracteres especiales y la sintaxis que contenga tengan sus efectos especiales. La forma de hacerlo es añadir /: al principio.

Por ejemplo, puede entrecomillar un nombre de archivo local que parezca remoto para evitar que se trate como un nombre de archivo remoto. Así, si tiene un directorio llamado /foo: y un archivo llamado bar en él, puede referirse a ese archivo en Emacs como /:/foo:/bar.

Si sólo quiere citar caracteres especiales en la parte local de un nombre de archivo remoto, puede citar sólo la parte local. /ssh:baz:/:/foo:/bar se refiere al archivo bar del directorio /foo: en el host baz.

/: también puede evitar que ~ sea tratado como un carácter especial para el directorio personal de un Usuario. Por ejemplo, /:/tmp/~hack se refiere a un archivo cuyo nombre es ~hack en el directorio /tmp.

Citar con /: es también una forma de introducir en el minibúfer un nombre de archivo que contenga $. Para que esto funcione, el /: debe estar al principio del contenido del minibúfer. (También puede duplicar cada $; consulte Nombres de Archivo con $ en ref:19.1

También puede entrecomillar caracteres comodín con /:, para visitas. Por ejemplo, /:/tmp/foo*bar visita el archivo /tmp/foo*bar.

Otro método para obtener el mismo resultado es introducir /tmp/foo[*]bar, que es una especificación comodín que sólo coincide con /tmp/foo*bar. Sin embargo, en muchos casos no es necesario entrecomillar los caracteres comodín porque incluso sin entrecomillar dan el resultado correcto. Por ejemplo, si el único nombre de archivo de /tmp que empieza por foo y termina por bar es foo*bar, al especificar /tmp/foo*bar sólo se visitará /tmp/foo*bar.

19.17 Caché de Nombres de Archivo

Puede usar la caché de nombres de archivo para facilitar la localización de un archivo por su nombre, sin tener que recordar exactamente dónde se encuentra. Al escribir un nombre de archivo en el minibúfer, Ctrl-TAB (C-TAB, file-cache-minibuffer-complete) lo completa usando la caché de nombres de archivo. Si repite C-TAB, eso hace un ciclo a través de las posibles terminaciones de lo que había tecleado originalmente. (Sin embargo, tenga en cuenta que el carácter C-TAB no se puede teclear en la mayoría de los terminales de texto).

La caché de nombres de archivo no se llena automáticamente. En su lugar, Usted carga los nombres de archivo en la caché usando estos comandos:

Alt-x file-cache-add-directory RETURN directorio RETURN
(M-x file-cache-add-directory RET directorio RET)

Añade cada nombre de archivo del directorio a la caché de nombres de archivo.

Alt-x file-cache-add-directory-using-find RETURN directorio RETURN
(M-x file-cache-add-directory-using-find RET directorio RET)

Añade cada nombre de archivo del directorio y todos sus subdirectorios anidados a la caché de nombres de archivo.

Alt-x file-cache-add-directory-using-locate RETURN directorio RETURN
(M-x file-cache-add-directory-using-locate RET directorio RET)

Añade cada nombre de archivo del directorio y todos sus subdirectorios anidados a la caché de nombres de archivo, usando locate para encontrarlos a todos.

Alt-x file-cache-add-directory variable RETURN
(M-x file-cache-add-directory-list RET variable RET)

Añade cada nombre de archivo de cada directorio enumerado en variable a la caché de nombres de archivo. variable ser una variable Lisp cuyo valor sea una lista de directorios, como load-path.

Alt-x file-cache-clear-cache RETURN
(M-x file-cache-clear-cache RET)

Borra la caché; es decir, elimina todos los nombres de archivo de la misma.

La caché de nombres de archivo no es persistente: se guarda y mantiene sólo mientras dura la sesión de Emacs. Puede ver el contenido de la caché con el comando file-cache-display.

19.18 Funciones Útiles para Encontrar Archivos

En esta sección, presentamos algunas facilidades convenientes para encontrar archivos abiertos recientemente, leyendo nombres de archivos desde un búfer.

Si habilita el modo recentf, con M-x recentf-mode, Emacs mantiene una lista de archivos abiertos recientemente. Para abrir un archivo de esta lista, use el comando M-x recentf-open. Cuando este modo está activado, el menú File (Archivo) incluirá un submenú que puede usar para visitar uno de estos archivos. M-x recentf-save-list guarda la lista recentf actual en un archivo, y M-x recentf-edit-list la edita.

El comando M-x ffap generaliza find-file con heurísticas por defecto más potentes (véase 47.5 Encontrar Archivos y URLs en un Punto), a menudo basadas en el texto en el punto. El modo de finalización parcial ofrece otras características que amplían find-file, que pueden usarse con ffap. Consulte 9.4.5 Opciones de Completado.

19.19 Visualización de Archivos de Imagen

Al visitar archivos de imagen se selecciona automáticamente el modo Imagen (Image mode). En este modo principal, puede teclear Ctrl-c Ctrl-c (C-c C-c, image-toggle-display) para alternar entre mostrar el archivo como una imagen en el búfer de Emacs, y mostrar su representación de texto en bruto (o byte en bruto). Además, puede escribir (C-c C-x, image-toggle-hex-display) para alternar entre mostrar el archivo como una imagen en el búfer de Emacs y mostrarlo en representación hexadecimal. Mostrar el archivo como una imagen sólo funciona si Emacs está compilado con soporte para mostrar este tipo de imágenes.

Si la imagen mostrada es más ancha o más alta que la ventana en la que se muestra, las teclas habituales de movimiento de puntos (Ctrl-f (C-f), Ctrl-p, C-p etc.) hacen que se muestren diferentes partes de la imagen. Sin embargo, por defecto las imágenes se redimensionan automáticamente para ajustarse a la ventana, por lo que esto sólo es necesario si se personaliza el comportamiento por defecto usando las opciones image-auto-resize e image-auto-resize-on-window-resize.

Para redimensionar la imagen manualmente puede usar el comando image-transform-fit-to-window enlazado a sw (s w) que ajusta la imagen tanto a la altura como a la anchura de la ventana. Para escalar la imagen a un porcentaje de su tamaño original, use el comando image-transform-set-percent enlazado a sp (s p). Para escalar la imagen especificando un factor de escala, use el comando image-transform-set-scale enlazado a ss (s s). Para restablecer todas las transformaciones al estado inicial, use image-transform-reset-to-initial enlazado a s0 (s 0), o image-transform-reset-to-original enlazado a so (s o).

Puede pulsar n (n, image-next-file) y p (p, image-previous-file) para visitar el siguiente archivo de imagen y el archivo de imagen anterior en el mismo directorio, respectivamente. Estos comandos consultarán el búfer del directorio «padre» para determinar cuál es el archivo de imagen siguiente/anterior. Estos comandos también funcionan al abrir un archivo desde archivos de archivo (como archivos zip o tar), y consultarán en su lugar el búfer de modo de archivo. Si no se puede encontrar ni un archivo ni un búfer «padre», se abrirá un búfer «padre».

Al examinar imágenes, a veces es conveniente poder marcar los archivos para procesarlos posteriormente (por ejemplo, si desea seleccionar un grupo de imágenes para copiarlas en otro lugar). El comando m (m, image-mode-mark-file) marcará el archivo actual en cualquier búfer(es) Dired que muestre el directorio del archivo actual. Si no hay ningún búfer abierto, el directorio se abre en uno nuevo. Para desmarcar archivos, use el comando u (u, image-mode-mark-file). Por último, si sólo desea copiar el nombre del archivo del búfer actual en el anillo de muertes, puede usar el comando w (w, image-mode-copy-file-name-as-kill).

Si la imagen se puede animar, el comando RET (image-toggle-animation) inicia o detiene la animación. La animación se reproduce una vez, a menos que la opción image-animate-loop no sea nula. Con f (f, image-next-frame) y b (image-previous-frame) puede recorrer los distintos marcos. Ambos comandos aceptan un prefijo numérico para recorrer varios marcos a la vez. Puede ir a un marco específico con F (F, image-goto-frame). Los marcos se indexan a partir de 1. Si escribe a+ (a +, image-increase-speed) aumenta la velocidad de la animación, a-- (a -, image-decrease-speed) la disminuye y ar (a r, image-reverse-speed) la invierte. El comando a0 (a 0, image-reset-speed) restablece la velocidad al valor original.

Además de las combinaciones de teclas anteriores, que son específicas del modo Imagen, las imágenes mostradas en cualquier búfer de Emacs tienen combinaciones de teclas especiales cuando el punto está en la imagen o dentro de ella:

i+ (i +)

Aumenta el tamaño de la imagen (image-increase-size) en un 20%. El argumento numérico prefijo controla el incremento; el valor de n significa multiplicar el tamaño por el factor 1 + n / 10, por lo que Ctrl-u 5i+ (C-u 5 i +) significa aumentar el tamaño en un 50%.

i- (i -)

Disminuye el tamaño de la imagen (image-increase-size) en un 20%. El argumento numérico prefijo controla el decremento; el valor de n significa multiplicar el tamaño por el factor de 1 - n / 10, por lo que Ctrl-u 3i- (C-u 3 i -) significa disminuir el tamaño en un 30%.

ir (i r)

Gira la imagen 90º en el sentido de las agujas del reloj (image-rotate). Con el argumento prefijo, rota 90 grados en sentido contrario a las agujas del reloj. Tenga en cuenta que este comando no está disponible para imágenes cortadas.

ih (i h)

Gira la imagen horizontalmente (image-flip-horizontally). Esto presenta la imagen como si se reflejara en un espejo vertical. Tenga en cuenta que este comando no está disponible para imágenes cortadas.

iv (i v)

Gira la imagen verticalmente (image-flip-vertically). Esto presenta la imagen como si se reflejara en un espejo horizontal. Tenga en cuenta que este comando no está disponible para imágenes cortadas.

io (i o)

Guardar la imagen en un archivo (image-save). Este comando le pide el nombre del archivo para guardar la imagen.

ic (i c)

Recorta la imagen (image-crop). Este comando sólo está disponible si su sistema tiene instalado un programa externo que pueda usarse para recortar y cortar imágenes; la opción de Usuario image-crop-crop-command determina qué programa usar, y por defecto usa el programa de conversión de ImageMagick. El comando muestra la imagen con un marco rectangular superpuesto, y le permite usar el ratón para mover y redimensionar el marco. Escriba m (m) para que los movimientos del ratón muevan el marco en lugar de redimensionarlo; escriba s (s) para mover un marco cuadrado en su lugar. Cuando esté satisfecho con la posición y el tamaño del marco de recorte, escriba RETURN (RET) para recortar la parte que está debajo del marco; o q (q) para salir sin recortar. Puede guardar la imagen recortada usando i o o M-x imagen-guardar.

ix (i x)

Corta un rectángulo de la imagen (image-cut). Funciona igual que image-crop (y también requiere un programa externo, definido por la variable image-crop-cut-command, para realizar el corte de la imagen), pero en lugar de recortar la imagen, elimina la parte dentro del marco y rellena esa parte con el color especificado por image-cut-color. Con el argumento prefijo, el comando pregunta por el color a usar.

Los comandos de tamaño y rotación son «repetitivos», lo que significa que puede seguir ajustando la imagen sin usar el prefijo i.

Si Emacs fue compilado con soporte para la librería ImageMagick, puede usarla para renderizar una amplia variedad de imágenes. La variable imagemagick-enabled-types lista los tipos de imagen que Emacs puede renderizar usando ImageMagick; cada elemento de la lista debe ser un nombre interno de ImageMagick para un tipo de imagen, como un símbolo o una cadena equivalente (por ejemplo, BMP para imágenes .bmp). Para habilitar ImageMagick para todos los tipos de imagen posibles, cambie imagemagick-enabled-types a t. La variable imagemagick-types-inhibit lista los tipos de imagen que nunca deberían ser renderizados usando ImageMagick, independientemente del valor de imagemagick-enabled-types (la lista por defecto incluye tipos como C y HTML, que ImageMagick puede renderizar como imagen pero Emacs no). Para desactivar ImageMagick completamente, cambie imagemagick-types-inhibit a t.

Si Emacs no tiene soporte nativo para el formato de imagen en cuestión, y la variable image-use-external-converter es no-nil, Emacs intentará determinar si existen utilidades externas que puedan utilizarse para transformar la imagen en cuestión a PNG antes de mostrarla. GraphicsMagick, ImageMagick y ffmpeg están actualmente soportados para la conversión de imágenes.

Además, puede que desee añadir manejadores especiales para determinados formatos de imagen. Éstos pueden añadirse con la función image-converter-add-handler. Por ejemplo, para permitir la visualización de archivos Krita como imágenes simples, Usted podría escribir algo como:

(image-converter-add-handler
 "kra"
  (lambda (file data-p)
(if data-p
    (error "Can't decode non-files")
  (call-process "unzip" nil t nil
                "-qq" "-c" "-x" file "mergedimage.png"))))

La función toma dos parámetros, donde el primero es un sufijo de nombre de archivo, y el segundo es una función para hacer la «conversión». Esta función toma dos parámetros, donde el primero es el nombre del archivo o una cadena con los datos, y el segundo dice si el primer parámetro son datos o no, y debe dar salida a una imagen en formato image-convert-to-format (image-convert-to-format) en el búfer actual.

El paquete Image-Dired también puede usarse para ver imágenes como miniaturas. Vea 31.19 Ver Miniaturas de Imágenes en Dired.

19.20 Conjunto de Archivos

Si edita regularmente un determinado grupo de ficheros, puede definirlos como un conjunto de archivos (fileset). Esto le permite realizar ciertas operaciones, como visitar, query-replace (consultar-reemplazar), y comandos shell en todos ellos a la vez. Para usar conjuntos de archivos, primero debe añadir la expresión (filesets-init) a su archivo de inicio (vea 50.4. El Archivo de Inicialización de Emacs). Esto añade un submenú Filesets al menú File de la barra de menú.

La forma más sencilla de definir un conjunt de archivos es añadiéndole archivos de uno en uno. Para añadir un archivo a este conjunto de archivos, visite el archivo y escriba Alt-x filesets-add-buffer RETURN nombre RETURN (M-x filesets-add-buffer RET nombre RET). Si no hay ningún nombre de fileset, se crea uno nuevo, que inicialmente sólo contiene el archivo actual. El comando M-x filesets-remove-buffer elimina el archivo actual de un conjunto de ficheros.

También puede editar la lista de conjuntos de archivos directamente, con M-x filesets-edit (o eligiendo Edit Filesets (Editar Conjunto de Archivos) en el menú Filesets (Conjuntos de Archivos)). La edición se realiza en un búfer de personalización (véase 50.1 Interfaz de Personalización Fácil). Normalmente, un conjunto de archivos es una simple lista de archivos, pero también puede definir un conjunto de archivos como una expresión regular que coincida con nombres de archivo. Algunos ejemplos de estos conjuntos de ficheros más complicados se muestran en el búfer Personalizar. Recuerde seleccionar Save for future sessions (Guardar para futuras sesiones) si quiere usar los mismos conjuntos de archivos en futuras sesiones de Emacs.

Puede usar el comando M-x filesets-open para visitar todos los archivos de un fileset, y M-x filesets-close para cerrarlos. Use M-x filesets-run-cmd para ejecutar un comando de shell en todos los archivos de un fileset. Estos comandos también están disponibles en el menú Filesets, donde cada conjunto de archivos existente está representado por un submenú.

29.1 Control de Versiones, para un concepto diferente de los conjuntos de archivos: grupos de archivos organizados para operaciones de control de versiones. Los conjuntos de archivos de este tipo no tienen nombre, y no permanecen a través de las sesiones de Emacs.