Inicio

Traducción al Español de la documentación oficial del Manual Emacs 28.2 llevada a cabo por Tano autor del Sitio Web homónimo.

Distribución

Gnu Emacs es Software Libre; esto significa que todo el mundo es libre de usarlo y de redistribuirlo bajo ciertas condiciones. Emacs de GNU no es de dominio público; tiene derechos de autor y hay restricciones en su distribución, pero estas restricciones están diseñadas para permitir todo lo que un buen ciudadano cooperante querría hacer. Lo que no está permitido es tratar de impedir que otros sigan compartiendo cualquier versión de Gnu Emacs que puedan obtener de usted. Las condiciones precisas se encuentran en la Licencia Pública General de GNU que viene con Emacs y que también aparece en este manual (1). Ver LICENCIA PÚBLICA GENERAL DE GNU.

Nota

1 Este manual está cubierto por la Licencia de Documentación Libre de GNU. Esta licencia es similar en espíritu a la Licencia Pública General, pero es más adecuada para la documentación. Véase Licencia Pública General de GNU la licencia de documentación libre de GNU.

Una forma de conseguir una copia de Gnu Emacs es a través de otra persona que lo tenga. No necesita pedirnos permiso para hacerlo, ni decírselo a nadie más; simplemente cópielo. Si tiene acceso a Internet, puede obtener la última versión de distribución de Gnu Emacs por FTP anónimo; vea nuestro sitio web para más información.

También puede recibir Gnu Emacs cuando compre un ordenador. Los fabricantes de ordenadores son libres de distribuir copias en los mismos términos que se aplican a todos los demás. Estos términos requieren que le den las fuentes completas, incluyendo cualquier cambio que puedan haber hecho, y que le permitan redistribuir el Emacs de GNU recibido de ellos bajo los términos habituales de la Licencia Pública General. En otras palabras, el programa debe ser libre para usted cuando lo obtenga, no sólo libre para el fabricante.

Si encuentra útil Gnu Emacs, por favor, envíe una donación a la Free Software Foundation para apoyar nuestro trabajo. Las donaciones a la Free Software Foundation son deducibles de impuestos en los Estados Unidos. Si lo usa en su lugar de trabajo, por favor sugiera que la compañía haga una donación. Para donar, vea https://my.fsf.org/donate/. Para otras formas de ayudar, vea https://www.gnu.org/help/help.html.

También vendemos versiones impresas de este manual y de An Introduction to Programming in Emacs Lisp, de Robert J. Chassell. Puede visitar nuestra tienda en línea en https://shop.fsf.org/. Los ingresos de las ventas se destinan a apoyar el propósito de la fundación: el desarrollo de nuevo software libre, y las mejoras de nuestros programas existentes, incluyendo Gnu Emacs.

Si necesita ponerse en contacto con la Fundación para el Software Libre, consulte https://www.fsf.org/about/contact/, o escriba a

Free Software Foundation
51 Franklin Street, Fifth Floor
Boston, MA 02110-1301
USA

Copyright © 1985–1987, 1993–2022 Free Software Foundation, Inc.

Se concede permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre GNU, Versión 1.3 o cualquier versión posterior publicada por la Free Software Foundation; siendo las Secciones Invariantes "El Manifiesto GNU", "Distribución" y "LICENCIA PÚBLICA GENERAL GNU", siendo los Textos de Cubierta Delantera "Un Manual GNU", y con los Textos de Cubierta Trasera como en (a) más abajo. Una copia de la licencia se incluye en la sección titulada "GNU Free Documentation License".
(a) El texto de contraportada de la FSF es: "Usted tiene la libertad de copiar y modificar este manual de GNU. Comprar copias a la FSF la apoya en el desarrollo de GNU y en la promoción de la libertad del software."

Introducción

Está leyendo sobre GNU Emacs, la encarnación GNU del avanzado, autodocumentado, personalizable y extensible editor Emacs. (La G de GNU (GNU no es Unix) no es muda).

Llamamos a Emacs avanzado porque puede hacer mucho más que la simple inserción y eliminación de texto. Puede controlar subprocesos, sangrar programas automáticamente, mostrar múltiples archivos a la vez, editar archivos remotos como si fueran archivos locales, y mucho más. Los comandos de edición de operan en términos de caracteres, palabras, líneas, frases, párrafos y páginas, así como de expresiones y comentarios en varios lenguajes de programación.

La autodocumentación significa que en cualquier momento puede usar comandos especiales, conocidos como comandos de ayuda, para saber cuáles son sus opciones, o para saber qué hace cualquier comando, o para encontrar todos los comandos que pertenecen a un tema determinado. Ver Ayuda (Help).

Personalizable significa que puede alterar fácilmente el comportamiento de los comandos de forma sencilla. Por ejemplo, si usa un lenguaje de programación en el que los comentarios empiezan con <** y terminan con **>, puede decirle a los comandos de manipulación de comentarios que usen esas cadenas (ver Manipulación de comentarios). Por poner otro ejemplo, puede revincular los comandos básicos de movimiento del cursor ( arriba, abajo, izquierda y derecha) a cualquier tecla del teclado que le resulte cómoda. Véase Personalización.

Extensible significa que puede ir más allá de la simple personalización y crear comandos completamente nuevos. Los nuevos comandos son simplemente programas escritos en el lenguaje Lisp, que son ejecutados por el propio intérprete Lisp de Emacs. Los comandos existentes pueden incluso redefinirse en medio de una sesión de edición, sin tener que reiniciar el Editor. La mayoría de los comandos de edición en Emacs están escritos en Lisp; las pocas excepciones podrían haber sido escritas en Lisp pero usan C en su lugar por eficiencia. Escribir una extensión es programar, pero los no programadores pueden usarla después. Vea el Prefacio en Una Introducción a la Programación en Emacs Lisp, si quiere aprender a programar en este lenguaje.



La Organizacion De La Pantalla

En una pantalla gráfica, como en GNU/Linux usando el sistema X Window, Emacs ocupa una ventana gráfica. En un terminal de texto, ocupa toda la pantalla del terminal. Usaremos el término marco para referirnos a una ventana gráfica o pantalla de terminal ocupada por el editor. Emacs se comporta de forma muy similar en ambos tipos de marcos. Normalmente comienza con un solo marco, pero puede crear marcos adicionales si lo desea (ver Marcos y Pantallas Gráficas).

Cada marco consiste en varias regiones distintas. En la parte superior del marco hay una barra de menús, que le permite acceder a los comandos a través de una serie de menús. En una pantalla gráfica, justo debajo de la barra de menús hay una barra de herramientas, una fila de iconos que ejecutan comandos de edición cuando se hace clic en ellos. En la parte inferior del marco hay un área de eco, donde se muestran mensajes informativos y donde se introduce información cuando Emacs la solicita.

El área principal del marco, por debajo de la barra de herramientas (si existe) y por encima del área de eco, se llama ventana. De ahora en adelante en este manual, usaremos la palabra "ventana" en este sentido. Los sistemas de visualización gráfica suelen utilizar la palabra "ventana" con un significado diferente; pero, como se ha dicho anteriormente, nos referimos a esas ventanas gráficas como "marcos".

Una ventana de Emacs es el lugar donde se muestra el buffer -el texto u otros gráficos que está editando o viendo-. En una pantalla gráfica, la ventana posee una barra de desplazamiento en un lado, que puede usarse para desplazarse por el búfer. La última línea de la ventana es una línea de modo. En ella se muestra diversa información sobre lo que está ocurriendo en el buffer, como por ejemplo si hay cambios sin guardar, los modos de edición que están en uso, el número de línea actual, etc.

Cuando inicia Emacs, normalmente sólo hay una ventana en el marco. Sin embargo, puede subdividir esta ventana horizontal o verticalmente para crear múltiples ventanas, cada una de las cuales puede mostrar independientemente un buffer (vea Ventanas Múltiples).

En cualquier momento, una de las ventanas es la ventana seleccionada. En una pantalla gráfica, la ventana seleccionada muestra un cursor más prominente (normalmente sólido y parpadeante); las otras ventanas muestran un cursor menos prominente (normalmente una caja hueca). En un terminal de texto, sólo hay un cursor, que se muestra en la ventana seleccionada. El búfer que se muestra en la ventana seleccionada se llama búfer actual, y es donde se produce la edición. La mayoría de los comandos de Emacs se aplican implícitamente al búfer actual; el texto que se muestra en las ventanas no seleccionadas es visible sobre todo como referencia. Si utiliza varios marcos en una pantalla gráfica, al seleccionar un marco en particular se selecciona una ventana en ese marco.

Punto

El cursor en la ventana seleccionada muestra la ubicación donde la mayoría de los comandos de edición tienen efecto, que se llama punto (2). Muchos comandos de Emacs mueven el punto a diferentes lugares en el buffer; por ejemplo, puede colocar el punto pulsando el botón 1 del ratón (normalmente el botón izquierdo) en el lugar deseado.

Nota

(2) El término "punto" viene del carácter ., que era el comando en TECO (el lenguaje en el que se escribió el Emacs original) para acceder a la posición de edición.

Por defecto, el cursor en la ventana seleccionada se dibuja como un bloque sólido y parece estar sobre un carácter, pero debería pensar en el punto como algo entre dos caracteres; está situado antes del carácter bajo el cursor. Por ejemplo, si su texto se parece a frob con el cursor sobre la b, entonces el punto está entre la o y la b. Si inserta el carácter ! en esa posición, el resultado es fro!b, con el punto entre el ! y la b. Así, el cursor permanece sobre la b, como antes.

Si está editando varios archivos en Emacs, cada uno en su propio buffer, cada buffer tiene su propio valor de punto. Un búfer que no se visualiza en ese momento recuerda su valor de punto si lo vuelve a visualizar más tarde. Además, si un búfer se muestra en varias ventanas, cada una de ellas tiene su propio valor de punto.

Vea Visualización del Cursor, para las opciones que controlan cómo Emacs muestra el cursor.

El área de eco

La línea en la parte inferior del marco es el área de eco. Se usa para mostrar pequeñas cantidades de texto para varios propósitos.

El área de eco se llama así porque una de las cosas para las que se usa es para hacer eco, lo que significa mostrar los caracteres de un comando de varios caracteres mientras se escribe. Los comandos de un solo carácter no tienen eco. Los comandos de varios caracteres (vea Teclas) se hacen eco si se hace una pausa de más de un segundo en medio de un comando. Emacs entonces se hace eco de todos los caracteres del comando hasta el momento, para pedirle el resto. Una vez que el eco ha comenzado, el resto del comando se hace eco inmediatamente mientras lo escribe. Este comportamiento está diseñado para que los usuarios confíen en sí mismos, mientras que los Usuarios indecisos reciben la máxima retroalimentación.

El área de eco también se usa para mostrar un mensaje de error cuando un comando no puede hacer su trabajo. Los mensajes de error pueden ir acompañados de un pitido o de un parpadeo en la pantalla.

Algunos comandos muestran mensajes informativos en el área de eco para decirle lo que el comando ha hecho, o para proporcionarle alguna información específica. Estos mensajes informativos, a diferencia de los mensajes de error, no van acompañados de un pitido o un parpadeo. Por ejemplo, C-x = (mantenga pulsada la tecla Ctrl y escriba x, luego suelte la tecla Ctrl y escriba =) muestra un mensaje que describe el carácter en cuestión, su posición en la memoria intermedia y su columna actual en la ventana. Los comandos que tardan mucho tiempo suelen mostrar mensajes que terminan en ... mientras trabajan (a veces también indican cuánto se ha avanzado, en forma de porcentaje), y añaden done (hecho) cuando terminan.

Los mensajes informativos del área de eco se guardan en un búfer especial llamado *Mensajes*. (Todavía no hemos explicado los búferes; vea Usando Múltiples Buffers, para más información sobre ellos). Si se pierde un mensaje que ha aparecido brevemente en la pantalla, puede pasar al búfer *Mensajes* para volver a verlo. Este buffer está limitado a un cierto número de líneas, especificado por la variable message-log-max. (Tampoco hemos explicado las variables; vea Variables, para más información sobre ellas). Más allá de este límite, se borra una línea del principio cada vez que se añade una nueva línea de mensajes al final.

Vea Personalización de la Pantalla, para las opciones que controlan cómo Emacs usa el área de eco.

El área de eco también se usa para mostrar el minibuffer, una ventana especial en la que se pueden introducir argumentos para los comandos, como el nombre de un archivo que se va a editar. Cuando el minibuffer está en uso, el texto que se muestra en el área de eco comienza con una cadena de instrucciones, y el cursor activo aparece dentro del minibuffer, que se considera temporalmente la ventana seleccionada. Siempre se puede salir del minibuffer escribiendo Ctrl-g (C-g). Véase El Minibuffer.

La línea de modo (modeline)

En la parte inferior de cada ventana hay una línea de modo, que describe lo que está ocurriendo en el buffer actual. Cuando sólo hay una ventana, la línea de modo aparece justo encima del área de eco; es la penúltima línea del marco. En una pantalla gráfica, la línea de modo se dibuja con una apariencia de caja 3D. Emacs también suele dibujar la línea de modo de la ventana seleccionada con un color diferente al de las ventanas no seleccionadas, para que destaque.

El texto que se muestra en la línea de modo tiene el siguiente formato:

cs:ch-fr buf pos line (major minor)
En un terminal de texto, este texto va seguido de una serie de guiones que se extienden hasta el borde derecho de la ventana. Estos guiones se omiten en una pantalla gráfica.

La cadena cs y los dos puntos que la siguen describen el conjunto de caracteres y la convención de nueva línea usada para el búfer actual. Normalmente, Emacs maneja automáticamente estos ajustes por Ud., pero a veces es útil tener esta información.

cs describe el conjunto de caracteres del texto en el buffer (vea Sistemas de Codificación). Si es un guión (-), eso indica que no se maneja ningún conjunto de caracteres especiales (con la posible excepción de las convenciones de fin de línea, descritas en el siguiente párrafo). = significa que no hay conversión alguna, y se suele usar para archivos que contienen datos no textuales. Otros caracteres representan diversos sistemas de codificación; por ejemplo, 1 representa ISO Latin-1.

En un terminal de texto, cs va precedido de dos caracteres adicionales que describen los sistemas de codificación para la entrada del teclado y la salida del terminal. Además, si está usando un método de entrada, cs va precedido de una cadena que identifica el método de entrada (véase Métodos de Entrada).

El carácter que sigue a cs suele ser dos puntos. Si se muestra una cadena diferente, eso indica una convención de fin de línea no trivial para codificar un archivo. Normalmente, en un archivo, las líneas de texto están separadas por caracteres de nueva línea, pero a veces se usan otras dos convenciones. La convención de MS-DOS usa un carácter de retorno de carro seguido de un carácter de salto de línea; al editar dichos archivos, los dos puntos cambian a una barra invertida (\) o (DOS), dependiendo del sistema operativo. Otra convención, empleada por los sistemas Macintosh más antiguos, usa un carácter de retorno de carro en lugar de una nueva línea; al editar estos archivos, los dos puntos se convierten en una barra inclinada (/) o en (Mac). En algunos sistemas, Emacs muestra (Unix) en lugar de los dos puntos para los archivos que usan la nueva línea como separador de líneas.

En los marcos creados para emacsclient (vea Invocar emacsclient), el siguiente carácter es @. Esta indicación es típica para los marcos de un proceso de Emacs que se ejecuta como demonio (vea Uso de Emacs como servidor).

El siguiente elemento en la línea de modo es la cadena indicada por ch. Esta muestra dos guiones (--) si el buffer mostrado en la ventana tiene el mismo contenido que el archivo correspondiente en el disco; es decir, si el buffer no está modificado. Si el búfer está modificado, muestra dos asteriscos (**). En el caso de un búfer de sólo lectura, muestra %* si el búfer está modificado, y %% en caso contrario.

El carácter después de ch es normalmente un guión (-). Sin embargo, si el directorio por defecto (vea Nombres de Archivos) para el buffer actual está en una máquina remota, se muestra @ en su lugar.

fr da el nombre del marco seleccionada (vea Marcos y Pantallas Gráficas). Sólo aparece en los terminales de texto. El nombre del marco inicial es F1.

buf es el nombre de la memoria intermedia que aparece en la ventana. Normalmente, es el mismo que el nombre del archivo que se está editando. Vea Usando Múltiples Buffers.

pos le indica si hay texto adicional por encima de la parte superior de la ventana, o por debajo de la parte inferior. Si su buffer es pequeño y todo su contenido es visible en la ventana, pos es All (Todo). De lo contrario, es Top si está mirando el principio del buffer, Bot si está mirando el final del buffer, o nn%, donde nn es el porcentaje del buffer por encima de la parte superior de la ventana. Con el modo de indicación de tamaño, también puede mostrar el tamaño del búfer. Véase Características opcionales de la línea de modo.

line es el carácter L seguido del número de línea en el punto. (También puede mostrar el número de columna actual, activando el modo Número de columna. Véase Características opcionales de la línea de modo).

major es el nombre del modo principal o modo mayor usado en el buffer. Un modo principal es un modo de edición principal para el buffer, como el modo Texto, el modo Lisp, el modo C, etc. Vea Modos principales o Mayores. Algunos modos principales muestran información adicional después del nombre del modo principal. Por ejemplo, los búferes de compilación y los búferes Shell muestran el estado del subproceso.

minor es una lista de algunos de los modos menores habilitados, que son modos de edición opcionales que proporcionan características adicionales además del modo mayor. Vea Modos menores.

Algunas características se enumeran junto con los modos menores siempre que estén activados, aunque no sean realmente modos menores. Narrow significa que el búfer que se muestra tiene la edición restringida a sólo una parte de su texto (vea Estrechamiento). Def significa que se está definiendo una macro de teclado (vea Macros de teclado).

Por otra parte, si Emacs está dentro de un nivel de edición recursivo, aparecen corchetes ([...]) alrededor de los paréntesis que rodean los modos. Si se está en un nivel de edición recursivo dentro de otro, aparecen dobles corchetes, y así sucesivamente. Dado que los niveles de edición recursiva afectan a Emacs globalmente, estos corchetes aparecen en la línea de modo de cada ventana. Vea Niveles de edición recursiva.

Puede cambiar la apariencia de la línea de modo así como el formato de su contenido. Vea Características opcionales de la línea de modo. Además, la línea de modo es sensible al ratón; al hacer clic en diferentes partes de la línea de modo se ejecutan varios comandos. Véase Comandos del ratón en la línea de modo. También, al pasar el puntero del ratón por encima de las partes sensibles al ratón de la línea de modo, se muestran sugerencias de herramientas (véase Información sobre herramientas (tooltips)) con información sobre los comandos que puede invocar al hacer clic en la línea de modo.

La barra de menús

Cada marco de Emacs tiene normalmente una barra de menús en la parte superior que puede usar para llevar a cabo operaciones comunes. No es necesario enumerarlas aquí, ya que puede verlas más fácilmente por Ud. mismo.

En una pantalla que soporte un ratón, puede usarlo para elegir un comando de la barra de menús. Una flecha en el borde derecho de un elemento de menú significa que conduce a un menú secundario, o submenú. Un ... al final de un elemento de menú significa que el comando le pedirá que introduzca más datos antes de hacer algo.

Algunos de los comandos de la barra de menús también tienen enlaces de teclas ordinarias; si es así, se muestra un enlace de teclas después del propio elemento. Para ver el nombre completo del comando y la documentación de un elemento de menú, escriba Ctrl-h k (C-h k) y, a continuación, seleccione la barra de menú con el ratón de la forma habitual (véase Documentación de una tecla).

En lugar de usar el ratón, también puede invocar el primer elemento de la barra de menús pulsando F10 (para ejecutar el comando menu-bar-open). A continuación, puede navegar por los menús con las teclas de dirección o con C-b, C-f (/, izquierda/derecha), C-p y C-n (/, arriba/abajo). Para activar un elemento del menú seleccionado, pulse Enter (RET); para cancelar la navegación por el menú, pulse Ctrl-g (C-g) o ESCESC (ESC ESC). (Sin embargo, tenga en cuenta que cuando Emacs fue construido con un kit de herramientas GUI, los menús son dibujados y controlados por el kit de herramientas, y las secuencias de teclas para cancelar la navegación por los menús pueden ser diferentes de la descripción anterior).

En un terminal de texto, puede acceder opcionalmente a los menús de la barra de menús en el área de eco. Para ello, personalice la variable tty-menu-open-use-tmm a un valor no nulo. Entonces, al teclear F10 se ejecutará el comando tmm-menubar en lugar de desplegar el menú. (También puede escribir Alt-` (M-`), que siempre invoca tmm-menubar). tmm-menubar le permite seleccionar un elemento del menú con el teclado. Aparece una opción provisional en el área de eco. Puede usar las teclas de flecha (hacia arriba) y (hacia abajo) para desplazarse por el menú a diferentes elementos, y luego puede escribir RET para seleccionar el elemento. Cada elemento del menú se designa también con una letra o un dígito (normalmente la inicial de alguna palabra del nombre del elemento). Esta letra o dígito está separada del nombre del elemento por ==>. Puede escribir la letra o el dígito del elemento para seleccionarlo.



Tipo de Entradas de los Usuarios

GNU Emacs está diseñado principalmente para su uso con el teclado. Aunque es posible usar el ratón para emitir comandos de edición a través de la barra de menús y la barra de herramientas, eso no es tan eficiente como usar el teclado. Por lo tanto, este manual documenta principalmente cómo editar con dicho periférico.

La entrada del teclado en Emacs se basa en una versión muy extendida de ASCII. Los caracteres simples, como a, B, 3, =, y el carácter de espacio (denotado como SPC), se introducen escribiendo la tecla correspondiente. Los caracteres de control, como RET, TAB, DEL, ESC, F1, Home e IZQUIERDA, también se introducen de esta manera, al igual que ciertos caracteres que se encuentran en teclados no ingleses (véase Soporte de juegos de caracteres internacionales).

Emacs también reconoce los caracteres de control que se introducen mediante teclas modificadoras. Dos teclas modificadoras comúnmente usadas son Ctrl (usualmente etiquetada como Ctrl), y Meta (usualmente etiquetada como Alt) (3). Por ejemplo, Ctrl-a (Control-a) se introduce manteniendo presionada la tecla Ctrl mientras se presiona a; nos referiremos a esto como C-a para abreviar. Del mismo modo, Alt-a Meta-a, o M-a para abreviar, se introduce manteniendo pulsada la tecla Alt y pulsando a. Las teclas modificadoras también pueden aplicarse a caracteres no alfanuméricos, por ejemplo, Ctrl-F1 (C-F1) o Alt- (M-LEFT).

Nota

(3) Nos referimos a Alt como Meta por razones históricas.

También se pueden escribir caracteres Meta usando secuencias de dos caracteres que comienzan con ESC. Así, puede introducir Alt-a (M-a) escribiendo ESC-a (ESC a). Puede ingresar o escribir C-M-a (manteniendo pulsadas las teclas Ctrl y Alt, y pulsando a) escribiendo ESC Ctrl-a (ESC C-a). A diferencia de Meta, ESC se introduce como un carácter separado. No hay que mantener pulsado ESC mientras se escribe el siguiente carácter; en su lugar, hay que pulsar ESC y soltarlo, y luego introducir el siguiente carácter. Esta característica es útil en ciertos terminales de texto donde la tecla Meta no funciona de forma fiable.

Emacs soporta 3 teclas modificadoras adicionales, vea Teclas modificadoras.

En pantallas gráficas, el gestor de ventanas puede bloquear algunas entradas de teclado, incluyendo Alt-TAB (M-TAB), Alt-SCP (M-SPC), Ctrl-Alt-d (C-M-d) y Ctrl-Alt-l (C-M-l). Si tiene este problema, puede personalizar su gestor de ventanas para que no bloquee esas teclas, o volver a enlazar los comandos afectados (vea Personalización).

Los caracteres simples y los caracteres de control, así como ciertas entradas no relacionadas con el teclado, como los clics del ratón, se denominan colectivamente eventos de entrada. Para más detalles sobre cómo Emacs maneja internamente los eventos de entrada, vea Eventos de Entrada en el Mantual de Referencia Lisp.



Teclas

Algunos comandos de Emacs son invocados por un solo evento de entrada; por ejemplo, Ctrl-f (C-f) avanza un carácter en el buffer. Otros comandos necesitan dos o más eventos de entrada para ser invocados, como Ctrl-x Ctrl-f (C-x C-f) y Ctrl-x 4 Ctrl-f (C-x 4 C-f).

Una secuencia de teclas, o tecla para abreviar, es una secuencia de uno o más eventos de entrada que tiene sentido como unidad. Si una secuencia de teclas invoca un comando, la llamamos tecla completa; por ejemplo, Ctrl-f (C-f), Ctrl-x Ctrl-f (C-x C-f) y Ctrl-x 4 Ctrl-f (C-x 4 C-f) son todas teclas completas. Si una secuencia de teclas no es lo suficientemente larga como para invocar un comando, la llamamos tecla prefijada; en el ejemplo anterior, vemos que C-x y C-x 4 son teclas prefijadas. Toda secuencia de teclas es una tecla completa o una tecla prefijada.

Una tecla prefija se combina con el siguiente evento de entrada para formar una secuencia de teclas más larga. Por ejemplo, C-x es una tecla de prefijo, por lo que teclear Ctrl-x por sí solo no invoca un comando; en su lugar, Emacs espera más entradas (si hace una pausa de más de un segundo, hace eco de la tecla C-x para pedir esa entrada; ver El área de eco). C-x se combina con el siguiente evento de entrada para hacer una secuencia de teclas de dos eventos, que puede ser a su vez una tecla de prefijo (como C-x 4), o una tecla completa (como C-x C-f). No hay límite para la longitud de las secuencias de teclas, pero en la práctica rara vez son más largas que tres o cuatro eventos de entrada.

No se pueden añadir eventos de entrada a una tecla completa. Por ejemplo, como C-f es una tecla completa, la secuencia de dos eventos C-f C-k son dos secuencias de teclas, no una.

Por defecto, las teclas prefijadas en Emacs son

Ctrl-c Ctrl-h Ctrl-x Ctrl-x RET
Ctrl-x @ Ctrl-x a Ctrl-x n Ctrl-x r
Ctrl-x t Ctrl-x v Ctrl-x 4 Ctrl-x 5
Ctrl-x 6 ESC Alt-g

F1 (F1) y F2 (F2) son alias para Ctrl-h (C-h) y Ctrl-x 6 (C-x 6). Esta lista no está grabada en piedra; si personaliza Emacs, puede hacer nuevas teclas prefijadas. Incluso puede eliminar algunas de las estándar, aunque esto no es recomendable para la mayoría de los usuarios; por ejemplo, si elimina la definición de prefijo de C-x 4, entonces C-x 4 C-f se convierte en una secuencia de teclas no válida. Véase Personalización de las combinaciones de teclas.

Al escribir el carácter de ayuda Ctrl-h (C-h) o F1 (F1) después de una tecla de prefijo, se muestra una lista de los comandos que comienzan con ese prefijo. La única excepción a esta regla es ESC Ctrl-h (ESC C-h) equivale a Ctrl-Alt- h (C-M-h), que hace algo completamente distinto. Sin embargo, puede usar F1 para mostrar una lista de comandos que comienzan con ESC.



Teclas y Comandos

Este manual está lleno de pasajes que le dicen lo que hacen determinadas teclas. Pero Emacs no asigna significados a las teclas directamente. En su lugar,el Editor asigna significados a comandos con nombre, y luego da a las teclas sus significados uniéndolas a comandos.

Cada comando tiene un nombre elegido por el programador. El nombre suele estar formado por algunas palabras en inglés separadas por guiones; por ejemplo, next-line o forward-word. Internamente, cada comando es un tipo especial de función Lisp, y las acciones asociadas al comando se realizan ejecutando la función. Vea Qué es una función en el Manual de Referencia de Emacs Lisp.

Los enlaces entre las teclas y los comandos se registran en tablas llamadas keymaps. Ver Mapas de teclas.

Cuando decimos que "C-n se mueve verticalmente una línea" estamos pasando por alto una sutil distinción que es irrelevante en el uso ordinario, pero vital para la personalización de Emacs. El comando next-line hace un movimiento vertical hacia abajo. C-n tiene este efecto porque está ligado a next-line. Si se vuelve a enlazar C-n con el comando forward-word, C-n se moverá hacia adelante una palabra en su lugar.

En este manual, a menudo hablaremos de teclas como C-n como comandos, aunque estrictamente hablando la tecla está ligada a un comando. Normalmente, indicamos el nombre del comando que realmente hace el trabajo entre paréntesis después de mencionar la tecla que lo ejecuta. Por ejemplo, diremos que "El comando C-n (next-line, línea siguiente) mueve el punto verticalmente hacia abajo", lo que significa que dicho comando (next-line) hace precisamente eso: se mueve verticalmente hacia abajo, y la tecla Ctrl-n (C-n) está normalmente ligada a él.

Ya que estamos hablando de la personalización, debemos hablar de las variables. A menudo la descripción de un comando dirá: "Para cambiar esto, establezca la variable mumble-foo". Una variable es un nombre usado para almacenar un valor. La mayoría de las variables documentadas en este manual están pensadas para la personalización: algún comando u otra parte de Emacs examina la variable y se comporta de forma diferente según el valor que establezca. Puede ignorar la información sobre las variables hasta que esté interesado en personalizarlas. Lea la información básica sobre variables (ver Variables) y la información sobre variables específicas tendrá sentido.



Entrar y Salir de Emacs

Entrar en Emacs

La forma habitual de invocar Emacs es con el comando de shell emacs. Desde una ventana de terminal que ejecute un shell Unix en un terminal GUI, puede ejecutarlo en segundo plano con el comando emacs &; de esta manera, no ocupará la ventana del terminal, por lo que puede usarlo para ejecutar otros comandos del shell. (Para métodos comparables de iniciar al Editor en Windows, vea Cómo iniciar Emacs en MS-Windows).

Cuando Emacs se inicia, el marco inicial muestra un buffer especial llamado *GNU Emacs*. Esta pantalla de inicio contiene información sobre el Editor y enlaces a tareas comunes que son útiles para los usuarios principiantes. Por ejemplo, al activar el enlace ‘Emacs Tutorial’ se abre el tutorial de Emacs; esto hace lo mismo que el comando C-h t (help-with-tutorial, ayuda-con-tutorial). Para activar un archivos Lisp, dónde poner el marco inicial, etc. Vea Apendice C Argumentos de la línea de comandos para la invocación de Emacs.

Si la variable inhibit-startup-screen no es nula (no-nil), el Editor no muestra la pantalla de inicio. En ese caso, si uno o más archivos fueron especificados en la línea de comandos, simplemente muestra esos archivos; de lo contrario, muestra un buffer llamado *scratch*, que puede ser usado para evaluar expresiones Emacs Lisp interactivamente. Ver Bufferes de Interacción de Lisp. Puede establecer la variable inhibit-startup-screen usando la facilidad de personalización (ver Interfaz de fácil personalización), o editando su fichero de inicialización (ver El fichero de inicialización de Emacs). (4)

Nota

(4) Establecer inhibit-startup-screen en el archivo init.el no funciona, porque la pantalla de inicio se configura antes de leerlo. Vea El fichero de inicialización de Emacs, para información sobre init.el.

También puede forzar a Emacs a mostrar un archivo o directorio al inicio estableciendo la variable initial-buffer-choice a una cadena que nombre ese archivo o directorio. El valor de initial-buffer-choice también puede ser una función (sin argumentos) que debe devolver un buffer que luego se muestra. Si initial-buffer-choice no es nulo, y si se especifica algún archivo en la línea de comandos, Emacs sigue visitándolos, pero no los muestra inicialmente.

Salir de Emacs

Ctrl-x Ctrl-c(C-x C-c)
Mata Emacs (save-buffers-kill-terminal).
Ctrl-z(C-z)
En un terminal de texto, suspende Emacs; en una pantalla gráfica, iconiza (o "minimiza") el cuadro seleccionado (suspend-frame).

Matar Emacs significa terminar el programa. Para ello, escriba Ctrl-x Ctrl-c (C-x C-c, save-buffers-kill-terminal). Se usa una secuencia de teclas de dos caracteres para que sea más difícil escribir por accidente. Si hay alguna búfer modificada al escribir Ctrl-x Ctrl-c, Emacs ofrece primero guardar estas búferes. Si no los guarda todos, pide confirmación de nuevo, ya que los cambios no guardados se perderán. También pide confirmación si hay subprocesos en ejecución, ya que al matarlo también se matan los subprocesos (ver Ejecutar comandos de la shell desde Emacs).

Ctrl-x Ctrl-c (C-x C-c) se comporta de forma algo diferente si está usando Emacs como servidor. Si lo escribe desde un marco de cliente, cierra la conexión del cliente. Ver Uso de Emacs como servidor.

Emacs puede, opcionalmente, registrar cierta información de la sesión cuando la elimina, como los archivos que estaba visitando en ese momento. Esta información estará disponible la próxima vez que lo inicie. Ver Guardar sesiones de Emacs.

Si el valor de la variable confirm-kill-emacs es no nulo, Ctrl-x Ctrl-c (C-x C-c) asume que su valor es una función predicada, y llama a esa función. Si el resultado de la llamada a la función es no nulo, la sesión es eliminada, de lo contrario Emacs continúa ejecutándose. Una función conveniente para usar como valor de confirm-kill-emacs es la función yes-or-no-p. El valor por defecto de confirm-kill-emacs es nil.

Si el valor de la variable confirm-kill-processes es nil, Ctr-x Ctrl-c (C-x C-c) no pide confirmación antes de matar los subprocesos iniciados por el Editor. El valor es t (true, verdadero) por defecto.

Para personalizar más lo que ocurre cuando Emacs sale, vea Killing Emacs en Manual de Referencia Lisp.

Para matar a Emacs sin que se le pida que guarde los cambios, escriba Alt-x kill-emacs (M-x kill-emacs).

Ctrl-z (C-z) ejecuta el comando suspend-frame. En una pantalla gráfica, este comando minimiza (o iconiza) el marco de Emacs seleccionado, escondiéndolo de forma que le permita volver a él más tarde (la forma exacta en que se produce esta ocultación depende del sistema de ventanas). En un terminal de texto, el comando Ctrl-z (C-z) lo suspende, deteniendo el programa temporalmente y devolviendo el control al proceso padre (normalmente un shell); en la mayoría de los shells, puede reanudar el Editor después de suspenderlo con el comando del shell %emacs.

Los terminales de texto suelen escuchar ciertos caracteres especiales cuyo significado es matar o suspender el programa que se está ejecutando. Esta característica del terminal está desactivada mientras está en el Editor. Los significados de Ctrl-z (C-z) y Ctrl-x Ctrl-c (C-x C-c) como teclas se inspiraron en el uso de Ctrl-z (C-z) y Ctrl-c (C-c) en varios sistemas operativos como caracteres para detener o matar un programa, pero esa es su única relación con el sistema operativo. Puede personalizar estas teclas para ejecutar cualquier comando de tu elección (ver Mapas de teclas).



Comandos Básicos de Edición

Aquí explicamos los fundamentos de cómo introducir, hacer correcciones y guardar texto en un archivo. Si este material es nuevo para Ud., le sugerimos que primero ejecute el tutorial de Emacs para "aprender haciendo", tipeando Ctrl-h t (C-h t, help-with-tutorial, ayuda-con-tutorial).

Inserción de Texto

Puede insertar un caracter gráfico ordinario (por ejemplo, a, B, 3 y =) escribiendo la tecla asociada. Esto añade el carácter al búfer en el punto. La inserción desplaza el punto hacia delante, de modo que el punto queda justo después del texto insertado. Véase Punto.

Para terminar una línea y comenzar una nueva, escriba RETURN RET (newline, nueva línea). (La tecla RET puede estar etiquetada como Return, o Enter, o con una flecha de aspecto gracioso hacia la izquierda en su teclado, pero nos referimos a ella como RET en este manual). Este comando inserta un carácter de nueva línea en el búfer, y luego hace una sangría (ver Sangría) de acuerdo con el modo principal. Si el punto está al final de la línea, el efecto es crear una nueva línea en blanco después de él y sangrar la nueva línea; si el punto está en medio de una línea, la línea se divide en esa posición. Para desactivar la auto-indentación, puede desactivar el modo de sangría eléctrica (ver Funciones de conveniencia para la sangría) o escribir Ctrl-j (C-j), que inserta sólo una nueva línea, sin ninguna auto-indentación.

Como explicamos más adelante en este manual, puede cambiar la forma en que Emacs maneja la inserción de texto activando los modos menores. Por ejemplo, el modo menor llamado Modo de Relleno Automático (Auto Fill mode) divide las líneas automáticamente cuando son demasiado largas (ver Relleno de Texto). El modo menor llamado Overwrite mode hace que los caracteres insertados reemplacen (sobreescriban) el texto existente, en lugar de empujarlo a la derecha. Véase Modos menores.

Sólo se pueden insertar caracteres gráficos escribiendo la tecla asociada; otras teclas actúan como comandos de edición y no se insertan. Por ejemplo, la tecla DEL ejecuta por defecto el comando delete-backward-char (algunos modos la vinculan a un comando diferente); no inserta un carácter literal DEL (código de carácter ASCII 127).

Para insertar un carácter no gráfico, o un carácter que su teclado no soporta, primero cítelo escribiendo Ctrl-q (C-q, quoted-insert). Hay dos formas de usar C-q:

  • C-q seguido de cualquier carácter no gráfico (incluso C-g) inserta ese carácter. Por ejemplo, C-q DEL inserta un carácter literal ‘DEL’.
  • C-q seguido de una secuencia de dígitos octales inserta el carácter con el código de carácter octal especificado. Se puede usar cualquier número de dígitos octales; cualquier no dígito termina la secuencia. Si el carácter de terminación es RET, ese RET sólo sirve para terminar la secuencia. Cualquier otro carácter que no sea un dígito termina la secuencia y luego actúa como una entrada normal -por ejemplo, Ctrl-q 1 0 1 (C-q 1 0 1 B) inserta AB.

    El uso de secuencias octales está deshabilitado en el modo ordinario de sobrescritura no binaria, para darle una forma conveniente de insertar un dígito en lugar de sobrescribir con él.

Para usar el decimal o el hexadecimal en lugar del octal, establezca la variable read-quoted-char-radix en 10 o 16. Si el radix es 16, las letras a a f sirven como parte de un código de carácter, al igual que los dígitos. Se ignoran las mayúsculas y minúsculas.

Se pueden insertar algunos caracteres Unicode comunes mediante un comando que comienza con Ctrl-x 8 (C-x 8). Por ejemplo, Ctrl-x 8 [ (C-x 8 [) inserta , que es el punto de código Unicode U+2018 MARCA DE COMILLAS SIMPLE IZQUIERDA, a veces llamada "comilla curva" o "comilla rizada". Del mismo modo, Ctrl-x 8 ] (C-x 8 ]), Ctrl-x 8 { (C-x 8 {) y Ctrl-x 8 } (C-x 8 }) insertan las comillas curvas , y , respectivamente. Además, una tecla Alt de trabajo actúa como Ctrl-x 8 (C-x 8) (a menos que vaya seguida de RET); por ejemplo, Alt-[ (A-[) actúa como Ctrl-x 8 (C-x 8 [) e inserta . Para ver qué caracteres tienen abreviaturas C-x 8, escriba Ctrl-x 8 Ctrl-h (C-x 8 C-h).

También puede usar el comando Ctrl-x 8 RET (C-x 8 RET, insert-char, insertar carácter). Esto solicita el nombre Unicode o el punto de código de un carácter, usando el minibúfer. Si se introduce un nombre, el comando proporciona la finalización (véase Completado). Si introduce un punto de código, debe ser un número hexadecimal (la convención para Unicode), o un número con un radix especificado, por ejemplo, #o23072 (octal); Ver Integer Basics en Manual de Referencia Lisp. El comando inserta entonces el carácter correspondiente en el búfer.

Por ejemplo, los siguientes comandos insertan el mismo carácter:

C-x 8 RET left single quotation mark RET
C-x 8 RET left sin TAB RET
C-x 8 RET 2018 RET
C-x 8 [
A-[  (si funciona la tecla Alt)
`    (en el modo Electric Quote)

Un argumento numérico para Ctrl-q (C-q) o Ctrl-x 8 (C-x 8) ... especifica cuántas copias del carácter se van a insertar (véase Argumentos numéricos).

Como alternativa a Ctrl-x 8 (C-x 8), puede seleccionar el método de entrada transitoria correspondiente tecleando Ctrl-u Ctrl-x \ iso-transl RETURN (C-u C-x \ iso-transl RET), y luego activar temporalmente este método de entrada transitoria tecleando Ctrl-x \[ (C-x \ [) insertará el mismo carácter (ver Método de Entrada de forma transitoria).

Además, en algunos contextos, si se escribe una cita con acento grave y apóstrofe `como esta', se convierte en una forma ‘como esta’ usando comillas simples, incluso sin comandos Ctrl-x 8 (C-x 8). Del mismo modo, si se escribe una cita ``como esta'' usando doble acento grave y apóstrofe, se convierte en una forma “como esta” usando comillas dobles. Véase Comillas.

Cambiar la Ubicación del Punto

Para hacer algo más que insertar caracteres, hay que saber cómo mover el punto (véase Punto). Los comandos del teclado Ctrl-f (C-f), Ctrl-b (C-b), Ctrl-n (C-n) y Ctrl-p (C-p) mueven el punto hacia la derecha, izquierda, abajo y arriba, respectivamente. También puede mover el punto utilizando las teclas de flecha presentes en la mayoría de los teclados: ; sin embargo, muchos usuarios de Emacs encuentran que es más lento usar las teclas de flecha que las teclas de control, porque se necesita mover la mano hacia el área del teclado donde se encuentran esas teclas.

También puede pulsar el botón izquierdo del ratón () para mover el punto a la posición pulsada. Emacs también proporciona una variedad de comandos de teclado adicionales que mueven el punto de maneras más sofisticadas.

Ctrl-f (C-f)
Avanza un carácter (forward-char).
(DERECHA)
Este comando (right-char) se comporta como Ctrl-f (C-f), excepto cuando el punto está en un párrafo de derecha a izquierda (ver Edición Bidireccional).
Ctrl-b (C-b)
Mueve el punto hacia atrás un carácter (backward-char).
(IZQUIERDA)
Este comando (left-char) se comporta como Ctrl-b (C-b), excepto si el párrafo actual es de derecha a izquierda (ver Edición Bidireccional).
Ctrl-n (C-n)
(ABAJO)
Baja una línea de la pantalla (next-line). Este comando intenta mantener la posición horizontal sin cambios, por lo que si comienza en la mitad de una línea, se mueve a la mitad de la siguiente.
Ctrl-p (C-p)
(ARRIBA)
Sube el punto una línea de la pantalla (previous-line). Este comando conserva la posición dentro de la línea, como Ctrl-n (C-n).
Ctrl-a (C-a)
Inicio(Inicio)
Se desplaza al principio de la línea (move-beginning-of-line).
Ctrl-e (C-e)
Fin (Fin)
Mueve el punto al final de la línea (move-end-of-line).
Alt-f (M-f)
Avanza una palabra (forward-word). Ver Palabras.
Ctrl- (C-DERECHA)
Alt- (M-IZQUIERDA)
Este comando (right-word) se comporta como Alt-f (M-f), excepto que se mueve hacia atrás una palabra si el párrafo actual es de derecha a izquierda. Ver Edición Bidireccional.
Alt-b (M-b)
Se mueve hacia atrás una palabra (backward-word). Ver Palabras.
Ctrl- (C-IZQUIERDA)
Alt- (M-IZQUIERDA)
Este comando (left-word) se comporta como Alt-b (M-b), excepto que se mueve hacia adelante una palabra si el párrafo actual es de derecha a izquierda. Ver Edición Bidireccional.
Alt-r (M-r)
Sin mover el texto en la pantalla, reposiciona el punto en el margen izquierdo de la línea de texto más central de la ventana; en invocaciones consecutivas subsiguientes, mueve el punto al margen izquierdo de la línea más alta, la línea más baja, y así sucesivamente, en orden cíclico (move-to-window-line-top-bottom).
Un argumento numérico indica en qué línea de la pantalla debe colocarse el punto, contando hacia abajo desde la parte superior de la ventana (cero significa la línea superior). Un argumento negativo cuenta las líneas hacia arriba desde la parte inferior (-1 significa la línea inferior). Ver Argumentos Numéricos, para más información sobre argumentos numéricos.
Alt-< (M-<)
Se mueve a la parte superior del búfer (beginning-of-buffer). Con el argumento numérico n, se mueve a n/10 del camino desde la parte superior. En pantallas gráficas, Ctrl-INICIO (C-HOME) hace lo mismo.
Alt-> (M->)
Se mueve al final del búfer (end-of-buffer). En las pantallas gráficas, Ctrl-FIN (C-FIN) hace lo mismo.
Ctrl-v (C-v)
PageDown
next
Desplaza una pantalla hacia delante, y mueve el punto en la pantalla si es necesario (scroll-up-command). Ver Desplazamiento.
Alt-v (M-v)
PageUp
prior
Desplaza una pantalla hacia atrás, y mueve el punto en la pantalla si es necesario (scroll-down-command). Ver Desplazamiento.
Alt-g c (M-g c)
Lee un número n y mueve el punto a la posición n del búfer. La posición 1 es el comienzo del búfer. Si el punto está sobre o justo después de un número en el búfer, ese es el valor por defecto para n. Sólo tiene que escribir RET en el minibúfer para usarlo. También puede especificar n dándole a Alt-g c (M-g c) un argumento de prefijo numérico.
Alt-g Alt-g (M-g M-g)
Alt-g g (M-g g)
Lee un número n y mueve el punto al principio de la línea número n (goto-línea). La línea 1 es el principio del búfer. Si el punto está en o justo después de un número en el búfer, ese es el valor por defecto para n. Sólo tiene que escribir RET en el minibúfer para usarlo. También puede especificar n dando a Alt-g Alt-g (M-g M-g) un argumento de prefijo numérico. Ver Creación y Selección de Búferes, para el comportamiento de M-g M-g cuando le da un argumento de prefijo simple. Alternativamente, puede usar el comando goto-line-relative para mover el punto a la línea relativa a la porción accesible del búfer estrechado.
goto-line tiene su propia lista de historial (ver Historial del minibúfer). Puede tener una única lista compartida entre todos los búferes (el valor predeterminado) o una lista separada para cada búfer, personalizando la opción de usuario goto-line-history-local.
Alt-g TAB (M-g TAB)
Lee un número n y se mueve a la columna n en la línea actual. La columna 0 es la más a la izquierda. Si se llama con un argumento prefijo, se mueve al número de columna especificado por el valor numérico del argumento.
Ctrl-x Ctrl-n (C-x C-n)
Usa la columna actual del punto como columna meta semipermanente para Ctrl-p y Ctrl-n (C-p y C-n, set-goal-column) en el búfer actual. Cuando una columna de meta semipermanente está en efecto, esos comandos siempre tratan de moverse a esta columna, o lo más cerca posible de ella, después de moverse verticalmente. La columna de meta permanece en efecto hasta que se cancele.
Ctrl-u Ctrl-x Ctrl-n (C-u C-x C-n)
Cancela la columna de meta. En adelante, Ctrl-p y Ctrl-n (C-p y C-n) intentan conservar la posición horizontal, como es habitual.

Cuando una línea de texto en el búfer es más larga que el ancho de la ventana, Emacs suele mostrarla en dos o más líneas de pantalla. Por comodidad, Ctrl-n y Ctrl-p (C-n y C-p) mueven el punto por líneas de pantalla, al igual que las teclas equivalentes abajo y arriba. Puede forzar que estos comandos se muevan según las líneas lógicas (es decir, según las líneas de texto en el búfer) estableciendo la variable line-move-visual a nil; si una línea lógica ocupa varias líneas de pantalla, el cursor se salta entonces las líneas de pantalla adicionales. Para más detalles, véase Líneas de continuación. Vea Variables, para saber cómo establecer variables como line-move-visual.

A diferencia de Ctrl-n y Ctrl-p (C-n y C-p), la mayoría de los comandos de Emacs que trabajan sobre líneas funcionan sobre líneas lógicas. Por ejemplo, Ctrl-a (C-a, move-beginning-of-line, mover-principio-de-línea) y Ctrl-e (C-e, move-end-of-line, mover-fin-de-línea) se mueven respectivamente al principio y al final de la línea lógica. Siempre que encontremos comandos que trabajen sobre líneas de pantalla, como Ctrl-n Ctrl-p (C-n y C-p), los señalaremos.

Cuando line-move-visual es nil, también se puede establecer la variable track-eol a un valor no nulo. Entonces Ctrl-n Ctrl-p (C-n y C-p), al comenzar en el final de la línea lógica, se mueven al final de la siguiente línea lógica. Normalmente, track-eol es nulo (nil).

Ctrl-n (C-n) normalmente se detiene al final del búfer cuando lo usas en la última línea del búfer. Sin embargo, si establece la variable next-line-add-newlines a un valor no nulo, Ctrl-n (C-n) en la última línea de un búfer crea una línea adicional al final y se mueve hacia abajo en ella.

Borrar texto

DEL
BACKSPACE
Borra el carácter anterior al punto, o la región si está activa (delete-backward-char).
Supr (Suprimir, Delete)
Borra el carácter después del punto, o la región si está activa (delete-forward-char).
Ctrl-d (C-d)
Borra el carácter después del punto (delete-char).
Ctrl-k (C-k)
Mata hasta el final de la línea (kill-line).
Alt-d (M-d)
Mata hasta el final de la siguiente palabra (kill-word).
Alt-DEL (M-DEL)
Alt-BACKSPACE (M-BACKSPACE)
Mata hacia atrás hasta el principio de la palabra anterior (backward-kill-word).

El comando DEL (delete-backward-char) elimina el carácter anterior al punto, moviendo el cursor y los caracteres posteriores hacia atrás. Si el punto estaba al principio de una línea, esto elimina la nueva línea precedente, uniendo esta línea a la anterior.

Sin embargo, si la región está activa, DEL borra el texto de la región. Véase La marca y la región, para una descripción de la región.

En la mayoría de los teclados, DEL se denomina BACKSPACE, pero en este manual nos referimos a él como DEL. (No confunda DEL con la tecla Sup (Sup, Suprimir); hablaremos de Suprimir momentáneamente.) En algunos terminales de texto, Emacs puede no reconocer la tecla DEL correctamente. Si se encuentra con este problemaVea Si la Tecla Del no Logra Borrar, .

El comando Delete (delete-forward-char) borra en la dirección opuesta: borra el carácter después del punto, es decir, el carácter bajo el cursor. Si el punto estaba al final de una línea, esto une la línea siguiente a ésta. Al igual que DEL, borra el texto de la región si ésta está activa (véase La Marca y la Región).

Ctrl-d (C-d, delete-char) borra el carácter después del punto, de forma similar a Delete, pero independientemente de que la región esté activa.

Consulte Borrado, para obtener información más detallada sobre los comandos de borrado anteriores.

Ctrl-k (C-k, kill-line) borra (mata) una línea a la vez. Si escribe Ctrl-k (C-k) al principio o en medio de una línea, se borra todo el texto hasta el final de la línea. Si escribe Ctrl-k (C-k) al final de una línea, une esa línea con la siguiente.

Para más información sobre C-k y otros comandos relacionados, consulte Matar y Mover Texto.

Deshacer los Cambios

Ctrl-/ ( C-/ )
Ctrl-x u ( C-x u )
Ctrl-_ ( C-_ )
Deshacer (undo) una entrada de los registros de deshacer, normalmente, el valor de un comando. (La primera tecla puede no estar disponible en las pantallas en modo texto).

Emacs registra una lista de los cambios realizados en el texto del búfer, por lo que puede deshacer los cambios recientes. Esto se hace usando el comando deshacer, que está ligado a C-/ (así como C-x u y C-_). Normalmente, este comando deshace el último cambio, devolviendo el punto a donde estaba antes del cambio. El comando deshacer sólo se aplica a los cambios en el búfer; no se puede usar para deshacer el movimiento del cursor.

En un terminal que admita el modificador Control en todas las demás teclas, la forma más fácil de invocar el comando deshacer es con Ctrl-/ (C-/), ya que no necesita el modificador Shift. En los terminales que sólo permiten los caracteres de control ASCII, C-/ no existe, pero para muchos de ellos C-/ sigue funcionando porque en realidad envía C-_ a Emacs, mientras que muchos otros permiten omitir el modificador Shift cuando se escribe C-_ (en efecto presionando Ctrl-- - (C--)), haciendo que esa sea la forma más conveniente de invocar deshacer.

Aunque cada comando de edición normalmente hace una entrada separada en los registros de deshacer, los comandos muy simples pueden agruparse. A veces, una entrada puede cubrir sólo una parte de un comando complejo.

Si repite Ctrl-/ (C-/, o sus alias), cada repetición deshace otro cambio anterior, hasta el límite de la información de deshacer disponible. Si todos los cambios registrados ya han sido deshechos, el comando deshacer muestra un mensaje de error y no hace nada.

Para obtener más información sobre el comando deshacer, consulte Deshacer.

Archivos

El texto que inserta en un búfer de Emacs dura sólo el tiempo que dura la sesión de este. Para mantener cualquier texto de forma permanente, debe ponerlo en un archivo.

Suponga que hay un archivo llamado test.emacs en su directorio personal. Para empezar a editar este archivo en Emacs, escriba:

C-x C-f test.emacs RET

Aquí el nombre del archivo se da como argumento al comando Ctrl-x Ctrl-f (C-x C-f, find-file). Esta instrucción usa el minibúfer para leer el argumento, y se teclea RETURN (RET) para terminar el argumento (ver El Minibúfer).

Emacs obedece este comando visitando el archivo: crea un búfer, copia el contenido del archivo en el búfer, y luego muestra el búfer para su edición. Si modificas el texto, puede guardar el nuevo texto en el archivo escribiendo Ctrl-x Ctrl-s (C-x C-s, save-buffer). Esto copia el contenido alterado del búfer en el archivo test.emacs, haciéndolo permanente. Hasta que guarde, el texto modificado sólo existe dentro de Emacs, y el archivo test.emacs no ha sido modificado.

Para crear un archivo, basta con visitarlo escribiendo Ctrl-x Ctrl-f (C-x C-f) como si ya existiera. Esto crea un búfer vacío, en el que puede insertar el texto que quiere poner en el archivo. Emacs realmente crea el archivo la primera vez que guarda este búfer al escribir Ctrl-x Ctrl-s (C-x C-s).

Para aprender más sobre el uso de archivos en Emacs, vea Manejo de Archivos.

Ayuda

Si olvida lo que hace una tecla, puede averiguarlo escribiendo Ctrl-h k (C-h k, describe-key), seguido de la tecla que le interesa; por ejemplo, Ctrl-h k Ctrl-n (C-h k C-n) le dice lo que hace C-n.

El prefijo C-h significa "ayuda". La tecla F1 (F1) sirve de alias para Ctrl-h (C-h). Aparte de C-h k, hay muchos otros comandos de ayuda que proporcionan diferentes tipos de ayuda.

Para más detalles, véase Ayuda.

Líneas en Blanco

A continuación se presentan comandos y técnicas especiales para insertar y eliminar líneas en blanco.

Ctrl-o (C-o)
Inserta una línea en blanco después del cursor (open-line).
Ctrl-x Ctrl-o (C-x C-o)
Borra todas las líneas en blanco consecutivas menos una (delete-blank-lines).

Hemos visto cómo RETURN (RET, newline) inicia una nueva línea de texto. Sin embargo, puede ser más fácil ver lo que está haciendo si primero hace una línea en blanco y luego inserta el texto deseado en ella. Esto es fácil de hacer usando la tecla Ctrl-o (C-o, open-line), que inserta una nueva línea después del punto pero deja el punto delante de la nueva línea. Después de C-o, escriba el texto para la nueva línea.

Puede hacer varias líneas en blanco escribiendo Ctrl-o (C-o) varias veces, o dándole un argumento numérico que especifique cuántas líneas en blanco debe hacer. Vea Argumentos numéricos, para saber cómo. Si tiene un prefijo de relleno, el comando C-o inserta el prefijo de relleno en la nueva línea, si se escribe al principio de una línea. Ver El prefijo de relleno.

La manera más fácil de deshacerse de las líneas en blanco extra es con el comando Ctrl-x Ctrl-o (C-x C-o, delete-blank-lines). Si el punto se encuentra dentro de una serie de líneas en blanco, C-x C-o borra todas menos una de ellas. Si el punto se encuentra en una sola línea en blanco, C-x C-o lo borra. Si el punto se encuentra en una línea que no está en blanco, C-x C-o borra todas las líneas en blanco siguientes, si las hay.

Líneas de Continuación

A veces, una línea de texto en el búfer -una línea lógica- es demasiado larga para caber en la ventana, y Emacs la muestra como dos o más líneas en pantalla. Esto se llama ajuste de línea o continuación, y la línea lógica larga se llama línea continuada. En una pantalla gráfica, indica el ajuste de línea con pequeñas flechas dobladas en los bordes izquierdo y derecho de la ventana. En un terminal de texto, Emacs indica el ajuste de línea mostrando un carácter ‘\’ (contrabarra) en el margen derecho.

La mayoría de los comandos que actúan sobre las líneas actúan sobre las líneas lógicas, no sobre las líneas de la pantalla. Por ejemplo, Ctrl-k (C-k) elimina una línea lógica. Como se describió anteriormente, Ctrl-n (C-n, next-line) y Ctrl-p (C-p, previous-line) son excepciones especiales: mueven el punto hacia abajo y hacia arriba, respectivamente, en una línea de pantalla (ver Cambiar la ubicación del punto).

Emacs puede opcionalmente truncar líneas lógicas largas en lugar de continuarlas. Esto significa que cada línea lógica ocupa una sola línea de pantalla; si es más larga que el ancho de la ventana, el resto de la línea no se muestra. En una pantalla gráfica, una línea truncada se indica con una pequeña flecha recta en la franja derecha; en un terminal de texto, se indica con un caracter ‘$’ en el margen derecho. Véase Truncado de líneas.

Por defecto, las líneas continuadas se envuelven en el borde derecho de la ventana. Dado que el ajuste puede producirse en medio de una palabra, las líneas continuas pueden ser difíciles de leer. La solución habitual es romper las líneas antes de que sean demasiado largas, insertando nuevas líneas. Si lo prefiere, puede hacer que Emacs inserte una nueva línea automáticamente cuando una línea sea demasiado larga, utilizando el modo de Auto Fill Mode (Modo de Relleno Automático). Vea Texto de Relleno.

A veces, puede necesitar editar archivos que contienen muchas líneas lógicas largas, y puede no ser práctico romperlas todas añadiendo nuevas líneas. En ese caso, puede usar el modo visual-line-mode, que permite el ajuste de palabras: en lugar de ajustar las líneas largas exactamente en el borde derecho de la ventana, Emacs las ajusta en los límites de las palabras (es decir, los espacios o caracteres de tabulación) más cercanos al borde derecho de la ventana. Este modo (visual-line-mode) también redefine los comandos de edición como C-a, C-n y C-k para operar en líneas de pantalla en lugar de líneas lógicas. Véase visual-line-mode (Modo de línea visual).

Información Sobre la Posición del Cursor

Aquí hay comandos para obtener información sobre el tamaño y la posición de partes del búfer, y para contar palabras y líneas.

Alt-x what-line (M-x what-line)
Muestra el número de línea del punto.
Alt-x line-number-mode (M-x line-number-mode)
Alt-x column-number-mode (M-x column-number-mode)
Alterna la visualización automática del número de línea o del número de columna actual. Véase Características opcionales de la línea de modo. Si desea que se muestre un número de línea antes de cada línea, consulte Personalización de la pantalla.
Alt-= (M-=)
Muestra el número de líneas, palabras y caracteres presentes en la región (count-words-region). Consulte La marca y la región, para obtener información sobre la región.
Alt-x count-words (M-x count-words)
Muestra el número de líneas, palabras y caracteres presentes en el búfer. Si la región está activa (véase La marca y la región), muestra en su lugar los números de la región.
Ctrl-x = (C-x =)
Muestra el código del carácter después del punto, la posición del carácter del punto y la columna del punto (what-cursor-position).
Alt-x hl-line-mode (M-x hl-line-mode)
Activa o desactiva el resaltado de la línea actual. Ver Visualización del Cursor.
Alt-x size-indication-mode (M-x size-indication-mode)
Activa la visualización automática del tamaño del búfer. Véase Características opcionales de la línea de modo.

Alt-x what-line (M-x what-line) muestra el número de línea actual en el área de eco. Este comando suele ser redundante porque el número de línea actual se muestra en la línea de modo (véase La línea de modo (modeline)). Sin embargo, si se estrecha el búfer, la línea de modo muestra el número de línea relativo a la parte accesible (véase Estrechamiento). Por el contrario, la línea de modo muestra tanto el número de línea relativo a la región estrechada como el número de línea relativo a todo el búfer.

Alt-= (M-=, count-words-region) muestra un mensaje que informa del número de líneas, palabras y caracteres de la región (véase La marca y la región, para una explicación de la región). Con un argumento de prefijo, Ctrl-u Alt-= (C-u M-=), el comando muestra un recuento para todo el búfer.

El comando Alt-x count-region (M-x count-words) hace el mismo trabajo, pero con una convención de llamada diferente. Muestra un recuento para la región si la región está activa, y para el búfer en caso contrario.

El comando Ctrl-x = (C-x =, what-cursor-position) muestra información sobre la posición actual del cursor y el contenido del búfer en esa posición. Muestra una línea en el área de eco con el siguiente aspecto:

Char: c (99, #o143, #x63) point=28062 of 36168 (78%) column=53Char: c (99, #o143, #x63) point=28062 of 36168 (78%) column=53

Después de ‘Char:’, esto muestra el carácter en el búfer en el punto. El texto dentro del paréntesis muestra los correspondientes códigos de caracteres decimales, octales y hexadecimales; para más información sobre cómo Ctrl-x = (C-x =) muestra la información de los caracteres, véase Introducción a los juegos de caracteres internacionales. Después de ‘punto=’ está la posición del punto como un conteo de caracteres (el primer carácter en el búfer es la posición 1, el segundo carácter es la posición 2, y así sucesivamente). El número que sigue es el número total de caracteres en el búfer, y el número entre paréntesis expresa la posición como un porcentaje del total. Después de ‘column=’ está la posición horizontal del punto, en columnas contando desde el borde izquierdo de la ventana.

Si la opción de usuario what-cursor-show-names es no nula, se muestra también el nombre del carácter, tal y como lo define la base de datos de caracteres Unicode. La parte entre paréntesis sería entonces:

(99, #o143, #x63, LATIN SMALL LETTER C)

Si el búfer se ha estrechado, haciendo que parte del texto del principio y del final sea temporalmente inaccesible, C-x = muestra un texto adicional que describe el rango actualmente accesible. Por ejemplo, podría mostrar esto:

Char: C (67, #o103, #x43) point=252 of 889 (28%) <231-599> column=0

donde los dos números extra dan la posición de carácter más pequeña y más grande que ese punto puede asumir. Los caracteres entre esas dos posiciones son los accesibles. Véase Estrechamiento.

Una característica relacionada, pero diferente, es el modo de visualización de números de línea (véase Personalización de la Pantalla).

Argumentos Numéricos

En la terminología de las matemáticas y la informática, argumento significa "datos proporcionados a una función u operación". Puedes dar a cualquier comando de Emacs un argumento numérico (también llamado argumento prefijo). Algunos comandos interpretan el argumento como una cuenta de repetición. Por ejemplo, dar a C-f un argumento de diez hace que el punto avance diez caracteres en lugar de uno. Con estos comandos, ningún argumento es equivalente a un argumento de uno, y los argumentos negativos hacen que se muevan o actúen en la dirección opuesta.

La forma más sencilla de especificar un argumento numérico es escribir un dígito y/o un signo menos mientras se mantiene pulsada la tecla Meta ( Alt ). Por ejemplo,

M-5 C-n

se mueve hacia abajo cinco líneas. Las teclas Alt-1, Alt-2 (M-1, M-2), etc., así como M--, están vinculadas a comandos (digit-argument y negative-arguments) que establecen un argumento para el siguiente comando. Alt-- - (M--) sin dígitos normalmente significa -1.

Si se introduce más de un dígito, no es necesario mantener pulsada la tecla Meta para el segundo dígito y los siguientes. Así, para bajar cincuenta líneas, escriba

M-5 0 C-n

Observe que esto no inserta cinco copias de ‘0’ y se desplaza una línea hacia abajo, como cabría esperar: el '0' se trata como parte del argumento del prefijo.

(¿Y si quiere insertar cinco copias de ‘0’? Escriba Alt-5 Ctrl-u 0 (M-5 C-u 0). En este caso, C-u termina el argumento del prefijo, de modo que la siguiente pulsación de tecla comienza el comando que desea ejecutar. Tenga en cuenta que este significado de C-u sólo se aplica a este caso. Para la función habitual de C-u, véase más adelante).

En lugar de escribir Alt-1, Alt-2 (M-1, M-2), etc., otra forma de especificar un argumento numérico es escribir Ctrl-u (C-u, universal-argument) seguido de algunos dígitos, o (para un argumento negativo) un signo menos seguido de dígitos. Un signo menos sin dígitos normalmente significa -1.

Ctrl-u (C-u) solo tiene el significado especial de "cuatro veces": multiplica por cuatro el argumento para el siguiente comando. Ctrl-u Ctrl-u (C-u C-u) lo multiplica por dieciséis. Así, Ctrl-u Ctrl-u Ctrl-f(C-u C-u C-f) avanza dieciséis caracteres. Otras combinaciones útiles son Ctrl-u Ctrl-n, Ctrl-u Ctrl-u Ctrl-n (C-u C-n, C-u C-u C-n) (avanza una buena fracción de pantalla), Ctrl-u Ctrl-u Ctrl-o (C-u C-u C-o) (hace dieciséis líneas en blanco) y Ctrl-u Ctrl-k C-u C-k (elimina cuatro líneas).

Puede usar un argumento numérico antes de un carácter autoinsertado para escribir varias copias del mismo. Esto es sencillo cuando el carácter no es un dígito; por ejemplo, Ctrl-u 64 a(C-u 6 4) a inserta 64 copias del carácter ‘a’. Pero esto no funciona para insertar dígitos; Ctrl-u 641 (C-u 6 4 1) especifica un argumento de 641. Puede separar el argumento del dígito a insertar con otra C-u; por ejemplo, Ctrl-u 64 Ctrl-u 1 (C-u 6 4 C-u 1) inserta 64 copias del carácter ‘1’.

Algunos comandos se preocupan de si hay un argumento, pero ignoran su valor. Por ejemplo, el comando M-q (fill-paragraph) rellena el texto; con un argumento, también justifica el texto. (Véase Texto de Relleno, para más información sobre M-q.) Para estos comandos, basta con especificar el argumento con una sola combinación C-u.

Algunos comandos usan el valor del argumento como cuenta de repetición pero hacen algo especial cuando no hay argumento. Por ejemplo, el comando C-k (kill-line) con el argumento n mata n líneas, incluyendo sus nuevas líneas finales. Pero C-k sin argumento es especial: mata el texto hasta la siguiente nueva línea, o, si el punto está justo al final de la línea, mata la propia nueva línea. Por lo tanto, dos comandos C-k sin argumentos pueden matar una línea que no esté en blanco, al igual que C-k con un argumento de uno. (Ver Matar y mover texto, para más información sobre C-k).

Algunos comandos tratan un simple C-u de forma diferente a un argumento ordinario. Otros pocos pueden tratar un argumento de sólo un signo menos de forma diferente a un argumento de -1. Estos casos inusuales se describen cuando aparecen; existen para hacer que un comando individual sea más conveniente, y están documentados en la cadena de documentación de ese comando.

Usamos el término argumento prefijo para enfatizar que usted escribe tales argumentos antes del comando, y para distinguirlos de los argumentos del minibúfer (ver El Minibúfer), que se introducen después de invocar el comando.

En las pantallas gráficas, Ctrl-0, Ctrl-1 (C-0, C-1), etc. actúan igual que Alt-0, Alt-1 (M-0, M-1), etc.

Repetición de un Comando

Muchos comandos sencillos, como los que se invocan con una sola tecla o con Alt-x nombre-comando RETURN (M-x nombre-comando RET), pueden repetirse invocándolos con un argumento numérico que sirva de cuenta de repetición (véase Argumentos numéricos). Sin embargo, si el comando que desea repetir solicita una entrada, o usa un argumento numérico de otra manera, ese método no funcionará.

El comando Ctrl-x z (C-x z, repeat, repetir) muchas veces proporciona otra forma de repetir una orden en el Editor. Este comando repite la orden Emacs anterior, sea cual sea. La repetición de un comando usa los mismos argumentos que se usaron antes; no lee nuevos argumentos cada vez.

Para repetir el comando más de una vez, escriba z's adicionales: cada z (z) repite el comando una vez más. La repetición finaliza cuando se escribe un carácter distinto de z o se pulsa un botón del ratón.

Por ejemplo, suponga que escribe Ctrl-u 20 Ctrl-d (C-u 2 0 C-d) para borrar 20 caracteres. Puede repetir ese comando (incluyendo su argumento) tres veces más, para borrar un total de 80 caracteres, escribiendo Ctrl-x zzz (C-x z z z). La primera Ctrl-x z (C-x z) repite el comando una vez, y cada z posterior lo repite una vez más.

También puede activar el modo de repetición que habilita temporalmente un modo transitorio con teclas cortas después de un número limitado de comandos. Las secuencias de teclas más cortas actualmente soportadas son:

  • Ctrl-x uu (C-x u u) en lugar de Ctrl-x u Ctrl-x u (C-x u C-x u) para deshacer muchos cambios.
  • Ctrl-oo (C-x o o) en lugar de Ctrl-x o Ctrl-x o (C-x o C-x o) para cambiar varias ventanas.
  • Ctrl-x {{}}^^vv (C-x { { } } ^ ^ v v) para cambiar el tamaño de la ventana seleccionada de forma interactiva.
  • Alt-g n npp (M-g n n p p) para navegar por las coincidencias de error siguientes.
  • Ctrl-x ]][[ (C-x ] ] [ [) para navegar por las páginas.

Cualquier otra tecla sale del modo transitorio y se ejecuta normalmente. La opción de usuario repeat-exit-key define una tecla adicional para salir de este modo transitorio. También es posible romper la cadena de repetición automáticamente después de un tiempo de inactividad personalizando la opción de usuario repeat-exit-timeout para especificar el tiempo de inactividad en segundos después del cual este modo transitorio se desactivará.



El Minibuffer

El minibuffer es el lugar donde los comandos de Emacs leen los argumentos complicados, como: nombres de archivos, nombres de los buffers, nombres de las ordenes del Editor o las expresiones de Lisp. Lo llamamos "minibuffer" porque es un buffer de propósito especial con una pequeña cantidad de espacio en pantalla. En este espacio, puede usar los comandos de edición habituales de Emacs para editar el texto del argumento.

Uso del minibuffer

Cuando el minibuffer está en uso, aparece en el área de eco, con un cursor. El minibuffer comienza con un prompt que suele terminar con dos puntos. Éste, indica qué tipo de entrada se espera y cómo se utilizará. Se resalta usando la face minibuffer-prompt (ver Faces (Caras) de Texto).

La forma más sencilla de introducir un argumento es escribir el texto, luego RET para enviar el argumento y salir de este. Alternativamente, puede escribir Ctrl-g (C-g) para salir del minibuffer cancelando el comando que pide el argumento (ver Salir y Abortar).

A veces, el prompt muestra un argumento por defecto, dentro de paréntesis antes de los dos puntos. Este argumento por defecto se usará como argumento si sólo escribe RET. Por ejemplo, los comandos que leen nombres de búferes suelen mostrar un nombre de búfer como argumento por defecto; puede escribir RETURN (RET) para operar en ese búfer por defecto. Puede personalizar cómo se muestra el argumento por defecto con la opción de usuario minibuffer-default-prompt-format.

Si activa el modo Minibuffer Electric Default, un modo global menor, Emacs oculta el argumento por defecto tan pronto como modifica el contenido del minibuffer (ya que al teclear RET ya no se presentaría ese argumento por defecto). Si alguna vez devuelve el texto original del minibuffer, el prompt vuelve a mostrar el predeterminado. Además, si cambia la variable minibuffer-eldef-shorten-default a un valor no nulo, el argumento por defecto se muestra como ‘[default-arg]’ en lugar de ‘(default default-arg)’, ahorrando algo de espacio en pantalla. Para activar este modo menor, escriba Alt-x minibuffer-electric-default-mode (M-x minibuffer-electric-default-mode).

Como el minibuffer aparece en el área de eco, puede entrar en conflicto con otros usos del área de eco. Si se emite un mensaje de error o un mensaje informativo mientras el minibuffer está activo, el mensaje se muestra entre paréntesis después del texto del minibuffer durante unos segundos, o hasta que se escriba algo; entonces el mensaje desaparece. Mientras el minibuffer está en uso, Emacs no hace eco de las pulsaciones de las teclas.

Mientras usa el minibuffer, puede cambiar a un marco diferente, quizás para anotar el texto que necesita introducir (ver Comandos de los marcos). Por defecto, el minibuffer activo se mueve a este nuevo marco. Si establece la opción de usuario minibuffer-follows-selected-frame a nil, entonces el minibuffer se queda en el marco donde lo abrió, y debe volver a ese marco para completar (o abortar) el comando actual. Si establece esa opción a un valor que no sea ni nil ni t, el minibuffer se mueve de marco sólo después de que se haya abierto un minibuffer recursivo en el comando actual (ver (elisp)Minibuferes Recursivos). Esta opción es -principalmente- para mantener (aunque sea de forma aproximada) el comportamiento anterior a Emacs 28.1. Tenga en cuenta que el efecto del comando, cuando finalmente termina de usar el minibuffer, siempre tiene lugar en el marco donde lo abrió por primera vez. La única excepción es que cuando ese marco ya no existe, la acción tiene lugar en el marco actualmente seleccionado.

Minibuffer para nombres de archivos

Comandos como Ctrl-x Ctrl-f (C-x C-f, find-file) usan el minibuffer para leer un argumento de nombre de archivo (ver Archivos). Cuando se usa el minibuffer para leer un nombre de archivo, normalmente comienza con un texto inicial que termina en una barra. Este es el directorio por defecto. Por ejemplo, puede empezar así:

Find file: /u2/emacs/src/

Aquí, ‘Find file:’ es el prompt y ‘/u2/emacs/src/’ es el directorio por defecto. Si ahora escribe buffer.c como entrada, eso especifica el archivo /u2/emacs/src/buffer.c. Vea Nombres de archivos, para información sobre el directorio por defecto.

Los valores predeterminados alternativos para el nombre del archivo que pueda llegar a necesitar están disponibles escribiendo Alt-n (M-n), vea Historial del Minibuffer.

Puede especificar un archivo en el directorio padre con ..: /a/b/../foo.el, que es equivalente a /a/foo.el. Como alternativa, puede usar Alt-DEl (M-DEL) para eliminar los nombres de los directorios al revés (véase Palabras).

Para especificar un archivo en un directorio completamente diferente, puede matar todo el valor por defecto con Ctrl-a Ctrl-k (C-a C-k) (ver Editar en el Minibuffer). Alternativamente, puede ignorar el valor por defecto, e introducir un nombre de archivo absoluto que comience con una barra o una tilde después del directorio por defecto. Por ejemplo, puede especificar /etc/termcap como sigue:

Find file: /u2/emacs/src//etc/termcap

Una barra doble hace que Emacs ignore todo lo que hay antes de la segunda barra del par. En el ejemplo anterior, /u2/emacs/src/ es ignorado, por lo que el argumento suministrado es /etc/termcap. La parte ignorada del nombre del fichero se atenúa si el terminal lo permite. (Para desactivar este oscurecimiento, desactive el modo de sombra de nombre de archivo con el comando M-x file-name-shadow-mode).

Cuando se completan nombres de archivos remotos (ver Archivos Remotos), una doble barra se comporta de forma ligeramente diferente: hace que Emacs ignore sólo la parte del nombre del archivo, dejando el resto (método, host y nombre de usuario, etc.) intacto. Si se escriben tres barras seguidas, se ignora todo lo que hay en los nombres de archivos remotos. Ver Completar el nombre del archivo en el Manual de Tramp.

Emacs interpreta ~/ como su directorio personal. Por lo tanto, ~/foo/bar.txt especifica un archivo llamado bar.txt, dentro de un directorio llamado foo, que a su vez se encuentra en su directorio personal. Además, ~user-id/ significa el directorio personal de un usuario cuyo nombre de usuario es user-id. Cualquier nombre de directorio delante de la ~ se ignora: así, /u2/emacs/~/foo/bar.txt es equivalente a ~/foo/bar.txt.

En los sistemas MS-Windows y MS-DOS, donde un usuario no siempre tiene un directorio home, Emacs usa varias alternativas. Para MS-Windows, ver Directorios de Inicio en MS-Windows; para MS-DOS, ver Nombres de Archivos en MS-DOS. En estos sistemas, la construcción ~user-id/ sólo es compatible con el usuario actual, es decir, sólo si user-id es el nombre de inicio de sesión del usuario actual.

Para evitar que Emacs inserte el directorio por defecto al leer los nombres de los archivos, cambie la variable insert-default-directory a nil. En ese caso, el minibuffer comienza vacío. No obstante, los argumentos relativos de los nombres de archivo se siguen interpretando basándose en el mismo directorio por defecto.

También puede introducir nombres de archivos remotos en el minibuffer. Véase Archivos remotos.

Editar en el minibuffer

El minibuffer es un buffer de Emacs, aunque peculiar, y los comandos habituales del Editor están disponibles para editar el texto del argumento. (El prompt, sin embargo, es de sólo lectura, y no puede ser modificado).

Dado que RET en el minibuffer presenta el argumento, no puede usarlo para insertar una nueva línea. Puede hacerlo con Ctrl-q Ctrl-j (C-q C-j), que inserta un carácter de control C-j, que es formalmente equivalente a un carácter de nueva línea (ver Inserción de texto). También puede usar el comando Ctrl-o (C-o, open-line) (véase Líneas en blanco).

Dentro de un minibuffer, las teclas TAB, SPACE y ? (TAB, SPC y ?) suelen estar vinculadas a comandos de completado, que permiten rellenar fácilmente el texto deseado sin tener que escribirlo todo. Véase Completado. Al igual que con RET, puede usar C-q para insertar un carácter TAB, SPC o ‘?’.

Por comodidad, Ctrl-a (C-a, move-beginning-of-line) en un minibuffer mueve el punto al principio del texto del argumento, no al principio del prompt. Por ejemplo, Ctrl-a Ctrl-k (C-a C-k) permite borrar todo el argumento.

Cuando el minibuffer está activo, el área de eco se trata como una ventana ordinaria de Emacs. Por ejemplo, puede cambiar a otra ventana (con Ctrl-x o, (C-x o)), editar texto allí, y luego volver a la ventana del minibuffer para terminar el argumento. Incluso puede matar el texto en otra ventana, volver a la ventana del minibuffer, y arrastrar el texto al argumento. Sin embargo, la ventana del minibuffer tiene algunas restricciones: por ejemplo, no se puede dividir. Véase Ventanas múltiples.

Normalmente, la ventana del minibuffer ocupa una sola línea de la pantalla. Sin embargo, si añade dos o más líneas de texto en él, éste se expande automáticamente para acomodar el texto. La variable resize-mini-windows controla el cambio de tamaño del minibuffer. El valor por defecto es grow-only, lo que significa el comportamiento que acabamos de describir. Si el valor es t, la ventana del minibuffer también se encogerá automáticamente si se eliminan algunas líneas de texto, hasta un mínimo de una línea de pantalla. Si el valor es nulo (nil), la ventana del minibuffer nunca cambia de tamaño automáticamente, pero puede usar los comandos habituales de redimensionamiento de ventanas en ella (ver Ventanas múltiples).

La variable max-mini-window-height controla la altura máxima para redimensionar la ventana del minibuffer. Un número de punto flotante especifica una fracción de la altura del marco; un número entero especifica el número máximo de líneas; nil significa que no se redimensiona la ventana del minibuffer automáticamente. El valor por defecto es 0,25.

El comando Ctrl-Alt-v (C-M-v) en el minibuffer desplaza el texto de ayuda de los comandos que muestran texto de ayuda de cualquier tipo en otra ventana. También puede desplazar el texto de ayuda con Alt-PageUp (M-PageUp) y Alt-PageDown (M-PageDown) (o, equivalentemente, M-prior y M-next). Esto es especialmente útil con listas largas de posibles terminaciones. Ver Uso de otras ventanas.

Emacs normalmente no permite la mayoría de los comandos que usan el minibuffer mientras éste está activo. Para permitir tales comandos en el minibuffer, establezca la variable enable-recursive-minibuffers a ‘t’. Podría necesitar también activar el modo minibuffer-depth-indicate para mostrar la profundidad de recursión actual en el prompt del minibuffer en el uso recursivo del minibuffer.

Cuando está activo, el minibuffer suele estar en modo minibuffer (minibuffer-mode). Este es un modo interno de Emacs sin ninguna característica especial.

Cuando no está activo, el minibuffer está en minibuffer-inactive-mode, y al hacer clic con el ratón-1 () allí se muestra el buffer *Mensajes* (*Messages*). Si usas un marco dedicado a los minibufferes, Emacs también reconoce ciertas teclas allí, por ejemplo, n para hacer un nuevo marco.

Completado

A menudo puede usar una función llamada completado para ayudar a introducir argumentos. Esto significa que después de escribir parte del argumento, Emacs puede rellenar el resto, o parte de él, basándose en lo que se ha escrito hasta ahora.

Cuando el completado está disponible, ciertas teclas (normalmente TAB, RETURN y SPACE (TAB, RET, y SPC)) rebotan en el minibuffer a comandos especiales de completado (ver Comandos de Completado). Estos comandos intentan completar el texto en el minibuffer, basándose en un conjunto de alternativas de completado proporcionadas por el comando que solicitó el argumento. Normalmente puede escribir ‘?’ para ver una lista de alternativas de completado.

Aunque el completado se lleva a cabo normalmente en el minibuffer, a veces la función también está disponible en los buffers ordinarios. Véase Completar nombres de símbolos.

Ejemplo de finalización

Aquí, un simple ejemplo puede ayudar. Alt-x (M-x) usa el minibuffer para leer el nombre de un comando, por lo que el completado funciona comparando el texto del minibuffer con los nombres de los comandos Emacs existentes. Suponga que desea ejecutar el comando auto-fill-mode. Puede hacerlo escribiendo Alt-x auto-fill-mode RET (M-x auto-fill-mode RET), pero es más fácil usar el autocompletado .

Si escribe Alt-x a u TAB (M-x a u TAB), TAB busca alternativas de completado (en este caso, nombres de comandos) que empiecen por ‘au’. Hay varios, incluyendo auto-fill-mode y autoconf-mode, pero todos comienzan con auto, así que el ‘au’ en el minibuffer se completa con ‘auto’. (Se pueden definir más comandos en su sesión de Emacs. Por ejemplo, si se definiera un comando llamado authorize-me, el Editor sólo podría completar hasta ‘aut’).

Si escribe TAB (TAB) de nuevo inmediatamente, no puede determinar el siguiente carácter; podría ser ‘-’, ‘a’, o ‘c’. Así que no añade ningún carácter; en su lugar, TAB (TAB) muestra una lista de todas las posibles terminaciones en otra ventana.

A continuación, escriba -f. El minibuffer contiene ahora ‘auto-f’, y el único nombre de comando que comienza con esto es auto-fill-mode Si ahora escribe TAB (TAB), el autocompletado rellena el resto del argumento ‘auto-fill-mode’ en el minibuffer.

Por lo tanto, escribiendo sólo una u TAB - f TAB (u TAB - f TAB) le permite entrar en modo ‘auto-fill-mode’.

Comandos de Completado

Esta es una lista de los comandos de finalización definidos en el minibuffer cuando se permite la finalización.

TAB (TAB)
Completa el texto en el minibuffer tanto como sea posible; si no se puede completar, muestra una lista de posibles terminaciones (minibuffer-complete).
SPACE (SPC)
Completa hasta una palabra del texto del minibuffer antes del punto (minibuffer-complete-word). Este comando no está disponible para argumentos que suelen incluir espacios, como los nombres de archivos.
RETURN (RET)
Envia el texto del minibuffer como argumento, posiblemente completando primero (minibuffer-complete-and-exit). Ver Salida del Completado.
? (?)
Muestra una lista de terminaciones (minibuffer-completion-help).
TAB (minibuffer-complete) es el comando de finalización fundamental. Busca todas las terminaciones posibles que coincidan con el texto existente en el minibuffer, e intenta completar todo lo que pueda. Ver Cómo se eligen las Alternativas de Completado, para saber cómo se eligen las alternativas de completado.
SPC (minibuffer-complete-word) completa como TAB, pero sólo hasta el siguiente guión o espacio. Si tiene ‘auto-f’ en el minibuffer y escribe SPC, encuentra que la terminación es ‘auto-fill-mode’, pero sólo inserta ‘ill-’, dando ‘auto-fill-. Otro SPC en este punto completa todo el camino hasta ‘auto-fill-mode’.
Si TAB o SPC no puede completar, muestra una lista de alternativas de completado que coinciden (si hay alguna) en otra ventana. Puede mostrar la misma lista con ? (minibuffer-completion-help). Los siguientes comandos se pueden usar con la lista de completado:
Alt-v (M-v)
PageUp (PageUp)
(prior)
Al teclear Alt-v (M-v), mientras se está en el minibuffer, se selecciona la ventana que muestra la lista de finalización (switch-to-completions, cambio a finalizaciones). Esto prepara el camino para usar los comandos siguientes. PageUp, prior y Alt-g Alt-c (M-g M-c) hace lo mismo. También puede seleccionar la ventana de otras maneras (ver Ventanas múltiples).
RETURN (RET)
(ratón-1)
(ratón-2)
Mientras que esté en el buffer de la lista de completado, esto elige la opción de completado en el punto (choose-completion).
TAB (TAB)
(RIGHT)
n (n)
Mientras se encuentra en el búfer de la lista de completado, estas teclas mueven el punto a la siguiente alternativa de la finalización sugerida (net-completion).
Shift-TAB (S-TAB)
(LEFT)
p (n)
Mientras que está en el buffer de la lista de completado, estas teclas se mueven a la alternativa de finalización sugerida anterior (previous-completion).
q (q)
Mientras se está en el buffer de la lista de completado, se sale de la ventana que la muestra y se selecciona la ventana que muestra el minibuffer (quit-window).
z (z)
Mientras está en el buffer de la lista de completado, lo mata y elimina la ventana que lo muestra (kill-current-buffer).

Salida del Completado

Cuando un comando lee un argumento usando el minibuffer con opciones de completado , también controla lo que ocurre cuando se escribe RETURN (RET, minibuffer-complete-and-exit) para enviar el argumento. Hay cuatro tipos de comportamiento:

  • El completado estricto sólo acepta coincidencias de finalización exactas. Al escribir RETURN (RET) se sale del minibuffer sólo si el texto del minibuffer es una coincidencia exacta, o se completa con una. En caso contrario, Emacs se niega a salir del minibuffer; en su lugar intenta completarlo, y si no se puede completar muestra momentáneamente ‘[No match]’ después del texto del minibuffer. (Todavía puede salir del minibuffer escribiendo Ctrl-g (C-g) para cancelar el comando).

    Un ejemplo de un comando que usa este comportamiento es M-x, ya que no tiene sentido que acepte un nombre de comando inexistente.

  • El completado cauteloso es como el completado estricto, excepto que RETURN (RET) sale sólo si el texto ya es una coincidencia exacta. Si el texto se completa con una coincidencia exacta, RETURN (RET) lleva a cabe ese completado pero no sale todavía; debe escribir un segundo RETURN (RET) para salir.

    La finalización cautelosa se usa para leer nombres de archivos que ya deben existir, por ejemplo.

  • El completado permisivo permite cualquier entrada; los candidatos a la finalización son sólo sugerencias. Escribir RETURN (RET) no completa, sólo envía el argumento tal y como lo ha introducido.

  • El completado permisivo con confirmación es como el completamiento permisivo, con una excepción: si escribió TAB (TAB) y esto completó el texto hasta algún estado intermedio (es decir, uno que todavía no es una coincidencia de completamiento exacta), escribir RETURN (RET) justo después no envía el argumento. En su lugar, Emacs pide confirmación mostrando momentáneamente ‘[Confirm]’ después del texto; escriba RETURN (RET) de nuevo para confirmar y enviar el texto. Esto detecta un error común, en el que uno teclea RET antes de darse cuenta de que el TAB (TAB) no se ha completado hasta donde se deseaba.

    Puede ajustar el comportamiento de la confirmación personalizando la variable confirm-nonexistent-file-or-buffer. El valor por defecto, after-completion, da el comportamiento que acabamos de describir. Si lo cambia a nil, Emacs no pide confirmación, volviendo a la finalización permisiva. Si lo cambia a cualquier otro valor que no sea nil, pide confirmación tanto si el comando precedente era TAB como si no.

    Este comportamiento es usado por la mayoría de los comandos que leen nombres de archivos, como Ctrl-x Ctrl-f (C-x C-f), y comandos que leen nombres de búferes, como Ctrl-x b (C-x b).

Cómo se eligen las Alternativas de Completado

Los comandos de completado funcionan reduciendo una gran lista de posibles alternativas de finalización a un subconjunto más pequeño que coincida con lo que has escrito en el minibuffer. En Ejemplo de finalización, dimos un ejemplo sencillo de este tipo de coincidencia. El procedimiento para determinar lo que constituye una coincidencia es bastante intrincado. Emacs intenta ofrecer terminaciones plausibles en la mayoría de las circunstancias.

Emacs lleva a cabo el completado usando uno o más estilos de finalización, conjuntos de criterios para emparejar el texto del minibuffer con las alternativas de finalización. Durante el completado, el Editor intenta cada estilo de finalización por turnos. Si un estilo produce una o más coincidencias, se usa como lista de alternativas de finalización. Si un estilo no produce ninguna coincidencia, pasa al siguiente estilo.

La variable de lista completion-styles especifica los estilos de finalización a usar. Cada elemento de la lista es el nombre de un estilo de terminación (un símbolo Lisp). Los símbolos de estilo disponibles se almacenan en la variable completion-styles-alist (véase Variables de finalización en el Manual de referencia de Emacs Lisp). Los estilos de finalización por defecto son (en orden):

basic
Una alternativa de completado que coincida debe tener el mismo comienzo que el texto en el minibuffer antes del punto. Además, si hay algún texto en el minibuffer después del punto, el resto de la alternativa de completado debe contener ese texto como una subcadena.
partial-completion
Este estilo de completado agresivo divide el texto del minibuffer en palabras separadas por guiones o espacios, y completa cada palabra por separado. (Por ejemplo, al completar los nombres de los comandos, ‘em-l-m’ se completa como ‘emacs-lisp-mode’).
Además, un ‘*’ en el texto del minibuffer es tratado como un comodín - coincide con cualquier cadena de caracteres en la posición correspondiente en la alternativa de completado.
emacs22
Este estilo de completado es similar al básico, excepto que ignora el texto del minibuffer después del punto. Se llama así porque corresponde al comportamiento de finalización en Emacs 22.

Los siguientes estilos de finalización adicionales también están definidos, y puede añadirlos a completion-styles si lo desea (ver Personalización):

substring
Una alternativa de completado que coincida debe contener el texto en el minibuffer antes del punto, y el texto en el minibuffer después del punto, como substrings (en ese mismo orden).
Así, si el texto en el minibuffer es ‘foobar’, con el punto entre ‘foo’ y ‘bar’, eso coincide con ‘afoobbarc’, donde a, b, y c pueden ser cualquier cadena incluyendo la cadena vacía.
flex
Este estilo de completado agresivo, también conocido como flx o completado difuso o disperso (fuzzy o scatter completion), intenta completar usando subcadenas en orden. Por ejemplo, puede considerar que ‘foo’ coincide con ‘frodo’ o ‘fbarbazoo’.
initials
Este estilo de completado muy agresivo intenta completar acrónimos e inicialismos. Por ejemplo, al completar los nombres de los comandos, hace coincidir ‘lch’ con ‘list-command-history’.

También hay un estilo de completado muy simple llamado emacs21. En este estilo, si el texto en el minibuffer es ‘foobar’, sólo se consideran las coincidencias que empiezan por ‘foobar’.

Puede usar diferentes estilos de completado en diferentes situaciones, estableciendo la variable completion-category-overrides. Por ejemplo, la configuración por defecto dice que sólo se usa la terminación básica y la subcadena para los nombres de los búferes.

Opciones de finalización

Las mayúsculas y minúsculas son importantes cuando se completan argumentos que distinguen entre mayúsculas y minúsculas, como los nombres de los comandos. Por ejemplo, cuando se completan nombres de comandos, ‘AU’ no se completa con ‘auto-fill-mode’. Las diferencias entre mayúsculas y minúsculas se ignoran cuando se completan argumentos en los que no importan las mayúsculas.

Cuando se completan nombres de archivos, se ignoran las diferencias entre mayúsculas y minúsculas si la variable read-file-name-completion-ignore-case no es nula. El valor por defecto es nulo (nil) en sistemas que distinguen entre mayúsculas y minúsculas, como GNU/Linux; es no nulo en sistemas que no distinguen entre mayúsculas y minúsculas, como Microsoft Windows. Cuando se completan los nombres de los búferes, las diferencias entre mayúsculas y minúsculas se ignoran si la variable read-buffer-completion-ignore-case es non-nil (no nul); el valor por defecto es nil (nulo).

Cuando se completan los nombres de los archivos, Emacs suele omitir ciertas alternativas que se consideran poco probables de ser elegidas, según lo determinado por la variable de lista completion-ignored-extensions. Cada elemento de la lista debe ser una cadena; cualquier nombre de archivo que termine en una cadena de este tipo se ignora como alternativa de finalización. Cualquier elemento que termine en una barra (/) representa un nombre de subdirectorio. El valor estándar de completion-ignored-extensions tiene varios elementos que incluyen ".o", ".elc" y "~". Por ejemplo, si un directorio contiene "foo.c" y "foo.elc", "foo" se completa con "foo.c". Sin embargo, si todas las posibles terminaciones terminan en cadenas ignoradas, no se ignoran: en el ejemplo anterior, ‘foo.e’ se completa en ‘foo.elc’. Emacs no tiene en cuenta las extensiones ignoradas cuando muestra las alternativas de finalización en la lista de finalización.

La finalización de Shell es una versión extendida de la finalización de nombres de archivos, ver Opciones del modo Shell.

Si completion-auto-help se establece en nil, los comandos de completado nunca muestran el buffer de la lista de finalización; debes escribir ? para mostrar la lista. Si el valor es lazy, Emacs sólo muestra el buffer de la lista de finalización en el segundo intento de finalización. En otras palabras, si no hay nada que completar, el primer TAB se hace eco de ‘Next char not unique’; el segundo TAB muestra el buffer de la lista de finalización.

Si completion-cycle-threshold no es nulo, los comandos de completado pueden recorrer las alternativas de finalización. Normalmente, si hay más de una alternativa de finalización para el texto en el minibuffer, un comando de finalización completa hasta la subcadena común más larga. Si cambia completion-cycle-threshold a t, el comando de finalización completa la primera de esas alternativas de finalización; cada invocación posterior del comando de finalización reemplaza eso con la siguiente alternativa de finalización, de manera cíclica. Si le da a completion-cycle-threshold un valor numérico n, los comandos de finalización cambian a este comportamiento cíclico sólo cuando hay n o menos alternativas.

Cuando se muestran las terminaciones, Emacs normalmente abrirá un nuevo búfer para mostrar las terminaciones. Las terminaciones serán (por defecto) ordenadas en columnas horizontalmente en orden alfabético, pero esto puede ser cambiado cambiando la opción de usuario completions-format. Si es vertical, ordena los datos verticalmente en columnas, y si es de una columna, usa una sola columna.

Historial del minibuffer

Cada argumento que introduzca usando el minibuffer se guarda en una lista del historial del minibuffer para que pueda volver a usarlo fácilmente más adelante. Puede usar los siguientes argumentos para recuperar rápidamente un argumento anterior en el minibuffer:

Alt-p (M-p)
Mueve al elemento anterior del historial del minibuffer (previous-history-element).
Alt-n (M-n)
Mueve al siguiente elemento del historial del minibuffer (next-history-element).
(UP)
(DOWN)
Como Alt-p (M-p) y Alt-n (M-n), pero se mueven a la línea anterior o siguiente de un elemento de varias líneas antes de ir al elemento anterior del historial (previous-line-or-history-element y next-line-or-history-element) .
Alt-r expresión regular RETURN (M-r regexp RET)
Moverse a un elemento anterior del historial del minibuffer que coincida con la expresión regular (regexp) (previous-matching-history-element).
Alt-s expresión regular RETURN (M-s regexp RET)
Desplazarse a un elemento posterior del historial del minibuffer que coincida con regexp (next-matching-history-element).

Mientras está en el minibuffer, Alt-p (M-p, previous-history-element) se mueve a través de la lista del historial del minibuffer, un elemento a la vez. Cada Alt-p (M-p) recupera un elemento anterior de la lista del historial en el minibuffer, reemplazando su contenido existente. Si escribe Alt-n (M-n, next-history-element) te mueves a través de la lista del historial del minibuffer en la dirección opuesta, recuperando las entradas posteriores en el minibuffer.

Si teclea Alt-n (M-n) en el minibuffer cuando no hay entradas posteriores en el historial del minibuffer (por ejemplo, si no ha tecleado previamente Alt-p (M-p), Emacs intenta buscar en una lista de argumentos por defecto: valores que probablemente introduzca. Puede pensar en esto como un movimiento a través del "historial futuro".

El "historial futuro" de los nombres de archivo incluye varias alternativas posibles que puede encontrar útiles, como el nombre del archivo o la URL en el punto del buffer actual. Los valores por defecto puestos en el "historial futuro" en este caso son controlados por las funciones mencionadas en el valor de la opción file-name-at-point-functions. Por defecto, su valor invoca el paquete ffap (ver Búsqueda de archivos y URLs en el punto), que intenta adivinar el archivo o URL por defecto a partir del texto alrededor del punto. Para desactivar esta función, personalice la opción a un valor nulo (nil), entonces el "historial futuro" de nombres de archivos incluirá sólo el archivo, si lo hay, visitado por el buffer actual, y el directorio por defecto.

Las teclas de flecha (ARRIBA) y (ABAJO) funcionan como Alt-p (M-p) y Alt-n (M-n), pero si el elemento del historial actual es más largo que una sola línea, le permiten pasar a la línea anterior o siguiente del elemento del historial actual antes de ir al elemento anterior o siguiente del historial.

Si edita el texto insertado por los comandos de historial del minibuffer Alt-p (M-p) o Alt-n (M-n), esto no cambia su entrada en la lista del historial. Sin embargo, el argumento editado sí va al final de la lista del historial cuando lo envía.

Puede usar Alt-r (M-r, previous-matching-history-element) para buscar entre los elementos más antiguos de la lista del historial, y Alt-s (M-s, next-matching-history-element) para buscar entre las entradas más recientes. Cada uno de estos comandos pide una expresión regular como argumento, y obtiene la primera entrada que coincide en el minibuffer. Ver Sintaxis de las expresiones regulares, para una explicación de las expresiones regulares. Un prefijo numérico n significa que se obtiene la enésima entrada que coincide. Estos comandos son inusuales, ya que usan el minibuffer para leer el argumento de la expresión regular, aunque se invoquen desde el minibuffer. Una letra mayúscula en la expresión regular hace que la búsqueda sea sensible a las mayúsculas y minúsculas (ver Coincidencia laxa durante la búsqueda).

También puede buscar en el historial usando una búsqueda incremental. Ver Búsqueda incremental en el Minibuffer.

Emacs mantiene listas de historial separadas para diferentes tipos de argumentos. Por ejemplo, hay una lista para nombres de archivos, usada por todos los comandos que leen nombres de archivos. Otras listas de historial incluyen nombres de búferes, nombres de comandos (usados por Alt-x (M-x), y argumentos de comandos (usados por comandos como query-replace).

La variable history-length especifica la longitud máxima de una lista de historial del minibuffer; al añadir un nuevo elemento se borra el más antiguo si la lista se alarga demasiado. Si el valor es t, no hay longitud máxima.

La variable history-delete-duplicates especifica si se borran los duplicados en el historial. Si no es nula, al añadir un nuevo elemento se eliminan de la lista todos los demás elementos que sean iguales a él. El valor por defecto es nil (nulo).

Repetición de comandos del minibuffer

Cada comando que usa el minibuffer una vez se registra en una lista especial del historial, el historial de comandos, junto con los valores de sus argumentos, para que pueda repetir el comando completo. En particular, cada uso de Alt-x (M-x) se registra allí, ya que M-x usa el minibuffer para leer el nombre del comando.

Ctrl-x ESC ESC (C-x ESC ESC)
Reejecuta un comando reciente del minibuffer desde el historial de comandos (repeat-command-complex).
Alt-x list-command-history (M-x list-command-history)
Muestra todo el historial de comandos, mostrando todos los comandos que Ctrl-x ESC ESC (C-x ESC ESC) puede repetir, el más reciente primero.

Ctrl-x ESC ESC (C-x ESC ESC) reejecuta un comando reciente que usó el minibuffer. Sin argumento, repite el último comando de este tipo. Un argumento numérico especifica qué comando repetir; 1 significa el último, 2 el anterior, y así sucesivamente.

Ctrl-x ESC ESC (C-x ESC ESC) funciona convirtiendo el comando anterior en una expresión Lisp y luego introduciendo un minibuffer inicializado con el texto de esa expresión. Incluso si no conoce Lisp, probablemente será obvio qué comando se muestra para la repetición. Si escribe sólo RETURN (RET), eso repite el comando sin cambios. También puede cambiar el comando editando la expresión Lisp antes de ejecutarla. El comando ejecutado se añade al frente del historial de comandos a menos que sea idéntico al elemento más reciente.

Una vez dentro del minibuffer de Ctrl-x ESC ESC (C-x ESC ESC), puede utilizar los comandos habituales del historial del minibuffer (véase Historial del minibuffer) para desplazarse por la lista del historial. Después de encontrar el comando anterior deseado, puede editar su expresión como de costumbre y luego ejecutarlo escribiendo RETURN (RET).

La búsqueda incremental no usa, estrictamente hablando, el minibuffer. Por lo tanto, aunque se comporta como un comando complejo, normalmente no aparece en la lista del historial de Ctrl-x ESC ESC (C-x ESC ESC). Puede hacer que los comandos de búsqueda incremental aparezcan en el historial estableciendo isearch-resume-in-command-history a un valor no nulo. Véase Búsqueda incremental.

La lista de comandos anteriores que usan el minibuffer se almacena como una lista Lisp en la variable command-history. Cada elemento es una expresión Lisp que describe una orden y sus argumentos. Los programas Lisp pueden volver a ejecutar una orden llamando a eval con el elemento command-history.

Introducción de contraseñas

A veces, puede necesitar introducir una contraseña en Emacs. Por ejemplo, cuando le dice al Editor que visite un archivo en otra máquina a través de un protocolo de red como FTP, a menudo necesita proporcionar una contraseña para acceder a la máquina (ver Archivos remotos).

Introducir una contraseña es similar a usar un minibuffer. Emacs muestra un prompt en el área de eco (como ‘Password:’); después de escribir la contraseña requerida, pulse RETURN (RET) para enviarla. Para evitar que otros vean su contraseña, cada carácter que escriba se muestra como un asterisco (‘*’) en lugar de su forma habitual.

La mayoría de las funciones y comandos asociados al minibuffer no pueden usarse al introducir una contraseña. No hay historial ni completado, y no puede cambiar de ventana ni realizar ninguna otra acción con Emacs hasta que hayas enviado la contraseña.

Mientras está escribiendo la contraseña, puede pulsar DEL (DEL) para borrar hacia atrás, eliminando el último carácter introducido. Ctrl-u (C-u) borra todo lo que ha escrito hasta el momento. Ctrl-g (C-g) sale de la solicitud de contraseña (ver Salir y Abortar). Ctrl-y (C-y) inserta la el texto matado en la contraseña (ver Matar y Mover texto). Puede escribir RETURN (RET) o ESC (ESC) para enviar la contraseña. Cualquier otra tecla de autoinserción de caracteres inserta el carácter asociado en la contraseña, y cualquier otra entrada es ignorada.

Preguntas de sí o no

Un comando de Emacs puede requerir que respondas a una pregunta de sí o no durante el curso de su ejecución. Este tipo de preguntas son de dos tipos principales.

Para el primer tipo de pregunta sí o no, el prompt termina con ‘(y o n)’. Para responder a la pregunta, hay que teclear una sola tecla, ya sea ‘y’ o ‘n’, lo que permite salir inmediatamente del minibuffer y obtener la respuesta. Por ejemplo, si escribe Ctrl-x Ctrl-w (C-x C-w, write-file) para guardar un buffer, e introduce el nombre de un archivo existente, Emacs emite un prompt como este:

File ‘foo.el’ exists; overwrite? (y or n)

El segundo tipo de consulta de sí o no se emplea normalmente si dar una respuesta errónea podría tener consecuencias graves; por lo tanto, presenta una pregunta más larga que termina con ‘(yes or no)’. Por ejemplo, si invoca Ctrl-x k (C-x k, kill-buffer) en un buffer que visita un archivo con cambios no guardados, Emacs activa el minibuffer con un prompt como este:

Buffer foo.el modified; kill anyway? (yes or no)

Para responder, debe escribir ‘yes’ o ‘no’ en el minibuffer, seguido de RETURN (RET).

Con ambos tipos de consulta "sí" o "no", el minibuffer se comporta como se ha descrito en las secciones anteriores; puede recentrar la ventana seleccionada con Ctrl-l (C-l), desplazarse por esa ventana Ctrl-v (C-v) o PageDown se desplaza hacia delante, Alt-v (M-v) o PageUp se desplaza hacia atrás), cambiar a otra ventana con Ctrl-x o (C-x o), usar los comandos del historial Alt-p (M-p) y Alt-n (M-n), etc. Escriba Ctrl-g (C-g) para descartar la consulta, y salir del minibuffer y del comando de consulta (ver Salir y Abortar).



Ejecutar comandos por nombres

Cada comando de Emacs tiene un nombre que puede usar para ejecutarlo. Para mayor comodidad, muchos comandos también tienen enlaces de teclas. Puede ejecutar esos comandos pulsando las teclas, o ejecutarlos por su nombre. La mayoría de los comandos de Emacs no tienen enlaces de teclas, así que la única manera de ejecutarlos es por nombre. (Ver Personalización de las combinaciones de teclas, para saber cómo configurar a los enlaces de las teclas).

Por convención, un nombre de comando consiste en una o más palabras, separadas por guiones; por ejemplo, auto-fill-mode o manual-entry. Los nombres de comandos suelen usar palabras completas en inglés para que sean más fáciles de recordar.

Para ejecutar un comando por su nombre, comience con Alt-x (M-x), escriba el nombre del comando y termine con RETURN (RET). Alt-x (M-x) usa el minibuffer para leer el nombre del comando. La cadena ‘M-x’ aparece al principio del minibuffer como un prompt para recordarle que debe introducir el nombre del comando a ejecutar. RETURN (RET) sale del minibuffer y ejecuta el comando. Ver El minibuffer, para más información sobre el minibuffer.

Puede usar el completado para introducir el nombre del comando. Por ejemplo, para invocar el comando forward-char, puede escribir

M-x forward-char RET

o

M-x forw TAB c RET

Tenga en cuenta que forward-char es el mismo comando que se invoca con las teclas Ctrl-f (C-f). La existencia de una unión de teclas no le impide ejecutar el comando por su nombre.

Cuando Alt-x (M-x) completa los comandos, ignora los comandos que se declaran obsoletos; para estos, tendrá que escribir su nombre completo. (Los comandos obsoletos son aquellos para los que existen alternativas más nuevas y mejores, y que están programados para ser eliminados en alguna futura versión de Emacs).

Además, el completado que se desprende de Alt-x (M-x) puede excluir comandos que no son relevantes para -y generalmente no pueden trabajar con- el modo mayor del buffer actual (ver Modos principales o Mayores) y los modos menores (ver Modos menores). Por defecto, no se excluye ningún comando, pero puede personalizar la opción read-extended-command-predicate para excluir esos comandos irrelevantes de los resultados del completado.

A la inversa, Emacs puede excluir todos los comandos excepto aquellos que son particularmente relevantes para el buffer actual. El comando Alt-Shift-x (M-S-x) (que es "meta shift x") funciona igual que Alt-x (M-x), pero en lugar de listar todos (o la mayoría) de los comandos que Emacs conoce, sólo listará los comandos que han sido marcados como "pertenecientes" al modo mayor actual, o cualquier modo menor habilitado.

Para cancelar Alt-x (M-x) y no ejecutar un comando, escriba Ctrl-g (C-g) en lugar de introducir el nombre del comando. Esto le lleva de vuelta al nivel de comandos.

Para pasar un argumento numérico al comando que está invocando con Alt-x (M-x), especifique el argumento numérico antes de Alt-x (M-x). El valor del argumento aparece en el prompt mientras se lee el nombre del comando, y finalmente Alt-x (M-x) pasa el argumento a ese comando. Por ejemplo, para pasar el argumento numérico de 42 al comando forward-char puede escribir Ctrl-u 42 Alt-x forward-chart RETURN (C-u 42 M-x forward-char RET) .

Cuando el comando que se ejecuta con Alt-x (M-x) tiene un enlace de teclas, Emacs lo menciona en el área de eco después de ejecutar el comando. Por ejemplo, si escribes Alt-x forward-word (M-x forward-word), el mensaje dice que puedes ejecutar el mismo comando escribiendo (M-f). Puede desactivar estos mensajes estableciendo la variable suggest-key-bindings en nil. El valor de suggest-key-bindings también puede ser un número, en cuyo caso Emacs mostrará el enlace durante tantos segundos antes de quitarlo de la pantalla. El comportamiento por defecto es mostrar el enlace durante 2 segundos.

Además, cuando suggest-key-bindings no es nulo, la lista de finalización de M-x muestra las combinaciones de teclas equivalentes para todos los comandos que las tienen.

Los comandos que no tienen enlaces de teclas, aún pueden ser invocados después de escribir menos de su nombre completo en el prompt ‘M-x’. Emacs menciona estos atajos en el área de eco si son significativamente más cortos que el nombre completo del comando, y extended-command-suggest-shorter es non-nil. La configuración de suggest-key-bindings afecta también a estas sugerencias.

En este manual, cuando hablamos de ejecutar un comando por su nombre, a menudo omitimos el (RET) que termina el nombre. Así, podríamos decir Alt-x auto-fill-mode (M-x auto-fill-mode) en lugar de Alt-x auto-fill-mode RETURN (M-x auto-fill-mode RET). Mencionamos RETURN (RET) sólo para dar énfasis, como cuando el comando va seguido de argumentos.En este manual, cuando hablamos de ejecutar un comando por su nombre, a menudo omitimos teclear RETURN (RET) que termina el nombre. Así, podríamos decir M-x auto-fill-mode en lugar de M-x auto-fill-mode RET. Mencionamos el RET sólo para dar énfasis, como cuando el comando va seguido de argumentos.

(M-x) funciona ejecutando el comando execute-extended-command, que se encarga de leer el nombre de otro comando e invocarlo.



Ayuda (Help)

Emacs proporciona una amplia variedad de comandos de ayuda, todos ellos accesibles a través de la tecla prefijo Ctrl-h (C-h) o, equivalentemente, la tecla de función F1 (F1). Estos comandos de ayuda se describen en las siguientes secciones. También puede escribir Ctrl-h Ctrl-h (C-h C-h) para ver una lista de comandos de ayuda (help-for-help). Puede desplazarse por la lista con SPACE (SPC) y DEL (DEL), y luego escribir el comando de ayuda que desee. Para cancelar, escriba Ctrl-g (C-g).

Muchos comandos de ayuda muestran su información en un búfer especial: el buffer de ayuda. En este búfer, puede escribir SPACE (SPC) y DEL (DEL) para desplazarse, y RETURN (RET) para seguir los hipervínculos. Consulte los Comandos del modo de ayuda.

Si está buscando una determinada función, pero no sabe cómo se llama o dónde buscar, le recomendamos tres métodos. Primero, intente un comando apropos, luego intente buscar en el índice del manual, luego busque en el FAQ y en las palabras clave del paquete.

Ctrl-h a tema RETURN (C-h a tema RET)
Esto busca comandos cuyos nombres coinciden con el argumento tema. El argumento puede ser una palabra clave, una lista de palabras clave o una expresión regular (véase Sintaxis de las Expresiones Regulares). Véase Apropos.
Ctrl-h idm emacs RETURN i tema RETURN (C-h i d m emacs RET i tema RET)
Busca el tema en los índices del manual Emacs Info, mostrando la primera coincidencia encontrada. Pulse , para ver las siguientes coincidencias. Puede usar una expresión regular como tema.
Ctrl-h idm emacs RETURN s tema RETURN (C-h i d m emacs RET tema RET)
Similar, pero busca en el texto del manual en lugar de en los índices.
Ctrl-h Ctrl-f (C-h C-f)
Muestra las preguntas frecuentes (FAQ) de Emacs, usando Info.
Ctrl-h p (C-h p)
Muestra los paquetes Emacs disponibles en base a palabras clave. Ver Búsqueda de paquetes por palabras clave.

Ctrl-h (C-h) o F1 (F1) significan "ayuda" en varios otros contextos también. Por ejemplo, puede escribirlas después de una tecla de prefijo para ver una lista de las teclas que pueden seguir a la tecla de prefijo. (También puede utilizar ? (?) en este contexto. Algunas teclas de prefijo no admiten C-h o ? de esta manera, porque definen otros significados para esas entradas, pero todas admiten F1).

Resumen de la ayuda

Este es un resumen de los comandos de ayuda para acceder a la documentación incorporada. La mayoría de ellos se describen con más detalle en las siguientes secciones.

Ctrl-h a temas RETURN (C-h a temas RET)
Muestra una lista de comandos cuyos nombres coinciden con los temas (apropos-command). Véase Apropos.
Ctrl-h b (C-h b)
Muestra todas las combinaciones de teclas activas; primero las del modo menor, luego las del modo mayor y después las globales (describe-bindings). Ver Otros comandos de ayuda.
Ctrl-h c tecla (C-h c tecla)
Muestra el nombre del comando al que está vinculada la tecla de la secuencia de teclas (describe-key-briefly). Aquí c significa "carácter" (character). Para una información más extensa sobre la tecla, use Ctrl-h k (C-h k). Véase Documentación de una tecla.
Ctrl-h d temas RETURN (C-h d temas RET)
Muestra los comandos y variables cuya documentación coincide con los temas (apropos-documentación). Ver Apropos.
Ctrl-h e (C-h e)
Muestra el buffer *Messages* (*Mensajes*, view-echo-area-messages). Ver Otros comandos de ayuda.
Ctrl-h f función RETURN (C-h f función RET)
Muestra la documentación de la función Lisp de nombre función (describe-function). Dado que los comandos son funciones Lisp, esto también funciona para los comandos, pero también puede usar Ctrl-h x (C-h x). Vea Ayuda por nombre de comando o variable.
Ctrl-h h (C-h h)
Muestra el archivo HELLO, que muestra ejemplos de varios conjuntos de caracteres.
Ctrl-h i (C-h i)
Ejecuta Info, el navegador de documentación de GNU (info). El manual de Emacs está disponible en Info. Ver Otros comandos de ayuda.
Ctrl-h k tecla (C-h k tecla)
Muestra el nombre y la documentación del comando que ejecuta la tecla (describe-key). Ver Documentación de una tecla.
Ctrl-h l (C-h l)
Muestra una descripción de las últimas 300 pulsaciones de la tecla (view-lossage). Consulte Otros comandos de ayuda.
Ctrl-h m (C-h m)
Muestra la documentación del modo mayor y los modos menores actuales (describe-mode). Consulte Otros comandos de ayuda.
Ctrl-h n (C-h n)
Muestra las noticias de los cambios recientes de Emacs (view-emacs-news). Ver Archivos de ayuda.
Ctrl-h o símbolo (C-h o símbolo)
Muestra la documentación del símbolo Lisp de nombre símbolo (describe-symbol). Esto mostrará la documentación de todo tipo de símbolos: funciones, variables y caras. Véase Ayuda por nombre de comando o variable.
Ctrl-h p (C-h p)
Busca paquetes por palabra clave del tema (finder-by-keyword). Ver Búsqueda de paquetes por palabras clave. Esto lista los paquetes usando un buffer de menú de paquetes. Ver Paquetes Emacs Lisp.
Ctrl-h P paquete RETURN (C-h P paquete RET)
Muestra la documentación sobre el paquete especificado (describe-package). Ver Búsqueda de paquetes por palabras clave.
Ctrl-h r (C-h r)
Muestra el manual de Emacs en Info (info-emacs-manual).
Ctrl-h s (C-h s)
Muestra el contenido de la tabla de sintaxis actual (describe-syntax). Ver Otros comandos de ayuda. La tabla de sintaxis dice qué caracteres son delimitadores de apertura, cuáles son partes de palabras, etc. Para más detalles vea Tablas de Sintaxis en el Manual de Referencia de Emacs Lisp.
Ctrl-h t (C-h t)
Entra en el tutorial interactivo de Emacs (help-with-tutorial).
Ctrl-h v var RETURN (C-h v var RET)
Muestra la documentación de la variable Lisp de nombre var (describe-variable). Ver Ayuda por nombre de comando o variable.
Ctrl-h w comando RETURN (C-h w comando RET)
Muestra qué teclas ejecutan el comando de nombre comando (where-is). Ver Documentación de una Tecla.
Ctrl-h x comando RETURN (C-h x comando RET)
Muestra la documentación del comando de nombre comando (describe-command). Ver Ayuda por nombre de comando o variable.
Ctrl-h C codificación RETURN (C-h C codificación RET)
Describe la codificación del sistema de codificación (describe-coding-system). Ver Sistemas de codificación.
Ctrl-h C RETURN (C-h C RET)
Describe los sistemas de codificación actualmente en uso.
Ctrl-h F comando RETURN (C-h F comando RET)
Entra en Info y va al nodo que documenta el comando de Emacs de nombre comando (Info-goto-emacs-command-node). Ver Ayuda por nombre de comando o variable.
Ctrl-h I método RETURN (C-h I método RET)
Describe el método de entrada (describe-input-method). Ver Selección de un método de entrada.
Ctrl-h K tecla (C-h K tecla)
Entre en Info y vaya al nodo que documenta la clave de la secuencia de teclas (Info-goto-emacs-key-command-node). Véase Documentación de una tecla.
Ctrl-h L lenguaje-env RETURN (C-h L lenguaje-env RET)
Muestra información sobre los conjuntos de caracteres, los sistemas de codificación y los métodos de entrada utilizados en el entorno lingüístico language-env (describe-language-environment). Véase Entornos lingüísticos.
Ctrl-h S símbolo RETURN (C-h S símbolo RET)
Muestra la documentación de información sobre el símbolo de acuerdo con el lenguaje de programación que se está editando (info-lookup-symbol). Ver Ayuda sobre el texto activo y las Sugerencias de Herramientas (tooltips).
Ctrl-h . (C-h .)
Muestra el mensaje de ayuda para un área de texto especial, si el punto está en una (display-local-help). Esto incluye, por ejemplo, los enlaces en los búferes de *Ayuda* (*Help*). Véase la ayuda sobre Ayuda sobre el texto activo y las Sugerencias de Herramientas (tooltips).

Documentación de una tecla

Los comandos de ayuda para obtener información sobre una secuencia de teclas son Ctrl-h c (C-h c, describe-key-briefly) y Ctrl-h k (C-h k, describe-key).

Ctrl-h c tecla (C-h c tecla) muestra en el área de eco el nombre del comando al que está vinculada esa tecla. Por ejemplo, Ctrl-h c Ctrl-f (C-h c C-f) muestra ‘forward-char’.

Ctrl-h k tecla (C-h k tecla) es similar pero da más información: muestra un búfer de ayuda que contiene la cadena de documentación del comando, que describe exactamente lo que hace el comando.

Ctrl-h K tecla (C-h K tecla) muestra la sección del manual de Emacs que describe el comando correspondiente a tecla.

Ctrl-h c (C-h c), Ctrl-h k (C-h k) y Ctrl-h K (C-h K) funcionan para cualquier tipo de secuencias de teclas, incluyendo teclas de función, menús y eventos del ratón (excepto que Ctrl-h c (C-h c) ignora los eventos de movimiento del ratón). Por ejemplo, después de C-h k puede seleccionar un elemento de menú de la barra de menús, para ver la cadena de documentación del comando que ejecuta.

Ctrl-h w comando RETURN (C-h w comando RET) enumera las teclas que están vinculadas al comando. Muestra la lista en el área de eco. Si dice que el comando no está en ninguna tecla, significa que debe usar Alt-x (M-x) para ejecutarlo. Ctrl-h w (C-h w) ejecuta el comando donde está.

Algunos modos en Emacs usan varios botones (ver Botones en El Manual de Referencia de Emacs Lisp) y widgets (ver Introducción en Emacs Widgets) que pueden ser pulsados para realizar alguna acción. Para averiguar qué función es invocada en última instancia por estos botones, Emacs proporciona los comandos button-describe y widget-describe, que deben ser ejecutados con el punto sobre el botón.

Ayuda por nombre de comando o variable

Ctrl-h x comando RETURN (C-h x comando RET, describe-comando ) muestra la documentación del comando nombrado, en una ventana. Por ejemplo,

C-h x auto-fill-mode RET

muestra la documentación del modo de relleno automático. Así es como se obtiene la documentación de un comando que no está ligado a ninguna tecla (uno que normalmente se ejecutaría usando Alt-x (M-x)).

Ctrl-h f función RETURN (C-h f función RET, describe-function) muestra la documentación de la función Lisp. Este comando está pensado para las funciones Lisp que se usan en un programa Lisp. Por ejemplo, si acaba de escribir la expresión (make-vector len) y quiere comprobar que está usando make-vector correctamente, escriba Ctrl-h f make-vector RETURN (C-h f make-vector RET). Además, como todos los comandos son funciones Lisp, también puede usar este comando para ver la documentación de cualquier comando.

Si escribe Ctrl-h f RETURN (C-h f RET), describe la función llamada por la expresión Lisp más interna en el buffer alrededor del punto, siempre que el nombre de la función sea una función Lisp válida y definida. (Ese nombre aparece por defecto mientras se introduce el argumento.) Por ejemplo, si el punto se encuentra tras el texto ‘(make-vector (car x)’, la lista más interna que contiene el punto es la que comienza con ‘(make-vector’, por lo que Ctrl-h f RETURN (C-h f RET) describe la función make-vector.

Ctrl-h f (C-h f) también es útil para verificar que ha escrito correctamente el nombre de una función. Si el prompt del minibuffer para Ctrl-h f (C-h f) muestra el nombre de la función del buffer por defecto, significa que ese nombre está definido como una función Lisp. Escriba Ctrl-g (C-g) para cancelar el comando Ctrl-h f (C-h f) si realmente no desea ver la documentación.

Si solicita ayuda para una función autocargada cuyo formulario de autocarga (véase Autoload en The Emacs Lisp Reference Manual) no proporciona una cadena de documentación, el búfer *Help* no tendrá ninguna cadena de documentación que mostrar. En ese caso, si help-enable-symbol-autoload no es nulo, Emacs intentará cargar el fichero en el que está definida la función para ver si hay una cadena doc allí.

Puede obtener una visión general de las funciones relevantes para un tema en particular usando el comando Alt-x shortdoc-display-gropu (M-x shortdoc-display-group). Esto le pedirá un área de interés, por ejemplo, cadena, y le llevará a un búfer donde se enumeran muchas de las funciones relevantes para el manejo de cadenas.

Ctrl-h v (C-h v, describe-variable) es como Ctrl-h f (C-h f) pero describe variables Lisp en lugar de funciones Lisp. Su valor por defecto es el símbolo Lisp alrededor o antes del punto, si ese es el nombre de una variable Lisp definida. Véase Variables.

Los buffers de ayuda que describen las variables y funciones de Emacs normalmente tienen hipervínculos al código fuente correspondiente, si tienes los archivos fuente instalados (ver Características de hipervínculos y navegación web).

Para encontrar la documentación de un comando en un manual, utilice (C-h F, Info-goto-emacs-command-node). Esto conoce varios manuales, no sólo el de Emacs , y encuentra el correcto.

Ctrl-h o (C-h o, describe-symbol) es como Ctrl-h f (C-h f) y Ctrl-h v (C-h v), pero describe cualquier símbolo, ya sea una función, una variable o una cara. Si el símbolo tiene más de una definición, como por ejemplo si tiene ambas definiciones como función y como variable, este comando mostrará la documentación de todas ellas, una tras otra.

Si la opción de usuario completions-detailed no es nula, algunos comandos proporcionan detalles sobre los posibles valores al mostrar las terminaciones. Por ejemplo, Ctrl-h (C-h) o TAB (TAB) incluirá la primera línea de la cadena de documentación, y también dirá si cada símbolo es una función o una variable (y así sucesivamente). Los detalles que se incluyen varían en función del comando usado.

Apropos

Los comandos apropos responden a preguntas como: "¿Cuáles son los comandos para trabajar con archivos?" En concreto, se especifica un patrón de apropos, es decir, una palabra, una lista de palabras o una expresión regular.

Cada uno de los siguientes comandos apropos lee un patrón apropos en el minibuffer, busca los elementos que coinciden con el patrón y muestra los resultados en una ventana diferente.

Ctrl-h a (C-h a)
Busca comandos (apropos-command). Con un argumento de prefijo, busca también funciones no interactivas.
Alt-x apropos (M-x apropos)
Busca funciones y variables. Tanto las funciones interactivas (commands) como las no interactivas pueden ser encontradas con este comando.
Alt-x apropos-user-option (M-x apropos-user-option)
Busca variables personalizables por el usuario. Con un argumento de prefijo, busca también variables no personalizables.
Alt-x apropos-variable (M-x apropos-variable)
Busca variables. Con un argumento de prefijo, busca sólo variables personalizables.
Alt-x apropos-local-variable (M-x apropos-local-variable)
Busca variables locales del buffer.
Alt-x apropos-value (M-x apropos-value)
Busca variables cuyos valores coincidan con el patrón especificado. Con un argumento de prefijo, busca también funciones con definiciones que coincidan con el patrón, y símbolos Lisp con propiedades que coincidan con el patrón.
Alt-x apropos-local-value (M-x apropos-local-value)
Busca variables locales del buffer cuyos valores coincidan con el patrón especificado.
Ctrl-h d (C-h d)
Busca funciones y variables cuyas cadenas de documentación coincidan con el patrón especificado (apropos-documentation).

El tipo más simple de patrón apropos es una palabra. Cualquier cosa que contenga esa palabra coincide con el patrón. Así, para encontrar comandos que funcionen en archivos, escriba Ctrl-h un archivo RETURN (C-h un archivo RET). Esto muestra una lista de todos los nombres de comandos que contienen ‘archivo’, incluyendo copy-file, find-file, etc. Cada nombre de comando viene con una breve descripción y una lista de teclas con las que puedes invocarlo actualmente. En nuestro ejemplo, diría que puedes invocar find-file escribiendo Ctrl-x Ctrl-f (C-x C-f).

Para obtener más información sobre la definición de una función, variable o propiedad de un símbolo que aparece en un búfer de apropiaciones, puede hacer clic en él con (ratón-1) o (ratón-2), o desplazarse hasta allí y escribir RETURN (RET).

Cuando se especifica más de una palabra en el patrón de apropos, un nombre debe contener al menos dos de las palabras para que coincida. Por lo tanto, si está buscando comandos para matar un trozo de texto antes del punto, podría intentar Ctrl-a kill back backward behind before RETURN (C-h a kill back backward behind before RET). El nombre real del comando kill-backward coincidirá con eso; si hubiera un comando kill-text-before, también coincidiría, ya que contiene dos de las palabras especificadas.

Para una mayor flexibilidad, puede especificar una expresión regular (véase Sintaxis de las Expresiones Regulares). Un patrón apropos se interpreta como una expresión regular si contiene alguno de los caracteres especiales de expresión regular, ‘^$*+?.[’.

Siguiendo las convenciones para nombrar los comandos de Emacs, aquí hay algunas palabras que encontrará útiles en los patrones apropos. Usándolas en Ctrl-h a (C-h a), también se hará una idea de las convenciones de nomenclatura.

char, line, word, sentence, paragraph, region, page, sexp, list, defun, rect, buffer, frame, window, face, file, dir, register, mode, beginning, end, forward, backward, next, previous, up, down, search, goto, kill, delete, mark, insert, yank, fill, indent, case, change, set, what, list, find, view, describe, default.

Si la variable apropos-do-all no es nula, la mayoría de los comandos apropos se comportan como si se les hubiera dado un argumento prefijo. Hay una excepción: apropos-variable sin un argumento de prefijo siempre buscará todas las variables, sin importar el valor de apropos-do-all.

Por defecto, todos los comandos apropos excepto apropos-documentation listan sus resultados en orden alfabético. Si la variable apropos-sort-by-scores no es nula, estos comandos intentan adivinar la relevancia de cada resultado y muestran primero los más relevantes. El comando apropos-documentation lista sus resultados en orden de relevancia por defecto; para listarlos en orden alfabético, cambie la variable apropos-documentation-sort-by-scores a nil.

Comandos del modo de ayuda

Los buffers de ayuda tienen el modo de ayuda como su modo principal. El modo de ayuda proporciona los mismos comandos que el modo Vista (ver Modo de Visualización); por ejemplo, SPACE (SPC) se desplaza hacia adelante, y DEL (DEL) o Shift-SPACE (S-SPC) se desplaza hacia atrás. También proporciona algunos comandos especiales:

RETURN (RET)
Sigue una referencia cruzada en un punto (help-follow).
TAB (TAB)
Avanza el punto hasta el siguiente hipervínculo (forward-button).
Shift-TAB (S-TAB)
Mueve el punto hacia atrás al hipervínculo anterior (backward-button).
(ratón-1)
(ratón-2)
Sigue un hipervínculo sobre el que se hace clic.
Ctrl-c Ctrl-c (C-c C-c)
Muestra toda la documentación sobre el símbolo en el punto (help-follow-symbol).
Ctrl-c Ctrl-f (C-c C-f)
r (r)
Pasa al siguiente tema de ayuda (help-go-forward).
Ctrl-c Ctrl-b (C-c C-b)
l (l)
Vuelve al tema de ayuda anterior (help-go-back).
s (s)
Permite ver el origen del tema de ayuda actual -si lo hay- (help-view-source).
i (i)
Busca el tema actual en el(los) manual(es) (help-goto-info).
c (c)
Personaliza la variable o una face (help-customize).

Cuando un nombre de función, nombre de variable o nombre de face (ver Faces (Caras) de Texto) aparece en la documentación en el buffer de ayuda, normalmente es un hipervínculo subrayado. Para ver la documentación asociada, mueva el punto allí y escriba RETURN (RET) (help-follow), o haga clic en el hipervínculo con (ratón-1) o (ratón-2). Para volver sobre sus pasos, escriba Ctrl-c Ctrl-b (C-c C-b) o l (l) (help-go-back). Mientras vuelve sobre sus pasos, puede avanzar usando Ctrl-c Ctrl-f (C-c C-f) o r (r) (help-go-forward).

Un búfer de ayuda también puede contener hipervínculos a manuales de información, definiciones de código fuente y URLs (páginas web). Los dos primeros se abren en Emacs, y el tercero usando un navegador web a través del comando browse-url (ver Siguiendo URLs).

En un búfer de ayuda, TAB (TAB, forward-button) mueve el punto hacia adelante al siguiente hipervínculo, mientras que Shift-TAB (S-TAB, backward-button) mueve el punto hacia atrás al hipervínculo anterior. Estos comandos actúan de forma cíclica; por ejemplo, si se teclea TAB (TAB) en el último hipervínculo, se vuelve al primer hipervínculo.

Para ver toda la documentación sobre cualquier símbolo en el texto, mueva el punto al símbolo y escriba Ctrl-c Ctrl-c (C-c C-c, help-follow-symbol). Esto muestra la documentación para todos los significados del símbolo-como una variable, como una función, y/o como una face.

Búsqueda de paquetes por palabras clave

La mayoría de las características opcionales de Emacs están agrupadas en paquetes. Este Editor contiene varios cientos de paquetes incorporados, y se pueden instalar más a través de la red (ver Paquetes Emacs Lisp).

Para facilitar la búsqueda de paquetes relacionados con un tema, la mayoría de los paquetes están asociados con una o más palabras clave basadas en lo que hacen. Escriba Ctrl-h p (C-h p, finder-by-keyword) para que aparezca una lista de palabras clave de paquetes, junto con una descripción de lo que significan las palabras clave. Para ver una lista de paquetes para una palabra clave dada, escriba RETURN (RET) en esa línea; esto muestra la lista de paquetes en un búfer del Menú de Paquetes (vea El Búfer de El menú de paquetes).

Ctrl-h P (C-h P, describe-paquete) pide el nombre de un paquete (ver Paquetes de Emacs Lisp), y muestra un buffer de ayuda describiendo los atributos del paquete y las características que implementa. El búfer enumera las palabras clave relacionadas con el paquete en forma de botones. Haga clic en un botón con (ratón-1) o (ratón-2) para ver la lista de otros paquetes relacionados con esa palabra clave.

Ayuda para el soporte lingüístico internacional

Para obtener información sobre un entorno lingüístico específico (véase Entornos lingüísticos), escriba Ctrl-h L (C-h L, describe-language-environment). Esto muestra un búfer de ayuda que describe los idiomas soportados por el entorno lingüístico, y que enumera los conjuntos de caracteres asociados, los sistemas de codificación y los métodos de entrada, así como algunos ejemplos de texto para ese entorno lingüístico.

El comando Ctrl-h h (C-h h, view-hello-file) muestra el archivo etc/HELLO, que demuestra varios conjuntos de caracteres mostrando cómo decir "hola" en muchos idiomas.

El comando Ctrl-h I (C-h I, describe-input-method) describe un método de entrada, ya sea un método de entrada especificado, o por defecto el método de entrada actualmente en uso. Véase Métodos de entrada.

El comando Ctrl-h C (C-h C, describe-coding-system) describe los sistemas de codificación, ya sea un sistema de codificación especificado o los que se usan actualmente. Véase Sistemas de codificación.

Otros comandos de ayuda

Ctrl-h i (C-h i, info) ejecuta el programa Info, que explora los archivos de documentación estructurada. Ctrl-h 4i (C-h 4 i, info-other-window) hace lo mismo, pero muestra el buffer de Info en otra ventana. El manual completo de Emacs está disponible en Info, junto con muchos otros manuales del sistema GNU. Escriba h (h) después de entrar en Info para ejecutar un tutorial sobre el uso de Info.

Con un argumento numérico n, Ctcrl-h i (C-h i) selecciona el buffer ‘*info*<n>’. Esto es útil si quiere navegar por varios manuales de Info simultáneamente. Si se especifica sólo Ctrl-u (C-u) como argumento de prefijo, Ctrl-h i (C-h i) solicita el nombre de un archivo de documentación, de modo que se puede navegar por un archivo que no tiene una entrada en el menú Info de nivel superior.

Los comandos de ayuda Ctrl-h F función RETURN (C-h F función RET) Ctrl-h K y (C-h K tecla), descritos anteriormente, entran en Info y van directamente a la documentación de la función o tecla.

Al editar un programa, si tiene una versión Info del manual del lenguaje de programación, puede usar Ctrl-h S (C-h S, info-lookup-symbol) para encontrar una entrada para un símbolo (palabra clave, función o variable) en el manual adecuado. Los detalles de cómo funciona este comando dependen del modo principal.

Si ocurre algo sorprendente y no está seguro de lo que ha escrito, use Ctrl-h l (C-h l, view-lossage). C-h l muestra sus últimas pulsaciones de teclas y los comandos que invocaron. Por defecto, Emacs almacena las últimas 300 pulsaciones; si quiere, puede cambiar este número con el comando lossage-size. Si ve comandos con los que no está familiarizado, puede usar Ctrl-h k (C-h k) o Ctrl-h f (C-h f) para averiguar lo que hacen.

Para revisar los mensajes recientes del área de eco, use Ctrl-h e (C-h e, view-echo-area-messages). Esto muestra el buffer *Messages* (*Mensajes*), donde se guardan esos mensajes.

Cada modo principal de Emacs normalmente redefine algunas teclas y realiza otros cambios en el funcionamiento de la edición. Ctrl-h m (C-h m, describe-mode) muestra la documentación sobre el modo principal actual, que normalmente describe los comandos y características que se cambian en este modo, y también sus enlaces de teclas.

Ctrl-h b (C-h b, describe-bindings) y Ctrl-h s (C-h s, describe-syntax) muestran otra información sobre el entorno actual dentro de Emacs. Ctrl-h b (C-h b) muestra una lista de todas las combinaciones de teclas vigentes: primero las combinaciones locales de los modos menores actuales, luego las combinaciones locales definidas por el modo mayor actual, y finalmente las combinaciones globales (ver Personalización de las combinaciones de teclas). Ctrl-h s (C-h s) muestra el contenido de la tabla de sintaxis, con explicaciones de la sintaxis de cada carácter (véase Tablas de sintaxis en el Manual de referencia de Emacs Lisp).

Puede obtener una lista de subcomandos para una tecla de prefijo en particular escribiendo Ctrl-h (C-h), ? (?), o F1 (F1, describe-prefix-bindings) después de la tecla de prefijo. (Hay algunas teclas de prefijo para las que no funcionan todas estas combinaciones, las que proporcionan sus propios enlaces para esa tecla. Una de estas teclas de prefijo es ESC (ESC), porque ESC Ctrl-h (ESC C-h) y ESC ? (ESC ?) son en realidad Ctrl-Alt-h (C-M-h, mark-defun) y Alt-? (M-? xref-find-references), respectivamente. Sin embargo, ESC F1 (ESC F1) funciona bien).

Finalmente, Alt-x describe-keymap (M-x describe-keymap) pide el nombre de un mapa de teclas, con finalización, y muestra un listado de todos los enlaces de teclas en ese mapa de teclas.

Archivos de ayuda

Aparte de la documentación y los manuales incorporados, Emacs contiene otros archivos que describen temas como las condiciones de copia, las notas de la versión, las instrucciones para depurar e informar de errores, etc. Puede usar los siguientes comandos para ver estos archivos. Aparte de Ctrl-h g (C-h g), todos tienen la forma Ctrl-h Ctrl-char (C-h C-char).

Ctrl-h Ctrl-c (C-h C-c)
Muestra las reglas bajo las cuales puedes copiar y redistribuir Emacs (describe-copying).
Ctrl-h Ctrl-d (C-h C-d)
Muestra la ayuda para depurar Emacs (view-emacs-debugging).
Ctrl-h Ctrl-e (C-h C-e)
Muestra información sobre dónde obtener paquetes externos (view-external-packages).
Ctrl-h Ctrl-f (C-h C-f)
Muestra la lista de preguntas frecuentes de Emacs (view-emacs-FAQ).
Ctrl-h g (C-h g)
Visitar la página con información sobre el Proyecto GNU (describe-gnu-project).
Ctrl-h Ctrl-m (C-h C-m)
Muestra información sobre cómo pedir copias impresas de los manuales de Emacs (view-order-manuals).
Ctrl-n Ctrl-n (C-h C-n)
Muestra las noticias, que enumeran las nuevas características de esta versión de Emacs (view-emacs-news).
Ctrl-n Ctrl-o (C-h C-o)
Muestra cómo pedir o descargar la última versión de Emacs y otro software GNU (describe-distribution).
Ctrl-h Ctrl-p (C-h C-p)
Muestra la lista de problemas conocidos de Emacs, a veces con soluciones sugeridas (view-emacs-problems).
Ctrl-h Ctrl-t (C-h C-t)
Muestra la lista de tareas de Emacs (view-emacs-todo).
Ctrl-h Ctrl-w (C-h C-w)
Muestra los detalles completos sobre la ausencia total de garantía para GNU Emacs (describe-no-warranty).

Ayuda sobre el texto activo y las Sugerencias de Herramientas (tooltips)

En Emacs, los tramos de texto activo (texto que hace algo especial en respuesta a los clics del ratón o RETURN (RET)) a menudo tienen texto de ayuda asociado. Esto incluye los hipervínculos en los buffers del Editor , así como partes de la línea de modo. En las pantallas gráficas, así como en algunos terminales de texto que soportan el seguimiento del ratón, al mover el ratón sobre el texto activo se muestra el texto de ayuda como un tooltip (información sobre herramientas). Véase Información sobre herramientas (Tooltips).

En los terminales que no soportan el seguimiento del ratón, puede mostrar el texto de ayuda para el texto del búfer activo en el punto escribiendo Ctrl-h (C-h display-local-help). Esto muestra el texto de ayuda en el área de eco. Para mostrar el texto de ayuda automáticamente siempre que esté disponible en el punto, establezca la variable help-at-pt-display-when-idle a t.



La marca y la región

Muchos comandos de Emacs operan sobre una parte contigua arbitraria del buffer actual. Para especificar el texto sobre el que opera un comando de este tipo, se coloca la marca en un extremo y se mueve el punto al otro extremo. El texto entre el punto y la marca se llama región. La región siempre se extiende entre el punto y la marca, independientemente de cuál de ellos se encuentre antes en el texto; cada vez que se mueve el punto, la región cambia.

Al colocar la marca en una posición del texto también se activa. Cuando la marca está activa, decimos también que la región está activa; Emacs indica su extensión resaltando el texto dentro de ella, usando la face de la región (ver Personalización de las caras).

Esta es una de las pocas caras (faces) que tiene el atributo :extend t por defecto, lo que implica que se usa la misma face para resaltar el texto y el espacio entre el final de línea y el borde de la ventana. Para resaltar sólo el texto se puede establecer este atributo como nil (nulo).

Después de ciertos comandos que no son de movimiento, incluyendo cualquier comando que cambie el texto en el buffer, Emacs desactiva automáticamente la marca; esto desactiva el resaltado. También puede desactivar explícitamente la marca en cualquier momento, escribiendo Ctrl-g (C-g) (ver Salir y Abortar).

El comportamiento predeterminado anterior se conoce como modo de marca transitoria. Desactivar el modo de marca transitoria cambia a Emacs a un comportamiento alternativo, en el que la región no suele estar resaltada. Véase Desactivar el modo de marca transitoria.

Establecer la marca en un búfer no tiene efecto sobre las marcas en otros búferes. Cuando vuelva a un búfer con una marca activa, la marca estará en el mismo lugar que antes. Cuando varias ventanas muestran el mismo búfer, pueden tener diferentes valores de punto y, por tanto, diferentes regiones, pero todas comparten una posición de marca común. Véase Ventanas múltiples. Normalmente, sólo la ventana seleccionada resalta su región; sin embargo, si la variable highlight-nonselected-windows es no nula, cada ventana resalta su propia región.

Existe otro tipo de región: la región rectangular. Véase Rectángulos.

Establecer la marca

A continuación se presentan algunos comandos para fijar la marca:

Ctrl-SPACE (C-SPC).
Fija la marca en el punto, y la activa (comando set-mark).
Ctrl-@ (C-@)
Lo mismo que el anterior.
Ctrl-x Ctrl-x (C-x C-x)
Establece la marca en el punto, y la activa; luego mueve el punto donde estaba la marca (exchange-point-and-mark).
Drag- (Arrastrar-ratón-1)
Establece el punto y la marca alrededor del texto que se arrastra.
(ratón-3)
Establece la marca en el punto, y luego mueve el punto donde se hace clic (mouse-save-then-kill).
Teclas de movimiento del cursor por desplazamiento
Establece la marca en el punto si la marca está inactiva, luego mueve el punto. Ver Selección por desplazamiento.

La forma más común de fijar la marca es con Ctrl-SPACE (C-SPC, set-mark-command) (5). Esto fija la marca donde está el punto, y la activa. A continuación, se puede alejar el punto, dejando la marca atrás.

Nota

(5) No existe un carácter Ctrlf-SPACE (C-SPC) en ASCII; normalmente, al teclear C-SPC en un terminal de texto se obtiene el carácter Ctrl-@ (C-@). Esta tecla también está vinculada a set-mark-command, por lo que, a menos que tenga la mala suerte de tener un terminal de texto que se comporte de forma diferente, puede pensar en Ctrl-@ (C-@) como Ctrl-SPACE (C-SP).

Por ejemplo, suponga que desea convertir parte del búfer en mayúsculas. Para ello, vaya a un extremo del texto deseado, escriba Ctrl-SPACE (C-SPC) y mueva el punto hasta que la porción de texto deseada quede resaltada. Ahora escriba Ctrl-x Ctrl-u (C-x C-u, upcase-region). Esto convierte el texto de la región en mayúsculas y desactiva la marca.

Siempre que la marca esté activa, puede desactivarla escribiendo Ctrl-g (C-g) véase Salir y Abortar. La mayoría de los comandos que operan en la región también desactivan automáticamente la marca, como Ctrl-x Ctrl-u (C-x C-u) en el ejemplo anterior. 5

En lugar de activar la marca para operar en una región, también puede usarla para recordar una posición en el buffer (escribiendo Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC)), y posteriormente saltar de nuevo allí (escribiendo Ctrl-u SPACE (C-u C-SPC)). Para más detalles, véase El anillo de marcas.

El comando Ctrl-x Ctrl-x (C-x C-x, exchange-point-and-mark) intercambia las posiciones del punto y la marca. C-x C-x es útil cuando está satisfecho con la posición del punto pero quiere mover el otro extremo de la región (donde está la marca). Usando C-x C-x una segunda vez, si es necesario, se coloca la marca en la nueva posición y el punto vuelve a su posición original. Normalmente, si la marca está inactiva, este comando reactiva primero la marca en el lugar donde se fijó por última vez, para garantizar que la región quede resaltada. Sin embargo, si lo llama con un argumento de prefijo, deja la marca inactiva y la región sin resaltar; puede usar esto para saltar a la marca de manera similar a Ctrl-u SPACE (C-u C-SPC).

También puede fijar la marca con el ratón. Si pulsa el botón izquierdo del ratón (ratón-1) y arrastra el ratón a través de un rango de texto, esto establece la marca en el lugar donde pulsó por primera vez el botón del ratón y pone el punto donde lo soltó. Alternativamente, al pulsar el botón derecho del ratón (, ratón-3) se establece la marca en el punto y luego se mueve el punto adonde hizo clic. Para una descripción más detallada de estos comandos del ratón, véase Comandos del ratón para editar.

Por último, puede fijar la marca manteniendo pulsada la tecla de mayúsculas mientras escribe ciertos comandos de movimiento del cursor (como (Shift-, S-DERECHA), Shift-Ctrl-f (S-C-f), Shift-Ctrl-n (S-C-n), etc.). Esto se llama selección por desplazamiento. Establece la marca en el punto antes de mover el punto, pero sólo si no hay una marca activa establecida a través de una selección de mayúsculas anterior o de comandos del ratón. La marca fijada por los comandos del ratón y por la selección de mayúsculas se comporta de forma ligeramente diferente a la marca habitual: cualquier comando posterior de movimiento del cursor sin mayúsculas la desactiva automáticamente. Para más detalles, consulte Selección por desplazamiento.

Muchos comandos que insertan texto, como Ctrl-y (C-y, yank), fijan la marca en el otro extremo del texto insertado, sin activarla. Esto le permite volver fácilmente a esa posición (véase El anillo de marcas). Puede saber que un comando hace esto cuando muestra ‘Mark set’ (Marca establecida) en el área de eco.

En X, cada vez que la cambia región activa, Emacs guarda el texto de la región en la selección primaria. Esto te permite insertar ese texto en otras aplicaciones X con 2 clics del ratón. Ver Operaciones de "cortar y pegar" en pantallas gráficas.

Comandos para marcar objetos textuales

Estos son los comandos para colocar el punto y la marca alrededor de un objeto textual, como una palabra, una lista, un párrafo o una página:

Alt-@ (M-@)
Coloca la marca al final de la siguiente palabra (mark-word). Esto no mueve el punto.
Ctrl-Alt-@ (C-M-@)
Establece la marca al final de la siguiente expresión equilibrada (mark-sexp). Esto no mueve el punto.
Alt-h (M-h)
Mueve el punto al principio del párrafo actual y pone la marca al final (mark-paragraph).
Ctrl-Alt-h (C-M-h)
Mueve el punto al principio del párrafo actual y pone la marca al final (mark-defun).
Ctrl-x Ctrl-p (C-x C-p)
Mueve el punto al principio de la página actual y pone la marca al final (mark-page).
Ctrl-x h (C-x h)
Mueve el punto al principio del buffer, y pone la marca al final (mark-whole-buffer).

M-@, mark-word coloca la marca al final de la siguiente palabra (ver Palabras, para información sobre las palabras). Las invocaciones repetidas de este comando amplían la región avanzando la marca una palabra cada vez. Como excepción, si la marca está activa y situada antes del punto, M-@ hace retroceder la marca desde su posición actual una palabra cada vez.

Este comando también acepta un argumento numérico n, que indica que la marca debe avanzar n palabras. Un argumento negativo -n hace que la marca retroceda n palabras.

Del mismo modo, Ctrl-Alt-@ (C-M-@, marca-sexp) coloca la marca al final de la siguiente expresión equilibrada (véase Expresiones con paréntesis equilibrados). Las invocaciones repetidas extienden la región a las expresiones subsiguientes, mientras que los argumentos numéricos positivos o negativos hacen avanzar o retroceder la marca el número de expresiones especificado.

Los otros comandos de la lista anterior establecen tanto el punto como la marca, para delimitar un objeto en la memoria intermedia. Alt-h (M-h, mark-paragraph) marca párrafos (ver Párrafos), Ctrl-Alt-h (C-M-h, mark-defun) marca definiciones de nivel superior (ver Definiciones de alto nivel, o Defuns), y Ctrl-x Ctrl-p (C-x C-p, mark-page) marca páginas (ver Páginas). Las invocaciones repetidas vuelven a desempeñar el mismo papel, extendiendo la región a objetos consecutivos; de forma similar, los argumentos numéricos especifican en cuántos objetos se debe mover la marca.

Ctrl-x h (C-x h, mark-whole-buffer) establece todo el buffer como región, poniendo el punto al principio y la marca al final.

Operar sobre la región

Una vez que tenga una región, estas son algunas de las formas en las que puede operar sobre ella:

Algunos comandos tienen un comportamiento por defecto cuando la marca está inactiva, pero operan en la región si la marca está activa. Por ejemplo,Alt-$ (M-$, ispell-word) normalmente comprueba la ortografía de la palabra en el punto, pero comprueba el texto de la región si la marca está activa (véase Comprobar y corregir la ortografía). Normalmente, estos comandos usan su comportamiento por defecto si la región está vacía (es decir, si la marca y el punto están en la misma posición). Si desea que operen en la región vacía, cambie la variable use-empty-active-region a t.

Como se ha descrito en Borrar texto, los comandos DEL (DEL, delete-forward-char) y Delete (delete-forward-char) también actúan de esta manera. Si la marca está activa, borran el texto de la región. (Como excepción, si proporciona un argumento numérico n, donde n no es uno, estos comandos borran n caracteres independientemente de si la marca está activa). Si cambia la variable delete-active-region a nil, estos comandos no actúan de forma diferente cuando la marca está activa. Si cambia el valor a kill, estos comandos matan la región en lugar de borrarla (véase Matar y mover texto).

Otros comandos siempre operan en la región, y no tienen un comportamiento predeterminado. Estos comandos suelen tener la palabra región en sus nombres, como Ctrl-w (C-w, kill-region) y Ctrl-x Ctrl-u (C-x C-u, upcase-region). Si la marca está inactiva, actúan sobre la región inactiva, es decir, sobre el texto situado entre el punto y la posición en la que se fijó la marca por última vez (véase El anillo de marcas). Para desactivar este comportamiento, cambie la variable mark-even-if-inactive a nil. Entonces estos comandos señalarán un error si la marca está inactiva.

Por defecto, la inserción de texto se produce con normalidad aunque la marca esté activa; por ejemplo, al escribir a se inserta el carácter ‘a’ y se desactiva la marca. El modo Delete Selection (Borrar Selección), un modo menor, modifica este comportamiento: si activa ese modo, la inserción de texto mientras la marca está activa hace que el texto de la región se borre primero. Para activar o desactivar el modo Delete Selection (Eliminar Selección), escriba Alt-x delete-selection-mode (M-x delete-selection-mode).

El anillo de marcas

Cada memoria intermedia recuerda las ubicaciones anteriores de la marca, en el anillo de marcas. Los comandos que fijan la marca también empujan la antigua marca a este anillo. Uno de los usos del anillo de marcas es recordar puntos a los que puede querer volver.

Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC)
Establece la marca, empujándola hacia el anillo de marcas, sin activarla.
Ctrl-u Ctrl-SPACE (C-u C-SPC)
Mover el punto a donde estaba la marca, y restaurar la marca desde el anillo de marcas anteriores.

El comando Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC) es útil cuando se desea usar la marca para recordar una posición a la que se desea volver. Empuja el punto actual al anillo de marcas, sin activar la marca (lo que haría que Emacs resaltara la región). En realidad se trata de dos invocaciones consecutivas de C-SPC (set-mark-command); la primera C-SPC establece la marca, y la segunda C-SPC la desactiva. (Cuando el modo de marca transitoria está desactivado, C-SPC C-SPC activa en cambio el modo de marca transitoria temporalmente; véase Desactivar el modo de marca transitoria).

Para volver a una posición marcada, utilice set-mark-command con un argumento de prefijo Ctrl-u Ctrl-SPACE (C-u C-SPC). Esto mueve el punto a donde estaba la marca, desactiva la marca si estaba activa. Cada C-u C-SPC posterior salta a una posición anterior almacenada en el anillo de marcas. Las posiciones por las que se desplaza de este modo no se pierden; van al final del anillo.

Si establece set-mark-command-repeat-pop en un valor no nulo, inmediatamente después de escribir Ctrl-u Ctrl-SPACE (C-u C-SPC), puede escribir Ctrl-SPACE (C-SPC) en lugar de Ctrl-u Ctrl-SPACE (C-u C-SPC) para recorrer el anillo de marcas. Por defecto, set-mark-command-repeat-pop es nulo.

Cada búfer tiene su propio anillo de marcas. Todos los comandos de edición usan el anillo de marcas del búfer actual. En particular, Ctrl-u Ctrl-SPACE (C-u C-SPC) siempre permanece en el mismo búfer.

La variable mark-ring-max especifica el número máximo de entradas a mantener en el anillo de marcas. El valor por defecto es de 16 entradas. Si existen tantas entradas y se empuja otra, se descarta la más antigua de la lista. Repitiendo C-u C-SPC se recorren las posiciones actualmente en el anillo.

Si desea volver al mismo lugar una y otra vez, el anillo de marcas puede no ser lo suficientemente conveniente. En ese caso, puede grabar la posición en un registro para recuperarla más tarde (véase Guardar posiciones en los registros).

El anillo de marcas global

Además del anillo de marcas ordinario que pertenece a cada búfer, Emacs tiene un único anillo de marcas global. Cada vez que se establece una marca, ésta se registra en el anillo de marcas global, además del anillo de marcas propio del búfer actual, si se ha cambiado de búfer desde la configuración de la marca anterior. Por lo tanto, el anillo de marcas global registra una secuencia de búferes en los que ha estado y, para cada búfer, un lugar en el que estableció la marca. La longitud del anillo de marcas global está controlada por global-mark-ring-max, y es 16 por defecto.

El comando Ctrl-x Ctrl-SPACE (C-x C-SPC, pop-global-mark) salta a la memoria intermedia y a la posición de la última entrada en el anillo global. También gira el anillo, de modo que los usos sucesivos de C-x C-SPC le llevan a búferes y posiciones de marca anteriores.

Selección por desplazamiento

Si mantiene pulsada la tecla de mayúsculas mientras escribe un comando de movimiento del cursor, esto establece la marca antes de mover el punto, de modo que la región se extiende desde la posición original del punto hasta su nueva posición. Esta función se denomina shift-selection (selección de mayúsculas). Es similar a la forma en que se selecciona el texto en otros editores.

La marca establecida a través de la selección de mayúsculas se comporta de forma un poco diferente a lo que hemos descrito anteriormente. En primer lugar, además de las formas habituales de desactivar la marca (como cambiar el texto de la memoria intermedia o escribir Ctrl-g (C-g)), la marca se desactiva con cualquier comando de movimiento del cursor sin desplazamiento. En segundo lugar, cualquier comando posterior de movimiento del cursor desplazado evita la activación de la marca de nuevo. Por lo tanto, una serie de comandos de movimiento del cursor desplazado ajustará continuamente la región.

La selección de mayúsculas sólo funciona si la tecla de movimiento del cursor desplazado no está ya vinculada a un comando independiente (véase Personalización). Por ejemplo, si vincula S-C-f a otro comando, al teclear Shift-Ctrl-f se ejecuta ese comando en lugar de realizar una versión con selección de mayúsculas de Ctrl-f (C-f, forward-char).

Una marca establecida a través de los comandos del ratón se comporta igual que una marca establecida a través de la selección de mayúsculas (véase Establecer la marca). Por ejemplo, si especifica una región arrastrando el ratón, puede seguir ampliando la región mediante comandos de movimiento del cursor desplazado. En cualquier caso, cualquier comando de movimiento del cursor sin desplazamiento desactiva la marca.

Para desactivar la selección por desplazamiento, establezca el modo de selección por desplazamiento como nulo. Al hacerlo, no se desactiva la fijación de la marca mediante comandos del ratón. Si establece shift-select-mode al valor permanente, las teclas de movimiento del cursor que no hayan sido desplazadas por shift no desactivarán la marca, por lo que, por ejemplo, la región establecida por los comandos anteriores puede ser ampliada por shift-selection, y las teclas de movimiento del cursor no desplazadas ampliarán la región establecida por shift-selection.

Desactivar el modo de marca transitoria

El comportamiento por defecto de la marca y la región, en el que al poner la marca se activa y se resalta la región, se denomina modo de marca transitoria (Transient Mark mode). Se trata de un modo menor que está activado por defecto. Puede activarse con Alt-xtransient-mark-mode (M-x transient-mark-mode), o con el elemento de menú ‘Highlight Active Region’ en el menú ‘Options’. Si se desactiva, Emacs pasa a un modo de funcionamiento alternativo:

  • Fijar la marca, con comandos como Ctrl-SPACE (C-SPC) o Ctrl-x Ctrl-x (C-x C-x), no resalta la región. Por lo tanto, no se puede saber con la mirada dónde se encuentra la marca; hay que recordarlo.

    La solución habitual a este problema es fijar la marca y usarla pronto, antes de que se olvide dónde está. También puede comprobar dónde está la marca usando Ctrl-x Ctrl-x (C-x C-x), que intercambia las posiciones del punto y de la marca (véase Establecer la marca).

  • Algunos comandos, que normalmente actúan sobre la región cuando la marca está activa, ya no lo hacen. Por ejemplo, normalmente Alt-% (M-%, query-replace) realiza sustituciones dentro de la región, si la marca está activa. Cuando el modo de marca transitoria está desactivado, siempre actúa desde el punto hasta el final de la memoria intermedia. Los comandos que actúan de este modo están identificados en su propia documentación.

Mientras el modo Marca transitoria está desactivado, puede activarlo temporalmente mediante Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC) o Ctrl-u Ctrl-x Ctrl-x (C-u C-x C-x).

Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC)
Coloca la marca en el punto (como C-SPC simple) y activa el modo de marca transitoria sólo una vez, hasta que la marca se desactive. (Esto no es realmente un comando separado; está usando el comando C-SPC dos veces).
Ctrl-u Ctrl-u Ctrl-x Ctrl-x (C-u C-x C-x)
Intercambia punto y marca, activa la marca y habilita el modo de marca transitoria temporalmente, hasta la siguiente desactivación de la marca. (Este es el comando C-x C-x, intercambia punto y marca, con un argumento de prefijo).

Estos comandos establecen o activan la marca, y habilitan el modo de marca transitoria sólo hasta que la marca se desactive. Una de las razones por las que puede querer usarlos es que algunos comandos operan en toda la memoria intermedia en lugar de en la región cuando el modo de marca transitoria está desactivado. La activación del modo de marca transitoria le permite usar estos comandos en la región.

Cuando se especifica una región con el ratón (véase Establecer la marca), o con la selección de mayúsculas (véase Selección por desplazamiento), también se activa temporalmente el modo Marca transitoria y se resalta la región.



Matar y Mover Texto

En Emacs, matar significa borrar el texto y copiarlo en el anillo de muertes. Desplazar (yanking) significa traer el texto del anillo de muertes de vuelta al buffer. (Algunas aplicaciones usan los términos "cortar" y "pegar" para operaciones similares). El anillo de muertes se llama así porque se puede visualizar como un conjunto de bloques de texto dispuestos en un anillo, al que se puede acceder en orden cíclico. Véase El anillo de muertes.

Killing y yanking (matar y desplazar) es la forma más común de mover o copiar texto dentro de Emacs. Es muy versátil, porque hay comandos para matar diferentes tipos de unidades sintácticas.

Borrar y matar

La mayoría de los comandos que borran el texto de la memoria intermedia lo guardan en el anillo de muertes (ver El anillo de muertes). Se conocen como comandos de eliminación o comandos de muerte (kill commands), y sus nombres normalmente contienen la palabra "kill" (por ejemplo, kill-line). el anillo de muertes almacena varias muertes recientes, no sólo la última, por lo que matar es una operación muy segura: no tiene que preocuparse mucho por perder el texto que ha matado previamente. El anillo de muertes es compartido por todos los búferes, por lo que el texto que se mata en un búfer puede ser arrastrado a otro búfer.

Cuando usa Ctrl-/ (C-/, undo) para deshacer un comando de eliminación (ver Deshacer), eso devuelve el texto eliminado al búfer, pero no lo elimina del anillo de eliminación.

En las pantallas gráficas, matar el texto también lo copia en el portapapeles del sistema. Véase Operaciones de "cortar y pegar" en pantallas gráficas.

Los comandos que borran el texto pero no lo guardan en el anillo de eliminación se conocen como comandos de borrado; sus nombres suelen contener la palabra ‘delete’ (borrar). Entre ellos se encuentran Ctrl-d (C-d, delete-char) y DEL ( DEL, delete-backward-char), que borran sólo un carácter a la vez, y aquellos comandos que borran sólo espacios o nuevas líneas. Los comandos que pueden borrar cantidades significativas de datos no triviales generalmente realizan una operación de eliminación.

También puede usar el ratón para matar y tirar (kill y yank). Vea las Operaciones de "cortar y pegar" en pantallas gráficas.

Borrado

Borrar significa borrar el texto y no guardarlo en el anillo de muertes. En su mayor parte, los comandos de Emacs que borran texto son los que borran sólo un carácter o sólo los espacios en blanco.

DEL (DEL)
BACKSPACE (BACKSPACE)
Borra el carácter anterior, o el texto de la región si está activa (delete-backward-char).
Delete
Borra el carácter siguiente, o el texto de la región si está activo (delete-forward-char).
Ctrl-d (C-d)
Borra el siguiente carácter (delete-char).
Alt-\ (M-\)
Elimina espacios y tabulaciones alrededor del punto (delete-horizontal-space).
Alt-SPACE (M-SPC)
Elimina espacios y tabulaciones alrededor del punto, dejando un espacio (just-one-space).
Ctrl-x Ctrl-o (C-x C-o)
Elimina las líneas en blanco alrededor de la línea actual (delete-blank-lines).
Alt-^ (M-^)
Une dos líneas borrando la nueva línea intermedia, junto con cualquier sangría que la siga (delete-indentation).

Ya hemos descrito los comandos básicos de borrado DEL (DEL, delete-backward-char), delete (delete-forward-char) y Ctrl-d (C-d, delete-char). Véase Borrar texto. Con un argumento numérico, borran el número de caracteres especificado. Si el argumento numérico se omite o es uno, (DEL) y delete borran todo el texto de la región si está activa (ver Operar sobre la región).

Los otros comandos de borrado son los que borran sólo los caracteres de espacio en blanco: espacios, tabulaciones y nuevas líneas. Alt-\ (M-\, delete-horizontal-space) borra todos los espacios y caracteres de tabulación antes y después del punto. Con un argumento de prefijo, sólo borra los espacios y tabuladores antes del punto. Alt-SPACE (M-SPC just-one-space) hace lo mismo pero deja un solo espacio antes del punto, sin importar el número de espacios que existían previamente (incluso si no había ninguno antes). Con un argumento numérico n, deja n espacios antes del punto si n es positivo; si n es negativo, elimina las nuevas líneas además de los espacios y los tabuladores, dejando -n espacios antes del punto. El comando cycle-spacing actúa como una versión más flexible de just-one-space. Hace cosas diferentes si se le llama repetidamente en sucesión. La primera llamada actúa como just-one-space, la siguiente elimina todos los espacios en blanco, y una tercera llamada restaura los espacios en blanco originales.

Ctrl-x Ctrl-o (C-x C-o, delete-blank-lines) elimina todas las líneas en blanco después de la línea actual. Si la línea actual está en blanco, elimina también todas las líneas en blanco que la preceden (dejando una línea en blanco, la actual). En una sola línea en blanco, borra esa línea.

Alt-^ (M-^, delete-indentation) une la línea actual y la anterior, borrando una nueva línea y todos los espacios que la rodean, dejando normalmente un único espacio. Véase M-^ (Sangría).

El comando delete-duplicate-lines busca en la región líneas idénticas, y elimina todas las copias de cada una de ellas excepto una. Normalmente mantiene la primera instancia de cada línea repetida, pero con un argumento de prefijo C-u mantiene la última. Con un argumento de prefijo C-u C-u, sólo busca líneas idénticas adyacentes. Este es un modo de operación más eficiente, útil cuando las líneas ya han sido ordenadas. Con un argumento de prefijo C-u C-u C-u, conserva las líneas en blanco repetidas.

Matar por líneas

Ctrl-k (C-k)
Mata el resto de la línea o una o más líneas (kill-line).
Ctrl-Shift-Backspace (C-S-Backspace)
Mata una línea entera de una vez (kill-whole-line)

El comando de eliminación más sencillo es Ctrl-k (C-k, kill-line). Si se usa al final de una línea, mata el carácter de nueva línea de final de línea, fusionando la siguiente línea con la actual (por lo tanto, se elimina por completo una línea en blanco). De lo contrario, C-k elimina todo el texto desde el punto hasta el final de la línea; si el punto estaba originalmente al principio de la línea, esto deja la línea en blanco.

Los espacios y los tabuladores al final de la línea se ignoran al decidir qué caso se aplica. Siempre que el punto esté después del último carácter que no sea un espacio en blanco en la línea, puede estar seguro de que C-k eliminará la nueva línea. Para eliminar una línea entera que no esté en blanco, vaya al principio y escriba C-k dos veces.

En este contexto, "línea" significa una línea de texto lógica, no una línea de pantalla (ver Líneas de Continuación).

Cuando a C-k se le da un argumento positivo n, elimina n líneas y las nuevas líneas que les siguen (el texto de la línea actual antes del punto no se elimina). Con un argumento negativo -n, elimina n líneas que preceden a la línea actual, junto con el texto de la línea actual antes del punto. C-k, con un argumento cero, elimina el texto anterior al punto en la línea actual.

Si la variable kill-whole-line no es nula, C-k al principio de una línea mata toda la línea incluyendo la siguiente nueva línea. Esta variable es normalmente nula.

Ctrl-Shift-Backspace (C-S-backspace, kill-whole-line) mata una línea entera incluyendo su nueva línea, sin importar la posición del punto dentro de la línea. Tenga en cuenta que muchos terminales de texto le impedirán escribir la secuencia de teclas (C-S-Backspace1).

Otros comandos de muerte

Ctrl-w (C-w)
Mata la región (kill-region).
Alt-w (M-w)
Copia la región en el anillo de muertes (kill-ring-save).
Alt-d (M-d)
Mata la siguiente palabra (kill-word). Ver Palabras.
Alt-DEL (M-DEL)
Mata una palabra hacia atrás (backward-kill-word).
Ctrl-x DEL (C-x DEL)
Mata al principio de la frase (backward-kill-sentence). Ver Frases.
Alt-k (M-k)
Mata hasta el final de la frase (kill-sentence).
Ctrl-Alt k (C-M-k)
Mata la siguiente expresión balanceada (kill-sexp). Ver Expresiones con paréntesis equilibrados.
Alt-z char (M-z char)
Mata hasta la siguiente ocurrencia de char (zap-to-char).
Alt-x zap-a-char char (M-x zap-a-char char)
Mata hasta, pero sin incluir, la siguiente ocurrencia de char.

Uno de los comandos de eliminación más usados es Ctrl-w (C-w, kill-region), que elimina el texto de la región (véase La marca y la región). Del mismo modo, Alt-w (M-w, kill-ring-save) copia el texto de la región en el anillo de eliminación sin eliminarlo de la memoria intermedia. Si la marca está inactiva cuando escribe Ctrl-w (C-w) o Alt-w (M-w), el comando actúa sobre el texto entre el punto y donde puso la marca por última vez (ver Operar sobre la región).

Emacs también proporciona comandos para eliminar unidades sintácticas específicas: palabras, con Alt-DEL (M-DEL) y Alt-d (M-d) (ver Palabras); expresiones equilibradas, con Ctrl-Alt-k (C-M-k) (ver Expresiones con paréntesis equilibrados); y frases, con Ctrl-x DEL (C-x DEL) y Alt-k (M-k) (ver Frases).

El comando Alt-z zap-to-char (M-z, zap-to-char) combina matar con buscar: lee un carácter y mata desde el punto hasta (e incluyendo) la siguiente ocurrencia de ese carácter en el buffer. Un argumento numérico actúa como una cuenta de repetición; un argumento negativo significa buscar hacia atrás y matar el texto antes del punto. Se mantiene un historial de los caracteres usados anteriormente, al que se puede acceder mediante las teclas Alt-p / Alt-n (M-p/M-n). Esto es útil sobre todo si el carácter que se va a usar tiene que ser introducido mediante un método de entrada complicado. Un comando similar, zap-up-to-char, mata desde el punto hasta, pero sin incluir, la siguiente aparición de un carácter, con un argumento numérico que actúa como cuenta de repetición.

Opciones de eliminación

Algunos búferes especializados contienen texto de sólo lectura, que no puede ser modificado y por lo tanto no puede ser matado. Los comandos de matar funcionan de forma especial en un búfer de sólo lectura: se mueven sobre el texto y lo copian al anillo de matar, sin borrarlo realmente del búfer. Normalmente, también emiten un pitido y muestran un mensaje de error cuando esto ocurre. Pero si establece la variable kill-read-only-ok a un valor no nulo, sólo imprimen un mensaje en el área de eco para explicar por qué el texto no ha sido borrado.

Antes de guardar lo que se ha matado en el anillo de muertes, puede transformar la cadena usando kill-transform-function. Se llama con la cadena que se va a matar, y debería devolver la cadena que se quiere guardar. También puede devolver nil, en cuyo caso la cadena no se guardará en el anillo de muertes. Por ejemplo, si no quiere guardar nunca una cadena en blanco en el anillo de muertes, puede configurarlo con la siguiente función:

(setq kill-transform-function
      (lambda (string)
        (and (not (string-blank-p string))
             string)))

Si cambia la variable kill-do-not-save-duplicates a un valor que no sea nulo, los subsiguientes idénticos que se hayan matado producen una única entrada en el anillo de la muerte (sin duplicación).

Yanking

El yanking es la reinserción de un texto previamente eliminado. La forma habitual de mover o copiar un texto es matarlo y luego arrastrarlo a otro lugar.

Ctrl-y (C-y)
Reintroduce el último texto eliminado en el búfer, en el punto (yank).
Alt-y (M-y)
Reemplaza el texto que acaba de ser eliminado por un lote anterior de texto eliminado (yank-pop), o permite seleccionar de la lista de lotes de texto eliminados previamente. Vea Tirar de muertes anteriores.
Ctrl-Alt-w (C-M-w)
Hace que el siguiente comando, si es un comando de eliminación, se añada a la eliminación anterior (append-next-kill). Ver Añadir muertes.

El comando básico de yanking es Ctrl-y (C-y, yank). Inserta la muerte más reciente, dejando el cursor al final del texto insertado. También fija la marca al principio del texto insertado, sin activar la marca; esto le permite saltar fácilmente a esa posición, si lo desea, con Ctrl-u Ctrl-SPACE (C-u C-SPC) (véase El anillo de marcas).

Con un argumento de prefijo simple (Ctrl-u Ctrl-y, C-u C-y), el comando deja el cursor delante del texto insertado y fija la marca al final. El uso de cualquier otro argumento de prefijo especifica una marca anterior; por ejemplo, Ctrl-u 4 Ctrl-y (C-u 4 C-y) reinserta la cuarta marca más reciente. Vea la sección de eliminación de textos anteriores.

En las pantallas gráficas y en las pantallas en modo texto, Ctrl-y (C-y) primero comprueba si otra aplicación ha colocado algún texto en el portapapeles del sistema más recientemente que la última eliminación de Emacs. Si es así, inserta el texto del portapapeles en su lugar. Así, el Editor trata efectivamente las operaciones de "cortar" o "copiar" del portapapeles realizadas en otras aplicaciones como kills de Emacs, excepto que no se registran en el anillo de kill. Para más detalles vea Operaciones de "cortar y pegar" en pantallas gráficas .

El anillo de muertes

El anillo de eliminación o anillo de muertes es una lista de bloques de texto que fueron eliminados previamente. Sólo hay un anillo de muerte, compartido por todos los búferes, por lo que puede matar o eliminar texto en un búfer y pegarlo en otro. Esta es la forma habitual de mover el texto de un búfer a otro. (Hay otros métodos: por ejemplo, puede almacenar el texto en un registro; vea Registros y Acumular texto, para algunas otras formas de mover el texto).

El número máximo de entradas en el anillo de muertes es controlado por la variable kill-ring-max. El valor por defecto es 60. Si haces un nuevo kill cuando se ha alcanzado este límite, Emacs hace espacio borrando la entrada más antigua del kill ring.

El contenido real del anillo de muertes se almacena en una variable llamada kill-ring; puede ver todo el contenido del anillo de muertes con Ctrl-h v kill-ring (C-h v kill-ring).

16

Tirar de muertes anteriores

Como se explica en "Yanking", se puede usar un argumento numérico para Ctrl-y (C-y) para tirar del texto que ya no es la muerte más reciente. Esto es útil si recuerda la entrada del anillo de muertes que quiere. Si no lo recuerda, puede usar el comando Alt-y yank-pop (M-y, yank-pop) para recorrer las posibilidades o para seleccionar uno de las muertes anteriores.

Si el comando anterior era un comando de extracción, Alt-y (M-y) toma el texto que fue extraído y lo reemplaza con el texto de una muerte anterior. Por lo tanto, para recuperar el texto de la penúltima muerte, primero hay que usar Ctrl-y (C-y) para tirar de la última muerte, y luego usar Alt y (M-y) para reemplazarla con la muerte anterior. Esto funciona sólo después de un Ctrl-y (C-y) u otro Alt-y M-y. (Si M-y se invoca después de algún otro comando, funciona de manera diferente, ver más abajo).

Puede entender este modo de funcionamiento de Alt-y (M-y) en términos de un puntero del último yank que apunta a una entrada en el anillo de muertes. Cada vez que se mata, el puntero del último yank se mueve a la entrada recién hecha en la parte delantera del anillo. Ctrl-y (C-y) arranca la entrada a la que apunta el puntero del último yank. Alt-y (M-y) después de un Ctrl-y (C-y) u otro Alt (M-y) mueve el puntero del último yank a la entrada anterior, y el texto en el buffer cambia para coincidir. Un número suficiente de comandos M-y, uno tras otro, puede mover el puntero a cualquier entrada en el anillo, por lo que se puede obtener cualquier entrada en el buffer. Finalmente, el puntero llega al final del anillo; el siguiente Alt-y (M-y) vuelve a la primera entrada.

Alt-y (M-y) mueve el puntero de la última entrada alrededor del anillo, pero no cambia el orden de las entradas en el anillo, que siempre va desde la muerte más reciente al frente hasta la más antigua que aún se recuerde.

Cuando se usa después de Ctrl-y (C-y) o Alt-y (M-y), Alt-y (M-y) puede tomar un argumento numérico, que le indica en cuántas entradas debe avanzar el puntero de última muerte. Un argumento negativo mueve el puntero hacia el frente del anillo; desde el frente del anillo, se mueve alrededor de la última entrada y continúa hacia adelante desde allí.

Una vez que el texto que busca es llevado al buffer, puede dejar de hacer los comandos Alt-y (M-y) y el último texto jalado permanecerá allí. Es sólo una copia de la entrada del anillo de muertes, así que editarlo en el buffer no cambia lo que hay en el anillo. Mientras no se haga una nueva muerte, el puntero del último yank permanece en el mismo lugar del anillo de muertes, por lo que repetir Ctrl-y (C-y) tirará otra copia de la misma muerte anterior.

Cuando se llama a Ctrl-y (C-y) con un argumento numérico, también se establece el puntero de la última vez que tiró (last-yank) en la entrada que se tiró.

También puede invocar Alt-y (M-y) después de un comando que no sea un comando yank. En ese caso, Alt-y (M-y) le pregunta en el minibuffer por una de las muertes anteriores. Puede usar los comandos del historial del minibuffer (ver Historial del minibuffer) para navegar o buscar entre las entradas del anillo de muertes hasta que encuentre la que quiere reinsertar. O puede usar los comandos de finalización (ver Completado) para completar una entrada de la lista de entradas del anillo de muertes o hacer aparecer el buffer de *Completions* con las entradas candidatas entre las que puede elegir. Después de seleccionar la entrada del anillo de muerte, puede editarla opcionalmente en el minibuffer. Por último, escriba RETURN (RET) para salir del minibuffer e insertar el texto de la entrada de anillo de muerte seleccionada. Al igual que en el caso de Alt-y (M-y) después de otro comando de extracción, el puntero de la última extracción queda apuntando al texto que acabas de extraer, ya sea una de las muertes anteriores o una entrada del anillo de muertes que hayas editado antes de insertarlo. (En este último caso, la entrada editada se añade al principio del anillo de muertes). Por lo tanto, también en este caso, al teclear Ctrl-y se extrae otra copia del texto que se acaba de insertar.

Cuando se invoca con un argumento de prefijo simple (Ctrl-u Alt-y, C-u M-y) después de un comando que no es un comando de borrado, Alt-y (M-y) deja el cursor delante del texto insertado, y pone la marca al final, como hace Ctrl-y (C-y).

Añadir muertes

Normalmente, cada orden de matar empuja una nueva entrada en el anillo de muertes. Sin embargo, dos o más órdenes de eliminación seguidas combinan su texto en una sola entrada, de modo que un solo Ctrl-y (C-y) arranca todo el texto como una unidad, tal y como estaba antes de ser eliminado.

Por lo tanto, si quiere arrancar el texto como una unidad, no necesita matarlo todo con un solo comando; puede seguir matando línea tras línea, o palabra tras palabra, hasta que lo haya matado todo, y todavía puede recuperarlo todo de una vez.

Los comandos que matan hacia delante desde el punto se añaden al final del texto matado anteriormente. Los comandos que matan hacia atrás desde el punto añaden el texto al principio. De este modo, cualquier secuencia de comandos de eliminación mixtos hacia delante y hacia atrás pone todo el texto eliminado en una sola entrada sin necesidad de reorganizarlo. Los argumentos numéricos no rompen la secuencia de eliminación de texto. Por ejemplo, supongamos que el buffer contiene este texto:

Esta es una línea ∗de texto de muestra.

con el punto mostrado por . Si escribe Alt-d Alt-DEL Alt-d Alt-DEL (M-d M-DEL M-d M-DEL), matando alternativamente hacia adelante y hacia atrás, terminará con ‘una línea de muestra’ como una entrada en el anillo de muertes, y ‘Esta es de texto.’ en el buffer. (Observe el doble espacio entre ‘es’ y ‘texto’, que puede limpiar con Alt-SPACE (M-SPC) o Alt-q (M-q)).

Otra forma de matar el mismo texto es retroceder dos palabras con Alt-b Alt-b (M-b M-b y luego matar las cuatro palabras hacia adelante con Ctrl-u Alt-d (C-u M-d). Esto produce exactamente los mismos resultados en el búfer y en el anillo de eliminación. Alt-f Ctrl-u Alt-DEL (M-f M-f C-u M-DEL) mata el mismo texto, todo hacia atrás; una vez más, el resultado es el mismo. El texto en la entrada del anillo de muertes siempre tiene el mismo orden que tenía en el buffer antes de que lo matara.

Si una orden de matar está separada de la última orden de matar por otras órdenes (no sólo argumentos numéricos), se inicia una nueva entrada en el anillo de muertes. Pero puede forzarlo a combinarse con el último texto matado, escribiendo Ctrl-Alt-w (C-M-w, append-next-kill) justo antes. Ctrl-Alt-w (C-M-w) le dice a su comando siguiente, si es un comando de muerte, que trate la muerte como parte de la secuencia de muertes anteriores. Como es habitual, la muerte se añade al texto matado anteriormente si el comando mata hacia delante, y se antepone si el comando mata hacia atrás. De este modo, puede matar varios trozos de texto separados y acumularlos para que sean devueltos en un solo lugar.

Un comando de matar que sigue a Alt-w (M-w, kill-ring-save) no se añade al texto que Alt-w (M-w) copió en el anillo de matar.

Operaciones de "cortar y pegar" en pantallas gráficas

En la mayoría de los entornos gráficos de escritorio, se pueden transferir datos (normalmente texto) entre diferentes aplicaciones usando una función del sistema llamada portapapeles. En X, hay otras dos facilidades similares: la selección primaria y la selección secundaria. Cuando Emacs se ejecuta en una pantalla gráfica, sus comandos kill y yank se integran con estas facilidades, de modo que puede transferir fácilmente texto entre Emacs y otras aplicaciones gráficas.

Por defecto, Emacs usa UTF-8 como sistema de codificación para las transferencias de texto entre programas. Si encuentra que el texto pegado no es lo que esperaba, puede especificar otro sistema de codificación escribiendo Ctrl-x RETURN x (C-x RET x) o Ctrl-x RETURN X (C-x RET X). También puede solicitar un tipo de datos diferente personalizando x-select-request-type. Véase Sistemas de codificación para la comunicación entre procesos.

Uso del portapapeles

El portapapeles es la herramienta que la mayoría de las aplicaciones gráficas usan para "cortar y pegar". Cuando el portapapeles existe, los comandos kill y yank de Emacs hacen uso de él.

Cuando mata algún texto con un comando como Ctrl-w (C-w, kill-region), o lo copia en el anillo de muertes con un comando como Alt-w (M-w, kill-ring-save), ese texto también se pone en el portapapeles.

Cuando un comando kill de Emacs pone texto en el portapapeles, el contenido existente del portapapeles normalmente se pierde. Opcionalmente, el Editor puede guardar el contenido existente del portapapeles en el anillo de muertes, evitando que se pierdan los datos antiguos del portapapeles. Si save-interprogram-paste-before-kill cambia a un número, entonces estos datos se copian si son más pequeños (en caracteres) que este número. Si esta variable es cualquier otro valor que no sea nulo, siempre se copiará, con el riesgo de un alto consumo de memoria si esos datos resultan ser grandes.

Los comandos que tiran texto desde el anillo de muertes, como Ctrl-y (C-y, yank) también usan el portapapeles. Si otra aplicación es "dueña" del portapapeles, es decir, si cortó o copió texto allí más recientemente que su último comando de muerte, entonces Emacs toma del portapapeles en lugar del anillo de muertes..

Normalmente, girar el anillo de muertes con Alt-y (M-y, yank-pop) no altera el portapapeles. Sin embargo, si cambia yank-pop-change-selection a t, entonces Alt-y (M-y) guarda el nuevo yank en el portapapeles.

Para evitar que los comandos kill y yank accedan al portapapeles, cambie la variable select-enable-clipboard a nil.

Muchos entornos de escritorio X soportan una característica llamada gestor del portapapeles. Si sale de Emacs mientras es el actual "propietario" de los datos del portapapeles, y hay un gestor de portapapeles en ejecución, el Editor transfiere los datos del portapapeles al gestor de portapapeles para que no se pierdan. En algunas circunstancias, esto puede causar un retraso al salir del programa; si quiere evitar que Emacs transfiera los datos al gestor del portapapeles, cambia la variable x-select-enable-clipboard-manager a nil.

Dado que las cadenas que contienen bytes NUL suelen truncarse al pasar por el portapapeles, Emacs sustituye dichos caracteres por "\0" antes de transferirlos al portapapeles del sistema.

Antes de Emacs 24, los comandos kill y yank usaban la selección primaria (ver Cortar y pegar con otras aplicaciones de ventana), no el portapapeles. Si prefiere este comportamiento, cambie:

  • select-enable-clipboard a nil.
  • select-enable-primary a t.
  • mouse-drag-copy-region a t.

En este caso, puede usar los siguientes comandos para actuar explícitamente en el portapapeles:

  • clipboard-kill-region mata la región y la guarda en el portapapeles
  • clipboard-kill-ring-save copia la región al anillo de muertes y la guarda en el portapapeles.
  • clipboard-yank arranca el contenido del portapapeles en un punto.

Cortar y pegar con otras aplicaciones de ventana

En el sistema X Window, existe una selección primaria que contiene el último tramo de texto seleccionado en una aplicación X (normalmente arrastrando el ratón). Usualmente, este texto se puede insertar en otras aplicaciones X mediante un clic de (ratón-2). La selección primaria está separada del portapapeles. Su contenido es más frágil; se sobrescribe cada vez que se selecciona texto con el ratón, mientras que el portapapeles sólo se sobrescribe mediante comandos explícitos de cortar o copiar.

En X, siempre que la región esté activa (véase La marca y la región), el texto de la región se guarda en la selección primaria. Esto se aplica independientemente de si la región se hizo arrastrando o haciendo clic con el ratón (véase Comandos del ratón para editar), o mediante comandos del teclado (por ejemplo, escribiendo Ctrl-SPACE (C-SPC) y moviendo el punto; véase Establecer la marca).

Si cambia la variable select-active-regions a only, Emacs sólo guarda las regiones temporalmente activas en la selección primaria, es decir, las que se hacen con el ratón o con selección de mayúscuas (ver Selección por desplazamiento). Si cambia select-active-regions a nil, Emacs evita guardar las regiones activas en la selección primaria por completo.

Para insertar la selección primaria en un búfer de Emacs, haga clic con (mouse-2, mouse-yank-primary) donde quiera insertarla. Véase Comandos del ratón para editar. También puede usar el comando normal de Emacs: yank (Ctrl-y, C-y) para insertar este texto si select-enable-primary está configurado (ver Uso del portapapeles).

MS-Windows no proporciona selección primaria, pero Emacs la emula dentro de una sola sesión-Emacs almacenando el texto seleccionado internamente. Por lo tanto, todas las características y comandos relacionados con la selección primaria funcionan en Windows como lo hacen en X, para cortar y pegar dentro de la misma sesión, pero no entre sesiones del Editor o con otras aplicaciones.

Selección secundaria

Además de la selección primaria, el sistema X Window proporciona una segunda facilidad similar conocida como selección secundaria. Hoy en día, pocas aplicaciones X hacen uso de la selección secundaria, pero puede acceder a ella usando los siguientes comandos-Emacs:

Alt-Arrastrar- (M-Arrastrar-mouse-1)
Establece la selección secundaria, con un extremo en el lugar donde se presiona el botón, y el otro extremo en el lugar donde se suelta (mouse-set-secondary). El texto seleccionado se resalta, usando la cara de selección secundaria, a medida que se arrastra. La ventana se desplaza automáticamente si arrastra el ratón fuera de la parte superior o inferior de la ventana, al igual que mouse-set-region (ver Comandos del ratón para editar).

Este comando no altera el anillo de muertes.
Alt- (M-ratón-1)
Establece un extremo para la selección secundaria (mouse-start-secondary); use Alt- (M-ratón-3) para establecer el otro extremo y completar la selección. Este comando cancela cualquier selección secundaria existente, cuando inicia una nueva.
Alt- (M-ratón-3)
Establece la selección secundaria (mouse-start-secondary), con un extremo en la posición en la que haga Alt- (M-ratón-3), y el otro en la posición especificada previamente con Alt- (M-ratón-1). Esto también pone el texto seleccionado en el anillo de muertes. Un segundo Alt- (M-ratón-3) en el mismo lugar mata el texto seleccionado por la selección secundaria que se acaba de hacer.
Alt- (M-ratón-2)
Inserta la selección secundaria en el lugar donde se hace el clic, colocando el punto al final del texto arrancado (M-mouse-yank-secondary).

El doble o triple clic de Alt- (M-ratón-1) opera sobre las palabras y las líneas, de forma similar a doble/triple clic con (Mouse-1).

Si mouse-yank-at-point no es nulo, Alt- (M-ratón-2) arranca en el punto. Entonces no importa exactamente dónde se haga clic, o incluso en cuál de las ventanas del marco se hace clic. Ver Comandos del ratón para editar.

Acumular texto

Normalmente copiamos o movemos el texto matándolo y tirando de él (kill y yank), pero hay otros métodos convenientes para copiar un bloque de texto en muchos lugares, o para copiar muchos bloques de texto dispersos en un solo lugar. Aquí describimos los comandos para acumular trozos de texto dispersos en un búfer o en un archivo.

Alt-x append-to-buffer (M-x append-to-buffer)
Añade una región al contenido de un búfer especificado.
Alt-x preprend-to-buffer (M-x prepend-to-buffer)
Añade una región al contenido de una memoria intermedia especificada.
Alt-x copy-to-buffer (M-x copy-to-buffer)
Copiar una región en un búfer especificado, eliminando el contenido antiguo de ese búfer.
Alt-x insert-buffer (M-x insert-buffer)
Inserta el contenido de un búfer especificado en el búfer actual en un punto.
Alt-x append-to-file (M-x append-to-file)
Añade una región al contenido de un archivo especificado, al final.

Para acumular texto en un búfer, use Alt-x append-to-buffer (M-x append-to-buffer). Esto lee un nombre de búfer, y luego inserta una copia de la región en el búfer especificado. Si especifica un búfer inexistente, append-to-buffer crea el búfer. El texto se inserta en cualquier punto de ese búfer. Si ha estado usando el búfer para editar, el texto copiado va al centro del texto del búfer, empezando por donde esté el punto en ese momento.

El punto en ese búfer queda al final del texto copiado, de modo que los sucesivos usos de append-to-buffer acumulan el texto en el búfer especificado en el mismo orden en que fueron copiados. Estrictamente hablando, append-to-buffer no siempre agrega al texto que ya está en el buffer, sólo lo agrega si el punto en ese buffer está al final. Sin embargo, si append-to-buffer es el único comando que usa para alterar un buffer, entonces el punto siempre está al final.

Alt-x prepend-to-buffer (M-x prepend-to-buffer) es igual que append-to-buffer excepto que el punto en el otro buffer se deja antes del texto copiado, por lo que los usos sucesivos de este comando añaden texto en orden inverso. Alt-x copy-to-buffer (M-x copy-to-buffer) es similar, excepto que cualquier texto existente en el otro buffer se elimina, por lo que el buffer queda conteniendo sólo el texto recién copiado en él.

El comando Ctrl-x xi (C-x x i, insert-buffer) puede usarse para recuperar el texto acumulado en otro buffer. Esto pide el nombre de un búfer, e inserta una copia de todo el texto de ese búfer en el búfer actual en el punto, dejando el punto al principio del texto insertado. También añade la posición 20 del final del texto insertado al anillo de marca, sin activar la marca. Para más información sobre las memorias intermedias, consulte Usando Multiples Buffers.

En lugar de acumular texto en una memoria intermedia (en un buffer), puede añadir texto directamente a un archivo con Alt-x append-to-file (M-x append-to-file). Esto solicita un nombre de archivo y añade el texto de la región al final del archivo especificado. El archivo se modifica inmediatamente en el disco.

Debería usar append-to-file sólo con archivos que no estén siendo visitados por el Editor. Usar este comando en un archivo que no está siendo editado por GNU/Emacs cambiaría el archivo a espaldas del mismo, lo que puede llevar a perder parte de su edición.

Otra forma de mover el texto es almacenarlo en un registro. Ver Registros.

Rectángulos

Los comandos de rectángulo operan en áreas rectangulares del texto: todos los caracteres entre un cierto par de columnas, en un cierto rango de líneas. Emacs tiene comandos para matar rectángulos, arrancar rectángulos muertos, borrarlos, rellenarlos con espacios en blanco o texto, o borrarlos. Los comandos de rectángulo son útiles con texto en formatos de varias columnas, y para cambiar el texto dentro o fuera de tales formatos.

Para especificar un rectángulo y que un comando trabaje en él, ponga la marca en una esquina y apunte a la esquina opuesta. El rectángulo así especificado se llama región rectangular. Si el punto y la marca están en la misma columna, la región rectangular está vacía. Si están en la misma línea, la región rectangular tiene una altura de una línea.

La región rectangular se controla de la misma manera que la región. Pero recuerde que una determinada combinación de valores de punto y marca puede interpretarse como una región o como un rectángulo, dependiendo del comando que los use.

Una región rectangular también puede marcarse con el ratón: haga Ctrl- (C-Mouse-1) y arrastre desde una esquina del rectángulo a la opuesta.

Ctrl-x rk (C-x r k)
Mata el texto de la región rectangular, guardando su contenido como el último rectángulo matado (kill-rectangle).
Ctrl-x r Alt-w (C-x r M-w)
Guarda el texto del región rectangular como el último rectángulo matado (copy-rectangle-as-kill).
Ctrl-x rd (C-x r d)
Borrar el texto del región rectangular (delete-rectangle).
Ctrl-x r y (C-x r y)
Tirar el último rectángulo matado con su esquina superior izquierda en el punto (yank-rectangle).
Ctrl-x ro (C-x r o)
Inserta un espacio en blanco para rellenar el espacio de la región rectangular (open-rectangle). Esto empuja el contenido anterior de la región rectangular hacia la derecha.
Ctrl-x r N (C-x r N)
Inserta números de línea a lo largo del borde izquierdo de la región rectangular (rectangle-numbers-lines). Esto empuja el contenido anterior de la región rectangular hacia la derecha.
Ctrl-x rc (C-x r c)
Borra la región rectangular sustituyendo todo su contenido por espacios (clear-rectangle).
Alt-x delete-whitespace-rectangle (M-x delete-whitespace-rectangle)
Borra los espacios en blanco en cada una de las líneas del rectángulo especificado, empezando por la columna del borde izquierdo del rectángulo.
Ctrl-x rt cadena RETURN (C-x r t cadena RET)
Reemplaza el contenido del rectángulo con una cadena en cada línea (string-rectangle).
Alt-x string-insert-rectangle RETURN cadena RETURN
(M-x string-insert-rectangle RET cadena RET)
Inserta una cadena en cada línea del rectángulo.
Ctrl-x SPACE (C-x SPC)
Alterna el modo de marca del rectángulo (rectangle-mark-mode). Cuando este modo está activo, la región rectangular se resalta y puede encoger/crecer, y los comandos estándar kill y yank operan sobre ella.

Las operaciones con rectángulos se dividen en dos clases: comandos para borrar o insertar rectángulos, y comandos para hacer rectángulos en blanco.

Hay dos maneras de borrar el texto de un rectángulo:

  • Ctrl-x rd (C-x r d, delete-rectangle) para borrar el texto directamente.
  • Ctrl-x rk (C-x r k, kill-rectangle) para eliminar el texto y guardarlo como el último rectángulo matado.

En ambos casos, borrar la región rectangular es como borrar el texto especificado en cada línea del rectángulo; si hay algún texto siguiente en la línea, se mueve hacia atrás para rellenar el hueco.

Matar un rectángulo no es matar en el sentido habitual; el rectángulo no se almacena en el anillo de muertes, sino en un lugar especial que sólo registra el último rectángulo matado. Esto se debe a que tirar un rectángulo es tan diferente de tirar un texto lineal que hay que usar diferentes comandos para tirar de ellos. No se ha definido la función de "yank-popping" para los rectángulos.

Ctrl-x r Alt-w (C-x r M-w, copy-rectangle-as-kill) es el equivalente a Alt-w (M-w) para rectángulos: registra el rectángulo como el último rectángulo eliminado, sin borrar el texto del buffer.

Para borrar el último rectángulo eliminado, escriba Ctrl-x ry (C-x r y, yank-rectangle). La primera línea del rectángulo se inserta en el punto, la segunda línea del rectángulo se inserta en la misma posición horizontal una línea por debajo, y así sucesivamente. El número de líneas afectadas está determinado por la altura del rectángulo guardado.

Por ejemplo, puede convertir dos listas de una columna en una lista de dos columnas matando una de las listas de una columna como un rectángulo, y luego tirándolo al lado de la otra lista.

También puede copiar rectángulos dentro y fuera de los registros con Ctrl-x rrr (C-x r r r) y Ctrl--x r i r (C-x r i r). Consulte Guardar rectángulos en los registros.

Hay dos comandos que puede usar para hacer rectángulos en blanco: Ctrl-x rrc (C-x r c, clear-rectangle) borra el texto existente en la región rectangular, y Ctrl-x ro (C-x r o, open-rectangle) inserta un rectángulo en blanco.

Alt-x delete-whitespace-rectangle (M-x delete-whitespace-rectangle) elimina los espacios en blanco horizontales a partir de una columna determinada. Esto se aplica a cada una de las líneas del rectángulo, y la columna está especificada por el borde izquierdo del rectángulo. El borde derecho del rectángulo no supone ninguna diferencia para este comando.

El comando Ctrl-x rN (C-x r N, rectangle-number-lines) inserta números de línea a lo largo del borde izquierdo de la región rectangular. Normalmente, la numeración comienza a partir de 1 (para la primera línea del rectángulo). Con un argumento de prefijo, el comando pide un número a partir del cual empezar, y una cadena de formato con la que imprimir los números (ver Formateo de cadenas en el manual de referencia de Emacs Lisp).

El comando Ctrl-x rt (C-x r t, string-rectangle) reemplaza el contenido de una región rectangular con una cadena en cada línea. La anchura de la cadena no tiene por qué ser la misma que la del rectángulo. Si el ancho de la cadena es menor, el texto después del rectángulo se desplaza a la izquierda; si la cadena es más ancha que el rectángulo, el texto después del rectángulo se desplaza a la derecha.

El comando Alt-x string-insert-rectangle (M-x string-insert-rectangle) es similar a string-rectangle, pero inserta la cadena en cada línea, desplazando el texto original a la derecha.

El comando Ctrl-x SPACE (C-x SPC, rectangle-mark-mode) cambia si se resalta la región rectangular o la región estándar (activando primero la región si es necesario). Cuando este modo está activado, los comandos que redimensionan la región (Ctrl-f (C-f), Ctrl-n (C-n), etc.) lo hacen de forma rectangular, y tanto matar como tirar operan sobre el rectángulo. Véase Matar y Mover Texto. El modo persiste sólo mientras la región está activa.

El rectángulo de la región sólo funciona cuando la marca está activa. En particular, cuando el modo de marca transitoria está desactivado (véase Desactivar el modo de marca transitoria), además de escribir Ctrl-x SPACE (C-x SPC) tendrá que activar la marca.

A diferencia de la región estándar, la región rectangular puede tener sus esquinas extendidas más allá del final del búfer, o dentro de tramos de espacio en blanco en los que el punto normalmente no puede entrar, como en medio de un carácter TAB.

Cuando la región está activa (véase La marca y la región) y en el modo rectangle-mark-mode, Ctrl-x Ctrl-x (C-x C-x) ejecuta el comando rectangle-exchange-point-and-mark, que hace un ciclo entre las cuatro esquinas del región rectangular. Esto resulta útil si quiere modificar las dimensiones de dicha región antes de invocar una operación sobre el texto marcado.

Enlaces CUA

El comando Alt-x cua-mode (M-x cua-mode) configura los enlaces de las teclas que son compatibles con el sistema de Acceso Común de Usuario (CUA) usado en muchas otras aplicaciones.

Cuando el modo CUA está activado, las teclas Ctrl-x (C-x), Ctrl-c (C-c), Ctrl-v (C-v) y Ctrl-z (C-z) invocan los comandos de cortar (kill), copiar, pegar (yank) y deshacer, respectivamente. Las teclas Ctrl-x (C-x) y Ctrl-c (C-c) realizan el corte y la copia sólo si la región está activa. En caso contrario, siguen actuando como teclas de prefijo, de modo que los comandos estándar de Emacs como Ctrl-x Ctrl-c (C-x C-c) siguen funcionando. Tenga en cuenta que esto significa que la variable mark-even-if-inactive no tiene efecto para Ctrl-x (C-x) y Ctrl-c (C-c) (ver Operar sobre la región).

Para introducir un comando Emacs como Ctrl-x Ctrl-f (C-x C-f) mientras la marca está activa, use uno de los siguientes métodos: mantenga pulsada la tecla Shift junto con la tecla del prefijo, por ejemplo, Shift-Ctrl-x Ctrl-f (S-C-x C-f), o escriba rápidamente la tecla del prefijo dos veces, por ejemplo, Ctrl-x Ctrl-x Ctrl-f (C-x C-x C-f).

Para deshabilitar la anulación de la vinculación estándar de Emacs por el modo CUA, mientras se mantienen las otras características del modo CUA descritas a continuación, establezca la variable cua-enable-cua-keys en nil.

El modo CUA activa por defecto el modo Delete-Selection (Borrar-Selección) (véase Comandos del ratón para editar), de modo que el texto escrito sustituye a la región activa. Para usar CUA sin este comportamiento, establezca la variable cua-delete-selection a nil.

El modo CUA proporciona un soporte mejorado para los rectángulos con un resaltado visible de los mismos. Use Ctrl-RETURN (C-RET) para iniciar un rectángulo, extenderlo usando los comandos de movimiento, y cortarlo o copiarlo usando Ctrl-x (C-x) o Ctrl-c (C-c). RETURN (RET) desplaza el cursor a la siguiente esquina (en el sentido de las agujas del reloj) del rectángulo, para que pueda ampliarlo fácilmente en cualquier dirección. El texto normal que escriba se inserta a la izquierda o a la derecha de cada línea del rectángulo (en el mismo lado que el cursor).

Puede usar este soporte de rectángulo sin activar CUA llamando al comando cua-rectangle-mark-mode. También existe el comando estándar rectangle-mark-mode, véase Rectángulos.

Con CUA puede copiar fácilmente texto y rectángulos dentro y fuera de los registros proporcionando un prefijo numérico de un dígito a los comandos kill, copy y yank, por ejemplo, Ctrl-1 Ctrl-c (C-1 C-c) copia la región en el registro 1, y Ctrl-2 Ctrl-v (C-2 C-v) yank el contenido del registro 2.

El modo CUA también tiene una función de marca global que permite mover y copiar fácilmente el texto entre los búferes. Use Ctrl-Shift-SPACE (C-S-SPC) para activar y desactivar la marca global. Cuando la marca global está activada, todo el texto que mate o copie se inserta automáticamente en la marca global, y el texto que escriba se inserta en la marca global en lugar de en la posición actual.

Por ejemplo, para copiar palabras de varias memorias intermedias (varios búferes) en una lista de palabras de una memoria intermedia determinada, establezca la marca global en la memoria intermedia de destino, luego navegue hasta cada una de las palabras que desee en la lista, márquela (por ejemplo, con Shift-Alt-f (S-M-f)), cópiela en la lista con Ctrl-c (C-c) o Alt-w (M-w), e inserte una nueva línea después de la palabra en la lista de destino pulsando RETURN ().



Registros

Los registros de Emacs son compartimentos en los que puede guardar texto, rectángulos, posiciones y otras cosas para su uso posterior. Una vez que guarda un texto o un rectángulo en un registro, puede copiarlo en el buffer una o varias veces; una vez que guarda una posición en un registro, puede volver a esa posición una o varias veces.

Cada registro tiene un nombre que consiste en un solo carácter, que denotaremos por r; r puede ser una letra (como ‘a’) o un número (como ‘1’); las mayúsculas y minúsculas importan, por lo que el registro ‘a’ no es lo mismo que el registro ‘A’. También puede establecer un registro con caracteres no alfanuméricos, por ejemplo ‘*’ o Ctrl-d ‘(C-d)’. Tenga en cuenta que no es posible establecer un registro en Ctrl-g ‘(C-g)’ o ESC ‘(ESC)’, porque estas teclas están reservadas para salir (ver Salir y Abortar).

Un registro puede almacenar una posición, un trozo de texto, un rectángulo, un número, una configuración de ventana o un nombre de archivo, pero sólo una cosa en cada momento. Lo que se almacena en un registro permanece allí hasta que se almacena algo más en ese registro. Para ver qué contiene el registro r, use Alt-x view-register (M-x view-register):

Alt-x view-register RETURN r (M-x view-register RET r)
Muestra una descripción de lo que contiene el registro r.

Todos los comandos que solicitan un registro mostrarán una ventana de vista previa que enumera los registros existentes (si hay alguno) después de un breve retraso. Para cambiar la duración del retraso, personalice register-preview-delay. Para evitar que se muestre esta ventana, establezca esta opción como nula. Puede solicitar explícitamente una ventana de vista previa pulsando Ctrl-h (C-h) o F1.

Los marcadores registran los archivos y las posiciones en ellos, para que pueda volver a esas posiciones cuando vuelva a mirar el archivo. Los marcadores, en espíritu son similares a los registros, por lo que también se documentan en este capítulo.

Guardar posiciones en los registros

Ctrl-x r SPACE r (C-x r SPC r )
Graba la posición del punto y el buffer actual en el registro r (point-to-register).
Ctrl-x rjr (C-x r j r )
Salta a la posición y al buffer guardado en el registro r (jump-to-register).

Al escribir Ctrl-x r SPACE (C-x r SPC, point-to-register), seguido de un carácter r, se guarda tanto la posición del punto como el búfer actual en el registro r. El registro conserva esta información hasta que se almacene otra cosa en él. seguido de un carácter r, guarda tanto la posición del punto como el búfer actual en el registro r. El registro retiene esta información hasta que se almacene algo más en él.

El comando Ctrl-x rjr (C-x r j r) cambia al buffer grabado en el registro r, empuja una marca y mueve el punto a la posición grabada. (La marca no se empuja si el punto ya estaba en la posición grabada, o en sucesivas llamadas al comando). El contenido del registro no se modifica, por lo que puede saltar a la posición guardada cualquier número de veces.

Si usa Ctrl-x rj (C-x r j) para ir a una posición guardada, pero el buffer del que se guardó ha sido eliminado, C-x r j intenta crear el buffer de nuevo visitando el mismo archivo. Por supuesto, esto funciona sólo para los búferes que estaban visitando archivos.

Guardar texto en los registros

Cuando quiera insertar una copia del mismo texto varias veces, puede ser inconveniente sacarlo del anillo de eliminación, ya que cada eliminación posterior mueve esa entrada más abajo en el anillo. Una alternativa es almacenar el texto en un registro y recuperarlo posteriormente.

Ctrl-x rsr (C-x r s r)
Copia región en el registro r (copy-to-register).
Ctrl-x rir (C-x r i r)
Inserta texto desde el registro r (insert-register).
Alt-x append-to-register (M-x append-to-register RET r)
Añade una región al texto del registro r.

Cuando el registro r contiene texto, puede usar Ctrl-x r+ (C-x r +, increment-register) para añadirlo a ese registro. Tenga en cuenta que el comando Ctrl-x r+ (C-x r +) se comporta de forma diferente si r contiene un número. Consulte Mantener números en los registros.
Alt-x prepend-to-register RETURNr (M-x prepend-to-register RET r)
Preagrega la región al texto en el registro r.

Ctrl-x rsr (C-x r s r) almacena una copia del texto de la región en el registro llamado r. Si la marca está inactiva, Emacs reactiva primero la marca en el lugar donde fue puesta por última vez. La marca se desactiva al final de este comando. Véase La marca y la región. Ctrl-u Ctrl-x rs (C-u C-x r s r), el mismo comando con un argumento de prefijo, copia el texto en el registro r y borra el texto del buffer también; puedes pensar en esto como mover el texto de la región al registro.

Alt-x append-to-register RETURNr (M-x append-to-register RET r) añade la copia del texto de la región al texto ya almacenado en el registro llamado r. Si se invoca con un argumento de prefijo, borra la región después de añadirla al registro. El comando prepend-to-register es similar, excepto que antepone el texto de la región al texto del registro en lugar de añadirlo.

Cuando se recopila texto mediante append-to-register y prepend-to-register, es posible que se desee separar las piezas individuales recopiladas mediante un separador. En ese caso, configure un register-separator y almacene el texto del separador en ese registro. Por ejemplo, para obtener dobles líneas nuevas como separador de texto durante el proceso de recopilación, puede usar la siguiente configuración

(setq register-separator ?+)
(set-register register-separator "\n\n")

Ctrl-x rir (C-x r i r) inserta en el buffer el texto del registro r. Normalmente deja el punto después del texto y pone la marca antes, sin activarla. Con un argumento de prefijo, en cambio, coloca el punto antes del texto y la marca después.

Guardar rectángulos en los registros

Un registro puede contener un rectángulo en lugar de texto lineal. Consulte Rectángulos, para obtener información básica sobre cómo especificar un rectángulo en el búfer.

Ctrl-x rrr (C-x r r r)
Copiar la region-rectangle en el registro r (copy-rectangle-to-register). Con el argumento del prefijo, elimínalo también.
Ctrl-x rir (C-x r i r)
Insertar el rectángulo almacenado en el registro r (si contiene un rectángulo) (insertar-register).

El comando Ctrl-x rir (C-x r i r, insert-register), previamente documentado en Guardar texto en los registros, inserta un rectángulo en lugar de una cadena de texto, si el registro contiene un rectángulo.

Guardar las configuraciones de las ventanas en los registros

Puede guardar la configuración de la ventana del marco seleccionado en un registro, o incluso la configuración de todas las ventanas de todos los marcos, y restaurar la configuración más tarde. Consulte Ventanas Múltiples, para obtener información sobre las configuraciones de las ventanas.

Ctrl-x rwr (C-x r w r)
Guarda el estado de las ventanas del marco seleccionado en el registro r (window-configuration-to-register).
Ctrl-x rfr (C-x r f r)
Guarda el estado de todos los marcos, incluyendo todas sus ventanas, en el registro r (frameset-to-register).

Use Ctrl-x rjr C-x r j r para restaurar la configuración de una ventana o un marco. Este es el mismo comando que se usa para restaurar la posición del cursor. Cuando restablece una configuración de marcos, los marcos existentes que no están incluidos en la configuración se vuelven invisibles. Si desea eliminar estos marcos, use Ctrl-u Ctrl-x rjr (C-u C-x r j r).

Mantener números en los registros

Existen comandos para almacenar un número en un registro, para insertar el número en el buffer en decimal, y para incrementarlo. Estos comandos pueden ser útiles en las macros de teclado (véase Macros de teclado).

Ctrl-u número Ctrl-x rnr (C-u número Ctrl-x r n r)
Almacena el número en el registro r (number-to-register).
Ctrl-u número Ctrl-x r+r (C-u número C-x r + r)
Si r contiene un número x, el número en ese registro también se incrementa en un valor x. Tenga en cuenta que el comando Ctrl-x r+ (C-x r +, increment-register) se comporta de manera diferente si r contiene texto. Véase Guardar texto en los registros.
Ctrl-x rir (C-x r i r)
Inserta el número del registro r en el buffer.

Ctrl-x ri (C-x r i) es el mismo comando que se usa para insertar cualquier otro tipo de contenido de registro en la memoria intermedia. Ctrl-x r+ (C-x r +) sin argumento numérico incrementa el valor del registro en 1; Ctrl-x rn (C-x r n) sin argumento numérico almacena cero en el registro.

Mantener los nombres de los archivos en registros

Si visita ciertos nombres de archivos con frecuencia, puede visitarlos más cómodamente si pone sus nombres en registros. Este es el código Lisp usado para poner un nombre de archivo en el registro r:

(set-register r '(file . name))

Por ejemplo:

(set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))

pone el nombre del archivo que aparece en el registro ‘z’.

Para visitar el archivo cuyo nombre está en el registro r, escriba Ctrl-x rjr (C-x r j r). (Este es el mismo comando que se usa para saltar a una posición o restaurar una configuración de marco).

Registros de macros de teclado

Si necesita ejecutar una macro de teclado (véase Macros de teclado) con frecuencia, es más conveniente ponerla en un registro o guardarla (véase Cómo nombrar y guardar macros de teclado). Ctrl-x Ctrl-k xr (C-x C-k x r, kmacro-to-register) almacena la última macro de teclado en el registro r.

Para ejecutar la macro de teclado en el registro r, escriba Ctrl-x rjr (C-x r j r). (Este es el mismo comando que se usa para saltar a una posición o restaurar un conjunto de cuadros).

Marcadores

Los marcadores son algo parecido a los registros en el sentido de que registran posiciones a las que se puede saltar. A diferencia de los registros, tienen nombres largos y persisten automáticamente de una sesión de Emacs a la siguiente. El uso prototípico de los marcadores es registrar dónde estaba leyendo en varios archivos.

Ctrl-x rmRETURN (C-x r m RET)
Establece el marcador para el archivo visitado, en el punto.
Ctrl-x rm marcador RETURN (C-x r m marcador RET)
Establece el marcador llamado bookmark en el punto (bookmark-set).
Ctrl-x r M marcador RETURN (C-x r M marcador RET)
Como C-x r m, pero no sobrescribe un marcador existente.
Ctrl-x rb marcador RETURN (C-x r b marcador RET)
Salta al marcador de nombre marcador (bookmark-jump).
Ctrl-x rl (C-x r l)
Lista todos los marcadores (list-bookmarks).
Alt-x marcador-save (M-x marcador-save)
Guardar todos los valores actuales de los marcadores en el archivo de marcadores por defecto.

Para registrar la posición actual en el archivo visitado, use el comando Ctrl-x rm (C-x r m), que establece un marcador usando el nombre del archivo visitado como nombre predeterminado del marcador. Si nombra cada marcador con el nombre del archivo al que apunta, entonces puede volver a visitar convenientemente cualquiera de esos archivos con Ctrl-x rb (C-x r b), y moverse a la posición del marcador al mismo tiempo.

El comando Ctrl-x rM (C-x r M, bookmark-set-no-overwrite) funciona como Ctrl-x rm (C-x r m), pero señala un error si el marcador especificado ya existe, en lugar de sobrescribirlo.

Para mostrar una lista de todos sus marcadores en un búfer separado, escriba Ctrl-x rl (C-x r l, list-bookmarks). Si pasa a ese búfer, puede usarlo para editar las definiciones de los marcadores o anotar los marcadores. Escribe Ctrl-h m (C-h m) en el buffer de marcadores para obtener más información sobre sus comandos especiales de edición.

Cuando mata Emacs, este guarda sus marcadores, si ha cambiado algún valor de los mismos. También puede guardar los marcadores en cualquier momento con el comando (M-x bookmark-save). Los marcadores se guardan en el archivo ~/config/emacs/bookmark (por compatibilidad con versiones anteriores del Editor, si tiene un archivo llamado ~/.emacs.bmk, se usa en su lugar). Los comandos de marcadores cargan automáticamente su archivo de marcadores por defecto. Esta forma de guardar y cargar los marcadores persiste de una sesión de Emacs a la siguiente.

Si establece la variable bookmark-save-flag a 1, cada comando que establezca un marcador también guardará sus marcadores; de esta manera, no pierdes ningún valor de marcador incluso si Emacs se bloquea. El valor, si es un número, dice cuántas modificaciones de los marcadores deben pasar entre los guardados. Si estableces esta variable a nil, Emacs sólo guarda los marcadores si usas explícitamente M-x bookmark-save.

La variable bookmark-default-file especifica el archivo en el que se guardan los marcadores por defecto.

Si establece la variable bookmark-use-annotations en t, al establecer un marcador se buscará una anotación. Si un marcador tiene una anotación, ésta se muestra automáticamente en una ventana separada cuando se salta al marcador.

Los valores de posición de los marcadores se guardan con el contexto circundante, de modo que bookmark-jump puede encontrar la posición adecuada incluso si el archivo se modifica ligeramente. La variable bookmark-search-size dice cuántos caracteres de contexto hay que registrar a cada lado de la posición del marcador.

Aquí hay algunos comandos adicionales para trabajar con marcadores:

Alt-x bookmark-load RETURN nombre-de-archivo RETURN
(M-x bookmark-load RET nombre-de-archivo RET)
Carga un archivo llamado nombre-de-archivo que contiene una lista de valores de marcadores. Puede usar este comando, así como bookmark-write, para trabajar con otros archivos de valores de marcadores además de su archivo de marcadores por defecto.
Alt-x bookmark-write RETURN nombre-de-archivo RETURN
(M-x bookmark-write RET nombre-de-archivo RET)
Guarda todos los valores de los marcadores actuales en el fichero nombre-de-archivo.
Alt-x bookmark-delete RETURN nombre-marcador RETURN
(M-x bookmark-delete RET nombre-marcador RET)
Borra el marcador llamado nombre-marcador.
Alt-x bookmark-insert-location RETURN nombre-marcadorRETURN
(M-x bookmark-insert-location RET nombre-marcador RET)
Inserta en el buffer el nombre del archivo al que apunta el marcador nombre-marcador.
Alt-x bookmark-insert RETURN nombre-marcador RETURN
(M-x bookmark-insert RET nombre-marcador RET)
Inserta en el buffer el contenido del archivo al que apunta el marcador llamado nombre-marcador.


Control de la pantalla

Como sólo una parte de un buffer grande cabe en la ventana, Emacs tiene que mostrar lo mismo: sólo una parte. Este capítulo describe comandos y variables que le permiten especificar qué parte del texto quiere ver, y cómo se muestra el texto.

Desplazamiento

Si una ventana es demasiado pequeña para mostrar todo el texto de su búfer, sólo muestra una parte. Los comandos de desplazamiento cambian la parte de la memoria intermedia que se muestra.

El desplazamiento hacia adelante o hacia arriba hace avanzar la porción del búfer que se muestra en la ventana; de manera equivalente, mueve el texto del búfer hacia arriba en relación con la ventana. Desplazarse hacia atrás o hacia abajo muestra una porción anterior del buffer, y mueve el texto hacia abajo en relación con la ventana.

En Emacs, el desplazamiento hacia arriba o hacia abajo se refiere a la dirección en que se mueve el texto en la ventana, no a la dirección en que se mueve la ventana con respecto al texto. Esta terminología fue adoptada por Emacs antes de que se generalizara el significado moderno de "desplazamiento hacia arriba" y "desplazamiento hacia abajo". De ahí el resultado extraño cuando PageDown se desplaza hacia arriba en el sentido del Editor.

La porción de un buffer que se muestra en una ventana siempre contiene un punto. Si mueve el punto más allá de la parte inferior o superior de la ventana, el desplazamiento se produce automáticamente para devolverlo a la pantalla (ver Desplazamiento automático). También puede desplazarse explícitamente con estos comandos:

Ctrl-v (C-v)
PageDown
next
Desplazarse hacia delante casi una ventana completa (scroll-up-command).
Alt-v (M-v)
PageUp
prior
Desplazarse hacia atrás (scroll-down-command).

Ctrl-v (C-v, scroll-up-command) se desplaza hacia adelante por casi toda la altura de la ventana. El efecto es tomar las dos líneas de la parte inferior de la ventana y ponerlas en la parte superior, seguidas de las líneas que no eran visibles anteriormente. Si el punto estaba en el texto que se desplazó fuera de la parte superior, termina en la nueva línea superior de la ventana. La tecla PageDown (o siguiente) equivale a Ctrl-v (C-v).

M-v, scroll-down-command se desplaza hacia atrás de forma similar. La tecla PageUp (o anterior) equivale a M-v.

El número de líneas de solapamiento que dejan estos comandos de desplazamiento se controla mediante la variable next-screen-context-lines, cuyo valor por defecto es 2. Puede suministrar a los comandos un argumento numérico de prefijo, n, para desplazarse por n líneas; Emacs intenta dejar el punto sin cambiar, de modo que el texto y el punto se mueven juntos hacia arriba o hacia abajo. Ctrl-v (C-v) con un argumento negativo es como Alt-v (M-v) y viceversa.

Por defecto, estos comandos señalan un error (mediante un pitido o un parpadeo de la pantalla) si no es posible el desplazamiento, porque la ventana ha llegado al principio o al final del buffer. Si cambia la variable scroll-error-top-bottom a t, estos comandos mueven el punto a la posición más lejana posible. Si el punto ya está allí, los comandos señalan un error.

A algunos Usuarios les gusta que los comandos de desplazamiento mantengan el punto en la misma posición de la pantalla, de modo que al volver a la misma pantalla el punto vuelva a su posición original. Puede activar este comportamiento mediante la variable scroll-preserve-screen-position. Si el valor es t, Emacs ajusta el punto para mantener el cursor en la misma posición de la pantalla cada vez que un comando de desplazamiento lo mueve fuera de la ventana, en lugar de moverlo a la línea superior o inferior. Con cualquier otro valor no nulo, Emacs ajusta el punto de esta manera incluso si el comando de desplazamiento deja el punto en la ventana. Esta variable afecta a todos los comandos de desplazamiento documentados en esta sección, así como al desplazamiento con la rueda del ratón (ver Comandos del ratón para editar); en general, afecta a cualquier comando que tenga una propiedad scroll-command no nula. Ver Property Lists en The Emacs Lisp Reference Manual.

A veces, particularmente cuando mantiene pulsadas teclas como Ctrl-v (C-v) y Alt-v (M-v), activando la repetición automática del teclado, Emacs no consigue mantener el rápido ritmo de desplazamiento solicitado; la pantalla no se actualiza y puede dejar de responder a las entradas durante bastante tiempo. Puede contrarrestar esta lentitud estableciendo la variable fast-but-imprecise-scrolling a un valor no nulo. Esto instruye a los comandos de desplazamiento para que no tipifiquen (ver modo de bloqueo de fuentes) cualquier texto no tipificado sobre el que se desplacen, en su lugar asumirán que tiene la face por defecto. Esto puede hacer que Emacs se desplace a posiciones de búfer algo erróneas cuando las faces en uso no son todas del mismo tamaño, incluso con operaciones de desplazamiento simples (es decir, sin repetición automática).

Como alternativa a la configuración del desplazamiento rápido pero impreciso (fat-but-imprecise-scrolling) puede preferir habilitar la fontificación diferida de jit-lock (ver Modo de bloqueo de fuentes). Para ello, personalice jit-lock-defer-time a un número positivo pequeño como 0,25, o incluso 0,1 si escribe rápidamente. Esto le proporciona un desplazamiento menos brusco cuando mantiene pulsada la tecla Ctrl-v (C-v), pero el contenido de la ventana después de cualquier acción que se desplace a una nueva porción del búfer estará momentáneamente desfontificado.

Finalmente, una tercera alternativa a estas variables es redisplay-skip-fontification-on-input. Si esta variable es no nula, omitirá algunas fontificaciones si hay entradas pendientes. Esto normalmente no afecta a la visualización porque la redistribución se salta completamente de todos modos si la entrada estaba pendiente, pero puede hacer que el desplazamiento sea más suave al evitar la fontificación innecesaria.

Los comandos Alt-x scroll-up (M-x scroll-up) y Alt-x scroll-down (M-x scroll-down) se comportan de forma similar a scroll-up-command y scroll-down-command, excepto que no obedecen a scroll-error-top-bottom. Antes de Emacs 24, estos eran los comandos por defecto para desplazarse hacia arriba y hacia abajo. Los comandos Alt-x scroll-up-line (M-x scroll-up-line) y Alt-x scroll-down-line (M-x scroll-down-line) desplazan la ventana actual de una en una. Si tiene la intención de usar cualquiera de estos comandos, es posible que desee darles enlaces de teclas (ver Revinculación de teclas en su fichero de inicialización).

Reciclaje

Ctrl-l (C-l)
Desplaza la ventana seleccionada para que la línea actual sea la línea de texto más central; en las siguientes invocaciones consecutivas, hace que la línea actual sea la línea superior, la inferior, y así sucesivamente en orden cíclico. Posiblemente también redistribuya la pantalla (recenter-top-bottom).
Ctrl-Alt-Shift-l (C-M-S-l)
Desplaza la otra ventana; equivale a que Ctrl-l (C-l) actúe sobre la otra ventana.
Altf-x recenter (M-x recenter)
Desplaza la ventana seleccionada para que la línea actual sea la línea de texto más central. Posiblemente también redistribuya la pantalla.
Ctrl-Alt-l (C-M-l)
Desplaza heurísticamente para traer información útil a la pantalla (reposition-window).

El comando Ctrl-l (C-l) (recenter-top-bottom) recentra la ventana seleccionada, desplazándola para que la línea actual de la pantalla esté exactamente en el centro de la ventana, o lo más cerca posible del centro.

Si se teclea Ctrl-l (C-l) dos veces seguidas Ctrl-l Ctrl-l (C-l C-l), la ventana se desplaza de modo que el punto se encuentre en la línea superior de la pantalla. Si se escribe un tercer Ctrl-l, la ventana se desplaza hasta que el punto se encuentre en la línea inferior de la pantalla. Cada combinación de teclas Ctrl-l sucesiva recorre estas tres posiciones.

Se puede cambiar el orden de los ciclos personalizando la variable de lista recenter-positions. Cada elemento de la lista debe ser el símbolo superior, medio o inferior, o un número; un número entero significa mover la línea a la línea de pantalla especificada, mientras que un número de punto flotante entre 0,0 y 1,0 especifica un porcentaje del espacio de la pantalla desde la parte superior de la ventana. El valor por defecto, (centro, arriba, abajo), es el orden cíclico descrito anteriormente. Además, si se cambia la variable scroll-margin a un valor n distinto de cero, Ctrl-l siempre deja al menos n líneas de pantalla entre el punto y la parte superior o inferior de la ventana (véase Desplazamiento automático).

También se puede dar a (C-l) un argumento prefijo. Un argumento prefijo simple, Ctrl-u Ctrl-l (C-u C-l), simplemente recentra la línea que muestra el punto. Un argumento positivo n mueve la línea que muestra el punto n líneas hacia abajo desde la parte superior de la ventana. Un argumento de cero mueve la línea del punto a la parte superior de la ventana. Un argumento negativo -n mueve la línea del punto n líneas desde la parte inferior de la ventana. Cuando se le da un argumento, Ctrl-l no borra la pantalla ni recorre las diferentes posiciones de la misma.

Si la variable recenter-redisplay tiene un valor no nulo, cada invocación de Ctrl-l (C-l) también limpia y vuelve a mostrar la pantalla; el valor especial tty (el predeterminado) dice que se haga esto sólo en marcos de terminales de texto. Volver a mostrar la pantalla es útil en caso de que la pantalla se vuelva confusa por cualquier razón (ver Basura en la pantalla).

El comando más primitivo Alt-x recenter (M-x recenter) se comporta como recenter-top-bottom, pero no cicla entre las posiciones de la pantalla.

Ctrl-Alt-l (C-M-l, reposition-window) desplaza la ventana actual de forma heurística de manera que se consiga información útil en la pantalla. Por ejemplo, en un archivo Lisp, este comando intenta poner en la pantalla todo el defun actual si es posible.

Desplazamiento automático

Emacs realiza un desplazamiento automático cuando el punto se mueve fuera de la porción visible del texto. Normalmente, el desplazamiento automático centra el punto verticalmente en la ventana, pero hay varias maneras de alterar este comportamiento.

Si establece scroll-conservatively a un número pequeño n, entonces mover el punto un poco fuera de la pantalla (no más de n líneas) hace que Emacs se desplace lo suficiente para traer el punto de vuelta a la pantalla; si al hacerlo no consigue hacer visible el punto, Emacs se desplaza lo suficiente para centrar el punto en la ventana. Si establece scroll-conservatively a un número grande (mayor que 100), el desplazamiento automático nunca centra el punto, no importa lo lejos que se mueva; el Editor siempre desplaza el texto lo suficiente para traer el punto a la vista, ya sea en la parte superior o inferior de la ventana dependiendo de la dirección de desplazamiento. Por defecto, scroll-conservatively es 0, lo que significa centrar siempre el punto en la ventana. Dicho esto, en las ventanas de minibuffer, el desplazamiento es siempre conservador por defecto porque scroll-minibuffer-conservatively es no-nil, lo que tiene prioridad sobre scroll-conservatively.

Otra forma de controlar el desplazamiento automático es personalizar la variable scroll-step. Su valor determina el número de líneas por las que se desplazará automáticamente, cuando el punto se desplace fuera de la pantalla. Si el desplazamiento de ese número de líneas no consigue devolver el punto a la vista, el punto se centra en su lugar. El valor por defecto es cero, lo que (por defecto) hace que el punto se centre siempre después del desplazamiento.

Una tercera forma de controlar el desplazamiento automático es personalizar las variables scroll-up-aggressively y scroll-down-aggressively, que especifican directamente la posición vertical del punto después del desplazamiento. El valor de scroll-up-aggressively debe ser o bien nulo (el valor por defecto), o bien un número de punto flotante f entre 0 y 1. Esto último significa que cuando el punto va por debajo del borde inferior de la ventana (es decir, el desplazamiento hacia delante), Emacs desplaza la ventana de manera que el punto esté a f partes de la altura de la ventana desde el borde inferior de la misma. Por lo tanto, una f más grande significa un desplazamiento más agresivo: más texto nuevo es traído a la vista. El valor por defecto, nil, equivale a 0,5.

Del mismo modo, el desplazamiento hacia abajo de forma agresiva se utiliza cuando el punto sobrepasa el borde superior de la ventana (es decir, se desplaza hacia atrás). El valor especifica a qué distancia debe estar el punto del margen superior de la ventana tras el desplazamiento. Por lo tanto, al igual que con scroll-up-agresivamente, un valor mayor es más agresivo.

Tenga en cuenta que las variables scroll-conservatively, scroll-step y scroll-up-agressively/scroll-down-agressively controlan el desplazamiento automático de forma contradictoria. Por lo tanto, no debería elegir más de uno de estos métodos para personalizar el desplazamiento automático. En caso de personalizar varias variables, el orden de prioridad es: scroll-conservativelly, luego scroll-step, y finalmente scroll-up-agressively/scroll-down-agressively.

La variable scroll-margin restringe lo cerca que se puede llegar a la parte superior o inferior de una ventana (incluso si el desplazamiento agresivo especifica una fracción f que es mayor que la porción de ventana entre los márgenes superior e inferior). Su valor es un número de líneas de pantalla; si el punto se acerca a ese número de líneas de la parte superior o inferior de la ventana, Emacs realiza un desplazamiento automático. Por defecto, scroll-margin es 0. El tamaño del margen efectivo está limitado a un cuarto de la altura de la ventana por defecto, pero este límite puede incrementarse hasta la mitad (o reducirse a cero) personalizando maximum-scroll-margin.

Desplazamiento horizontal

El desplazamiento horizontal consiste en desplazar todas las líneas hacia los lados dentro de una ventana, de modo que parte del texto cercano al margen izquierdo no se muestra. Cuando el texto de una ventana se desplaza horizontalmente, las líneas de texto se truncan en lugar de continuar (véase Truncado de líneas). Si una ventana muestra líneas truncadas, Emacs realiza un desplazamiento horizontal automático cada vez que el punto se aleja del borde izquierdo o derecho de la pantalla. Por defecto, todas las líneas de la ventana se desplazan horizontalmente juntas, pero si estableces la variable auto-hscroll-mode al valor especial de current-line, sólo se desplazará la línea que muestra el cursor. Para desactivar por completo el desplazamiento horizontal automático, establezca la variable auto-hscroll-mode en nil. Tenga en cuenta que cuando el desplazamiento horizontal automático está desactivado, si el punto se sale del borde de la pantalla, el cursor desaparece para indicarlo. (En los terminales de texto, el cursor se deja en el borde).

La variable hscroll-margin controla lo cerca que puede estar el punto de los bordes izquierdo y derecho de la ventana antes de que se produzca el desplazamiento automático. Se mide en columnas. Por ejemplo, si el valor es 5, mover el punto a menos de 5 columnas de un borde provoca un desplazamiento horizontal lejos de ese borde.

La variable hscroll-step determina cuántas columnas se desplazan por la ventana cuando el punto se acerca demasiado al borde. Cero, el valor por defecto, significa centrar el punto horizontalmente dentro de la ventana. Un valor entero positivo especifica el número de columnas a desplazar. Un número de punto flotante (cuyo valor debe estar entre 0 y 1) especifica la fracción del ancho de la ventana por la que hay que desplazarse.

También puede llevar a cabo un desplazamiento horizontal explícito con los siguientes comandos:

Ctrl-x < (C-x <)
Desplaza el texto de la ventana actual hacia la izquierda (scroll-left).
Ctrl-x > (C-x >)
Desplazamiento Hacia la derecha (scroll-right).

Ctrl-x < (C-x <, scroll-left) desplaza el texto de la ventana seleccionada hacia la izquierda en todo el ancho de la ventana, menos dos columnas. (En otras palabras, el texto de la ventana se desplaza hacia la izquierda en relación con la ventana.) Con un argumento numérico n, se desplaza por n columnas.

Si el texto se desplaza hacia la izquierda, y el punto se desplaza fuera del borde izquierdo de la ventana, el cursor se congelará en el borde izquierdo de la ventana, hasta que el punto vuelva a la parte del texto que se muestra. Esto es independiente de la configuración actual del modo de desplazamiento automático, que, para el texto desplazado hacia la izquierda, sólo afecta al comportamiento en el borde derecho de la ventana.

Ctrl-x > (C-x >, scroll-right) se desplaza de forma similar hacia la derecha. La ventana no puede desplazarse más hacia la derecha una vez que se muestra normalmente, con cada línea que comienza en el margen izquierdo de la ventana; intentar hacerlo no tiene ningún efecto. Esto significa que no tiene que calcular el argumento con precisión para Ctrl-x > (C-x >); cualquier argumento suficientemente grande restaurará la visualización normal.

Si utiliza esos comandos para desplazar una ventana horizontalmente, eso establece un límite inferior para el desplazamiento horizontal automático. El desplazamiento automático continuará desplazando la ventana, pero nunca más a la derecha que la cantidad que haya establecido previamente mediante scroll-left. Cuando el modo de desplazamiento automático se establece en la línea actual, todas las líneas distintas de la que muestra el cursor se desplazarán en esa cantidad mínima.

Estrechamiento

Estrechar significa centrarse en una parte del buffer, haciendo que el resto sea temporalmente inaccesible. La parte a la que todavía se puede llegar se llama parte accesible. La anulación del estrechamiento, que hace que toda la memoria intermedia vuelva a ser accesible, se llama ampliación. Los límites del estrechamiento en vigor en un búfer se denominan restricción del búfer.

El estrechamiento puede facilitar la concentración en una sola subrutina o párrafo al eliminar el desorden. También puede utilizarse para limitar el rango de operación de un comando de reemplazo o de una macro de teclado repetitiva.

Ctrl-x nn (C-x n n)
Acota entre el punto y la marca (narrow-to-region).
Ctrl-x nw (C-x n w)
12 Amplía para que se pueda volver a acceder a toda la memoria intermedia (widen).
Ctrl-x np (C-x n p)
Reduce a la página actual (narrow-to-page).
Ctrl-x nd (C-x n d)
Reduce a la definición actual (narrow-to-defun).

Cuando se ha reducido a una parte del el buffer, esa parte parece ser todo lo que hay. No puede ver el resto, no puede moverte dentro de ella (los comandos de movimiento no salen de la parte accesible), no puede cambiarla de ninguna manera. Sin embargo, no ha desaparecido, y si guarda el archivo todo el texto inaccesible se guardará. La palabra 'Narrow' aparece en la línea de modo siempre que el estrechamiento esté en efecto.

El principal comando de estrechamiento es Ctrl-x nn (C-x n n, narrow-to-region). Establece las restricciones del búfer actual para que el texto de la región actual siga siendo accesible, pero todo el texto anterior a la región o posterior a la región es inaccesible. El punto y la marca no cambian.

Como alternativa, use Ctrl-n np (C-x n p, narrow-to-page) para restringir a la página actual. Vea Páginas, para la definición de una página. Ctrl-x nd (C-x n d, narrow-to-defun) se reduce al punto que contiene la definición (véase Definiciones de alto nivel, o Defuns).

La forma de cancelar el estrechamiento es ampliar con Ctrl-x nw (C-x n w, widen). Esto hace que todo el texto del buffer sea accesible de nuevo.

Puede obtener información sobre la parte del búfer a la que se ha estrechado utilizando el comando Ctrl-x = (C-x =). Véase Información sobre la posición del cursor.

Debido a que el estrechamiento puede confundir fácilmente a los Usuarios que no lo entienden, el estrechamiento a la región (narrow-to-region) es normalmente un comando deshabilitado. Al intentar utilizar este comando se pide confirmación y se da la opción de habilitarlo; si se habilita el comando, ya no se pedirá confirmación para el mismo. Consulte la sección Deshabilitar comandos.

Modo de Visualización

El modo de visualización es un modo menor que le permite escanear un búfer por pantallas secuenciales. Proporciona comandos para desplazarse por el buffer convenientemente pero no para cambiarlo. Aparte de los comandos habituales de movimiento del cursor de Emacs, puede escribir SPACE (SPC) para desplazarse hacia delante una ventana, Shift-SPACE (S-SPC) o DEL para desplazarse hacia atrás, y s para iniciar una búsqueda incremental.

Al escribir q (q, View-quit) se desactiva el modo de visualización, y se vuelve a la memoria intermedia y a la posición anterior a la activación del modo de visualización. Escribir e (e, View-exit) desactiva el modo de visualización, manteniendo el buffer y la posición actuales.

Alt-x view-buffer (M-x view-buffer) pide un buffer Emacs existente, cambia a él y activa el modo de visualización. Alt-x view-file (M-x view-file) solicita un archivo y lo visita con el modo de visualización activado

Modo de seguimiento

El modo de seguimiento (Follow mode) es un modo menor que hace que dos ventanas, ambas mostrando el mismo búfer, se desplacen como una unica ventana virtual de una sola altura. Para usar el modo de seguimiento, vaya a un marco con una sola ventana, divídala en dos ventanas contiguas utilizando Ctrl-x 3 (C-x 3), y luego escriba Alt-x follow-mode (M-x follow-mode). A partir de ese momento, puede editar el búfer en cualquiera de las dos ventanas, o desplazarse por cualquiera de ellas; la otra ventana la sigue.

En el modo de seguimiento (modo Follow), si mueve un punto fuera de la porción visible en una ventana y dentro de la porción visible en la otra ventana, eso selecciona la otra ventana, de nuevo, tratando las dos como si fueran partes de una sola ventana grande.

Para desactivar el modo de seguimiento, escriba Alt-x follow-mode (M-x follow-mode) por segunda vez.

Faces (Caras) de Texto

Emacs puede mostrar el texto en varios estilos diferentes, llamados faces. Cada face puede especificar varios atributos de la misma, como el tipo de letra, la altura, el peso, la inclinación, el color de primer plano y de fondo, y el subrayado o la superposición. La mayoría de los modos principales asignan faces (caras) al texto automáticamente, a través del modo de bloqueo de fuentes. Consulte el Modo de bloqueo de fuentes para obtener más información sobre cómo se asignan estas caras.

Para ver qué faces están definidas actualmente y qué aspecto tienen, escriba Alt-x list-faces-display (M-x list-faces-display). Con un argumento de prefijo, esto pide una expresión regular, y muestra sólo las caras con nombres que coinciden con esa expresión regular (ver Sintaxis de las Expresiones Regulares).

Es posible que una face determinada tenga un aspecto diferente en distintos marcos. Por ejemplo, algunos terminales de texto no soportan todos los atributos de las carátulas, particularmente la fuente, la altura y el ancho, y algunos soportan una gama limitada de colores. Además, la mayoría de las carátulas de Emacs están definidas para que sus atributos sean diferentes en fondos de marcos claros y oscuros, por razones de legibilidad. Por defecto, Emacs elige automáticamente qué conjunto de atributos de face mostrar en cada marco, basándose en el color de fondo actual del marco. Sin embargo, puede anular esto dando a la variable frame-background-mode un valor no nulo. Un valor de dark hace que el Editor trate todos los cuadros como si tuvieran un fondo oscuro, mientras que un valor de light hace que trate todos los cuadros como si tuvieran un fondo claro.

Puede personalizar una cara para alterar sus atributos, y guardar esas personalizaciones para futuras sesiones de Emacs. Ver Personalización de las Caras, para más detalles.

La cara por defecto es la predeterminada para mostrar texto, y todos sus atributos están especificados. Su color de fondo también se usa como el color de fondo del marco. Vea 8 Colores de las faces.

Otra cara especial es la cara del cursor. En las pantallas gráficas, el color de fondo de esta cara se utiliza para dibujar el cursor de texto. Ninguno de los otros atributos de esta cara tiene ningún efecto; el color de primer plano para el texto bajo el cursor se toma del color de fondo del texto subyacente. En los terminales de texto, la apariencia del cursor de texto está determinada por el terminal, no por la cara del cursor.

También puede usar los recursos X para especificar los atributos de cualquier cara en particular. Véase D 1 Recursos X.

Emacs puede mostrar fuentes de ancho variable, pero algunos comandos, particularmente los comandos de sangría, no tienen en cuenta el ancho variable de los caracteres. Por lo tanto, recomendamos no usar fuentes de ancho variable para la mayoría de las caras, particularmente aquellas asignadas por el modo de bloqueo de fuentes (Font Lock mode).

Colores de las faces

Las caras (faces) pueden tener varios colores de primer y segundo plano. Cuando se especifica un color para una face -por ejemplo, al personalizar la face (véase Personalización de las Caras) se puede usar un nombre de color o un triplete RGB.

Nombres de colores

Un nombre de color es un nombre predefinido, como "naranja oscuro" o "verde marino medio". Para ver una lista de nombres de colores, escriba Alt-x list-colors-display (M-x list-colors-display). Para controlar el orden en que se muestran los colores, personalice list-colors-sort. Si ejecuta este comando en una pantalla gráfica, muestra toda la gama de nombres de colores conocidos por Emacs (son los nombres de colores estándar de X11, definidos en el archivo rgb.txt de X. Si ejecuta el comando en un terminal de texto, sólo muestra un pequeño subconjunto de colores que pueden mostrarse con seguridad en dichos terminales. Sin embargo, Emacs entiende los nombres de color X11 incluso en terminales de texto; si una cara tiene un color especificado por un nombre de color X11, se muestra usando el color del terminal más parecido

Tripletes RGB

Un triplete RGB es una cadena de la forma ‘#RRGGBB’. Cada uno de los componentes primarios del color se representa con un número hexadecimal entre ‘00’ (intensidad 0) y ‘FF’ (la máxima intensidad). También es posible utilizar uno, tres o cuatro dígitos hexadecimales para cada componente, por lo que "rojo" puede representarse como "#F00", "#fff000000" o "#ffff00000000". Los componentes deben tener el mismo número de dígitos. Para los valores hexadecimales de la A a la F, se aceptan tanto las mayúsculas como las minúsculas.

El comando Alt-x list-colors-display (M-x list-colors-display) también muestra el triplete RGB equivalente para cada color nombrado. Por ejemplo, "verde marino medio" equivale a "#3CB371".

Puede cambiar los colores de primer y segundo plano de una cara con Alt-x face-foreground (M-x set-face-foreground) y Alt-x set-face-background (M-x set-face-background). Estos comandos solicitan en el minibuffer un nombre de cara y un color, con finalización, y luego establecen que esa cara use el color especificado. Afectan a los colores de las caras en todos los marcos, pero sus efectos no persisten en futuras sesiones de Emacs, a diferencia de lo que ocurre cuando se usa el buffer de personalización o los recursos de X. También puede usar parámetros de marco para establecer los colores de primer plano y de fondo para un marco específico; ver Parámetros de los Marcos.

Caras estándar

Aquí están las caras estándar para especificar la apariencia del texto. Puede aplicarlas a un texto específico cuando desee los efectos que producen.

default (por defecto)
Esta cara se utiliza para el texto ordinario que no especifica ninguna cara. Su color de fondo es usado como el color de fondo del marco.
bold (negrita)
Esta cara utiliza una variante en negrita de la fuente por defecto.
italic (cursiva)
Esta cara usa una variante en cursiva de la fuente por defecto.
bold-italic (negrita-cursiva)
Esta cara utiliza una variante en negrita y cursiva de la fuente por defecto.
underline (subrayado)
Esta cara subraya el texto.
fixed-pitch (paso fijo)
Esta cara obliga a usar una fuente de ancho fijo. Es razonable personalizar esta cara para usar una fuente de ancho fijo diferente, si lo desea, pero no deberías hacerla de ancho variable.
fixed-pitch-serif
Esta cara es como la de paso fijo, excepto que la fuente tiene serifas y se parece más a la tipografía tradicional.
variable-pitch (paso variable)
Esta cara obliga a utilizar una fuente de ancho variable.
shadow (sombra)
Esta cara se utiliza para hacer que el texto sea menos perceptible que el texto ordinario que lo rodea. Por lo general, esto puede lograrse usando tonos de gris en contraste con el color de primer plano por defecto, blanco o negro.

Esta es una lista incompleta de las caras usadas para resaltar partes del texto temporalmente con fines específicos. (Muchos otros modos definen sus propias caras para este propósito).

highlight (resaltar)
Esta cara se usa para resaltar el texto en varios contextos, como cuando el cursor del ratón se mueve sobre un hipervínculo.
isearch
Esta cara se utiliza para resaltar la coincidencia actual de Isearch (véase Búsqueda incremental).
query-replace (reemplazo de la búsqueda)
Esta cara se usa para resaltar la coincidencia actual de Query Replace (ver Comandos de reemplazo).
lazy-highlight
Esta cara se utiliza para resaltar las coincidencias perezosas de Isearch y Query Replace (coincidencias distintas de la actual).
region
Esta cara se usa para mostrar una región activa (véase La marca y la región). Cuando Emacs se construye con soporte GTK+, sus colores se toman del tema GTK+ actual.
secondary-selection (selección secundaria)
Esta cara se usa para mostrar una selección X secundaria (ver Selección secundaria).
trailing-whitespace (espacio en blanco al final de la frase o página)
La cara para resaltar el exceso de espacios y tabuladores al final de una línea cuando show-trailing-whitespace no es nulo (ver Espacios en blanco innecesarios).
escape-glyph
La cara para mostrar los caracteres de control y las secuencias de escape (véase Cómo se muestra el texto).
homoglyph (glifo homogéneo)
Cara para mostrar caracteres parecidos, es decir, caracteres que se parecen pero no son los caracteres que se representan (véase Cómo se muestra el texto).
nobreak-space (espacio de no ruptura)
Cara para mostrar caracteres sin espacios de ruptura (véase Cómo se muestra el texto).
nobreak-hyphen
Cara para mostrar los caracteres sin guión de ruptura (véase Cómo se muestra el texto).

Las siguientes caras controlan la apariencia de partes del marco de Emacs:

mode-line (línea de modo)
Esta cara se utiliza para la línea de modo de la ventana actualmente seleccionada, y para las barras de menú cuando no se usan los menús del kit de ramientas. Por defecto, se dibuja con sombras para conseguir un efecto de relieve en las pantallas gráficas, y se dibuja como la cara inversa a la determinada en los terminales sin ventanas.
mode-line-inactive (línea de modo inactiva)
Como mode-line, pero se utiliza para las líneas de modo de las ventanas distintas de la seleccionada (si mode-line-in-non-selected-windows es no nulo). Esta cara hereda de mode-line, por lo que los cambios en esa cara afectan a las líneas de modo de todas las ventanas.
mode-line-highlight (línea de modo resaltada)
Como el resaltado, pero usado para las porciones de texto sensibles al ratón en las líneas de modo. Dichas partes de texto suelen mostrar información sobre herramientas (ver Información sobre herramientas (tooltips)) cuando el puntero del ratón pasa por encima de ellas.
mode-line-buffer-id
Esta cara se usa para las partes de identificación del buffer en la línea de modo.
header-line
Similar a mode-line para la línea de cabecera de una ventana, que aparece en la parte superior de una ventana al igual que la línea de modo aparece en la parte inferior. La mayoría de las ventanas no tienen una línea de cabecera, sólo algunos modos especiales, como el modo Info, crean una.
header-line-highlith
Es similar a resaltar y a resaltar la línea de modo, pero se utiliza para las porciones de texto sensibles al ratón en las líneas de cabecera. Esta es una cara separada porque la cara de la línea de encabezado puede ser personalizada de una manera que no interactúa bien con el resaltado.
tab-line
Similar a mode-line para la línea de tabulación de una ventana, que aparece en la parte superior de una ventana con pestañas que representan los buffers de la ventana. Ver Pestaña de la ventana.
vertical-border
Esta cara se utiliza para el divisor vertical entre ventanas en los terminales de texto.
minibuffer-prompt
Esta cara se usa para las cadenas de aviso que se muestran en el minibuffer. Por defecto, Emacs añade automáticamente esta cara al valor de minibuffer-prompt-properties, que es una lista de propiedades de texto (ver Text Properties en el Manual de Referencia de Emacs Lisp) usadas para mostrar el texto del prompt. (Esta variable tiene efecto cuando se entra en el minibuffer).
fringe (bordes)
La cara de las franjas a la izquierda y a la derecha de las ventanas en las pantallas gráficas. (Los flecos son las partes estrechas del marco de Emacs entre el área de texto y los bordes derecho e izquierdo de la ventana). Ver Bordes de las ventanas.
cursor
El atributo :background de esta cara especifica el color del cursor de texto. Ver Visualización del cursor.
tooltip
Esta cara se utiliza para el texto de información sobre herramientas. Por defecto, si Emacs está construido con soporte GTK+, los tooltips se dibujan a través de GTK+ y esta cara no tiene efecto. Ver Información sobre herramientas (tooltips).
mouse
Esta cara determina el color del puntero del ratón.

Las siguientes caras también controlan la apariencia de partes del marco de Emacs, pero sólo en terminales de texto, o cuando el Editor se construye en X sin soporte del kit de las herramientas. (Para todos los demás casos, la apariencia de los respectivos elementos del marco está determinada por la configuración de todo el sistema).

scroll-bar (barra de desplazamiento)
Esta cara determina la apariencia visual de la barra de desplazamiento. Ver Barras de desplazamiento.
tool-bar (barra de herramientas)
Esta cara determina el color de los iconos de la barra de herramientas. Ver Barras de herramientas.
tab-bar (barra de pestañas)
Esta cara determina el color de los iconos de la barra de pestañas. Ver Barras de pestañas.
menu
Esta cara determina los colores y la fuente de los menús de Emacs. Ver Barras de menús.
tty-menu-enabled-face
Esta cara se utiliza para mostrar los elementos de menú habilitados en los terminales en modo texto.
tty-menu-disabled-face
Esta cara se utiliza para mostrar elementos de menú deshabilitados en terminales en modo texto.
tty-menu-selected-face
Esta cara se utiliza para mostrar en los terminales en modo texto el elemento del menú que se seleccionaría si se hace clic con el ratón o se pulsa RETURN (RET).

Escala del texto

Para aumentar la altura de la cara por defecto en el búfer actual, escriba Ctrl-x Ctrl-+ (C-x C-+) o Ctrl-x Ctrl-= (C-x C-=). Para disminuirla, escriba Ctrl-x Ctrl-- (C-x C--). Para restablecer la altura de la cara por defecto (global), escriba Ctrl-x Ctrl-0 (C-x C-0). Todas estas teclas están vinculadas al mismo comando, ajuste de la escala del texto, que se fija en la última tecla pulsada para determinar la acción a realizar.

Del mismo modo, al desplazar la rueda del ratón con el modificador Ctrl (Ctrl) pulsado, cuando el puntero del ratón está sobre el texto del buffer, aumentará o disminuirá la altura de la cara por defecto, dependiendo de la dirección del desplazamiento.

La tecla final de estos comandos puede repetirse sin la Ctrl-x (C-x) inicial. Por ejemplo, Ctrl-x Ctrl-= Ctrl-= Ctrl-= (C-x C-= C-= C-=) aumenta la altura de la cara en tres pasos. Cada paso escala la altura del texto en un factor de 1,2; para cambiar este factor, personalice la variable text-scale-mode-step. Un argumento numérico de 0 al comando de ajuste de la escala del texto restaura la altura por defecto, lo mismo que escribir Ctrl-x Ctrl-0 (C-x C-0).

Los comandos text-scale-increase y text-scale-decrease aumentan o disminuyen la altura de la cara por defecto, igual que Ctrl-x Ctrl-+ Ctrl-x Ctrl-- (C-x C-+ y C-x C--) respectivamente. Puede que le resulte conveniente enlazar con estos comandos, en lugar de con text-scale-adjust.

El comando text-scale-set escala la altura de la cara por defecto en el búfer actual a un nivel absoluto especificado por su argumento prefijo.

Los comandos anteriores activan automáticamente el modo menor text-scale-mode si la escala de la fuente actual es distinta de 1, y lo desactivan en caso contrario

Modo de bloqueo de fuentes

El modo de bloqueo de fuentes es un modo menor, siempre local a un búfer en particular, que asigna caras (o fontifica, agrega tipografía) a el texto en el búfer. El modo mayor de cada búfer indica al modo Font Lock qué texto debe tipificar; por ejemplo, los modos de lenguaje de programación tipifican construcciones sintácticas relevantes como comentarios, cadenas y nombres de funciones.

El modo Font Lock está activado por defecto en los modos principales que lo soportan. Para activarlo en el búfer actual, escriba Alt-x font-lock-mode (M-x font-lock-mode). Un argumento numérico positivo activa incondicionalmente el modo Font Lock, y un argumento negativo o cero lo desactiva.

Escriba Alt-x global-font-lock-mode (M-x global-font-lock-mode) para activar el modo Font Lock en todos los buffers. Para imponer esta configuración para futuras sesiones de Emacs, personalice la variable global-font-lock-mode (ver Interfaz de fácil personalización), o añada la siguiente línea a su archivo init:

(global-font-lock-mode 0)

Si ha desactivado el modo de Bloqueo de Fuente Global, aún puede activar el Bloqueo de Fuente para modos principales específicos añadiendo la función font-lock-mode a los ganchos (hooks) de modo (ver Ganchos). Por ejemplo, para habilitar el modo Font Lock para la edición de archivos C, puede hacer lo siguiente:

(add-hook 'c-mode-hook 'font-lock-mode)

El modo de bloqueo de fuentes utiliza varias caras para hacer su trabajo, incluyendo font-lock-string-face, font-lock-comment-face, y otros. La forma más fácil de encontrarlas todas es utilizar Alt-x customize-group RETURN font-lock-faces RETURN (M-x customize-group RET font-lock-faces RET). A continuación, puede utilizar ese búfer de personalización para personalizar la apariencia de estas caras. Véase Personalización de las caras.

Puede personalizar la variable font-lock-maximum-decoration para alterar la cantidad de fontificación aplicada por el modo Font Lock, para los modos principales que soportan esta característica. El valor debe ser un número (con 1 representando una cantidad mínima de fontificación; algunos modos soportan niveles tan altos como 3); o t, que significa "tan alto como sea posible" (el valor por defecto). Para que sea efectiva para un búfer de archivo determinado, la personalización de font-lock-maximum-decoration debe hacerse antes de visitar el archivo; si ya tiene el archivo visitado en un búfer cuando personalice esta variable, elimine el búfer y visite el archivo de nuevo después de la personalización.

También puede especificar diferentes números para determinados modos principales; por ejemplo, para utilizar el nivel 1 para los modos C/C++, y el nivel por defecto en caso contrario, utilice el valor:

((c-mode . 1) (c++-mode . 1)))

La fontificación de comentarios y cadenas (o La fontificación "sintáctica" se basa en el análisis de la estructura sintáctica del texto del buffer. En aras de la velocidad, algunos modos, incluido el modo Lisp, se basan en una convención especial: un paréntesis abierto o un corchete abierto en la columna más a la izquierda siempre define el comienzo de un defun, y por lo tanto siempre está fuera de cualquier cadena o comentario. Por lo tanto, debe evitar colocar un paréntesis abierto o un corchete abierto en la columna del extremo izquierdo, si está dentro de una cadena o un comentario. Vea Convención del margen izquierdo, para más detalles.

Los patrones de resaltado de Font Lock ya existen para la mayoría de los modos, pero es posible que desee tipificar patrones adicionales. Puede utilizar la función font-lock-add-keywords, para añadir sus propios patrones de resaltado para un modo concreto. Por ejemplo, para resaltar las palabras ‘FIXME:’ en los comentarios de C, use esto:

(add-hook 'c-mode-hook
          (lambda ()
           (font-lock-add-keywords nil
            '(("\\<\\(FIXME\\):" 1
               font-lock-warning-face t)))))

Para eliminar palabras clave de los patrones de resaltado de font-lock, utilice la función font-lock-remove-keywords. Ver Fontificación basada en la búsqueda en el Manual de Referencia de Emacs Lisp.

La fontificación de buffers grandes puede llevar mucho tiempo. Para evitar retrasos mayores cuando se visita un archivo, Emacs fontifica inicialmente sólo la parte visible de un buffer. A medida que se desplaza por el búfer, cada porción que se hace visible se tipifica tan pronto como se muestra; este tipo de bloqueo de fuentes se llama bloqueo justo a tiempo (just-in-time o JIT). Puede controlar cómo se comporta el bloqueo JIT, incluyendo la indicación de que realice la fontificación mientras está inactivo, personalizando las variables en el grupo de personalización ‘jit-lock’. Véase Personalización de elementos específicos.

Resaltado interactivo

El modo de resaltado de cambios es un modo menor que resalta las partes del búfer que fueron cambiadas más recientemente, dándole a ese texto una cara diferente. Para activar o desactivar el modo de resaltar cambios, utilice Alt-x highlight-changes-mode (M-x highlight-changes-mode).

El modo Hi Lock es un modo menor que resalta el texto que coincide con las expresiones regulares que Usted especifique. Por ejemplo, puede utilizarlo para resaltar todas las referencias a una determinada variable en un archivo fuente de un programa, resaltar ciertas partes en una salida voluminosa de algún programa o resaltar ciertos nombres en un artículo. Para activar o desactivar el modo Hi Lock, utilice el comando Alt-x hi-lock-mode (M-x hi-lock-mode). Para habilitar el modo Hi Lock para todos los buffers, use Alt-x global-hi-lock-mode (M-x global-hi-lock-mode) o coloque (global-hi-lock-mode 1) en su archivo ~/.config/emacs/init.el.

El modo Hi Lock funciona como el modo Font Lock (vea el modo Modo de bloqueo de fuentes), excepto que Usted especifica explícitamente las expresiones regulares a resaltar. Puede controlarlas con los siguientes comandos. (Las combinaciones de teclas que comienzan con Ctrl-x w (C-x w) están obsoletas en favor de las combinaciones globales Alt-s h (M-s h), y serán eliminadas en alguna versión futura de Emacs).

Al-s h r expreg RETURN face RETURN (M-s h r regexp RET face RET)
Ctrl-x w h expreg RETURN face RETURN (C-x w h regexp RET face RET)
Resalta el texto que coincide con expreg (expresión regular) usando face (highlight-regexp). El resaltado permanecerá mientras se cargue el búfer. Por ejemplo, para resaltar todas las apariciones de la palabra "capricho" usando la cara por defecto (un fondo amarillo), escriba Alt-s h r capricho RETURN RETURN (M-s h r capricho RET RET). Se puede usar cualquier cara para resaltar, Hi Lock proporciona varias propias y éstas están precargadas en una lista de valores por defecto. Mientras se le pide una cara utilice Alt-n (M-n) y Alt-p (M-p) para recorrerlas. Un argumento numérico prefijado limita el resaltado a la sub-expresión correspondiente.

Si se establece la opción hi-lock-auto-select-face a un valor no nulo, este comando (y otros comandos Hi Lock que leen caras) elige automáticamente la siguiente cara de la lista por defecto sin preguntar.

Puede usar este comando varias veces, especificando varias expresiones regulares para resaltar de diferentes maneras.
Alt-s hu expreg RETURN (M-s h u expreg RET)
Ctrl-x w r expreg (C-x w r expreg RET)
Destaca expreg (unhighlight-regexp). Si se invoca desde el menú, se selecciona en una lista la expresión que se va a desmarcar. Si se invoca desde el teclado, sexsy usa el minibuffer. Mostrará la expresión regular añadida más recientemente; utilice Alt-n (M-n) para mostrar la siguiente expresión más antigua y Alt-p (M-p) para seleccionar la siguiente expresión más reciente. También puede escribir la expresión a mano, con la terminación. Cuando la expresión que desea desmarcar aparezca en el minibuffer, pulse RETURN (RET) para salir del minibuffer y desmarcarla.
Alt-s hl (M-s h l expreg RET cara RET)
Ctrl-x wl expreg RETURN cara RETURN (C-x w l expreg (RET) cara RET)
Resalta líneas enteras que contengan una coincidencia de expreg, usando cara (highlight-lines-matching-regexp).
Alt-s hp frase RETURN cara RETURN (M-s h p frase RET cara RET)
Ctrl-x wp frase RETURN cara RETURN (C-x w p frase RET cara RET)
Resalta coincidencias de frase, usando face face (highlight-phrase). La frase puede ser cualquier regexp, pero los espacios serán reemplazados por coincidencias con espacios en blanco y las minúsculas iniciales pasarán a ser insensibles a las mayúsculas.
Alt-s h . (M-s h .)
Ctrl-x w . (C-x w .)
Resalta el símbolo encontrado cerca del punto, usando la siguiente cara disponible (highlight-symbol-at-point).
Alt-s hw (M-s h w)
Ctrl-x wl (C-x w b)
Inserta todos los pares de expreg/cara resaltados actualmente en el buffer en el punto, con delimitadores de comentario para evitar que cambien su programa. (Esta unión de teclas ejecuta el comando hi-lock-write-interactive-patterns).

Estos patrones se extraen de los comentarios, si procede, si invoca M-x hi-lock-find-patterns, o si visita el archivo mientras el modo Hi Lock está activado (ya que eso ejecuta hi-lock-find-patterns).
Alt-s hf (M-s h f)
Ctrl-x wi (C-x w i)
Extrae los pares regexp/face de los comentarios en el buffer actual (hi-lock-find-patterns). Así, puede introducir patrones de forma interactiva con highlight-regexp, almacenarlos en el archivo con hi-lock-write-interactive-patterns, editarlos (quizás incluyendo diferentes caras para diferentes partes de la coincidencia entre paréntesis), y finalmente utilizar este comando (hi-lock-find-patterns) para que Hi Lock resalte los patrones editados.

La variable hi-lock-file-patterns-policy controla si el modo Hi Lock debe extraer y resaltar automáticamente los patrones encontrados en un archivo cuando es visitado. Su valor puede ser nil (nunca resaltar), ask (consultar al Usuario), o una función. Si es una función, hi-lock-find-patterns la llama con los patrones como argumento; si la función devuelve un valor no nulo, se utilizan los patrones. El valor por defecto es ask. Tenga en cuenta que los patrones siempre se resaltan si llama a hi-lock-find-patterns directamente, independientemente del valor de esta variable.

Además, hi-lock-find-patterns no hace nada si el símbolo del modo principal actual es un miembro de la lista hi-lock-exclude-modes.

Bordes de las ventanas

En las pantallas gráficas, cada ventana de Emacs tiene normalmente franjas estrechas en los bordes izquierdo y derecho. Los franjas se utilizan para mostrar símbolos que proporcionan información sobre el texto de la ventana. Puede teclear Alt-x fringe-mode (M-x fringe-mode) para alternar la visualización de las franjas o para modificar su anchura. Este comando afecta a los franjas de todos los marcos; para modificar los franjas sólo en el marco seleccionado, use Alt-x set-fringe-style (M-x set-fringe-style). Puede hacer que sus cambios en los franjas sean permanentes personalizando la variable fringe-mode.

El uso más común de las franjas es indicar una línea de continuación (véase Líneas de continuación). Cuando una línea de texto se divide en varias líneas de pantalla, la franja izquierda muestra una flecha curva para cada línea de pantalla excepto la primera, indicando que no es el verdadero comienzo. La franja derecha muestra una flecha curva para cada línea de pantalla excepto la última, indicando que ésta no es el verdadero final. Si la dirección de la línea es de derecha a izquierda (ver Edición bidireccional), los significados de las flechas curvas en los franjas se intercambian.

Las franjas indican el truncamiento de la línea (ver Truncado de líneas) con flechas horizontales cortas que significan que hay más texto en esta línea que se desplaza horizontalmente fuera de la vista. Al hacer clic con el ratón en una de las flechas, la pantalla se desplaza horizontalmente en la dirección de la flecha.

Estos márgenes también pueden indicar otras cosas, como los límites del búfer (ver Visualización de los límites), las líneas no utilizadas cerca del final de la ventana (ver Indicar líneas vacías), y dónde se está ejecutando un programa que está depurando (ver Ejecución de depuradores en Emacs).

La franja también se usa para dibujar el cursor, si la línea actual es exactamente tan ancha como la ventana y el punto está al final de la línea. Para desactivar esto, cambia la variable overflow-newline-into-fringe a nil; esto hace que Emacs continúe o trunque las líneas que son exactamente tan anchas como la ventana.

Si personaliza fringe-mode para eliminar las franjas de los márgenes en uno o ambos lados de la pantalla de la ventana, las características que se muestran en dichas franjas no estaran disponibles. Los indicadores de continuación y truncamiento de líneas son una excepción: cuando las franjas no están disponibles, Emacs usa las celdas de caracteres más a la izquierda y más a la derecha para indicar la continuación y el truncamiento con caracteres ASCII especiales, véase Líneas de continuación y Truncado de líneas. Esto reduce el ancho disponible para mostrar el texto en cada línea, porque las celdas de caracteres usadas para los indicadores de truncamiento y continuación están reservadas para ese propósito. Dado que el texto de la memoria intermedia puede incluir texto bidireccional y, por tanto, párrafos de izquierda a derecha y de derecha a izquierda (véase Edición bidireccional), al eliminar sólo uno de los márgenes se siguen reservando dos celdas de caracteres, una a cada lado de la ventana, para los indicadores de truncamiento y continuación, ya que estos indicadores se muestran en lados opuestos de la ventana en los párrafos de derecha a izquierda.

Visualización de los límites

Emacs puede mostrar una indicación de fill-column-position (posición de la columna de relleno, véase Comandos de relleno explícitos). El indicador de columna de relleno es una funcionalidad útil especialmente en el modo prog-mode y sus descendientes (ver Modos principales o Mayores) para indicar la posición de una columna específica que tiene algún significado especial para formatear el código fuente de un programa.

Para activar la visualización de la indicación de la columna de relleno, use los modos menores display-fill-column-indicator-mode y global-display-fill-column-indicator-mode, que activan el indicador local o globalmente, respectivamente.

Alternativamente, puede establecer las dos variables locales del buffer display-fill-column-indicator y display-fill-column-indicator-character para activar el indicador y controlar el carácter usado para la indicación. Tenga en cuenta que ambas variables deben ser no nulas para que se muestre la indicación. (Al activar el modo menor se activan estas dos variables).

Hay 2 variables locales del buffer y una cara para personalizar este modo:

display-fill-column-indicator-column
Especifica el número de columna en el que debe fijarse el indicador. Puede tomar valores numéricos positivos para la columna, o el valor especial t, que significa que se utilizará el valor de la variable fill-column.

Cualquier otro valor desactiva el indicador. El valor por defecto es t.
display-fill-column-indicator-character
Especifica el carácter usado para el indicador. Este carácter puede ser cualquier carácter válido, incluidos los Unicode, si la fuente los soporta. El valor nil desactiva el indicador. Cuando se activa el modo a través de las funciones display-fill-column-indicator-mode o global-display-fill-column-indicator-mode, usarán el carácter especificado por esta variable, si no es nulo (nil); de lo contrario Emacs usará el carácter U+2502 BOX DRAWINGS LIGHT VERTICAL ‘|’ si U+2502 no puede ser mostrado.
fill-column-indicator
Especifica la cara usada para mostrar el indicador. Hereda sus valores por defecto de la sombra de la cara, pero sin color de fondo. Para cambiar el color del indicador, sólo es necesario establecer el color de primer plano de esta cara.

En las pantallas gráficas, Emacs puede indicar los límites del buffer en las franjas. Si activa esta función, la primera línea y la última línea se marcan con imágenes angulares en los franjas. Esto puede combinarse con imágenes de flechas hacia arriba y hacia abajo que indican si es posible desplazar la ventana.

La variable local del búfer indicate-buffer-boundaries controla cómo se indican los límites del búfer y el desplazamiento de la ventana en los franjas. Si el valor es izquierda o derecha, los mapas de bits de ángulos y flechas se muestran en la franja izquierda o derecha, respectivamente.

Si el valor es una lista de asociaciones (véase Listas de asociaciones en el Manual de referencia de Emacs Lisp), cada elemento (indicador . posición) especifica la posición de uno de los indicadores. El indicador debe ser uno de los siguientes: top, bottom, up, down (superior, inferior, arriba, abajo), o t, que especifica la posición por defecto para los indicadores que no están presentes en la lista. La posición es una de las siguientes: left, right (izquierda, derecha) o nil, que especifica que no se debe mostrar este indicador.

Por ejemplo, ((top . left) (t . right)) coloca el mapa de bits del ángulo superior en la franja izquierda, el mapa de bits del ángulo inferior en la franja derecha y ambos mapas de bits de flechas en la franja derecha. Para mostrar sólo los mapas de bits de los ángulos en la franja izquierda, pero no los mapas de bits de las flechas, utilice ((top . left) (bottom . left)).

Espacios en blanco innecesarios

Es fácil dejar espacios innecesarios al final de una línea, o líneas vacías al final de un buffer, sin darse cuenta. En la mayoría de los casos, este espacio en blanco al final de la línea no tiene ningún efecto, pero a veces puede ser una molestia.

Puede hacer visible el espacio en blanco al final de una línea estableciendo la variable local del búfer show-trailing-whitespace a t. De esta forma Emacs muestra el espacio en blanco al final de la línea, usando la cara trailing-whitespace.

Esta característica no se aplica cuando el punto está al final de la línea que contiene el espacio en blanco. Estrictamente hablando, eso es espacio en blanco al final de la línea, pero mostrarlo especialmente en ese caso se ve feo mientras se escribe un nuevo texto. En este caso especial, la ubicación del punto es suficiente para mostrarte que los espacios están presentes.

Escriba Alt-x delete-trailing-whitespace (M-x delete-trailing-whitespace) para eliminar todos los espacios blancos finales. Este comando borra todos los espacios extra al final de cada línea en el buffer, y todas las líneas vacías al final del buffer; para ignorar estas últimas, cambie la variable delete-trailing-lines a nil. Si la región está activa, el comando borra los espacios extra al final de cada línea en la región.

En las pantallas gráficas, Emacs puede indicar las líneas no utilizadas al final de la ventana con una pequeña imagen en la franja izquierda (ver Bordes de las ventanas). La imagen aparece para las líneas de pantalla que no corresponden a ningún texto del búfer, por lo que las líneas en blanco al final del búfer destacan porque carecen de esta imagen. Para activar esta función, establezca la variable local del búfer indicate-empty-lines a un valor no nulo. Puede activar o desactivar esta función para todos los nuevos búferes estableciendo el valor por defecto de esta variable, por ejemplo, (setq-default indicate-empty-lines t).

El modo de espacio en blanco es un modo menor del búfer que permite visualizar muchos tipos de espacios en blanco en el búfer, dibujando los caracteres de espacio en blanco con una cara especial o mostrándolos como glifos especiales. Para activar este modo, escriba Alt-x whitespace-mode (M-x whitespace-mode). Los tipos de espacios en blanco que se visualizan están determinados por la variable de lista whitespace-style. Los elementos individuales de esa lista pueden activarse o desactivarse en el búfer actual escribiendo Alt-x whitespace-toggle-options (M-x whitespace-toggle-options). Esta es una lista parcial de los elementos posibles (ver la documentación de la variable para la lista completa):

face
Activa todas las visualizaciones que utilizan caras especiales. Este elemento tiene un significado especial: si está ausente de la lista, ninguna de las otras visualizaciones tiene efecto, excepto space-mark (marca de espacio), tab-mark (marca de tabulación) y newline-mark (marca de nueva línea).
trailing
Resalta los espacios en blanco al final del texto.
tabsiiii
Resalta los caracteres de tabulación.
spaces
Resalta los caracteres de espacio y de espacio que no son de ruptura.
lines
Resalta las líneas de más de 80 columnas. Para cambiar el límite de columnas, personalice la variable whitespaces-line-colum.
newline
Resalta las nuevas líneas.
missing-newline-at-eof
Resalta el carácter final si el buffer no termina con un carácter de nueva línea.
empty
Resalta las líneas vacías al principio y/o al final del buffer.
big-indent
Destaca las sangrías demasiado profundas. Por defecto, se resalta cualquier secuencia de al menos 4 caracteres de tabulación consecutivos o 32 caracteres de espacio consecutivos. Para cambiar esto, personalice la expresión regular whitespace-big-indent-regexp.
space-mark
Dibuja el espacio y los caracteres de no ruptura con un glifo especial.
tab-mark
Dibuja los caracteres de tabulación con un glifo especial.
newline-mark
Dibuja caracteres de nueva línea con un glifo especial.

El modo global de espacios en blanco es un modo global menor que permite visualizar los espacios en blanco en todos los buffers. Para activar funciones individuales, utilice Alt-x global-whitespace-toggle-options (M-x global-whitespace-toggle-options).

Visualización selectiva

Emacs tiene la capacidad de ocultar las líneas con una sangría superior a un número determinado de columnas. Puede usar esto para obtener una visión general de una parte de un programa.

Para ocultar líneas en el buffer actual, escriba Ctrl-x $ set-selective-display (C-x $, set-selective-display) con un argumento numérico n. Entonces las líneas con al menos n columnas de sangría desaparecen de la pantalla. La única indicación de su presencia es que aparecen tres puntos (‘...’) al final de cada línea visible que va seguida de una o más líneas ocultas.

Los comandos Ctrl-n (C-n) y Ctrl-p (C-p) se desplazan por las líneas ocultas como si no estuvieran allí.

Las líneas ocultas siguen estando presentes en la memoria intermedia, y la mayoría de los comandos de edición las ven como siempre, por lo que es posible que encuentre un punto en medio del texto oculto. Cuando esto ocurre, el cursor aparece al final de la línea anterior, después de los tres puntos. Si el punto está al final de la línea visible, antes de la nueva línea que la termina, el cursor aparece antes de los tres puntos.

Para volver a hacer visibles todas las líneas, escriba Ctrl-x $ (C-x $) sin argumento.

Si establece la variable selective-display-ellipses en nil, los tres puntos no aparecen al final de una línea que precede a las líneas ocultas. Entonces no hay indicación visible de las líneas ocultas. Esta variable se convierte en local automáticamente cuando se establece.

Véase también Modo Contorno para otra forma de ocultar parte del texto en un búfer.

Características opcionales de la línea de modo

El porcentaje del buffer (pos) indica el porcentaje del buffer por encima de la parte superior de la ventana. Además, puede mostrar el tamaño del búfer escribiendo Alt-x size-indication-mode (M-x size-indication-mode) para activar el modo de indicación de tamaño. ‘k’ para 103, ‘M’ para 106, ‘G’ para 109, etc., para abreviar.

El número de línea actual del punto aparece en la línea de modo cuando el modo de número de línea está activado. Use el comando Alt-x line-number-mode (M-x line-number-mode) para activar y desactivar este modo; normalmente está activado. El número de línea aparece después del porcentaje del buffer pos, con la letra ‘L’ para indicar de qué se trata.

Del mismo modo, puede mostrar el número de columna actual activando el modo de número de columna con Alt-x column-number-mode (M-x column-number-mode). El número de columna se indica con la letra ‘C’. Sin embargo, cuando ambos modos están activados, los números de línea y columna se muestran entre paréntesis, el número de línea primero, en lugar de con ‘L’ y ‘C’. Por ejemplo: ‘(561,2)’. Véase Modos menores, para más información sobre los modos menores y sobre cómo usar estos comandos.

En el modo de número de columna, el número de columna mostrado cuenta desde cero empezando por el margen izquierdo de la ventana. Si prefiere que el número de columna mostrado cuente a partir de uno, puede configurar el indicador de número de columna basado en cero como nul (column-number-indicator-zero-based).

Si ha estrechado el búfer (véase Estrechamiento), el número de línea mostrado es relativo a la parte accesible del búfer. Por lo tanto, no es adecuado como argumento para goto-line. (El comando what-line muestra el número de línea relativo a todo el archivo.) Puede utilizar el comando goto-line-relative para mover el punto a la línea relativa a la porción accesible del buffer estrechado.

Si el búfer es muy grande (mayor que el valor de line-number-display-limit), Emacs no calculará el número de línea, porque eso sería demasiado lento; por lo tanto, el número de línea no aparecerá en la línea de modo. Para eliminar este límite, establezca line-number-display-limit a nil.

El cálculo del número de línea también puede ser lento si las líneas en el buffer son demasiado largas. Por esta razón, Emacs no muestra los números de línea si la anchura media, en caracteres, de las líneas cercanas al punto es mayor que el valor de line-number-display-limit-width. El valor por defecto es de 200 caracteres.

Emacs puede mostrar opcionalmente la hora y la carga del sistema en todas las líneas del modo. Para activar esta característica, escriba Alt-x display-time (M-x display-time) o personalice la opción display-time-mode. La información añadida a la línea de modo tiene el siguiente aspecto:

hh:mmPM l.ll

Aquí hh y mm son la hora y el minuto, seguidos siempre de ‘AM’ o ‘PM’. l.ll es el número medio, recogido para los últimos minutos, de procesos en todo el sistema que estaban en ejecución o listos para ejecutarse (es decir, que estaban esperando un procesador disponible). (Algunos campos pueden faltar si su sistema operativo no los soporta). Si prefiere que la hora se muestre en formato de 24 horas, establezca la variable display-time-24hr-format en t.

La palabra "Mail" (Correo) aparece después del nivel de carga si hay correo para Usted que aún no ha leído. En las pantallas gráficas, puede utilizar un icono en lugar de ‘Mail’ (Correo) personalizando display-time-use-mail-icon; esto puede ahorrar algo de espacio en la línea de modo. Puede personalizar display-time-mail-face para que el indicador de correo sea prominente. Utilice display-time-mail-file para especificar el archivo de correo a comprobar, o establezca display-time-mail-directory para especificar el directorio a comprobar para el correo entrante (cualquier archivo regular no vacío en el directorio se considera como correo recién llegado).

Cuando se ejecuta Emacs en un ordenador portátil, se puede mostrar la carga de la batería en la línea de modo, utilizando el comando display-battery-mode o personalizando la variable display-battery-mode. La variable battery-mode-line-format determina la forma en que se muestra la carga de la batería; el mensaje exacto de la línea de modo depende del sistema operativo, y normalmente muestra la carga actual de la batería como un porcentaje de la carga total.

En las pantallas gráficas, la línea de modo se dibuja como un cuadro en 3D. Si no te gusta este efecto, puedes desactivarlo personalizando la cara de la línea de modo y estableciendo su atributo de caja como nulo. Véase Personalización de las caras.

Por defecto, la línea de modo de las ventanas no seleccionadas se muestra en una cara diferente, llamada mode-line-inactive. Sólo la ventana seleccionada se muestra en la cara de la línea de modo. Esto ayuda a mostrar qué ventana está seleccionada. Cuando se selecciona el minibuffer, como no tiene línea de modo, la ventana desde la que se activó el minibuffer tiene su línea de modo mostrada usando mode-line; como resultado, la entrada normal en el minibuffer no cambia ninguna línea de modo.

Puede desactivar el uso de mode-line-inactive estableciendo la variable mode-line-in-non-selected-windows a nil; entonces todas las líneas de modo se muestran en la cara mode-line.

Puede personalizar la visualización de la línea de modo para cada uno de los formatos de fin de línea estableciendo cada una de las variables eol-mnemonic-unix, eol-mnemonic-dos, eol-mnemonic-mac y eol-mnemonic-undecided a las cadenas que prefiera.

Cómo se muestra el texto

La mayoría de los caracteres son caracteres de impresión: cuando aparecen en una memoria intermedia, se muestran literalmente en la pantalla. Los caracteres de impresión incluyen números, letras y caracteres de puntuación ASCII, así como muchos caracteres no ASCII.

El conjunto de caracteres ASCII contiene caracteres de control no imprimibles. Dos de ellos se muestran de forma especial: el carácter de nueva línea (punto de código Unicode U+000A) se muestra iniciando una nueva línea, mientras que el carácter de tabulación (U+0009) se muestra como un espacio que se extiende hasta la siguiente columna de tabulación (normalmente cada 8 columnas). El número de espacios por tabulación está controlado por la variable local del búfer tab-width, que debe tener un valor entero entre 1 y 1000, ambos inclusive. Tenga en cuenta que la forma en que se muestra el carácter de tabulación en el búfer no tiene nada que ver con la definición de TAB como comando.

Otros caracteres de control ASCII, cuyos códigos son inferiores a U+0020 (octal 40, decimal 32), se muestran como un signo de intercalación (‘^’) seguido de la versión sin control del carácter, con la cara del glifo de escape (escape-glyph). Por ejemplo, el carácter "control-A", U+0001, se muestra como "^A".

Los bytes sin procesar con los códigos U+0080 (octal 200) a U+009F (octal 237) se muestran como secuencias de escape octales, con la cara del glifo de escape (escape-glyph). Por ejemplo, el código de carácter U+0098 (octal 230) se muestra como ‘\230’. Si cambia la variable local del búfer ctl-arrow a nil, los caracteres de control ASCII también se muestran como secuencias de escape octales en lugar de secuencias de escape caret. (También puede solicitar que los bytes sin procesar se muestren en hexadecimal, véase Personalización de la pantalla).

Algunos caracteres no ASCII tienen la misma apariencia que un espacio ASCII o un guión del medio (-). Dichos caracteres pueden causar problemas si se introducen en un buffer sin que se des cuenta, por ejemplo, cuando se tira de texto (yanking); o en instancias como la que se describe a continuación: los compiladores de código fuente normalmente no tratan los espacios no ASCII como caracteres de espacio en blanco. Para solucionar este problema, Emacs muestra estos caracteres de forma especial: muestra U+00A0 NO-BREAK SPACE y otros caracteres de la clase de espacios horizontales de Unicode con la cara nobreak-space, y muestra U+00AD SOFT HYPHEN, U+2010 HYPHEN, y U+2011 NON-BREAKING HYPHEN con la cara nobreak-hyphen. Para desactivar esto, cambie la variable nobreak-char-display a nil. Si le da a esta variable un valor que no sea nul ni t, Emacs mostrará estos caracteres como una barra invertida resaltada seguida de un espacio o guión.

Puede personalizar la forma en que se muestra cualquier código de carácter particular por medio de una tabla de visualización. Vea Tablas de visualización en el Manual de referencia de Emacs Lisp.

En las pantallas gráficas, algunos caracteres pueden no tener glifos en ninguna de las fuentes disponibles para Emacs. Estos caracteres sin glifos se muestran normalmente como cuadros que contienen el código de carácter hexadecimal. Del mismo modo, en los terminales de texto, los caracteres que no pueden mostrarse utilizando la codificación del terminal (véase Sistemas de codificación para E/S de terminales) se muestran normalmente como signos de interrogación. Puede controlar el método de visualización personalizando la variable glyphless-char-display-control. También puede personalizar la variable glyphless-char-display-control para que estos caracteres sean más prominentes en la pantalla. Vea Visualización de caracteres sin glifo en el Manual de Referencia Lisp, para más detalles.

Emacs intenta determinar si las comillas curvas y pueden mostrarse en la pantalla actual. Por defecto, si esto parece ser así, entonces Emacs traducirá las comillas ASCII (` y '), cuando aparezcan en mensajes y textos de ayuda, a estas comillas curvas. Puedes influir o inhibir esta traducción personalizando la opción de Usuario text-quoting-style (ver Claves de la documentación en el Manual de Referencia Lisp).

Si se sabe que las comillas curvas , , y se parecen a los caracteres ASCII, se muestran con la cara del homoglifo (homoglyph face). Las comillas curvas que se sabe que no son visualizables se muestran como sus aproximaciones ASCII `, ' y " con la cara del homoglifo.

Visualización del cursor

En un terminal de texto, la apariencia del cursor es controlada por el terminal, en gran parte fuera del control de Emacs. Algunos terminales ofrecen dos cursores diferentes: un cursor estático visible, y un cursor parpadeante muy visible. Por defecto, se usa el cursor muy visible, y el Editor cambia a él cuando se inicia o renauda. Si la variable visible-cursor es nula cuando Emacs se inicia o reanuda, utiliza el cursor normal.

En una pantalla gráfica, se pueden alterar muchas más propiedades del cursor de texto. Para personalizar su color, cambie el atributo :background de la cara llamada cursor (ver Personalización de las caras). Los otros atributos de esta cara no tienen efecto; el texto que se muestra bajo el cursor se dibuja utilizando el color de fondo del marco. Para cambiar su forma, personalice la variable local del búfer cursor-type; los valores posibles son box (el valor por defecto), box . size (el cursor de caja se convierte en una caja hueca bajo imágenes enmascaradas de tamaño superior a los píxeles en cualquier dimensión), hollow (una caja hueca), bar (una barra vertical), bar . n (una barra vertical de n píxeles de ancho), hbar (una barra horizontal), hbaritt . n (una barra horizontal de n píxeles de alto), o nil (ningún cursor).

Por defecto, el cursor deja de titilar después de 10 parpadeos, si Emacs no recibe ninguna entrada durante ese tiempo; cualquier evento de entrada reinicia la cuenta. Puede personalizar la variable blink-cursor-blinks para controlar eso: su valor dice cuántas veces parpadeará sin entrada antes de detenerse. Establecer esta variable a un valor cero o negativo hará que el cursor parpadee para siempre. Para desactivar el parpadeo del cursor por completo, cambie la variable blink-cursor-mode a nil (ver Interfaz de Fácil Personalización), o añada la línea:

(blink-cursor-mode 0)

a su archivo init. Alternativamente, puede cambiar cómo se ve el cursor cuando se apaga personalizando la variable de lista blink-cursor-alist. Cada elemento de la lista debe tener la forma (on-type . off-type); esto significa que si el cursor se muestra como on-type cuando parpadea on (donde on-type es uno de los tipos de cursor y descritos anteriormente), entonces se muestra como off-type cuando parpadea off.

Algunos caracteres, como los de tabulación, son extra anchos. Cuando el cursor se sitúa sobre un carácter de este tipo, normalmente se dibuja con el ancho de carácter por defecto. Puede hacer que el cursor se estire para cubrir los caracteres anchos, cambiando la variable x-stretch-cursor a un valor no nulo.

El cursor aparece normalmente en las ventanas no seleccionadas como una caja hueca no parpadeante. Para desactivar el cursor en las ventanas no seleccionadas, cambie la variable cursor-in-non-selected-windows a nil.

Para que el cursor sea aún más visible, puede utilizar el modo HL Line, un modo menor que resalta la línea que contiene el punto. Utilice Alt-x hl-line-mode (M-x hl-line-mode) para activarlo o desactivarlo en el buffer actual. Alt-x global-hl-line-mode (M-x global-hl-line-mode) activa o desactiva el mismo modo globalmente.

Truncado de líneas

Como alternativa a la continuación (ver Líneas de Continuación), Emacs puede mostrar líneas largas por truncamiento. Esto significa que todos los caracteres que no caben en el ancho de la pantalla o ventana no aparecen en absoluto. En las pantallas gráficas, una pequeña flecha recta en la franja indica el truncamiento en cualquiera de los extremos de la línea. En los terminales de texto, esto se indica con signos ‘$’ en las columnas de la derecha y/o de la izquierda.

El desplazamiento horizontal provoca automáticamente el truncamiento de la línea (véase Desplazamiento horizontal). Puede activar explícitamente el truncamiento de líneas para un búfer concreto con el comando Ctrl-x xt toggle-truncate-lines (C-x x t, toggle-truncate-lines). Esto funciona cambiando localmente la variable truncate-lines. Si esa variable no es nula, las líneas largas se truncan; si es nula, se continúan en varias líneas de la pantalla. Si se establece la variable truncate-lines de cualquier manera, se hace local para el buffer actual; hasta ese momento, el valor por defecto, que normalmente es nulo, está en efecto.

Dado que el truncamiento de líneas y el ajuste de palabras (descrito en la siguiente sección) son contradictorios, toggle-truncate-lines desactiva el ajuste de palabras cuando activa el truncamiento de líneas.

Si una ventana dividida se vuelve demasiado estrecha, Emacs puede activar automáticamente el truncamiento de líneas. Vea Dividir las ventanas, para la variable truncate-partial-width-windows que controla esto.

Modo de línea visual

Otra alternativa a la continuación de línea ordinaria es usar el ajuste de palabras. Aquí, cada línea lógica larga se divide en dos o más líneas de pantalla, como en la continuación de línea ordinaria. Sin embargo, Emacs intenta ajustar la línea en los límites de la palabra cerca del borde derecho de la ventana. (Si la dirección de la línea es de derecha a izquierda, se envuelve en el borde izquierdo de la ventana). Esto hace que el texto sea más fácil de leer, ya que el ajuste no se produce en medio de las palabras.

El ajuste de palabras se activa mediante el modo Línea Visual (Visual Line mode), un modo menor opcional. Para activar el modo de línea visual en el búfer actual, escriba Alt-x visual-line-mode (M-x visual-line-mode); repitiendo este comando se desactiva. También puede activar el modo de línea visual mediante la barra de menús: en el menú Opciones, seleccione el submenú ‘Line Wrapping in this Buffer’ (Ajuste de líneas en este búfer), seguido del elemento de menú Word Wrap (Ajuste de palabras) (Visual Line Mode, modo de línea visual). Mientras el modo Visual Line está activado, la línea de modo muestra la cadena ‘wrap’ en la pantalla de modo. El comando Alt-x global-visual-line-mode (M-x global-visual-line-mode) activa el modo Visual Line en todos los buffers.

Dado que el ajuste de palabras y el truncamiento de líneas (descrito en la sección anterior) son contradictorios, al activar el modo de línea visual se desactiva el truncamiento de líneas.

En el modo de línea visual, algunos comandos de edición funcionan en líneas de pantalla en lugar de líneas lógicas: Ctrl-a (C-a, beginning-of-visual-line) se desplaza al principio de la línea de pantalla, Ctrl-e (C-e, end-of-visual-line) se desplaza al final de la línea de pantalla, y Ctrl-k (C-k, kill-visual-line) elimina el texto hasta el final de la línea de pantalla.

Para desplazarse por líneas lógicas, utilice los comandos Alt-x next-logical-line (M-x next-logical-line) y Alt-x previous-logical-line (M-x previous-logical-line). Éstos mueven el punto a la siguiente línea lógica y a la línea lógica anterior, respectivamente, independientemente de si el modo de línea visual está activado. Si utiliza estos comandos con frecuencia, puede ser conveniente asignarles enlaces de teclas. Consulte la sección "Reasignación de teclas en el archivo de inicio".

Por defecto, las líneas envueltas en palabras no muestran indicadores de franja. El modo de línea visual se usa a menudo para editar archivos que contienen muchas líneas lógicas largas, por lo que tener en la franja un indicador para cada línea envuelta sería una distracción visual. Puede cambiar esto personalizando la variable visual-line-fringe-indicators.

Por defecto, Emacs sólo rompe las líneas después de los caracteres de espacio en blanco. Esto produce resultados incorrectos cuando se mezclan textos CJK y latinos (porque los caracteres CJK no usan espacios en blanco para separar palabras). Puede personalizar la opción word-wrap-by-category para permitir que el Editor rompa las líneas después de cualquier carácter con categoría ‘|’ (ver Categorías en el Manual de Referencia de Emacs Lisp), lo que proporciona un mejor soporte para los caracteres CJK. Además, si esta variable se establece usando Customize, Emacs carga automáticamente kinsoku.el. Cuando se carga kinsoku.el, Emacs respeta las reglas de kinsoku al romper líneas. Eso significa que los caracteres con la categoría ‘>’ no aparecen al principio de una línea (por ejemplo, U+FF0C COMMA COMPLETA), y que los caracteres con la categoría ‘<’ no aparecen al final de una línea (por ejemplo, U+300A ABAJO DOBLE ÁNGULO IZQUIERDO). Puede ver el conjunto de categorías de un carácter utilizando los comandos char-category-set y category-set-mnemonics, o escribiendo Ctrl-u Ctrl-x = (C-u C-x =) con punto en el carácter y mirando la sección "category" del informe. Puede añadir categorías a un caracter utilizando el comando modify-category-entry.

Personalización de la pantalla

Esta sección describe las variables que controlan diversos aspectos de la apariencia de la pantalla de Emacs. Los Usuarios principiantes pueden saltársela.

Si quiere que Emacs muestre los números de línea para cada línea en el buffer, personalice la variable local del buffer display-line-numbers; es nula por defecto. Esta yvariable puede tener varios valores diferentes para soportar varios modos de visualización de números de línea:

t
Muestra un número de línea (absoluto) antes de cada línea de pantalla que no sea de continuación y que muestre el texto del búfer. Si la línea es una línea de continuación, o si toda la línea de pantalla muestra una cadena de visualización o de superposición, esa línea no será numerada.
relative
Muestra los números de línea relativos antes de las líneas que no son de continuación y que muestran texto en la memoria intermedia. Los números de línea son relativos al punto de visualización de la línea, por lo que los números crecen tanto hacia arriba como hacia abajo a medida que las líneas se alejan de la línea actual. Muestra los números de línea relativos antes de las líneas que no son de continuación y que muestran texto en la memoria intermedia. Los números de línea son relativos al punto de visualización de la línea, por lo que los números crecen tanto hacia arriba como hacia abajo a medida que las líneas se alejan de la línea actual.
visual
Este valor hace que Emacs cuente las líneas visualmente: sólo se contarán las líneas mostradas en la pantalla (sin tener en cuenta las líneas en partes invisibles del texto), y las líneas que se envuelven para consumir más de una línea de la pantalla se numerarán ese número de veces. Los números mostrados son relativos, como en el caso del valor relativo anterior. Esto es útil en los modos que doblan el texto, como el modo Contorno (ver Modo Contorno), y cuando se necesita moverse por el número exacto de líneas de la pantalla.
anything else (cualquier otra cosa)
Cualquier otro valor no nulo es tratado como t.

El comando Alt-x display-line-numbers-mode (M-x display-line-numbers-mode) proporciona una forma conveniente de activar la visualización de los números de línea. Este modo tiene una variante globalizada, global-display-line-numbers-mode. La opción de Usuario display-line-numbers-type controla qué submodo de visualización de números de línea, descrito anteriormente, activará estos modos.

Tenga en cuenta que los números de línea no se muestran en el minibuffer ni en la información sobre herramientas, incluso si activa el modo de mostrar números de línea globalmente.

Cuando Emacs muestra los números de línea relativos, puede controlar el número que se muestra antes de la línea actual, el punto de visualización de la línea. Por defecto, el Editor muestra allí el número absoluto de la línea actual, aunque todos los demás números de línea sean relativos. Si personaliza la variable display-line-numbers-current-absolute a un valor nulo, el número mostrado para la línea actual será cero. Esto es útil si no le importa el número de la línea actual, y quiere dejar más espacio horizontal para el texto en búferes grandes.

En un búfer estrecho (ver Estrechamiento) las líneas se numeran normalmente empezando por el principio del estrechamiento. Sin embargo, si personaliza la variable display-line-numbers-widen a un valor no nulo, los números de línea ignorarán cualquier estrechamiento y comenzarán en el primer carácter del buffer.

Si el valor de display-line-numbers-offset es distinto de cero, dicho valor se añade a cada número de línea absoluto, y las líneas se cuentan desde el principio del buffer, como si display-line-numbers-widen fuera distinto de cero. No tiene ningún efecto cuando se pone a cero, o cuando los números de línea no son absolutos.

En el modo de visualización selectiva (ver Visualización selectiva), y otros modos que ocultan muchas líneas de la visualización (como los modos Outline y Org), puede desear personalizar las variables display-line-numbers-width-start y display-line-numbers-grow-only, o establecer display-line-numbers-width a un valor suficientemente grande, para evitar errores ocasionales de cálculo del espacio reservado para los números de línea.

Los números de línea se muestran en una cara especial line-number. El número de línea actual se muestra en una cara diferente, line-number-current-line, para que pueda hacer que el número de la línea actual tenga una apariencia distintiva, lo que ayudará a localizar el punto de visualización de la línea. Las caras adicionales line-number-major-tick y line-number-minor-tick pueden utilizarse para resaltar los números de línea de las líneas que son múltiplos de ciertos números. Personalice la visualización de los números de línea mayor y menor respectivamente para establecer estos números.

Si la variable visible-bell es no nula, Emacs intenta hacer que toda la pantalla parpadee cuando normalmente haría un sonido de campana audible. Esta variable no tiene efecto si su terminal no tiene una forma de hacer parpadear la pantalla.

La variable echo-keystrokes controla el eco de las teclas de varios caracteres; su valor es el número de segundos de pausa necesarios para que comience el eco, o cero, lo que significa que no se hace eco en absoluto. El valor tiene efecto cuando hay algo de lo que hacerse eco. Ver El área de eco.

En pantallas gráficas, Emacs muestra el puntero del ratón como un reloj de arena si Emacs está ocupado. Para desactivar esta característica, establece la variable display-hourglass a nil. La variable hourglass-delay determina el número de segundos de tiempo ocupado antes de que se muestre el reloj de arena; el valor por defecto es 1.

Si el puntero del ratón se encuentra dentro de un marco de Emacs, este, lo hace invisible cada vez que escribe un carácter para insertar texto, para evitar que oscurezca el texto. (Para ser precisos, la ocultación se produce cuando se escribe un carácter de autoinserción. Vea Inserción de texto). Al mover el puntero del ratón se vuelve a hacer visible. Para desactivar esta función, establezca la variable make-pointer-invisible a nil.

En las pantallas gráficas, la variable underline-minimum-offset determina la distancia mínima entre la línea de base y el subrayado, en píxeles, para el texto subrayado. Por defecto, el valor es 1; aumentarlo puede mejorar la legibilidad del texto subrayado para ciertas fuentes. (Sin embargo, Emacs nunca dibujará el subrayado por debajo del área de la línea actual). La variable x-underline-at-descent-line determina cómo dibujar el texto subrayado. El valor por defecto es nil, lo que significa dibujarlo al nivel de la línea base de la fuente; si lo cambia a t, Emacs dibuja el subrayado a la misma altura que la línea descendente de la fuente. (Si se ha especificado un espaciado de línea no predeterminado para el texto subrayado, véase Altura de línea en El manual de referencia de Emacs Lisp, el Editor dibuja el subrayado por debajo del espaciado adicional).

La variable overline-margin especifica la posición vertical de una sobrelínea sobre el texto, incluyendo la altura de la propia sobrelínea, en píxeles; el valor por defecto es 2.

En algunos terminales de texto, la negrita y el vídeo inverso dan lugar a un texto difícil de leer. Llame a la función tty-suppress-bold-inverse-default-colors con un argumento no nulo para suprimir el efecto de la negrita en este caso.

Los bytes crudos se muestran en formato octal por defecto, por ejemplo un byte con un valor decimal de 128 se muestra como \200. Para cambiar la visualización al formato hexadecimal de (\x80), establezca la variable display-raw-bytes-as-hex a t.



Búsqueda y reemplazo

Al igual que otros editores, Emacs tiene comandos para buscar apariciones de una cadena. También tiene comandos para reemplazar las ocurrencias de una cadena con una cadena diferente. También hay comandos que hacen lo mismo, pero buscan patrones en lugar de cadenas fijas.

También puede buscar en varios archivos bajo el control de xref (ver Buscar y reemplazar con identificadores) o a través del comando Dired: A (ver Operar con archivos), o pedirle al programa grep que lo haga (ver Buscar con Grep en Emacs).

Búsqueda Incremental

El principal comando de búsqueda en Emacs es incremental: comienza a buscar tan pronto como escribe el primer carácter de la cadena de búsqueda. A medida que escribe la cadena de búsqueda, muestra dónde se encontraría la cadena (tal y como la ha escrito hasta ahora). Cuando haya escrito suficientes caracteres para identificar el lugar que quiere, puede parar. Dependiendo de lo que planee hacer a continuación, puede o no necesitar terminar la búsqueda explícitamente con RETURN (RET).

Ctrl-s (C-s)
Búsqueda incremental hacia adelante (isearch-forward).
Ctrl-r (C-r)
Búsqueda incremental hacia adelante (isearch-forward).

También puede invocar la búsqueda incremental desde el menú 'Edit->Search' (Edición -> Búsqueda) de la barra de menús.

Fundamentos de la búsqueda incremental

Ctrl-s (C-s)
Comienza la búsqueda incremental (isearch-forward).
Ctrl-r (C-r)
Inicia una búsqueda incremental inversa (isearch-backward).

Ctrl-s isearch-forward (C-s, isearch-forward) inicia una búsqueda incremental hacia adelante. Lee los caracteres del teclado y mueve el punto justo después del final de la siguiente aparición de esos caracteres en el buffer.

Por ejemplo, si escribe Ctrl-s (C-s) y luego F, eso pone el cursor después de la primera 'F' que aparece en el buffer después del punto de partida. Si luego escribe O, el cursor se mueve justo después del primer 'FO'; la 'F' en ese 'FO' podría no ser la primera 'F' encontrada previamente. Después de otra O, el cursor se mueve justo después del primer 'FOO'.

En cada paso, Emacs resalta la coincidencia actual -el texto del buffer que coincide con la cadena de búsqueda- usando la cara isearch (ver Faces (Caras) de Texto). Vea Adaptación de la búsqueda a sus necesidades, para varias opciones que personalizan este resaltado. La cadena de búsqueda actual también se muestra en el área de eco.

Si se equivoca al escribir la cadena de búsqueda, escriba DEL (DEL, isearch-suprimir-car). Cada DEL cancela el último elemento de entrada introducido durante la búsqueda. Emacs registra un nuevo elemento de entrada cada vez que se escribe un comando que cambia la cadena de búsqueda, la posición del punto, el éxito o el fracaso de la búsqueda, la dirección de la búsqueda, la posición del otro extremo del resultado de la búsqueda actual, o la "envoltura" de la búsqueda. Vea Errores en la búsqueda incremental, para más información sobre cómo tratar la búsqueda fallida.

Cuando esté satisfecho con el lugar al que ha llegado, escriba RETURN (RET, isearch-exit). Esto detiene la búsqueda, dejando el cursor donde la búsqueda lo llevó. Además, cualquier comando no especialmente significativo en las búsquedas detiene la búsqueda y se ejecuta. Así, al teclear Ctrl-a (C-a) se sale de la búsqueda y se mueve al principio de la línea; al teclear una de las teclas de flecha se sale de la búsqueda y se ejecuta el comando de movimiento respectivo; etc. RET es necesario sólo si el siguiente comando que quiere escribir es un carácter de impresión, DEL, RET, u otro carácter que es especial dentro de las búsquedas (Ctrl-q (C-q), Ctrl-w (C-w), Ctrl-r (C-r), Ctrl-s (C-s), Ctrl-y (C-y), Alt-y (M-y), Alt -r (M-r), Alt-c (M-c), Alt-e (M-e)), y algunos otros descritos más adelante). Puede ajustar los comandos que salen de la búsqueda; véase No salir de la búsqueda incremental.

Como excepción especial, introducir RETURN (RET) cuando la cadena de búsqueda está vacía, se inicia la búsqueda no incremental (véase Búsqueda no incremental).(Esto se puede personalizar; véase Adaptación de la búsqueda a sus necesidades).

Para abandonar la búsqueda y volver al lugar donde comenzó, escriba Esc Esc Esc (ESC ESC ESC, isearch-cancel) o Ctrl-g Ctrl-g (C-g C-g, isearch-abort).

Al salir de la búsqueda incremental, se añade el valor original del punto al anillo de marcas, sin activar la marca; por lo tanto, puede usar Ctrl-u Ctrl SPACE (C-u C-SPC) o Ctrl-x Ctrl-x (C-x C-x) para volver al lugar donde estaba antes de comenzar la búsqueda. Véase El anillo de marcas. (Emacs sólo hace esto si la marca no estaba ya activa; si la marca estaba activa cuando empezó la búsqueda, tanto Ctrl-u Ctrl-SPACE (C-u C-SPC) como Ctrl-x Ctrl-x (C-x C-x) irán a la marca).

Para buscar hacia atrás, use Ctrl-r (C-r, isearch-backward) en lugar de Ctrl-s (C-s) para iniciar la búsqueda. Una búsqueda hacia atrás encuentra coincidencias que terminan antes del punto de partida, al igual que una búsqueda hacia delante encuentra coincidencias que comienzan después.

Repetición de la búsqueda incremental

Suponga que busca 'FOO' hacia adelante y encuentra una coincidencia, pero no la que esperaba encontrar: el 'FOO' que buscaba aparece más adelante en la memoria intermedia. En este caso, escriba otra vez Ctrl-s (C-s, isearch-repeat-forward) para pasar a la siguiente aparición de la cadena de búsqueda, u otra vez Ctrl-r (C-r, isearch-repeat-backward) para pasar a la aparición anterior. Puede repetir estos comandos cualquier número de veces. Como alternativa, puede proporcionar un argumento numérico de prefijo n a Ctrl-s (C-s) y Ctrl-r (C-r) para encontrar la enésima aparición siguiente o anterior. Si se excede, puede cancelar algunos comandos Ctrl-s (C-s) con DEL (DEL). Del mismo modo, cada Ctrl-r (C-r, isearch-repeat-backward) en una búsqueda incremental hacia atrás repite la búsqueda hacia atrás.

Si hace una pequeña pausa durante la búsqueda incremental, Emacs resalta todas las otras posibles coincidencias para la cadena de búsqueda que están presentes en la pantalla. Esto le ayuda a anticipar a dónde puede llegar escribiendo Ctrl-s (C-s) o Ctrl-r (C-r) para repetir la búsqueda. Las otras coincidencias se resaltan de forma diferente a la coincidencia actual, usando la cara personalizable lazy-highlight (ver Faces (Caras) de texto). Si no le gusta esta función, puede desactivarla poniendo isearch-lazy-highlight a cero. Para otras personalizaciones relacionadas con el resaltado de coincidencias, consulte Adaptar la búsqueda a sus necesidades.

Después de salir de una búsqueda, puede volver a buscar la misma cadena escribiendo sólo Ctrl-s Ctrl-s (C-s C-s). La primera Ctrl-s es la teclas que invoca la búsqueda incremental, y la segunda Ctrl-s significa buscar de nuevo la última cadena de búsqueda. Del mismo modo, Ctrl-r Ctrl-r (C-r C-r) busca hacia atrás la última cadena de búsqueda. Para determinar la última cadena de búsqueda, no importa si esa cadena se buscó con Ctrl-s (C-s) o Ctrl-r (C-r).

Si está buscando hacia adelante pero se da cuenta de que estaba buscando algo antes del punto de partida, escriba Ctrl-r (C-r) para cambiar a una búsqueda hacia atrás, dejando la cadena de búsqueda sin cambios. Del mismo modo, Ctrl-s (C-s) en una búsqueda hacia atrás cambia a una búsqueda hacia delante.

Cuando cambie la dirección de una búsqueda, el primer comando que escriba permanecerá, por defecto, en la misma coincidencia, y el cursor se moverá al otro extremo de la coincidencia. Para pasar a otra coincidencia inmediatamente, personalice la variable isearch-repeat-on-direction-change a t.

Si una búsqueda está fallando y pide repetirla escribiendo otra combinación Ctrl-s (C-s), vuelve a empezar desde el principio del buffer. La repetición de una búsqueda inversa fallida con Ctrl-r (C-r) comienza de nuevo desde el final. A esto se le llama envolver alrededor de (o rodear), y una vez que ha sucedido esto, aparece ‘Wrapped’ en el indicador de búsqueda. Si sigue pasando por el punto de partida original de la búsqueda, cambia a ‘Overwrapped’ (Sobrepasado), lo que significa que está revisando coincidencias que ya ha visto.

Puede controlar lo que ocurre cuando no hay más coincidencias personalizando la opción de usuario isearch-wrap-pause. Si es t (el valor por defecto), señala un error. (Si es no, emite un ding y envuelve inmediatamente después de alcanzar la última coincidencia. Si es no-ding, se envuelve inmediatamente, pero no se emite un ding. Por último, si es nulo, no se envolverá nunca, sino que se detendrá en la última coincidencia.

Para reutilizar cadenas de búsqueda anteriores, use el anillo de búsqueda. Los comandos Alt-p (M-p, isearch-ring-retreat) y Alt-n (M-n, isearch-ring-advance) se mueven a través del anillo para elegir una cadena de búsqueda para reutilizar. Estos comandos dejan el elemento del anillo de búsqueda seleccionado en el minibuffer, donde puedes editarlo. Escriba Ctrl-s / Ctrl-r (C-s / C-r) o RET para aceptar la cadena y empezar a buscarla. El número de cadenas de búsqueda usadas más recientemente guardadas en el anillo de búsqueda se especifica con la variable search-ring-max, 16 por defecto.

Para editar la cadena de búsqueda actual en el minibuffer sin reemplazarla con elementos del anillo de búsqueda, escriba Alt-e (M-e, isearch-edit-string) o haga clic con (ratón-1) en el minibuffer. Escriba (RET), Ctrl-s (C-s) o Ctrl-r (C-r) para terminar de editar la cadena y buscarla. Escriba Ctrl-f (C-f) o (RIGHT) para añadir a la cadena de búsqueda los caracteres siguientes al punto del buffer desde el que inició la búsqueda.

Reinserción de Texto y Búsqueda Incremental

En muchos casos, querrá utilizar el texto en el punto o cerca del punto como su cadena de búsqueda. Los comandos descritos en esta subsección le permiten hacerlo convenientemente.

Ctrl-w (C-w, isearch-yank-word-or-char) añade el siguiente carácter o palabra en el punto a la cadena de búsqueda. Esta es una forma fácil de buscar otra ocurrencia del texto en el punto. (La decisión de copiar un carácter o una palabra es heurística.) Con un argumento numérico de prefijo n, añade los siguientes n caracteres o palabras. Ctrl-w (C-w, isearch-yank-word-or-char) añade el siguiente carácter o palabra en el punto a la cadena de búsqueda. Esta es una forma fácil de buscar otra ocurrencia del texto en el punto. (La decisión de copiar un carácter o una palabra es heurística.) Con un argumento numérico de prefijo n, añade los siguientes n caracteres o palabras.

Ctrl-Alt-w (C-M-w, isearch-yank-symbol-or-char) añade el siguiente carácter o símbolo en el punto a la cadena de búsqueda. Esta es una forma sencilla de buscar otra aparición del símbolo en el punto. (La decisión de copiar un carácter o un símbolo es heurística.) Con un argumento numérico de prefijo n, añade los siguientes n caracteres o símbolos.

Alt-s Ctrl-e (M-s C-e, isearch-yank-line) añade el resto de la línea actual a la cadena de búsqueda. Si el punto ya está al final de la línea, añade la línea siguiente. Con un argumento de prefijo n, añade las siguientes n líneas.

Del mismo modo, Ctrl-Alt-z (C-M-z, isearch-yank-until-char) añade a la cadena de búsqueda todo lo que hay desde el punto hasta la siguiente aparición de un carácter especificado (sin incluir ese carácter). Esto es especialmente útil para las macros de teclado, por ejemplo en los lenguajes de programación o de marcado en los que ese carácter marca un límite de token. Con un argumento numérico de prefijo n, el comando añade todo desde el punto hasta la enésima aparición del carácter especificado.

Dentro de la búsqueda incremental, Ctrl-y (C-y, isearch-yank-kill) añade el contenido actual del anillo de muertes a la cadena de búsqueda. Alt-y (M-y, isearch-yank-pop), si se llama después de Ctrl-y (C-y) durante la búsqueda incremental, sustituye el texto añadido por una muerte anterior, de forma similar al comando Alt-y (M-y, yank-pop) habitual. Al hacer clic con (ratón-2) en el área de eco, se añade la selección X actual (véase Operaciones de "cortar y pegar" en pantallas gráficas) a la cadena de búsqueda (isearch-yank-x-selection).

Ctrl-Alt-d (C-M-d, isearch-del-char) borra el último carácter de la cadena de búsqueda, y (C-M-y, isearch-yank-char) añade el carácter después del punto a la cadena de búsqueda. Un método alternativo para añadir el carácter después del punto es entrar en el minibuffer con Alt-e (M-e) (ver Repetición de la búsqueda incremental) y escribir Ctrl-f (C-f) o RIGHT al final de la cadena de búsqueda en el minibuffer. Cada Ctrl-f (C-f) o (RIGHT) que escriba añade otro carácter siguiente al punto a la cadena de búsqueda.

Normalmente, cuando la búsqueda no distingue entre mayúsculas y minúsculas, el texto que se introduce en la cadena de búsqueda se convierte en minúsculas, de modo que la búsqueda sigue sin distinguir entre mayúsculas y minúsculas (véase plegado de mayúsculas en Coincidencia laxa durante la búsqueda). Sin embargo, si el valor de la variable search-upper-case (véase search-upper-case en Coincidencia laxa durante la búsqueda) es distinto de not-yanks, eso desactiva esta conversión a minúsculas.

Para comenzar una nueva búsqueda incremental con el texto cerca del punto que se ha introducido en la cadena de búsqueda inicial, escriba Alt-s Alt-- (M-s M-). que ejecuta el comando isearch-forward-thing-at-point. Si la región estaba activa, entonces se introduce el texto de la región en la cadena de búsqueda. De lo contrario, intenta extraer una URL, un símbolo o una expresión que se encuentre cerca del punto. La opción de usuario isearch-forthing-at-point define lo que se va a extraer.

Errores en la búsqueda incremental

Si su cadena no se encuentra en absoluto, el área de eco dice ‘Failing I-Search’ (falló la búsqueda incremental), y el cursor se mueve más allá del lugar donde Emacs encontró la mayor parte de su cadena. Por lo tanto, si busca ‘FOOT’, y no está la palara ‘FOOT’, puede ver el cursor después de la ‘FOO’ en ‘FOOT’. En el área de eco, la parte de la cadena de búsqueda que no ha podido coincidir se resalta con la cara isearch-fail.

En este punto, hay varias cosas que puede hacer. Si su cadena fue mal escrita, use DEL (DEL) para cancelar un elemento de entrada anterior (ver Fundamentos de la búsqueda incremental), Ctrl-Alt-d (C-M-d) para borrar un carácter a la vez, o Alt-e (M-e) para editarlo. Si le gusta el lugar que ha encontrado, puede teclear RETURN (RET) para permanecer allí. O puede teclear Ctrl-g (C-g), que elimina de la cadena de búsqueda los caracteres que no se pudieron encontrar (la ‘T’ de ‘FOOT’), dejando los que se encontraron (el ‘FOO’ de ‘FOOT’). Un segundo Ctrl-g en ese punto cancela la búsqueda por completo, devolviendo el punto a donde estaba cuando se inició la búsqueda.

El comando de salida, Ctrl-g (C-g), hace cosas especiales durante las búsquedas; lo que hace depende del estado de la búsqueda. Si la búsqueda ha encontrado lo que ha especificado y está esperando la entrada, Ctrl-g (C-g) cancela toda la búsqueda, moviendo el cursor de vuelta al punto donde empezó la búsqueda. Si se teclea Ctrl-g cuando hay caracteres en la cadena de búsqueda que no se han encontrado -porque Emacs todavía los está buscando o porque no los ha encontrado- entonces los caracteres de la cadena de búsqueda que no se han encontrado se descartan de la cadena de búsqueda. Una vez eliminados, la búsqueda se ha realizado con éxito y está a la espera de más entradas, por lo que una segunda Ctrl-g cancelará toda la búsqueda.

Entradas especiales para la búsqueda incremental

Además de los caracteres descritos en las subsecciones anteriores, algunos de los otros caracteres que se escriben durante la búsqueda incremental tienen efectos especiales. Se describen aquí.

Para activar la concordancia de espacios laxa (véase Coincidencia laxa durante la búsqueda), escriba Alt-s SPACE (M-s SPC).

Para alternar la sensibilidad a las mayúsculas y minúsculas de la búsqueda, escriba Alt-c (M-c) o Alt-s c (M-s c). Consulte el apartado referido a combinación de mayúsculas y minúsculas en Coincidencia laxa durante la búsqueda. Si la cadena de búsqueda incluye letras mayúsculas, la búsqueda distingue por defecto entre mayúsculas y minúsculas.

Para alternar si la búsqueda considerará o no caracteres similares y equivalentes como una coincidencia, escriba Alt-s ' (M-s '). Véase plegado de caracteres en Coincidencia laxa durante la búsqueda. Si la cadena de búsqueda incluye caracteres acentuados, se desactiva el plegado de caracteres durante esa búsqueda.

Para alternar si se busca texto invisible o no, escriba Alt-s i (M-s i, isearch-toggle-invisible). Véase Búsqueda de contornos en Comandos de visibilidad del contorno .

Para alternar entre la búsqueda incremental sin expresiones regulares y con expresiones regulares, escriba Alt-r (M-r) o Alt-s r (M-s r, isearch-toggle-regexp). Véase Búsqueda por expresión regular.

Para alternar el modo de símbolos, escriba Alt-s _ (M-s _ ). Véase Búsqueda de símbolos.

Para buscar un carácter de nueva línea, escriba Ctrl-j (C-j) como parte de la cadena de búsqueda.

Para buscar caracteres no ASCII, utilice uno de los siguientes métodos:

  • Escriba Ctrl-q (C-q, isearch-quote-char), seguido de un carácter no gráfico o una secuencia de dígitos octales. Esto añade un carácter a la cadena de búsqueda, de forma similar a la inserción en un búfer mediante Ctrl,q (C-q) (véase Inserción de texto). Por ejemplo, Ctrl-q Ctrl-s (C-q C-s) durante la búsqueda incremental añade el carácter ‘control-S’ a la cadena de búsqueda.
  • Escriba Ctrl-x 8 RETURN (C-x 8 RET, isearch-char-by-name), seguido de un nombre Unicode o punto de código en hexadecimal. Esto añade el carácter especificado a la cadena de búsqueda, de forma similar al comando habitual de inserción de caracteres (véase Inserción de texto).
  • Utilice un método de entrada (véase Métodos de entrada). Si un método de entrada está activado en el búfer actual cuando se inicia la búsqueda, el mismo método estará activo en el minibúfer cuando se escriba la cadena de búsqueda. Mientras se escribe la cadena de búsqueda, se puede cambiar el método de entrada con Ctrl-\N (C-\N, isearch-toggle-input-method). También puede activar un método de entrada no predeterminado con C-^ (isearch-toggle-input-method), que solicita el nombre del método de entrada. Cuando un método de entrada está activo durante la búsqueda incremental, el mensaje de búsqueda incluye el mnemónico del método de entrada, como este:
    I-search [im]:
    donde im es el mnemónico del método de entrada activo. Cualquier método de entrada que habilite durante la búsqueda incremental permanece habilitado en el buffer actual después. Por último, puede activar temporalmente un método de entrada transitorio (véase método de entrada transitorio en Selección de un método de entrada) con Ctrl-x \ (C-x \, isearch-transient-input-method) para insertar un solo carácter en la cadena de búsqueda utilizando un método de entrada, y desactivar automáticamente el método de entrada después.

Al escribir Alt-s (M-s) o en la búsqueda incremental se invoca isearch-occur, que ejecuta occur con la cadena de búsqueda actual. Véase Otros comandos de búsqueda y bucle.

Si se escribe Alt-% (M-%, isearch-query-replace) en la búsqueda incremental, se invoca query-replace o query-replace-regexp (dependiendo del modo de búsqueda) con la cadena de búsqueda actual utilizada como cadena a reemplazar. Un argumento de prefijo negativo significa reemplazar hacia atrás. Ver Consulta y Reemplazo. Si se escribe Ctrl-Alt-% (C-M-%, isearch-query-replace-regexp) se invoca query-replace-regexp con la cadena de búsqueda actual utilizada como regexp para reemplazar.

Si se escribe Alt-TAB (M-TAB) en la búsqueda incremental, se invoca isearch-complete, que intenta completar la cadena de búsqueda utilizando el anillo de búsqueda (las cadenas de búsqueda anteriores utilizadas) como lista de alternativas de finalización. Véase Completado. En muchos sistemas operativos, la secuencia de teclas Alt-TAB es capturada por el gestor de ventanas; entonces deberá volver a enlazar isearch-complete con otra secuencia de teclas si desea usarla (véase Resaltado interactivo).

Puede salir de la búsqueda dejando las coincidencias resaltadas escribiendo Alt-s hr (M-s h r, isearch-highlight-regexp). Esto ejecuta highlight-regexp (ver Resaltado Interactivo), pasándole la expresión regular derivada de la cadena de búsqueda y pidiéndole la cara a utilizar para el resaltado. Para resaltar líneas enteras que contengan coincidencias (en lugar de sólo las coincidencias), escriba Alt-s hl (M-s h l, isearch-highlight-lines-matching-regexp). En cualquier caso, para eliminar el resaltado, escriba Alt-s h u (M-s h u, unhighlight-regexp).

Cuando la búsqueda incremental está activada, puede escribir Ctrl-h Ctrl-h (C-h C-h, isearch-help-map) para acceder a las opciones de ayuda interactiva, incluyendo una lista de combinaciones de teclas especiales. Estas combinaciones de teclas forman parte del mapa de teclas isearch-mode-map (véase Mapas de teclas).

Cuando la búsqueda incremental está activada, al teclear Alt-s Alt-> (M-s M->) se va a la última ocurrencia de la cadena de búsqueda, y Alt-s Alt-< (M-s M-<) se va a la primera ocurrencia. Con un argumento numérico de prefijo n, estos comandos irán a la enésima aparición de la cadena de búsqueda contando desde el principio o el final del buffer, respectivamente.

No salir de la búsqueda incremental

Esta subsección describe cómo controlar si al teclear un comando no específicamente significativo en las búsquedas se sale de la búsqueda antes de ejecutar el comando. También describe tres categorías de comandos que puede escribir sin salir de la búsqueda incremental actual, aunque no formen parte de la búsqueda incremental.

Normalmente, al escribir un comando que no está vinculado a la búsqueda incremental se sale de la búsqueda antes de ejecutar el comando. Por lo tanto, el comando opera en el buffer desde el que se invocó la búsqueda. Sin embargo, si se personaliza la variable search-exit-option a append, los caracteres que se teclean y que no son interpretados por la búsqueda incremental simplemente se añaden a la cadena de búsqueda. Esto es para que puedas incluir en la cadena de búsqueda caracteres de control, como Ctrl-a (C-a), que normalmente saldrían de la búsqueda e invocarían el comando ligado a ellos en el buffer.

Argumentos de prefijo
En la búsqueda incremental, cuando se escribe un comando que especifica un argumento de prefijo (ver Argumentos Numéricos), por defecto se aplicará a la siguiente acción en la búsqueda o al comando que sale de la búsqueda. En otras palabras, introducir un argumento de prefijo no terminará por sí mismo la búsqueda.
En versiones anteriores de Emacs, la introducción de un argumento de prefijo siempre terminaba la búsqueda. Puede volver a este comportamiento estableciendo la variable isearch-allow-prefix a nil.
Cuando isearch-allow-scroll no es nulo (véase más abajo), los argumentos de prefijo siempre tienen el comportamiento por defecto descrito anteriormente, es decir, no terminan la búsqueda, incluso si isearch-allow-prefix es nulo.
Comandos de desplazamiento
Normalmente, los comandos de desplazamiento salen de la búsqueda incremental. Si se cambia la variable isearch-allow-scroll a un valor no nulo, se habilita el uso de la barra de desplazamiento, así como los comandos de desplazamiento del teclado como Ctrl-v (C-v), Alt-v y Ctrl-l (C-l) (ver Desplazamiento). Esto sólo se aplica a la llamada de estos comandos a través de sus secuencias de teclas vinculadas; si se escribe Alt-x (M-x), se saldrá de la búsqueda. Puede dar argumentos de prefijo a estos comandos de la forma habitual. Normalmente, esta función no permite desplazar la coincidencia actual fuera de la visibilidad; pero si se personaliza isearch-allow-scroll con el valor especial unlimited, se elimina esa restricción.
La función isearch-allow-scroll también afecta a algunos otros comandos, como Ctrl-x 2 (C-x 2, split-window-bellow) y Ctrl-x ^ (C-x ^, enlarge-window), que no se desplazan exactamente pero sí afectan al lugar donde aparece el texto en la pantalla. Se aplica a cualquier comando cuyo nombre tenga una propiedad isearch-scroll no nula. Así que puede controlar qué comandos se ven afectados cambiando estas propiedades.
Por ejemplo, para hacer que Ctrl-h l (C-h l) sea utilizable dentro de una búsqueda incremental en todas las futuras sesiones de Emacs, useCtrl-h c (C-h c) para encontrar qué comando ejecuta (ver Documentación de una tecla), que es view-lossage. Entonces puede poner la siguiente línea en su fichero init (ver El fichero de inicialización de Emacs)
(put 'view-lossage 'isearch-scroll t)
Esta característica puede aplicarse a cualquier comando que no cambie permanentemente el punto, el contenido del buffer, los datos de coincidencia, el buffer actual o la ventana y el marco seleccionados. El comando no debe intentar por sí mismo una búsqueda incremental. Esta función se desactiva si isearch-allow-scroll es nil (que es por defecto).
Del mismo modo, si se cambia la variable isearch-allow-motion a un valor no nulo, se habilita el uso de los comandos de movimiento del teclado Alt-< (M-<), Alt-> (M->), Ctrl-v (C-v) y Alt-v (M-v), para desplazarse respectivamente a la primera ocurrencia de la cadena de búsqueda actual en el buffer, a la última, a la primera después de la ventana actual y a la última antes de la ventana actual. La dirección de búsqueda no cambia cuando se utilizan estos comandos de movimiento, a menos que se cambie la variable isearch-motion-changes-direction a un valor no nulo, en cuyo caso la dirección de búsqueda es hacia adelante después de Alt-< (M-<) y Ctrl-v (C-v), y hacia atrás después de Alt-> (M->) y Alt-v (M-v).
Comandos de movimiento
Cuando isearch-yank-on-move se personaliza a shift, puede ampliar la cadena de búsqueda manteniendo pulsada la tecla shift mientras escribe los comandos de movimiento del cursor. Se tirará del texto que termine en la nueva posición después de mover el punto en el buffer actual
Cuando isearch-yank-on-move es t, puede extender la cadena de búsqueda sin usar la tecla Shift para los comandos de movimiento del cursor, pero se aplica sólo para ciertos comandos de movimiento que tienen la propiedad isearch-move en sus símbolos.

Búsqueda Incremental en el minibuffer

Si inicia una búsqueda incremental mientras el minibuffer está activo, Emacs busca en el contenido del minibuffer. A diferencia de la búsqueda en un buffer ordinario, la cadena de búsqueda no se muestra en el área de eco, ya que ésta se utiliza para mostrar el minibuffer.

Si una búsqueda incremental falla en el minibuffer, intenta buscar en el historial del minibuffer. Ver Historial del minibuffer. Puede visualizar el minibuffer y su historial como una serie de páginas, con el elemento más antiguo del historial en la primera página y el minibuffer actual en la última. Una búsqueda hacia delante, Ctrl-s (C-s), busca hacia delante en las páginas posteriores; una búsqueda inversa, Ctrl-r (C-r), busca hacia atrás en las páginas anteriores. Al igual que en la búsqueda ordinaria en el búfer, una búsqueda fallida puede envolverse, yendo de la última página a la primera o viceversa.

Cuando la coincidencia actual se encuentra en un elemento del historial, ese elemento del historial es arrastrado al minibuffer. Si se sale de la búsqueda incremental de forma normal (por ejemplo, escribiendo RETURN (RET)), éste permanece después en el minibuffer. Al cancelar la búsqueda, con Ctrl-g (C-g), se restablece el contenido del minibuffer cuando se inició la búsqueda.

Búsqueda no incremental

Emacs también dispone de comandos de búsqueda convencionales no incrementales, que requieren que se escriba la cadena de búsqueda completa antes de comenzar la búsqueda.

Ctrl-s RETURN cadena RETURN (C-s RET cadena RET)
Busca la cadena.
Ctrl-r RETURN cadena RETURN (C-r RET cadena RET)
Busca la cadena hacia atrás.

Para iniciar una búsqueda no incremental, primero escriba Ctrl-s RETURN (C-s RET). Esto entra en el minibuffer para leer la cadena de búsqueda; termine la cadena con RETURN (RET), y entonces la búsqueda tiene lugar. Si no se encuentra la cadena, el comando de búsqueda señala un error.

Cuando se teclea Ctrl-s RETURN (C-s RET), el C-s invoca la búsqueda incremental como de costumbre. Ese comando está especialmente programado para invocar el comando de búsqueda no incremental, si la cadena que se especifica está vacía. (De lo contrario, un argumento vacío sería inútil.) Ctrl-r RETURN (C-r RET) hace lo mismo, invocando el comando de búsqueda no incremental hacia atrás.

La búsqueda no incremental también puede invocarse desde el menú ‘Edit->Search’ (Edición->Búsqueda) de la barra de menús.

También puede utilizar dos comandos más sencillos, Alt-x search-forward (M-x search-forward) y Alt-x search-backward (M-x search-backward). Estos comandos buscan las cadenas literales que usted especifique, y no admiten ninguna de las funciones de búsqueda laxa (véase Coincidencia laxa durante la búsqueda), excepto el plegado de mayúsculas y minúsculas.

Búsqueda de palabras

Una búsqueda de palabras encuentra una secuencia de palabras sin tener en cuenta el tipo de puntuación entre ellas. Por ejemplo, si introduce una cadena de búsqueda formada por dos palabras separadas por un solo espacio, la búsqueda coincide con cualquier secuencia de esas dos palabras separadas por uno o más espacios, nuevas líneas u otros caracteres de puntuación. Esto es especialmente útil para buscar en documentos de texto, ya que no hay que preocuparse de si las palabras que se buscan están separadas por nuevas líneas o espacios. Tenga en cuenta que los modos principales para los lenguajes de programación u otros modos especializados pueden modificar la definición de una palabra para adaptarla a sus necesidades sintácticas

Alt-s w (M-s w)
Si la búsqueda incremental está activa, conmuta el modo de búsqueda de palabras (isearch-toggle-word); de lo contrario, comienza una búsqueda incremental de palabras hacia adelante (isearch-forward-word).
Alt-s w RETURN palabras RETURN (M-s w RET palabras RET)
Busca palabras, usando una búsqueda de palabras hacia adelante no incremental.
Alt-s w Ctrl-r RETURN palabras RETURN (M-s w C-r RET palabras RET)
Busca palabras hacia atrás, usando una búsqueda de palabras no incremental.
Alt-s Alt-r (M-s M-w)
Busca en la web el texto de la región.

Para iniciar una búsqueda incremental de palabras hacia adelante, escriba Alt-s w (M-s w). Si la búsqueda incremental no está ya activa, se ejecutará el comando isearch-forward-word. Si la búsqueda incremental ya está activa (ya sea una búsqueda hacia adelante o hacia atrás), Alt-s w (M-s w) ejecuta el comando isearch-toggle-word, que cambia a una búsqueda de palabras manteniendo la dirección de la búsqueda y la cadena de búsqueda actual sin cambios. Puede volver a desactivar la búsqueda de palabras escribiendo de nuevo Alt-s w (M-s w).

Para iniciar una búsqueda de palabras no incremental, escriba Alt-s w RETURN (M-s w RET) para una búsqueda hacia adelante, o Alt-s w Ctrl-r RETURN (M-s w C-r RET) para una búsqueda hacia atrás. Esto ejecuta los comandos de búsqueda de palabras hacia adelante y búsqueda de palabras hacia atrás, respectivamente.

Las búsquedas de palabras incrementales y no incrementales difieren ligeramente en la forma de encontrar una coincidencia. En una búsqueda de palabras no incremental, cada palabra de la cadena de búsqueda debe coincidir exactamente con una palabra completa. En una búsqueda incremental de palabras, la coincidencia es más laxa: mientras se escribe la cadena de búsqueda, no es necesario que la primera y la última palabra coincidan con palabras enteras. Esto es así para que la búsqueda pueda realizarse de forma incremental a medida que se escribe. Esta laxitud adicional no se aplica al resaltado perezoso (véase Búsqueda incremental), que siempre coincide con palabras enteras. Mientras se escribe la cadena de búsqueda, aparece ‘Pending’ (Pendiente) en el indicador de búsqueda hasta que se utiliza una tecla de repetición de búsqueda como Ctrl-s (C-s).

Los comandos de búsqueda de palabras no realizan el plegado de caracteres, y la activación de la concordancia de espacios en blanco laxa (véase la Coincidencia laxa durante la búsqueda no tiene ningún efecto sobre ellos.

Para buscar en la Web el texto de la región, escriba Alt-s Alt-w (M-s M-w). Este comando realiza una búsqueda en Internet de las palabras de la región usando el motor de búsqueda cuya URL está especificada por la variable eww-search-prefix (ver EWW en The Emacs Web Wowser Manual). Si la región no está activa, o no contiene ninguna palabra, este comando pide al usuario una URL o palabras clave para buscar.

Búsqueda de símbolos

Una búsqueda de símbolos es muy parecida a una búsqueda ordinaria, salvo que los límites de la búsqueda deben coincidir con los límites de un símbolo. El significado de símbolo en este contexto depende del modo principal, y normalmente se refiere a un token de código fuente, como un símbolo Lisp en el modo Emacs Lisp. Por ejemplo, si realiza una búsqueda incremental de símbolos para el símbolo Lisp forward-word, no coincidiría con isearch-forward-word. Por lo tanto, esta función es principalmente útil para buscar en el código fuente.

Alt-s _ (M-s _ )
Si la búsqueda incremental está activa, conmuta el modo de búsqueda de símbolos (isearch-toggle-symbol); de lo contrario, comienza una búsqueda incremental de símbolos hacia adelante (isearch-forward-symbol).
Alt-s . (M-s .)
Iniciar una búsqueda incremental de símbolos hacia adelante con el símbolo encontrado cerca del punto añadido a la cadena de búsqueda inicialmente.
Alt-s _ RETURN símbolo RETURN (M-s _ RET símbolo RET)
Busca el símbolo hacia adelante, de forma no incremental.
Alt-s _ Ctrl-r RETURN símbolo RETURN (M-s _ C-r RET símbolo RET)
Busca el símbolo hacia atrás, de forma no incremental.

Para iniciar una búsqueda incremental de símbolos hacia adelante, escriba Alt-s (M-s _ ) (o Alt-s . (M-s .) si el símbolo a buscar está cerca del punto). Si la búsqueda incremental no está activa, Alt-s _ (M-s _ ) ejecuta el comando isearch-forward-symbol y Alt-s . (M-s .) ejecuta el comando isearch-forward-symbol-at-point. Con un argumento numérico de prefijo n, Alt-s . (M-s .) buscará la la siguiente aparición del símbolo en el punto; los valores negativos de n buscan hacia atrás. Si la búsqueda incremental ya está activa, Alt-s _ (M-s _ ) cambia a una búsqueda de símbolos, conservando la dirección de la búsqueda y la cadena de búsqueda actual; puede desactivar la búsqueda de símbolos escribiendo Alt-s _ (M-s _ ) de nuevo. En la búsqueda incremental de símbolos, mientras se teclea la cadena de búsqueda, sólo se requiere que el principio de la cadena de búsqueda coincida con el principio de un símbolo, y ‘Pendign’ (Pendiente) aparece en el aviso de búsqueda hasta que se utilice una tecla de repetición de búsqueda como Ctrl-s (C-s).

Para iniciar una búsqueda de símbolos no incremental, escriba Alt-s _ RETURN (M-s _ RET) para una búsqueda hacia adelante, o Alt-s _ Ctrl-r RETURN (M-s _ C-r RET) para una búsqueda hacia atrás. En las búsquedas de símbolos no incrementales, se requiere que el principio y el final de la cadena de búsqueda coincidan con el principio y el final de un símbolo, respectivamente.

Los comandos de búsqueda de símbolos no realizan el plegado de caracteres, y la activación de la concordancia de espacios en blanco laxa (véase Coincidencia laxa durante la búsqueda) no tiene ningún efecto sobre ellos.

Búsqueda por expresión regular

Una expresión regular (o expreg (regexp), para abreviar) es un patrón que denota una clase de cadenas alternativas que deben coincidir. Emacs proporciona formas incrementales y no incrementales de buscar una coincidencia para una expresión regular. La sintaxis de las expresiones regulares se explica en la siguiente sección.

Ctrl-Alt s (C-M-s)
Comienza la búsqueda incremental de expresión regular (expreg) (isearch-forward-regexp).
Ctrl-Alt r (C-M-r)
Comienza la búsqueda incremental inversa de una expresión regular (isearch-backward-regexp).

La búsqueda incremental de una expreg se realiza escribiendo Ctrl-Alt-s (C-M-s, isearch-forward-regexp), invocando Ctrl-s (C-s) con un argumento de prefijo (cuyo valor no importa), o escribiendo Alt-r (M-r) dentro de una búsqueda incremental hacia adelante. Este comando lee una cadena de búsqueda de forma incremental al igual que Ctrl-s (C-s), pero trata la cadena de búsqueda como una expreg en lugar de buscar una coincidencia exacta con el texto del búfer. Cada vez que se añade texto a la cadena de búsqueda, se alarga la expreg y se busca la nueva. Para buscar una expreg hacia atrás, utilice Ctrl-Alt-r (C-M-r, isearch-backward-regexp), Ctrl-r (C-r) con un argumento de prefijo, o Alt-r (M-r) dentro de una búsqueda incremental hacia atrás.

Todas las secuencias de teclas especiales de una búsqueda incremental ordinaria (véase Entradas especiales para la búsqueda incremental) hacen cosas similares en una búsqueda incremental de expresiones regulares. Por ejemplo, si se escribe Ctrl-s (C-s) inmediatamente después de iniciar la búsqueda, se recupera la última expreg de búsqueda incremental usada y se busca hacia adelante. Las búsquedas incrementales expreg y no expreg tienen valores predeterminados independientes. También tienen anillos de búsqueda independientes, a los que se puede acceder con Alt-p (M-p) y Alt-n (M-n). El número máximo de expregs de búsqueda guardados en el anillo de búsqueda viene determinado por el valor de regexp-search-ring-max, 16 por defecto.

A diferencia de la búsqueda incremental ordinaria, la búsqueda incremental de expresiones regulares no utiliza por defecto la concordancia de espacio laxo. Para activar esta función, utilice Alt-s SPACE (M-s SPC, isearch-toggle-lax-whitespace). Entonces, cualquier SPACE (SPC) que se escriba en la búsqueda incremental de expresión regular coincidirá con cualquier secuencia de uno o más caracteres de espacio en blanco. La variable search-whitespace-regexp especifica la expresión regular para la coincidencia de espacios laxos. Véase Entrada especial para la búsqueda incremental.

Además, a diferencia de la búsqueda incremental ordinaria, la búsqueda incremental con expreg no puede utilizar el plegado de caracteres (consulte la coincidencia laxa durante la búsqueda). (Si se activa el plegado de caracteres durante la búsqueda incremental regexp con Alt-s ' (M-s '), la búsqueda se convierte en una búsqueda no-expreg y el patrón de búsqueda que se ha escrito se interpreta como una cadena literal).

En algunos casos, la adición de caracteres a la expreg en una búsqueda incremental de expresión regular puede hacer que el cursor retroceda y comience de nuevo. Por ejemplo, si ha buscado ‘foo’ y añade ‘\|bar’, el cursor retrocede en caso de que el primer ‘bar’ preceda al primer ‘foo’. Véase Sintaxis de las expresiones regulares.

La búsqueda de expreg hacia adelante y hacia atrás no son simétricas, porque la coincidencia de expreg en Emacs siempre opera hacia adelante, empezando por el principio de la expreg. Por lo tanto, la búsqueda expreg hacia adelante escanea hacia adelante, intentando una coincidencia hacia adelante en cada posición inicial posible. La búsqueda de una expresión regular hacia atrás escanea hacia atrás, intentando una coincidencia hacia adelante en cada posición inicial posible. Estos métodos de búsqueda no son imágenes especulares.

La búsqueda no incremental de una expresión regular se realiza con los comandos re-search-forward y re-search-backward. Puede invocarlas con Alt-x (M-x), o mediante la búsqueda incremental de expresiones regulares con Ctrl-Alt-s RETURN (C-M-s RET) y Ctrl-Alt-r RETURN (C-M-r RET). Cuando se invocan estos comandos con Alt-x (M-x), se busca la expresión regular exacta que se especifica y, por lo tanto, no se admite ninguna función de búsqueda laxa (consulte Coincidencia laxa durante la búsqueda), excepto la combinación de mayúsculas y minúsculas.

Si utiliza los comandos de búsqueda incremental de expresiones regulares con un argumento de prefijo, éstos realizan una búsqueda de cadenas ordinaria, como isearch-forward e isearch-backward. Véase Búsqueda incremental.

Sintaxis de las Expresiones Regulares

Esta sección (y este manual en general) describe las características de las expresiones regulares que los usuarios suelen utilizar. Consulte Expresiones regulares en el Manual de referencia de Emacs Lisp, para conocer las características adicionales utilizadas principalmente en los programas Lisp.

Las expresiones regulares tienen una sintaxis en la que unos pocos caracteres son construcciones especiales y el resto son ordinarios. Un carácter ordinario coincide con ese mismo carácter y nada más. Los caracteres especiales son ‘$^.*+?[\N-’. El carácter ‘]' es especial si termina una alternativa de caracteres (ver más abajo). El carácter ‘-’ es especial dentro de una alternativa de carácter. Cualquier otro carácter que aparezca en una expresión regular es ordinario, a menos que lo preceda un ‘\’. (Cuando se utilizan expresiones regulares en un programa Lisp, cada ‘\’ debe estar duplicado, véase el ejemplo al final de esta sección).

Por ejemplo, ‘f’ no es un carácter especial, por lo que es ordinario, y por lo tanto ‘f’ es una expresión regular que coincide con la cadena ‘f’ y con ninguna otra cadena. (No coincide con la cadena ‘ff’.) Asimismo, ‘o’ es una expresión regular que sólo coincide con ‘o’. (Cuando se ignoran las distinciones entre mayúsculas y minúsculas, estas regexps también coinciden con ‘F’ y ‘O’, pero consideramos que esto es una generalización de "la misma cadena", en lugar de una excepción).

Se pueden concatenar dos expresiones regulares cualesquiera a y b. El resultado es una expresión regular que coincide con una cadena si a coincide con alguna parte del principio de esa cadena y b coincide con el resto de la cadena. Como ejemplo trivial, al concatenar las expresiones regulares ‘f’ y ‘o’ se obtiene la expresión regular ‘fo’, que sólo coincide con la cadena ‘fo’. Para hacer algo menos trivial, necesita utilizar uno de los caracteres especiales. Aquí hay una lista de ellos.

. (Punto)
Es un carácter especial que coincide con cualquier carácter único, excepto una nueva línea. Por ejemplo, la expresión regular ‘a.b’ coincide con cualquier cadena de tres caracteres que empiece por ‘a’ y termine por ‘b’.
*
No es una construcción en sí misma; es un operador postfijo que significa que coincide con la expresión regular precedente repetidamente cualquier número de veces, tantas como sea posible. Así, ‘o*’ coincide con cualquier número de ‘o’, incluso sin ‘o’.
El ‘*’ siempre se aplica a la expresión precedente más pequeña posible. Así, ‘fo*’ tiene una ‘o’ repetida, no una ‘fo’ repetida. Coincide con ‘f’, ‘fo’, ‘foo’, etc.
La herramientan de comparación (o emparejador) procesa una construcción ‘*’ emparejando, inmediatamente, todas las repeticiones que pueda encontrar. Luego continúa con el resto del patrón. Si esto falla, se realiza un backtracking (vuelve a comenzar), descartando algunas de las coincidencias de la construcción modificada con ‘*’ en caso de que eso haga posible la coincidencia con el resto del patrón. Por ejemplo, al comparar ‘ca*ar’ con la cadena ‘caaar’, la ‘a*’ intenta primero coincidir con las tres ‘a’; pero el resto del patrón es ‘ar’ y sólo queda ‘r’ para coincidir, por lo que este intento falla. La siguiente alternativa es que ‘a*’ coincida sólo con dos ‘a’. Con esta opción, el resto de la expresión regular coincide con éxito.
+
Es un operador postfijo, similar a ‘*’, salvo que debe coincidir con la expresión precedente al menos una vez. Así, ‘ca+r’ coincide con las cadenas ‘car’ y caaaar’ pero no con la cadena ‘cr’, mientras que ‘ca*r’ coincide con las tres cadenas.
?
Es un operador postfijo, similar a ‘*’, salvo que puede coincidir con la expresión precedente una vez o ninguna. Así, ‘ca?r coincide con 'car' o ‘cr’, y nada más.
*?, +?, ??
Son variantes no codiciosas de los operadores anteriores. Los operadores normales ‘*’, ‘+’, ‘?’ coinciden con todo lo que pueden, siempre que la expresión regular global pueda seguir coincidiendo. Con un ‘?’ a continuación, coincidirán lo menos posible.
Así, tanto ‘ab*’ como ‘ab*?’ pueden coincidir con la cadena 'a' y con la cadena 'abbbb'; pero si se intenta que ambos coincidan con el texto 'abbb', 'ab*' lo hará con todo (la coincidencia válida más larga), mientras que 'ab*?' sólo coincidirá con 'a' (la coincidencia válida más corta).
Los operadores no codiciosos hacen coincidir la cadena más corta posible a partir de un punto de partida determinado; sin embargo, en una búsqueda hacia adelante, siempre se elige el punto de partida más temprano posible para la coincidencia. Así, si se busca ‘a.*?$’ contra el texto ‘abbab’ seguido de una nueva línea, coincide con toda la cadena. Como puede coincidir a partir de la primera ‘a’, lo hace.
\{n\}
Es un operador postfijo que especifica n repeticiones, es decir, la expresión regular precedente debe coincidir exactamente n veces seguidas. Por ejemplo, ‘x{4\}’ coincide con la cadena ‘xxxx’ y nada más.
\N-{n,m\}
Es un operador postfijo que especifica entre n y m repeticiones, es decir, la expresión regular precedente debe coincidir al menos n veces, pero no más de m veces. Si se omite m, no hay límite superior, pero la expresión regular precedente debe coincidir al menos n veces.
{0,1\}’ es equivalente a ‘?’.
{0,\}’ es equivalente a ‘*’.
{1,\}’ es equivalente a ‘+’.
[ ... ]
Es un conjunto de caracteres que comienza con '[' y termina con ']'.
En el caso más sencillo, los caracteres entre los dos corchetesa los que este conjunto puede coincidir. Así, ‘[ad]’ coincide con una ‘a’ o una ‘d’, y ‘[ad]*’ coincide con cualquier cadena compuesta sólo por ‘a’ y ‘d’ (incluida la cadena vacía). Por lo tanto, ‘c[ad]*r’ coincide con ‘cr’, ‘car’, ‘cdr’, ‘caddaar’, etc.
También puede incluir rangos de caracteres en un conjunto de caracteres, escribiendo los caracteres iniciales y finales con un ‘-’ entre ellos. Así, ‘[a-z]’ coincide con cualquier letra ASCII minúscula. Los rangos pueden mezclarse libremente con caracteres individuales, como en ‘[a-z$%.]’, que coincide con cualquier letra ASCII minúscula o ‘$’, ‘% o punto. Otro ejemplo es ‘[α-ωί]’, que coincide con todas las letras griegas minúsculas.
También puede incluir ciertas clases de caracteres especiales en un conjunto de caracteres. ‘:]’ encierran una clase de caracteres dentro de una alternativa de caracteres. Por ejemplo, ‘[[:alnum:]]’ coincide con cualquier letra o dígito. Vea Clases de Caracteres en The Emacs Lisp Reference Manual, para una lista de clases de caracteres.
Para incluir un ‘]’ en un conjunto de caracteres, debe convertirlo en el primer carácter. Por ejemplo, ‘[]a]’ coincide con ‘]’ o ‘a’. Para incluir un ‘-’, escribe ‘-’ como último carácter del conjunto, aunque también puede ponerlo primero o después de un rango. Así, ‘[]-]’ coincide tanto con ‘]’ como con ‘-’.
Para incluir ‘^’ en un conjunto, póngalo en cualquier lugar menos al principio del conjunto. (Al principio, complementa el conjunto - véase más adelante).
Cuando utilice un rango en la búsqueda sin distinción de mayúsculas y minúsculas, debe escribir ambos extremos del rango en mayúsculas, o ambos en minúsculas, o ambos deben ser no-letras. El comportamiento de un rango de mayúsculas y minúsculas como ‘A-z’ no está bien definido y puede cambiar en futuras versiones de Emacs.
[^ ... ]
[^’ inicia un conjunto de caracteres complementarios, que coinciden con cualquier carácter excepto los especificados. Así, ‘[^a-z0-9A-Z]’ coincide con todos los caracteres excepto las letras y dígitos ASCII.
^’ no es especial en un conjunto de caracteres a menos que sea el primer carácter. El carácter que sigue a ‘^’ se trata como si fuera el primero (en otras palabras, ‘-’ y ‘]’ no son especiales allí).
Un conjunto de caracteres complementarios puede coincidir con una nueva línea, a menos que la nueva línea se mencione como uno de los caracteres que no deben coincidir. Esto contrasta con el manejo de las expresiones regulares en programas como grep.
^
Es un carácter especial que coincide con la cadena vacía, pero sólo al principio de una línea en el texto que se está comparando. De lo contrario, no coincide con nada. Así, ‘^foo’ coincide con un ‘foo’ que aparece al principio de una línea.
Por razones de compatibilidad histórica, ‘^’ puede utilizarse con este significado sólo al principio de la expresión regular, o después de ‘\(’ o ‘|’.
$
Es similar a ‘^’ pero sólo coincide con el final de una línea. Así, ‘x+$’ coincide con una cadena de una ‘x’ o más al final de una línea.
\
Tiene dos funciones: entrecomillar los caracteres especiales (incluyendo ‘\’), e introducir construcciones especiales adicionales.
Dado que ‘\’ entrecomilla los caracteres especiales, ‘\$’ es una expresión regular que sólo coincide con ‘$’, y ‘\[’ es una expresión regular que sólo coincide con ‘[’, y así sucesivamente.
Consulte la siguiente sección para conocer las construcciones especiales que comienzan por ‘\’.

Nota: por compatibilidad histórica, los caracteres especiales se tratan como ordinarios si se encuentran en contextos en los que sus significados especiales no tienen sentido. Por ejemplo, ‘*foo’ trata a ‘*’ como ordinario ya que no hay ninguna expresión precedente sobre la que el ‘*’ pueda actuar. Es una mala práctica depender de este comportamiento; es mejor citar el carácter especial de todos modos, independientemente de dónde aparezca.

Como un ‘\N’ no es especial dentro de una alternativa de caracteres, nunca puede eliminar el significado especial de ‘-’ o ‘]’. Por lo tanto, tampoco debe citar estos caracteres cuando no tienen un significado especial. Esto no aclararía nada, ya que las barras invertidas pueden preceder legítimamente a estos caracteres cuando tienen un significado especial, como en ‘[^\]’ ("[^\]" para la sintaxis de cadenas de Lisp), que coincide con cualquier carácter simple excepto una barra invertida.

Barra invertida en expresiones regulares

En la mayoría de los casos, ‘\’ seguido de cualquier carácter sólo coincide con ese carácter. Sin embargo, hay varias excepciones: las secuencias de dos caracteres que comienzan con ‘\’ tienen un significado especial. El segundo carácter de la secuencia es siempre un carácter ordinario cuando se utiliza solo. Esta es una tabla de construcciones ‘\’.

\|
Especifica una alternativa. Dos expresiones regulares a y b con ‘\|’ entre ellas forman una expresión que coincide con algún texto si a coincide con él o b coincide con él. Funciona tratando de coincidir con a, y si eso falla, tratando de coincidir con b.
Así, ‘foo\|bar’ coincide con ‘foo’ o ‘bar’ pero no con ninguna otra cadena.
\|’ se aplica a las expresiones circundantes más grandes posibles. Sólo una agrupamiento circundante ‘\( ... \)’ puede limitar el poder de agrupamiento de ‘\|’.
Existe una capacidad completa de retroceso para manejar múltiples usos de ‘\|’.
\( ... \)
es una construcción de agrupamiento que sirve para tres propósitos:
  1. Para encerrar un conjunto de alternativas ‘\|’ para otras operaciones. Así, ‘\(foo\|bar\)x’ coincide con ‘foox’ o ‘barx’.
  2. Para encerrar una expresión complicada para que operen los operadores postfijo ‘*’, ‘+’ y ‘?’. Así, ‘ba\(na\)*’ coincide con ‘bananana’, etc., con cualquier (cero o más) número de cadenas ‘na’.
  3. Registrar una subcadena coincidente para futuras consultas.
Esta última aplicación no es una consecuencia de la idea de agrupamiento parentética; es una característica independiente que se asigna como segundo significado a la misma construcción ‘\( ... \)’. En la práctica no suele haber conflicto entre los dos significados; cuando hay un conflicto, se puede utilizar un grupo tímido, descrito a continuación.
\(?: ... \)
Especifica un grupo tímido que no registra la subcadena coincidente; no puede remitirse a ella con ‘\d’ (véase más adelante). Esto es útil para combinar mecánicamente las expresiones regulares, de modo que pueda añadir grupos con fines sintácticos sin interferir con la numeración de los grupos a los que se pretende hacer referencia.
\d
Coincide con el mismo texto que coincidió con la ocurrencia dth de una construcción ‘\( ... \)’. A esto se le llama una referencia posterior.
Tras el final de una construcción ‘\( ... \)’, el comparador (o emparejador) recuerda el principio y el final del texto coincidente con esa construcción. Entonces, más adelante en la expresión regular, puede utilizar ‘\’ seguido del dígito d para significar "coincidir con el mismo texto coincidido la décima vez por la construcción ‘\( ...\)’".
A las cadenas que coinciden con las nueve primeras construcciones ‘\( ... \)’ que aparecen en una expresión regular se les asignan los números del 1 al 9 en el orden en que aparecen los paréntesis abiertos en la expresión regular. Por lo tanto, puede utilizar de ‘\1’ a ‘\9’ para referirse al texto coincidente con las construcciones ‘\( ... \)’ correspondientes.
Por ejemplo, ‘\(.*\)\1’ coincide con cualquier cadena sin saltos de línea que esté compuesta por dos mitades idénticas. El ‘\(.*\)’ coincide con la primera mitad, que puede ser cualquier cosa, pero el ‘\1’ que le sigue debe coincidir con el mismo texto exacto.
Si una determinada construcción ‘\( ... \)’ coincide más de una vez (lo que puede ocurrir fácilmente si va seguida de ‘*’ ), sólo se registra la última coincidencia.
\`
Coincide con la cadena vacía, pero sólo al principio de la cadena o del búfer (o de su parte accesible) que se está comparando.
\'
Coincide con la cadena vacía, pero sólo al final de la cadena o del búfer (o de su parte accesible) con el que se está comparando.
\=
Coincide con la cadena vacía, pero sólo en el punto.
\b
Coincide con la cadena vacía, pero sólo al principio o al final de una palabra. Así, ‘\bfoo\b’ coincide con cualquier ocurrencia de 'foo' como una palabra separada. ‘\bballs?\b‘ coincide con ‘ball’ o ‘balls’ como una palabra separada.
\b’ coincide con el principio o el final del búfer, independientemente del texto que aparezca al lado.
\B
Coincide con la cadena vacía, pero no al principio o al final de una palabra.
\<
Coincide con la cadena vacía, pero sólo al principio de una palabra. ‘\<’ coincide al principio del búfer sólo si le sigue un carácter constitutivo de palabra.
\>
Coincide con la cadena vacía, pero sólo al final de una palabra. ‘\>’ coincide con el final de la memoria intermedia sólo si el contenido termina con un carácter constitutivo de la palabra.
\w
Coincide con cualquier carácter constitutivo de palabra. La tabla de sintaxis determina qué caracteres son estos. Vea Tablas de Sintaxis en el Manual de Referencia de Emacs Lisp.
\W
Coincide con cualquier carácter que no sea un constituyente de palabra.
\_<
Coincide con la cadena vacía, pero sólo al principio de un símbolo. Un símbolo es una secuencia de uno o más caracteres constituyentes de símbolos. Un carácter constitutivo de símbolo es un carácter cuya sintaxis es ‘w’ o ‘_’. El carácter ‘\_<’ sólo coincide al principio del búfer si le sigue un carácter constitutivo de símbolo. Al igual que con las palabras, la tabla de sintaxis determina qué caracteres son constituyentes de símbolos.
\_>
Coincide con la cadena vacía, pero sólo al final de un símbolo. ‘\_>’ coincide con el final del búfer sólo si el contenido termina con un carácter constitutivo de símbolo.
\sc
Coincide con cualquier carácter cuya sintaxis sea c. Aquí c es un carácter que designa una clase de sintaxis particular: así, ‘w’ para constituyente de palabra, ‘-’ o ‘ ’ para espacio en blanco, ‘.’ para puntuación ordinaria, etc. Véase la tabla de clases sintácticas en el manual de referencia de Emacs Lisp.
\Sc
Coincide con cualquier carácter cuya sintaxis no sea c.
\cc
Coincide con cualquier carácter que pertenezca a la categoría c. Por ejemplo, ‘\cc’ coincide con caracteres chinos, ‘\cg’ con caracteres griegos, etc. Para la descripción de las categorías conocidas, escriba M-x describe-categoríes RET.
\Cc
Coincide con cualquier carácter que no pertenezca a la categoría c.

Las construcciones que pertenecen a las palabras y a la sintaxis son controladas por la configuración de la tabla de sintaxis. Ver Tablas de Sintaxis en el Manual de Referencia de Emacs Lisp.

Ejemplo de expresión regular

Aquí hay un ejemplo de una expresiónregular-similar a la expresiónregular que usa Emacs por defecto para reconocer el final de una frase sin incluir el espacio siguiente (es decir, la variable sentence-end-base):

[.?!][]\"')}]*

Contiene dos partes sucesivas: un conjunto de caracteres que coinciden con el punto, ‘?’ o ‘!’, y un conjunto de caracteres que coinciden con los corchetes, las comillas o los paréntesis, repetidos cero o más veces.

Coincidencia laxa durante la búsqueda

Normalmente, se desea que los comandos de búsqueda no tengan en cuenta ciertas diferencias menores entre la cadena de búsqueda que se escribe y el texto que se busca. Por ejemplo, las secuencias de caracteres de espacios en blanco de diferente longitud suelen percibirse como equivalentes; las diferencias de mayúsculas y minúsculas no suelen importar; etc. Esto se conoce como equivalencia de caracteres.

Esta sección describe las características de búsqueda laxa de Emacs, y cómo adaptarlas a sus necesidades.

Por defecto, los comandos de búsqueda realizan una coincidencia de espacios laxa: cada espacio, o secuencia de espacios, coincide con cualquier secuencia de uno o más caracteres de espacio en blanco en el texto. (La búsqueda incremental de expresión regular (regexp) tiene un valor predeterminado distinto; véase Búsqueda por expresión regular). Por lo tanto, ‘foo bar’ coincide con:

  • foo   bar
  • foo     bar
  • foo       bar’, etc.
  • Pero no con ‘foo bar
Más precisamente, Emacs hace coincidir cada secuencia de caracteres de espacio en la cadena de búsqueda con una expresión regular especificada por la variable search-whitespace-regexp. Por ejemplo, para hacer que los espacios coincidan con secuencias de nuevas líneas así como con espacios, configúrelo con la expresión regular ‘[[:space:]\n]+’. El valor por defecto de esta variable considera cualquier secuencia de espacios y caracteres de tabulación como espacio en blanco.

Si desea que los caracteres de espacio en blanco coincidan exactamente, puede desactivar la coincidencia de espacios laxa escribiendo Alt-Shift SPACE (M-s SPC, isearch-toggle-lax-whitespace) dentro de una búsqueda incremental. Otro Alt-Shift SPACE vuelve a activar la concordancia de espacios laxa. Para desactivar la concordancia de espacios en blanco para todas las búsquedas, cambie search-whitespace-regexp a nil; entonces cada espacio en la cadena de búsqueda coincide exactamente con un espacio.

Las búsquedas en Emacs ignoran por defecto las mayúsculas y minúsculas del texto que buscan, si se especifica la cadena de búsqueda en minúsculas. Así, si especifica que busca ‘foo’, entonces ‘Foo’ y ‘fOO’ también coinciden. Las expresiones regulares, y en particular los conjuntos de caracteres, se comportan de forma similar: ‘[ab]’ coincide con ‘a’ o ‘A’ o ‘b’ o ‘B’. Esta característica se conoce como case folding (es una estrategia común que consiste en llevar a cabo el plegado de casos reduciendo todas las letras a minúsculas o a la inversa), y está soportada tanto en el modo de búsqueda incremental como en el no incremental.

Una letra mayúscula en cualquier parte de la cadena de búsqueda hace que ésta distinga entre mayúsculas y minúsculas. Así, la búsqueda de ‘Foo’ no encuentra ‘foo’ o ‘FOO’. Esto se aplica tanto a la búsqueda por expresión regular como a la búsqueda por cadena literal. El efecto cesa si se elimina la letra mayúscula de la cadena de búsqueda. La variable search-upper-case controla esto: si es no nil, un carácter en mayúscula en la cadena de búsqueda hace que la búsqueda distinga entre mayúsculas y minúsculas; si se establece como nil se desactiva este efecto de los caracteres en mayúscula. El valor por defecto de esta variable es not-yanks, lo que hace que la búsqueda distinga entre mayúsculas y minúsculas si hay letras mayúsculas en la cadena de búsqueda, y también hace que el texto que se introduce en la cadena de búsqueda (véase Reinserción de Texto y Búsqueda Incremental) se reduzca a minúsculas, de modo que esas búsquedas no distinguen entre mayúsculas y minúsculas por defecto.

Si establece la variable case-fold-search en nil, todas las letras deben coincidir exactamente, incluyendo las mayúsculas y minúsculas. Esta es una variable por búfer; la alteración de la variable normalmente afecta sólo al búfer actual, a menos que cambie su valor por defecto. Véase Variables locales. Esta variable se aplica también a las búsquedas no incrementales, incluidas las realizadas por los comandos de reemplazo (véase Comandos de reemplazo) y los comandos de coincidencia del historial del minibuffer (véase Historial del minibuffer).

Si se escribe Alt-c (M-c) o Alt-Shift c (M-s c, isearch-toggle-case-fold) dentro de una búsqueda incremental, se cambia la sensibilidad a las mayúsculas y minúsculas de esa búsqueda. El efecto no se extiende más allá de la búsqueda incremental actual, pero anula el efecto de añadir o eliminar una letra mayúscula en la búsqueda actual.

Muchas variables relacionadas controlan la sensibilidad a las mayúsculas y minúsculas de la búsqueda y la coincidencia de comandos o actividades específicas. Por ejemplo, tags-case-fold-search controla la sensibilidad a las mayúsculas y minúsculas para find-tag. Para encontrar estas variables, haga Alt-x apropos-variable RETURN case-fold-search RETURN (M-x apropos-variable RET case-fold-search RET).

La combinación de mayúsculas y minúsculas hace caso omiso de las distinciones entre caracteres, haciendo que los caracteres en mayúsculas coincidan con las variantes en minúsculas, y viceversa. Una generalización de la separación de mayúsculas y minúsculas es la separación de caracteres, que no tiene en cuenta clases más amplias de distinciones entre caracteres similares. Por ejemplo, la letra a coincide con todos sus primos acentuados, como ä y á, es decir, no tiene en cuenta los diacríticos que distinguen estas variantes. Además, la a coincide con otros caracteres que se le parecen o que la tienen como parte de su representación gráfica, como U+249C PARENTHESIZED LATIN SMETTER A y U+2100 ACCOUNT OF (que parece una pequeña a dentro de un círculo). Del mismo modo, el carácter de comillas dobles ASCII " coincide con todas las demás variantes de comillas dobles definidas por el estándar Unicode. Por último, el plegado de caracteres puede hacer que una secuencia de uno o más caracteres coincida con otra secuencia de diferente longitud: por ejemplo, la secuencia de dos caracteres ff coincide con U+FB00 LIGATURA PEQUEÑA LATINA FF. Las secuencias de caracteres que no son idénticas, pero que coinciden con el plegado de caracteres, se conocen como secuencias de caracteres equivalentes.

Generalmente, los comandos de búsqueda en Emacs no realizan por defecto el plegado de caracteres para coincidir con secuencias de caracteres equivalentes. Puede activar este comportamiento personalizando la variable search-default-mode a char-fold-to-regexp. Consulte Adaptación de la búsqueda a sus necesidades. Dentro de una búsqueda incremental, escribir Alt-s ' (M-s ', isearch-toggle-char-fold) activa el plegado de caracteres, pero sólo para esa búsqueda. (Los comandos de reemplazo tienen un valor predeterminado diferente, controlado por una opción separada; véase Comandos de reemplazo y coincidencias laxas).

Por defecto, al escribir una variante explícita de un carácter, como ä, como parte de la cadena de búsqueda, no coincide con su carácter base, como a. Pero si se personaliza la variable char-fold-symmetric a t, los comandos de búsqueda tratan los caracteres equivalentes de la misma manera y el uso de cualquiera de un conjunto de caracteres equivalentes en una cadena de búsqueda encuentra cualquiera de ellos en el texto que se está buscando, por lo que al escribir un carácter acentuado ä coincide con la letra a así como con todas las demás variantes como á.

Puede añadir nuevos pliegues usando la variable personalizable char-fold-include, o eliminar los existentes utilizando la variable personalizable char-fold-exclude.

Comandos de reemplazo

Emacs proporciona varios comandos para realizar operaciones de búsqueda y reemplazo. Además del simple comando Alt-x replace-string (M-x replace-string), existe Alt-% (M-%, query-replace), que presenta cada ocurrencia del patrón de búsqueda y le pregunta si quiere reemplazarlo.

Los comandos de reemplazo operan normalmente sobre el texto desde el punto hasta el final del búfer. Cuando la región está activa, operan en su lugar (véase La marca y la región). Los comandos básicos de reemplazo sustituyen una cadena de búsqueda (o expreg) por una cadena de reemplazo. Es posible realizar varios reemplazos en paralelo, usando el comando expand-region-abbrevs (véase Control de la expansión de las abreviaturas).

Sustitución incondicional

Alt-x replace-string RETURN cadena RETURN nuevacadena RETURN
(M-x replace-string RET cadena RET nuevacadena RET)
Reemplaza cada ocurrencia de la cadena con nuevacadena.

Para reemplazar cada instancia de ‘foo’ después del punto con ‘bar’, use el comando Alt-x replace-string (M-x replace-string) con los dos argumentos ‘foo’ y ‘bar’. El reemplazo ocurre sólo en el texto después del punto, así que si quiere cubrir todo el buffer debe ir primero al principio. Todas las ocurrencias hasta el final del buffer son reemplazadas; para limitar el reemplazo a una parte del buffer, active la región alrededor de esa parte. Cuando la región está activa, el reemplazo se limita a la región (véase La marca y la región).

Cuando replace-string sale, deja el punto en la última ocurrencia reemplazada. Añade la posición anterior del punto (donde se emitió el comando replace-string) al anillo de marcas, sin activar la marca; utilice Ctrl-u Ctrl-SPACE (C-u C-SPC) para volver a ella. Véase El anillo de marcas.

Un argumento de prefijo restringe el reemplazo a las coincidencias que están rodeadas por límites de palabras.

Consulte Comandos de reemplazo y coincidencias laxas, para obtener detalles sobre la distinción de mayúsculas y minúsculas y el plegado de caracteres en los comandos de reemplazo.

Reemplazo de Expreg

El comando Alt-x replace-string (M-x replace-string) reemplaza las coincidencias exactas de una sola cadena. El comando similar Alt-x replace-string (M-x replace-regexp) sustituye cualquier coincidencia para un patrón de expresión regular especificado (véase Sintaxis de las expresiones regulares).

Alt-x replace-regexp RETURN expreg RETURN nuevacadena RETURN
(M-x replace-regexp RET expreg RET nuevacadena RET)
Reemplaza todas las coincidencias de expreg con nuevacadena.

En replace-regexp, la nueva cadena no tiene por qué ser constante: puede referirse a todo o parte de lo que coincide con la expreg. ‘\&’ en nuevacadena significa que se sustituye toda la coincidencia. ‘\d’ en nuevacadena, donde d es un dígito empezando por 1, representa lo que coincida con la agrupación dth entre paréntesis en expreg. (Esto se llama una "referencia posterior".) ‘\#’ se refiere a la cuenta de reemplazos ya hechos en este comando, como un número decimal. En el primer reemplazo, ‘\#’ significa ‘0’; en el segundo, ‘1’; y así sucesivamente. Por ejemplo,

M-x replace-regexp RET c[ad]+r RET \&-safe RET

sustituye (por ejemplo) ‘cadr’ por ’cadr-safe’ y ‘cddr’ por ‘cddr-safe’.

M-x replace-regexp RET \(c[ad]+r\)-safe RET \1 RET

Realiza la transformación inversa. Para incluir un ‘\’ en el texto a reemplazar, debe introducir ‘\\’.

Si quiere introducir parte de la cadena de sustitución a mano cada vez, utilice ‘\?’ en la cadena de sustitución. Cada reemplazo le pedirá que edite la cadena de reemplazo en el minibuffer, poniendo el punto donde estaba el ‘\?’.

El resto de esta subsección está destinada a tareas especializadas y requiere conocimientos de Lisp. La mayoría de los lectores pueden saltársela.

Puede utilizar expresiones Lisp para calcular partes de la cadena de sustitución. Para ello, escriba ‘\’ seguido de la expresión en la cadena de reemplazo. Cada reemplazo calcula el valor de la expresión y lo convierte en texto sin comillas (si es una cadena, esto significa utilizar el contenido de la cadena), y lo utiliza en la cadena de reemplazo en lugar de la propia expresión. Si la expresión es un símbolo, un espacio en la cadena de reemplazo después del nombre del símbolo va con el nombre del símbolo, por lo que el valor los reemplaza a ambos.

Dentro de una expresión de este tipo, se pueden utilizar algunas secuencias especiales. ‘\&’ y ‘\d’ se refieren aquí, como es habitual, a la coincidencia completa como cadena, y a una subcomparación como cadena. d puede ser de varios dígitos, y el valor de ‘\d’ es nulo si la agrupación d's de paréntesis no coincide. También puede usar ‘\#&’ y ‘\#d’ para referirse a esas coincidencias como números (esto es válido cuando la coincidencia o subcomparación tiene la forma de un número). En este caso, ‘\#’ también representa el número de sustituciones ya realizadas.

Por ejemplo, podemos intercambiar ‘x’ ‘e’ ‘y’ de esta manera:

M-x replace-regexp RET \(x\)\|y RET
\,(if \1 "y" "x") RET

Para calcular las cadenas de reemplazo de ‘\N,’, la función de formato es a menudo útil (ver Formateo de Cadenas en el Manual de Referencia de Emacs Lisp). Por ejemplo, para añadir cadenas numeradas consecutivamente como 'ABC00042' a las columnas 73 a 80 (a menos que ya estén ocupadas), puede usar:

M-x replace-regexp RET ^.\{0,72\}$ RET
\,(format "%-72sABC%05d" \& \#) RET

Comandos de reemplazo y coincidencias laxas

Esta subsección describe el comportamiento de los comandos de reemplazo con respecto a las coincidencias laxas (ver Coincidencia laxa durante la búsqueda) y cómo personalizarlo. En general, los comandos de reemplazo suelen ser más estrictos que sus homólogos de búsqueda.

A diferencia de la búsqueda incremental, los comandos de reemplazo no utilizan la concordancia de espacios laxa (ver Coincidencia laxa durante la búsqueda) por defecto. Para activar la concordancia de espacios laxa para el reemplazo, cambie la variable replace-lax-whitespace a un valor no nulo. (Esto sólo afecta al modo en que Emacs encuentra el texto a reemplazar, no al texto de reemplazo).

Una variable complementaria replace-regexp-lax-whitespace controla si query-replace-regexp utiliza la concordancia de espacios en blanco laxa cuando busca patrones.

Si el primer argumento de una orden de reemplazo está en minúsculas, la orden ignora las mayúsculas y minúsculas en la búsqueda de ocurrencias para reemplazar, siempre que la búsqueda de mayúsculas y minúsculas no sea nula y la búsqueda de mayúsculas y minúsculas tampoco sea nula. Si search-upper-case (véase search-upper-case) es nil, el hecho de que la búsqueda ignore las mayúsculas y minúsculas viene determinado únicamente por case-fold-search, independientemente de las mayúsculas y minúsculas del primer argumento de la orden. Si la búsqueda por pliegue de mayúsculas y minúsculas es nula, las mayúsculas y minúsculas son siempre importantes en todas las búsquedas.

Además, cuando el argumento nuevacadena está total o parcialmente en minúsculas, los comandos de sustitución intentan conservar el patrón de mayúsculas y minúsculas de cada aparición. Así, el comando:

M-x replace-string RET foo RET bar RET

Sustituye un ‘foo’ en minúsculas por un ‘bar’ en minúsculas, un ‘FOO’ en mayúsculas por un ‘BAR’, y un ‘Foo’ en mayúsculas por un ‘Bar’. (Estas tres alternativas: minúsculas, todo en mayúsculas y primera letra mayúsculas, son las únicas que replace-string puede distinguir).

Si se utilizan letras mayúsculas en la cadena de sustitución, seguirán siendo mayúsculas cada vez que se inserte el texto. Si se utilizan letras mayúsculas en el primer argumento, el segundo argumento siempre se sustituye exactamente como se indica, sin conversión de mayúsculas. Del mismo modo, si el valor de case-replace o case-fold-search es nulo, el reemplazo se realiza sin conversión de mayúsculas.

Por defecto, los comandos de sustitución no utilizan el plegado de caracteres (véase plegado de caracteres en Coincidencia laxa durante la búsqueda) cuando buscan el texto a sustituir. Para habilitar el plegado de caracteres para las coincidencias en query-replace y replace-string, establezca la variable replace-char-fold a un valor no nulo. (Este ajuste no afecta al texto a reemplazar, sólo a la forma en que Emacs encuentra el texto a reemplazar. Tampoco afecta a replace-regexp).

Consulta y Reemplazo

Alt-% cadena RETURN nuevacadena RETURN
(M-% cadena RET nuevacadena RET)
Reemplaza algunas ocurrencias de cadena con nuevacadena.
Ctrl-Alt-% expreg RETURN nuevacadena RETURN
(C-M-% expreg RET nuevacadena RET)
Reemplaza algunas coincidencias de expreg con nuevacadena.

Si desea cambiar sólo algunas de las apariciones de ‘foo’ por ‘bar’, y no todas, utilice Alt-% (M-%, query-replace). Este comando busca las apariciones de ‘foo’ una por una, muestra cada una de ellas y le pregunta si desea reemplazarlas. Aparte de la consulta, query-replace funciona igual que replace-string (véase Sustitución incondicional). En particular, preserva las mayúsculas y minúsculas siempre que case-replace no sea nulo, como suele ocurrir (véase Comandos de reemplazo y coincidencias laxas). Un argumento numérico significa que sólo se consideran las ocurrencias delimitadas por caracteres delimitadores de palabras. Un argumento de prefijo negativo reemplaza hacia atrás.

Ctrl-Alt-% (C-M-%) realiza una búsqueda y sustitución de expreg (query-replace-regexp). Funciona como replace-regexp, excepto que consulta como query-replace.

Con estos comandos se pueden reutilizar reemplazos anteriores. Cuando query-replace o query-replace-regexp solicita la cadena de búsqueda, utilice Alt-p (M-p) y Alt-n (M-n) para mostrar los reemplazos anteriores en la forma ‘de -> a’, donde de es el patrón de búsqueda, a es su reemplazo, y el separador entre ellos está determinado por el valor de la variable query-replace-from-to-separator. Escriba RETURN (RET) para seleccionar el reemplazo deseado. Si el valor de esta variable es nulo, los reemplazos no se añaden al historial de comandos y no pueden reutilizarse.

Estos comandos resaltan la coincidencia actual usando la cara query-replace. Puede desactivar este resaltado estableciendo la variable query-replace-highlight a nil. Resaltan otras coincidencias utilizando lazy-highlight al igual que la búsqueda incremental (ver Búsqueda Incremental); esto puede desactivarse estableciendo query-replace-lazy-highlight a nil. Por defecto, query-replace-regexp mostrará la cadena de sustitución para la coincidencia actual en el minibuffer. Si desea mantener las secuencias especiales ‘\&’ y ‘\n’ sin expandir, personalice la variable query-replace-show-replacement. Al igual que search-highlight-submatches resalta las subexpresiones en la búsqueda incremental (véase Adaptación de la búsqueda a sus necesidades), la variable query-replace-highlight-submatches define si se resaltan las subexpresiones en los comandos de sustitución de expreg.

La variable query-replace-skip-read-only, si se establece como no nula, hará que los comandos de reemplazo ignoren las coincidencias en el texto de sólo lectura. El valor por defecto es no ignorarlas.

Los caracteres que puede escribir cuando se le muestra una coincidencia de la cadena o expreg son:

SPACE (SPC)
y (y)
Para reemplazar la ocurrencia con la cadena de noticias.
DEL (DEL)
Delete
BAKCSPACE (BACKSPACE)
n (n)
Para pasar a la siguiente ocurrencia sin reemplazar esta.
, (, coma)
Para reemplazar esta ocurrencia y mostrar el resultado. A continuación se le pide otro carácter de entrada para decir qué hacer a continuación. Como el reemplazo ya se ha hecho, DEL (DEL) y SPACE (SPC) son equivalentes en esta situación; ambos se mueven a la siguiente ocurrencia.
Puede escribir Ctrl-r (C-r) en este punto (véase más adelante) para modificar el texto sustituido. También puede deshacer el reemplazo con el comando undo (deshacer) (por ejemplo, teclear Ctrl-x u (C-x u); ver Deshacer); esto sale de la query-replace, así que si quiere hacer más reemplazos debe usar Ctrl-x ESC RETURN (C-x ESC RET) para reiniciar (ver Repetición de comandos del minibuffer).
RETURN (RET)
q (q)
Para salir sin hacer más reemplazos.
. (punto)
Para reemplazar esta ocurrencia y luego salir sin buscar más ocurrencias.
! (!)
Para reemplazar todas las ocurrencias restantes sin preguntar de nuevo.
^ (^)
Para volver a la posición de la ocurrencia anterior (o de lo que solía ser una ocurrencia), en caso de que la haya cambiado por error o quiera volver a examinarla.
u (u)
Para deshacer el último reemplazo y volver al lugar donde se hizo ese reemplazo.
U (U)
Para deshacer todos los reemplazos y volver al lugar donde se hizo el primer reemplazo.
Ctrl-r (C-r)
Para entrar en un nivel de edición recursiva, en caso de que la ocurrencia necesite ser editada en lugar de sólo ser reemplazada con una cadena nueva. Cuando haya terminado, salga del nivel de edición recursiva con Ctrl-Alt-c (C-M-c) para pasar a la siguiente ocurrencia. Ver Niveles de edición recursiva.
Ctrl-w(C-w)
Para borrar la ocurrencia, y luego entrar en un nivel de edición recursiva como en Ctrl-r (C-r). Use la edición recursiva para insertar texto que reemplace la ocurrencia borrada de la cadena. Cuando termine, salga del nivel de edición recursiva con Ctrl-Alt-c (C-M-c) para proceder a la siguiente ocurrencia.
e (e)
E (E)
Para editar la cadena de sustitución en el minibuffer. Cuando salga del minibuffer tecleando RETURN (RET), el contenido del minibuffer reemplazará la ocurrencia actual del patrón. También se convierte en la nueva cadena de reemplazo para cualquier otra ocurrencia.
Ctrl-l (C-l)
Para volver a mostrar la pantalla. A continuación, debe escribir otro carácter para especificar qué hacer con esta ocurrencia.
Y (Y)
Para reemplazar todas las ocurrencias restantes en todos los búferes restantes en los reemplazos de varios búferes (como el comando Dired Q que realiza el reemplazo de la consulta en los archivos seleccionados). Responde a esta pregunta y a todas las siguientes de la serie con un "yes", sin más interacción del usuario.
N (N)
Para saltar al siguiente búfer en los reemplazos de varios búferes sin reemplazar las ocurrencias restantes en el búfer actual. Responde a esta pregunta con un "no", abandona las preguntas del búfer actual y continúa con el siguiente búfer de la secuencia.
Ctrl-h (C-h)
? (?)
F1 (F1)
Para mostrar un mensaje que resume estas opciones. A continuación, debe escribir otro carácter para especificar qué hacer con esta ocurrencia.

Aparte de esto, cualquier otro carácter sale de query-replace (consulta-reemplazo), y se vuelve a leer como parte de una secuencia de teclas. Así, si se escribe Ctrl-k (C-k), se sale de la consulta-reemplazo y se pasa a final de línea. En particular, Ctrl-g (C-g) simplemente sale de query-replace.

Para reiniciar una consulta-reemplazo una vez que ha salido, utilice Ctrl-x ESC ESC (C-x ESC ESC), que repite la consulta-reemplazo porque utilizó el minibuffer para leer sus argumentos. Ver C-x ESC ESC.

La opción search-invisible determina cómo query-replace trata el texto invisible. Ver Comandos de visibilidad del contorno.

Véase Operar con archivos, para el comando Dired Q que realiza el reemplazo de consulta en los archivos seleccionados. Véase también Transformación de nombres de archivos en Dired, para los comandos de Dired que permiten renombrar, copiar o enlazar archivos sustituyendo las coincidencias expreg en los nombres de los archivos.

Otros comandos de búsqueda y bucle

Aquí hay otros comandos que encuentran coincidencias para las expresiones regulares. Todos ellos ignoran las mayúsculas y minúsculas en la búsqueda, si el patrón no contiene letras mayúsculas y la búsqueda de mayúsculas y minúsculas no es nula. Aparte de multi-occur y multi-occur-in-matching-buffers, que siempre buscan en todo el buffer, todos los comandos operan en el texto desde el punto hasta el final del buffer, o en la región si está activa.

Alt-x multi-isearch-buffer (M-x multi-isearch-buffer)
Solicita uno o más nombres de búferes, terminando con RETURN (RET); luego, comienza una búsqueda incremental multibúfer en esos búferes. (Si la búsqueda falla en un búfer, el siguiente Ctrl-s (C-s) intenta buscar en el siguiente búfer especificado, y así sucesivamente). Con un argumento de prefijo, solicita una expresión regular y comienza una búsqueda incremental en varias memorias intermedias que coinciden con esa expresión.
Alt-x multi-isearch-bufferes-regexp (M-x multi-isearch-bufferes-regexp)
Este comando es igual que multi-isearch-buffers, excepto que realiza una búsqueda incremental expreg.
Alt-x multi-isearch-files (M-x multi-isearch-files)
Solicita uno o más nombres de archivo que terminen en RETURN (RET); a continuación, inicia una búsqueda incremental en varios archivos. (Si la búsqueda falla en un archivo, el siguiente Ctrl-s (C-s) intenta buscar en el siguiente archivo especificado, y así sucesivamente). Con un argumento de prefijo, solicita una expresión regular y comienza una búsqueda incremental en varios archivos que coinciden con esa expresión.
Alt-x multi-isearch-files-regexp (M-x multi-isearch-files-regexp)
Este comando es igual que multi-isearch-files, excepto que realiza una búsqueda incremental regexp.
En algunos modos que establecen la variable local del búfer multi-isearch-next-buffer-function (por ejemplo, en el modo Change Log) se activa automáticamente una búsqueda incremental de varios archivos.
Alt-x ocurr (M-x ocurr)
Alt-s o (M-s o)
Solicita una expresión regular (regexp), y muestra una lista con cada línea del buffer que contiene una coincidencia para ella. Si escribe Alt-n (M-n) en el indicador, puede reutilizar las cadenas de búsqueda de las búsquedas incrementales anteriores. El texto que ha coincidido se resalta con la cara de coincidencia. Un argumento numérico n especifica que se deben mostrar n líneas de contexto antes y después de cada línea coincidente.
El número de líneas de contexto por defecto se especifica mediante la variable list-matching-lines-default-context-lines. Cuando list-matching-lines-jump-to-current-line es no nula (no-nil), la línea actual se muestra resaltada con la cara list-matching-lines-current-line-face y el punto se establece en la primera coincidencia después de dicha línea.
También puede ejecutar Alt-s o (M-s o) cuando una búsqueda incremental está activa; esto utiliza la cadena de búsqueda actual.
Tenga en cuenta que las coincidencias de la expreg que escriba se extienden para incluir líneas completas, y una coincidencia que comienza antes de que termine la anterior no se considera una coincidencia.
El búfer *Occur* utiliza el modo Occur como modo principal. Puede utilizar las teclas n y p para pasar a la siguiente o anterior coincidencia; con argumento numérico prefijado, estos comandos mueven esa cantidad de coincidencias. Las teclas de dígitos están ligadas al argumento de dígitos, por lo que 5 n se mueve a la quinta coincidencia siguiente (no tiene que escribir Ctrl-u (C-u)). SPACE SPC y DEL DEL desplazan el buffer *Ocurr* hacia arriba y hacia abajo. Haciendo clic en una coincidencia o moviendo el punto allí y escribiendo RETURN RET se visita la posición correspondiente en el buffer original que se buscó. o y C-o muestran la coincidencia en otra ventana; C-o no selecciona esa ventana. Alternativamente, puede utilizar el comando Alt-g Alt-g (M-g M-n, next-error) para visitar las ocurrencias una por una (ver Modo de Compilación). Finalmente, q sale de la ventana que muestra el buffer *Ocurr* y entierra el buffer.
Escribir e en el búfer *Occur* hace que el búfer sea escribible y entra en el modo de edición de ocurrencias, en el que puede editar las líneas coincidentes y hacer que esas ediciones se reflejen en el texto del búfer de origen. Escriba Ctrl-c Ctrl-c (C-c C-c) para salir del modo Occur Edit y volver al modo Occur.
El comando Alt-x list-matching-lines (M-x list-matching-lines) es un sinónimo de Alt-x ocurr (M-x occur).
Alt-x multi-occur (M-x multi-occur)
Este comando es igual que occur, excepto que es capaz de buscar en múltiples buffers. Le pide que especifique los nombres de los búferes uno por uno.
Alt-x multi-occur-in-matching-buffers
(M-x multi-occur-in-matching-buffers)
Este comando es similar a multi-occur, excepto que los búferes a buscar son especificados por una expresión regular que coincide con los nombres de archivos visitados. Con un argumento de prefijo, utiliza la expresión regular para coincidir con los nombres de los búferes en su lugar.
Alt-x how-many (M-x how-many)
Solicita una expresión regular, e imprime el número de coincidencias de la misma en el búfer después del punto. Si la región está activa, esto opera en la región en su lugar.
Alt-x flush-lines (M-x flush-lines)
Solicita una expresión regular y borra cada línea que contenga una coincidencia con ella, operando en el texto después del punto. Cuando el comando termina, imprime el número de líneas coincidentes borradas.
Este comando borra la línea actual si contiene una coincidencia que comienza después del punto. Si la región está activa, opera en la región en su lugar; si una línea parcialmente contenida en la región contiene una coincidencia totalmente contenida en la región, se borra.
Si una coincidencia está dividida en varias líneas, flush-lines borra todas esas líneas. Elimina las líneas antes de comenzar a buscar la siguiente coincidencia; por lo tanto, ignora una coincidencia que comienza en la misma línea en la que terminó otra coincidencia.
Alt-x keep-lines (M-x keep-lines)
Solicita una expreg, y borra cada línea que no contenga una coincidencia para ella, operando en el texto después de punto. Si el punto no está al principio de una línea, este comando siempre mantiene la línea actual. Si la región está activa, el comando opera en la región en su lugar; nunca borra las líneas que sólo están parcialmente contenidas en la región (una nueva línea que termina una línea cuenta como parte de esa línea).
Si una coincidencia se divide en varias líneas, este comando mantiene todas esas líneas.
Alt-x kill-matching-lines (M-x kill-matching-lines)
Como flush-lines, pero también añade las líneas coincidentes al anillo de eliminación. El comando añade las líneas coincidentes al anillo de destrucción como una sola cadena, incluyendo las nuevas líneas que separan las líneas.
Alt-x copy-matching-lines (M-x copy-matching-lines)
Como kill-matching-lines, pero las líneas coincidentes no se eliminan del buffer.

Adaptación de la búsqueda a sus necesidades

En esta sección se describen diversas personalizaciones relacionadas con la búsqueda que no se describen en otros apartados.

El modo de búsqueda por defecto para la búsqueda incremental se especifica mediante la variable search-default-mode. Puede ser nil, t, o una función. Si es nil, el modo por defecto es hacer búsquedas literales sin doblar caracteres (sin la conversión entre mayúsculas/minúsculas), pero con convertir mayúsculas/minúsculas y con coincidencias de espacios en blanco laxas, tal y como se determina en case-fold-search y search-whitespace-regexp, respectivamente (véase Coincidencia laxa durante la búsqueda). Si el valor es t, la búsqueda incremental se realiza por defecto con búsquedas de expresión regular. El valor por defecto especifica una función que sólo realiza el plegado de mayúsculas y minúsculas y la coincidencia de espacios en blanco laxa.

La coincidencia actual de una búsqueda incremental en curso se resalta usando la cara isearch. Este resaltado puede desactivarse estableciendo la variable search-highlight a .

Cuando se buscan expresiones regulares (con Ctrl-Alt-s C-M-s, por ejemplo), las subexpresiones reciben un resaltado especial dependiendo de la variable search-highlight-submatches. Si el valor de esta variable es nulo, no se realiza ningún resaltado especial, pero si el valor es no nulo, el texto que coincida con las construcciones ‘\( ... \)’ (también conocidas como "subexpresiones") en la expresión regular se resaltará con caras distintas. Por defecto, se definen dos caras distintas, denominadas isearch-group-1 e isearch-group-2. Con estas dos caras, las subexpresiones impares se resaltarán con la cara isearch-group-1 y las pares con la cara isearch-group-2. Por ejemplo, al buscar ‘foo-\([0-9]+\)\([a-z]+\)’, la parte que coincida con ‘[0-9]+’ se resaltará con la cara isearch-group-1, y la parte que coincida con ‘[a-z]+’ se resaltará utilizando isearch-group-2. Si se definen caras adicionales usando el mismo esquema de numeración, es decir, isearch-grupo-3, isearch-grupo-4, ..., entonces la cara isearch-grupo-M se utilizará para resaltar la M's, N+M's, 2N+M's, ... subexpresiones, donde N es el número total de caras de la forma isearch-grupo-M.

Las otras coincidencias de la cadena de búsqueda que son visibles en la pantalla se resaltan utilizando la cara lazy-highlight. Si se establece la variable isearch-lazy-highlight a nil se desactiva este resaltado. Aquí hay otras variables que personalizan el resaltado perezoso:

lazy-highlight-initial-delay
Tiempo en segundos para esperar antes de resaltar las coincidencias visibles. Sólo se aplica si la cadena de búsqueda tiene menos caracteres que lazy-highlight-no-delay-length.
lazy-highlight-no-delay-length
Para las cadenas de búsqueda que tengan al menos la misma longitud que el valor de esta variable, el resaltado perezoso de las coincidencias comienza inmediatamente.
lazy-highlight-interval
Tiempo en segundos entre el resaltado de coincidencias sucesivas.
lazy-highlight-max-at-a-time
El número máximo de coincidencias a resaltar antes de comprobar la entrada. Un número grande puede tardar en resaltarse, así que si quiere seguir buscando y escribe Ctrl-s (C-s) o Ctrl-r (C-r) durante ese tiempo, Emacs no responderá hasta que termine de resaltar todas esas coincidencias. Por lo tanto, valores más pequeños hacen que el Editor responda mejor.
isearch-lazy-count
Muestra el número de coincidencias actual y el número total de coincidencias en el prompt de búsqueda.
lazy-count-prefix-format
lazy-count-suffix-format
Estas dos variables determinan el formato de mostrar el número actual y el número total de coincidencias para isearch-lazy-count.

Normalmente, al introducir RETURN (RET) dentro de la búsqueda incremental cuando la cadena de búsqueda está vacía, se lanza una búsqueda no incremental. (En realidad, le permite editar la cadena de búsqueda, y el siguiente (RET) realiza la búsqueda). Sin embargo, si se personaliza la variable search-nonincremental-instead a nil, al escribir RETURN se saldrá de la búsqueda incremental, incluso si la cadena de búsqueda está vacía.

Por defecto, los comandos de búsqueda incremental y consulta-reemplazo coinciden con el texto invisible, pero ocultan cualquier coincidencia de este tipo tan pronto como la coincidencia actual se desplaza fuera del texto invisible. Si personaliza la variable isearch-hide-immediately a nil, cualquier texto invisible en el que se hayan encontrado coincidencias permanecerá en pantalla hasta que la búsqueda o el comando de reemplazo salgan.

La búsqueda incremental en terminales lentos, como las pantallas conectadas a máquinas remotas a través de una conexión lenta, podría ser molesta debido a la necesidad de redibujar grandes porciones de la pantalla a medida que la búsqueda avanza. Emacs proporciona un modo de visualización especial para los terminales lentos, mediante el cual la búsqueda hace aparecer una pequeña ventana separada y muestra el texto que rodea la coincidencia en esa ventana. Las ventanas pequeñas se muestran más rápido, por lo que se alivia el molesto efecto de la velocidad lenta. La variable search-slow-speed determina el umbral de velocidad en baudios por debajo del cual Emacs utilizará este modo de visualización. La variable search-slow-window-lines controla el número de líneas de la ventana que el Editor abre para mostrar los resultados de la búsqueda; el valor por defecto es 1 línea. Normalmente, esta ventana aparecerá en la parte inferior de la ventana que muestra el búfer donde se inicia la búsqueda, pero si el valor de search-slow-window-lines es negativo, eso significa poner la ventana en la parte superior y darle el número de líneas que es el valor absoluto de search-slow-window-lines.



Comandos para corregir errores tipográficos

En este capítulo se describen comandos que son útiles cuando se detecta un error mientras se edita. El más fundamental de estos comandos es el comando para deshacer Ctrl-/ (C-/) (también vinculado a Ctrl-x u (C-x u) y Ctrl-_ (C-_ )). Esto deshace un solo comando, o una parte de un comando (como en el caso de la consulta-reemplazo (query-replace)), o varias inserciones de caracteres consecutivas. Las repeticiones consecutivas de Ctrl-/ (C-/) deshacen cambios cada vez más antiguos, hasta el límite de la información disponible para deshacer.

Aparte de los comandos descritos aquí, puede borrar texto utilizando comandos de borrado como DEL (delete-backward-char). Estos fueron descritos anteriormente en este manual. Vea Borrar texto.

Deshacer

El comando undo (deshacer) revierte los cambios recientes en el texto del búfer. Cada búfer registra los cambios individualmente, y el comando deshacer siempre se aplica al búfer actual. Puede deshacer todos los cambios de un búfer hasta donde lleguen los registros del mismo. Normalmente, cada comando de edición hace una entrada separada en los registros de deshacer, pero algunos comandos, como el de consulta-sustitución (query-replace), dividen sus cambios en múltiples entradas para tener flexibilidad a la hora de deshacer. Los comandos de inserción de caracteres consecutivos suelen agruparse en un único registro de deshacer, para que sea menos tedioso deshacer.

Ctrl-/ (Ctrl-/)
Ctrl-x u (C-x u)
Ctrl-_ (C-_)
Deshace una entrada en los registros de deshacer del búfer actual (undo).

Para empezar a deshacer, escriba Ctrl-/ (C-/) (o sus alias, Ctrl-_ (C-_ ) o Ctrl-x _ (C-x u)) (6). Esto deshace el cambio más reciente en el búfer, y mueve el punto de vuelta a donde estaba antes de ese cambio. Las repeticiones consecutivas de Ctrl-/ (C-/) (o sus alias) deshacen cambios cada vez más tempranos en el buffer actual. Si todos los cambios registrados ya se han deshecho, el comando de deshacer señala un error.

Nota

(6) Además de Ctrl-/ (C-/), el comando de deshacer también está vinculado a Ctrl-x u (C-x u) porque es más fácil de recordar para los principiantes: ‘u’ significa "deshacer" (undo). También está vinculado a Ctrl-_ (C-_ ) porque al teclear Ctrl-/ (C-/) en algunos terminales de texto en realidad se introduce Ctrl-_ (C-_ ).

Cualquier comando que no sea de deshacer rompe la secuencia de comandos de deshacer. A partir de ese momento, toda la secuencia de comandos de deshacer que acaba de realizar se coloca a su vez en el registro de deshacer. Por lo tanto, para volver a aplicar los cambios que ha deshecho, escriba Ctrl-f (C-f) o cualquier otro comando que rompa inofensivamente la secuencia de deshacer; luego escriba Ctrl-/ (C-/) una o más veces para deshacer algunos de los comandos de deshacer.

Alternativamente, si desea reanudar la acción de deshacer, sin rehacer los comandos anteriores, utilice Alt-x undo-redo (M-x) sólo para deshacer. Esto es como deshacer, pero no rehará los cambios que acaba de deshacer. Como complemento, Alt-x undo-redo (M-x undo-redo) deshará los comandos anteriores de deshacer (y no se registrará como un comando que se pueda deshacer).

Si nota que un búfer ha sido modificado accidentalmente, la forma más fácil de recuperarlo es teclear Ctrl-/ (C-/) repetidamente hasta que las estrellas desaparezcan del frente de la línea de modo (ver La línea de modo (modeline)). Cuando un comando de deshacer hace que las estrellas desaparezcan de la línea de modo, significa que el contenido del búfer es el mismo que había cuando se leyó o guardó el archivo por última vez. Si no recuerda si cambió el buffer deliberadamente, escriba Ctrl-/ (C-/) una vez. Cuando veas que el último cambio que hiciste se deshace, verás si fue un cambio intencionado. Si fue un accidente, déjelo sin hacer. Si fue deliberado, rehaga el cambio como se ha descrito anteriormente.

Alternativamente, puede descartar todos los cambios desde que el buffer fue visitado o guardado por última vez con Alt-x revert-buffer (M-x revert-buffer) (ver Revertir un Buffer).

Cuando hay una región activa, cualquier uso de deshacer realiza un deshacer selectivo: deshace el cambio más reciente dentro de la región, en lugar de todo el buffer. Sin embargo, cuando el modo de marcas transitorias está desactivado (véase Desactivar el modo de marca transitoria), Ctrl-/ (C-/) siempre actúa sobre todo el búfer, ignorando la región. En este caso, puede realizar un deshecho selectivo suministrando un argumento de prefijo al comando de deshacer: Ctrl-u Ctrl / (C-u C-/). Para deshacer más cambios en la misma región, repita el comando de deshacer (no es necesario el argumento del prefijo).

Algunos búferes especializados no hacen registros de deshacer. Los búferes cuyos nombres comienzan con espacios nunca lo hacen; estos búferes son usados internamente por Emacs para mantener texto que los usuarios normalmente no miran o editan.

Cuando la información de deshacer de un buffer se hace demasiado grande, Emacs descarta los registros más antiguos de vez en cuando (durante la recolección de basura). Puedes especificar cuánta información de deshacer se va a mantener estableciendo las variables undo-limit, undo-strong-limit y undo-outer-limit. Sus valores se expresan en bytes.

La variable undo-limit establece un límite blando: Emacs mantiene los datos de deshacer para suficientes comandos como para alcanzar este tamaño, y tal vez excederlo, pero no mantiene los datos de ningún comando anterior más allá de eso. Su valor por defecto es 160000. La variable undo-strong-limit establece un límite más estricto: cualquier comando anterior (aunque no el más reciente) que empuje el tamaño más allá de esta cantidad es olvidado. El valor por defecto de undo-strong-limit es 240000.

Independientemente de los valores de esas variables, el cambio más reciente nunca se descarta a menos que sea mayor que undo-outer-limit (normalmente 24.000.000). En ese momento, Emacs descarta los datos de deshacer y le advierte de ello. Esta es la única situación en la que no puedes deshacer el último comando. Si esto ocurre, puedes aumentar el valor de undo-outer-limit para que sea menos probable que ocurra en el futuro. Pero si no esperaba que el comando creara datos de deshacer tan grandes, entonces es probablemente un error y debería reportarlo. Vea Informar errores.

Transposición del texto

Ctrl-t (C-t)
Transponer dos caracteres (transpose-chars).
Alt-t (M-t)
Transponer dos palabras (transpose-words).
Ctrl-Alt-t (C-M-t)
Transponer dos expresiones equilibradas (transpose-sexps).
Ctrl-x Ctrl-t (C-x C-t)
Transponer dos líneas (transpose-lines).
Alt-x transpose-sentences (M-x transpose-sentences)
Transponer dos frases (transpose-sentences).
Alt-x transpose-paragraph (M-x transpose-paragraph)
Transponer dos párrafos (transpose-paragraph).
Alt-x transpose-regions (M-x transpose-regions)
Transponer dos regiones

El error común de transponer dos caracteres puede solucionarse, cuando son adyacentes, con el comando Ctrl-t (C-t, traspose-chars). Normalmente, Ctrl-t transpone los dos caracteres a ambos lados del punto. Cuando se da al final de una línea, en lugar de transponer el último carácter de la línea con la nueva línea, lo que sería inútil, Ctrl-t transpone los dos últimos caracteres de la línea. Por lo tanto, si detecta el error de transposición de inmediato, puede solucionarlo con un simple Ctrl-t. Si no lo detecta tan rápido, debe volver a mover el cursor entre los dos caracteres transpuestos antes de escribir Ctrl-t. Si ha transpuesto un espacio con el último carácter de la palabra anterior, los comandos de movimiento de palabras (Alt-f (M-f), Alt-b (M-b), etc.) son una buena forma de llegar a él. De lo contrario, una búsqueda inversa Ctrl-r (C-r) suele ser la mejor manera. Véase Búsqueda y reemplazo.

Alt-t (M-t) transpone la palabra antes del punto con la palabra después del punto (transpose-words). Desplaza el punto hacia delante sobre una palabra, arrastrando también hacia delante la palabra que precede o contiene al punto. Los caracteres de puntuación entre las palabras no se mueven. ‘BAR FOO,'. Cuando el punto está al final de la línea, se transpone la palabra anterior al punto con la primera palabra de la línea siguiente.

Ctrl-Alt-t (C-M-t, transpose-sexps) es un comando similar para transponer dos expresiones (ver Expresiones con paréntesis equilibrados), y Ctrl-x Ctrl-t (C-x C-t, transpose-lines) intercambia líneas. Alt-x (M-x transpose-sentences) y Alt-x (M-x transpose-paragraphs) transponen frases y párrafos, respectivamente. Estos comandos funcionan como Alt-t (M-t) excepto en lo que respecta a las unidades de texto que transponen.

Un argumento numérico para un comando de transposición sirve como recuento de repeticiones: le dice al comando de transposición que mueva el carácter (o palabra o expresión o línea) anterior o que contenga el punto a través de varios otros caracteres (o palabras o expresiones o líneas). Por ejemplo, Ctrl-u 3 Ctrl-t (C-u 3 C-t) desplaza el carácter que precede al punto a través de otros tres caracteres. Cambiaría ‘f∗oobar’ en ‘oobf∗ar’. Esto equivale a repetir Ctrl-t (C-t) tres veces. Ctrl-u 4 Alt-t (C-u 4 M-t) mueve la palabra anterior al punto anterior a través de cuatro palabras. Ctrl-u Ctrl-Alt-t (C-u C-M-t) anularía el efecto de Ctrl-Alt-t (C-M-t) simple.

A un argumento numérico de cero se le asigna un significado especial (porque de lo contrario un comando con una cuenta de repetición de cero no haría nada): transponer el carácter (o palabra o expresión o línea) que termina después de punto con el que termina después de la marca.

Alt-x transpose-regions (M-x transpose-regions) transpone el texto entre el punto y la marca con el texto entre las dos últimas marcas empujadas al anillo de la marca (ver Establecer la marca). Con un argumento de prefijo numérico, transpone el texto entre punto y marca con el texto entre dos marcas sucesivas que muchas entradas atrás en el anillo de marcas. Este comando se utiliza mejor para transponer varios caracteres (o palabras o frases o párrafos) de una sola vez.

Conversión de mayúsculas y minúsculas

Alt-- Alt-l (M-- M-l)
Convierte la última palabra en minúsculas. Nota: Meta-- es Meta-menos (Alt y guión del medio).
Alt-- Alt-l (M-- M-l)
Convierte la última palabra en minúsculas. Nota: Meta-- son las teclas Alt y guión del medio.
Alt-- Alt-u (M-- M-u)
Convierte la última palabra en mayúsculas.
Alt-- Alt-c (M-- M-c)
Convertir la última palabra en minúscula con inicial mayúscula.

Un error muy común es teclear las palabras en mayúsculas y minúsculas. Por ello, los comandos de conversión de palabras en mayúsculas Alt-l (M-l), Alt-u (M-u) y Alt-c (M-c) tienen una característica especial cuando se utilizan con un argumento negativo: no mueven el cursor. En cuanto vea que ha escrito mal la última palabra, puede simplemente convertirla en mayúscula y seguir escribiendo. Vea Comandos de conversión de mayúsculas y minúsculas.

Comprobar y corregir la ortografía

Esta sección describe los comandos para comprobar la ortografía de una sola palabra o de una parte de un buffer. Estos comandos sólo funcionan si se ha instalado un programa corrector ortográfico, uno de los siguientes: Hunspell, Aspell, Ispell o Enchant. Estos programas no forman parte de Emacs, pero uno de ellos suele estar instalado en GNU/Linux y otros sistemas operativos libres. Vea Aspell en el Manual de Aspell.

Si sólo tiene instalado uno de los programas correctores de ortografía, Emacs lo encontrará cuando invoque por primera vez uno de los comandos descritos aquí. Si tiene más de uno instalado, puede controlar cuál se utiliza personalizando la variable ispell-program-name.

Alt-$ (M-$)
Comprueba y corrige la ortografía de la palabra en el punto (ispell-word). Si la región está activa, lo hace para todas las palabras de la región.
Alt-x ispell-buffer (M-x ispell-buffer)
Comprueba y corrige la ortografía de todas las palabras del buffer. Si la región está activa, hágalo para todas las palabras de la región.
Alt-x ispell-region (M-x ispell-region)
Comprueba y corrige la ortografía en la región.
Alt-x ispell-message (M-x ispell-message)
Comprueba y corrige la ortografía en un borrador de mensaje de correo, excluyendo el material citado.
Alt-x ispell-comments-and-strings
(M-x ispell-comments-and-strings)
Comprueba y corrige la ortografía de los comentarios y las cadenas en el búfer o la región.
Alt-x ispell-comment-or-string-at-point
(M-x ispell-comment-or-string-at-point)
Comprueba el comentario o la cadena en el punto.
Alt-x ispell-change-dictionary RETURN dict RETURN
(M-x ispell-change-dictionary RET dict RET)
Reinicia el proceso del corrector ortográfico, utilizando dict como diccionario.
Alt-x ispell-kill-ispell (M-x ispell-kill-ispell)
Mata el subproceso del corrector ortográfico.
Alt-TAB (M-TAB)
ESC TAB (ESC TAB)
Ctrl-Alt-i (C-M-l)
Complete la palabra antes del punto basándose en el diccionario ortográfico (ispell-complete-word).
Alt-x flyspell-mode (M-x flyspell-mode)
Activa el modo Flyspell, que resalta todas las palabras mal escritas.
Alt-x flyspell-prog-mode (M-x flyspell-prog-mode)
Activa el modo Flyspell sólo para los comentarios y las cadenas.

Para comprobar la ortografía de la palabra alrededor o antes del punto, y opcionalmente corregirla también, escriba Alt-$ (M-$, ispell-word). Si una región está activa, Alt-$ (M-$) comprueba la ortografía de todas las palabras dentro de la región. Véase La marca y la región. (Cuando el modo de marca transitoria está desactivado, Alt-$ siempre actúa sobre la palabra alrededor o antes del punto, ignorando la región; véase Desactivar el modo de marca transitoria).

Del mismo modo, el comando Alt-x ispell (M-x ispell) realiza la corrección ortográfica en la región si hay una activa, o en todo el búfer en caso contrario. Los comandos Alt-x ispell-buffer (M-x ispell-buffer) y Alt-x ispell-region (M-x ispell-region) realizan explícitamente la corrección ortográfica en todo el buffer o en la región, respectivamente. Para comprobar la ortografía de un mensaje de correo electrónico que esté escribiendo, utilice Alt-x ispell-message (M-x ispell-message); ese comando comprueba todo el búfer, excepto el material que esté sangrado o que parezca citado de otros mensajes. Véase Envío de correo. Cuando se trata de código fuente, puede utilizar Alt-x ispell-comments-and-strings (M-x ispell-comments-and-strings) o Alt-x ispell-comment-or-string-at-point (M-x ispell-comment-or-string-at-point) para comprobar sólo los comentarios o las cadenas literales.

Cuando uno de estos comandos encuentra lo que parece ser una palabra incorrecta, le pregunta qué hacer. Suele mostrar una lista de palabras casi incorrectas numeradas que se acercan a la palabra incorrecta. A continuación, debe escribir una respuesta de un solo carácter. Estas son las respuestas válidas:

digit
Sustituye la palabra, sólo esta vez, por uno de los cuasi errores mostrados. Cada cuasi error aparece con un dígito; escriba ese dígito para seleccionarlo.
SPACE (SPC)
Omite esta palabra: siga considerándola incorrecta, pero no la cambia aquí.
r nueva RETURN (r nueva RET)
Reemplaza la palabra, sólo esta vez, con nueva. (La cadena de sustitución se volverá a analizar en busca de más errores ortográficos).
a (a)
Acepta la palabra incorrecta, la trata como correcta, pero sólo en esta sesión de edición.
A (A)
Acepta la palabra incorrecta, la trata como correcta, pero sólo en esta sesión de edición y para este buffer.
i (i)
Inserta esta palabra en su archivo de diccionario privado para que se considere correcta a partir de ahora, incluso en futuras sesiones.
m (m)
Como i, pero también puede especificar la información de finalización del diccionario.
u (u)
Inserta la versión en minúsculas de esta palabra en su archivo de diccionario privado. Inserta la versión en minúsculas de esta palabra en su archivo de diccionario privado.
l palabra RETURN (l palabra RET)
Busca en el diccionario palabras que coincidan con palabra. Estas palabras se convierten en la nueva lista de casi-errores; puede seleccionar una de ellas como reemplazo escribiendo un dígito. Puede utilizar ‘*’ en palabra como comodín.
Ctrl-g (C-g)
X (X)
Sale de la revisión ortográfica interactiva, dejando el punto en la palabra que se estaba revisando. Después puede reiniciar la comprobación con Ctrl-u Alt-$ (C-u M-$).
x (x)
Sale de la revisión ortográfica interactiva y devuelve el punto al lugar donde estaba cuando se inició la revisión ortográfica.
q (q)
Sale de la revisión ortográfica interactiva y mata el subproceso del corrector ortográfico.
? (?)
Muestra la lista de opciones.

En el modo Texto y otros modos relacionados, Alt-TAB (M-TAB, ispell-complete-word) realiza la compleción en el búfer basándose en la corrección ortográfica. Inserte el principio de una palabra y escriba Alt-TAB (M-TAB); esto muestra una lista de terminaciones. (Si su gestor de ventanas intercepta Alt-TAB, escriba ESC TAB (ESC TAB) o Ctrl-Alt-i (C-M-i). Cada compleción aparece con un dígito o carácter; escriba ese dígito o carácter para elegirla.

Una vez iniciado, el subproceso del corrector ortográfico continúa ejecutándose, a la espera de algo que hacer, para que los siguientes comandos de corrección ortográfica se completen más rápidamente. Si quiere deshacerse del proceso, utilice Alt-x ispell-kill-ispell (M-x ispell-kill-ispell). Esto no suele ser necesario, ya que el proceso no utiliza el tiempo del procesador, excepto cuando se hace la corrección ortográfica.

Los correctores ortográficos buscan la ortografía en dos diccionarios: el diccionario estándar y su diccionario personal. El diccionario estándar se especifica con la variable ispell-local-dictionary o, si es nula, con la variable ispell-dictionary. Si ambas son nulas, se utiliza el diccionario por defecto del programa de ortografía. El comando Alt-x ispell-change-dictionary (M-x ispell-change-dictionary) establece el diccionario estándar para el búfer y luego reinicia el subproceso, para que utilice un diccionario estándar diferente. Su diccionario personal está especificado por la variable ispell-personal-dictionary. Si es nula, el programa de ortografía busca un diccionario personal en una ubicación por defecto, que es específica de cada corrector ortográfico.

Se utiliza un diccionario separado para completar las palabras. La variable ispell-complete-word-dict especifica el nombre del archivo de este diccionario. El diccionario de compleción debe ser diferente porque no puede utilizar la información sobre las raíces y afijos de las palabras, que el corrector ortográfico utiliza para detectar variaciones de las palabras. Para algunos idiomas, existe un diccionario de corrección ortográfica pero no un diccionario de compleción de palabras.

El modo Flyspell es un modo menor que realiza la corrección ortográfica automática del texto que se escribe a medida que se escribe. Cuando encuentra una palabra que no reconoce, la resalta. Escriba Alt-x flyspell-mode (M-x flyspell-mode) para activar el modo Flyspell en el buffer actual. Para activar el modo Flyspell en todos los buffers de modo texto, añada flyspell-mode a text-mode-hook. Ver Ganchos (Hooks). Tenga en cuenta que, como el modo Flyspell necesita comprobar cada palabra por la que se mueve, ralentizará el movimiento del cursor y los comandos de desplazamiento. Tampoco comprueba automáticamente el texto que no se ha escrito o desplazado; para ello, use flyspell-region o flyspell-buffer.

Cuando el modo Flyspell resalta una palabra como mal escrita, puede hacer clic en ella con (ratón-2, flyspell-correct-word) para mostrar un menú de posibles correcciones y acciones. Si quiere este menú con (ratón-3), activa el modo de menú contextual. Además, Ctrl-. (C-.) o ESC TAB (ESC TAB, flyspell-auto-correct-word) propondrá varias correcciones sucesivas para la palabra en el punto, y Ctrl-c $ (C-c $, flyspell-correct-word-before-point) desplegará un menú de posibles correcciones. Por supuesto, siempre puede corregir la palabra mal escrita editándola manualmente como quiera.

El modo Flyspell Prog funciona igual que el modo Flyspell ordinario, salvo que sólo comprueba las palabras de los comentarios y las constantes de las cadenas. Esta función es útil para editar programas. Escriba Alt-x flyspell-prog-mode (M-x flyspell-prog-mode) para activar o desactivar este modo en el búfer actual. Para activar este modo en todos los búferes del modo de programación, añada flyspell-prog-mode a prog-mode-hook (vea Ganchos).



Macros de teclado

En este capítulo describimos cómo grabar una secuencia de comandos de edición para poder repetirla cómodamente más tarde.

Una macro de teclado es un comando definido por un usuario de Emacs para sustituir otra secuencia de teclas. Por ejemplo, si descubre que está a punto de escribir Ctrl-n Alt-d Ctrl-d (C-n M-d C-d) cuarenta veces, puede acelerar su trabajo definiendo una macro de teclado para hacer Ctrl-n Alt-d Ctrl-d, y luego ejecutarla 39 veces más.

Una macro de teclado se define ejecutando y registrando los comandos que constituyen su definición. Dicho de otro modo, al definir una macro de teclado, la definición se ejecuta por primera vez. De este modo, puede ver los efectos de sus comandos, para no tener que calcularlos mentalmente. Cuando termina esta operación, la macro de teclado está definida y también ha sido, en efecto, ejecutada una vez. A continuación, puede volver a hacer todo el proceso invocando la macro.

Las macros de teclado se diferencian de los comandos ordinarios de Emacs en que están escritas en el lenguaje de comandos del Editor y no en Lisp. Esto hace que sea más fácil para el principiante escribirlas, y las hace más convenientes como hacks temporales. Sin embargo, el lenguaje de comandos de Emacs no es lo suficientemente potente como lenguaje de programación para ser útil para escribir algo inteligente o general. Para esas cosas, hay que utilizar Lisp.

Uso básico

F3 (F3)
Inicia la definición de una macro de teclado (kmacro-start-macro-o-insert-counter).
F4 (F4)
Si se está definiendo una macro de teclado, finaliza la definición; en caso contrario, ejecuta la macro de teclado más reciente (kmacro-end-or-call-macro).
Ctrl-u F3 (C-u F3)
Reejecuta la última macro de teclado, y añade las teclas a su definición.
Ctrl-u Ctrl-u F3 (C-u C-u F3)
Añade teclas a la última macro de teclado sin reejecutarla.
Ctrl-x Ctrl-k r (C-x C-k r)
Ejecuta la última macro de teclado en cada línea que comienza en la región (apply-macro-to-region-lines).
Ctrl-x ( C-x (
Empieza a definir una macro de teclado (estilo antiguo) (kmacro-start-macro); con un argumento de prefijo, añade teclas a la última macro.
Ctrl-x ) C-x )
Termina la definición de una macro (estilo antiguo) (kmacro-end-macro); el argumento del prefijo sirve como cuenta de repetición para ejecutar la macro.
Ctrl-x e (C-x e)
Ejecuta la última macro de teclado definida (kmacro-end-and-call-macro); el argumento del prefijo sirve como cuenta de repeticiones.

Para empezar a definir una macro de teclado, escriba F3 (F3). A partir de ese momento, sus teclas siguen ejecutándose, pero también pasan a formar parte de la definición de la macro. ‘Def’ aparece en la línea de modo para recordarle lo que está sucediendo. Cuando haya terminado, escriba F4 (F4, kmacro-end-or-call-macro) para terminar la definición. Por ejemplo,

F3 M-f foo F4

Define una macro para avanzar una palabra y luego insertar ‘foo’. Tenga en cuenta que F3 y F4 no forman parte de la macro.

Después de definir la macro, puede llamarla con F4. Para el ejemplo anterior, esto tiene el mismo efecto que escribir Alt-f foo (M-f foo) de nuevo. (Tenga en cuenta las dos funciones del comando F4 (F4): termina la macro si está en proceso de definir una, o llama a la última macro en caso contrario). También puede suministrar F4 con un argumento numérico de prefijo ‘n’, que significa invocar la macro ‘n’ veces. Un argumento de cero repite la macro indefinidamente, hasta que obtenga un error o escriba Ctrl-g (C-g) (o, en MS-DOS, C-Break).

El ejemplo anterior demuestra un práctico truco que puede emplear con las macros de teclado: si quiere repetir una operación en lugares regularmente espaciados del texto, incluye un comando de movimiento como parte de la macro. En este caso, la repetición de la macro inserta la cadena ‘foo’ después de cada palabra sucesiva.

Después de terminar la definición de una macro de teclado, puede añadir más pulsaciones a su definición escribiendo Ctrl-u F3 (C-u F3). Esto equivale a una F3 simple seguida de volver a escribir toda la definición hasta el momento. En consecuencia, vuelve a ejecutar la macro tal y como estaba definida anteriormente. Si cambia la variable kmacro-execute-before-append a nil, la macro existente no se reejecutará antes de anexarla (el valor por defecto es t). También se puede añadir al final de la definición de la última macro de teclado sin reejecutarla escribiendo Ctrl-u Ctrl-u F3 (C-u C-u F3).

Cuando un comando lee un argumento con el minibuffer, su entrada en el minibuffer pasa a formar parte de la macro junto con el comando. Por lo tanto, cuando vuelve a ejecutar la macro, el comando recibe el mismo argumento que cuando introdujo la macro. Por ejemplo,

F3 C-a C-k C-x b foo RET C-y C-x b RET F4

Define una macro que mata la línea actual, la mete en el buffer ‘foo’, y luego vuelve al buffer original.

La mayoría de los comandos del teclado funcionan como siempre en una definición de macro del teclado, con algunas excepciones. Al escribir Ctrl-g (C-g, keyboard-quit) se sale de la definición de la macro del teclado. Escribir Ctrl-Alt-c (C-M-c, exit-recursive-edit) puede ser poco fiable: funciona como se esperaría si se sale de una edición recursiva que se inició dentro de la macro, pero si se sale de una edición recursiva que se inició antes de invocar la macro de teclado, también se sale necesariamente de la macro de teclado. Los eventos del ratón tampoco son fiables, aunque se pueden utilizar en una macro de teclado: cuando la macro reproduce el evento del ratón, utiliza la posición original del ratón de ese evento, la posición que tenía el ratón mientras estaba definiendo la macro. El efecto de esto puede ser difícil de predecir.

El comando Ctrl-x Ctrl-k r (C-x C-k r, apply-macro-to-region-lines) repite la última macro de teclado definida en cada línea que comienza en la región. Lo hace línea por línea, moviendo el punto al principio de la línea y luego ejecutando la macro.

Además de los comandos F3 (F3) y F4 (F4) descritos anteriormente, Emacs también admite un conjunto más antiguo de combinaciones de teclas para definir y ejecutar macros de teclado. Para comenzar la definición de una macro, escriba Ctrl-x (C-x, kmacro-start-macro); al igual que con F3, un argumento de prefijo añade esta definición a la última macro del teclado. Para finalizar una definición de macro, escriba Ctrl-x ) (C-x ), kmacro-end-macro). Para ejecutar la macro más reciente, escriba Ctrl-x e (C-x e, kmacro-end-and-call-macro). Si introduces Ctrl-x e C-x e mientras defines una macro, la macro se termina y se ejecuta inmediatamente. Inmediatamente después de teclear Ctrl-x e (C-x e), puede teclear e (e) varias veces para repetir inmediatamente la macro una o más veces. También puede dar a Ctrl-x e (C-x e) un argumento de repetición, al igual que F4 (cuando se utiliza para ejecutar una macro).

A Ctrl-x ) (C-x ) ) se le puede dar una cuenta de repetición como argumento. Esto significa repetir la macro justo después de definirla. La definición de la macro en sí misma cuenta como la primera repetición, ya que se ejecuta mientras se define, por lo que Ctrl-u 4 Ctrl-x (C-u 4 C-x) ) ejecuta la macro inmediatamente 3 veces adicionales.

Mientras se ejecuta una macro de teclado de larga duración, a veces puede ser útil activar una redistribución (para mostrar hasta dónde hemos llegado). El comando Ctrl-x Ctrl-k d (C-x C-k d) se puede utilizar para esto. Como ejemplo no muy útil, Ctrl-x ( Alt-f Ctrl-x Ctrl-k d Ctrl-x ) (C-x ( M-f C-x C-k d C-x)) creará una macro que se redistribuirá una vez por iteración al decir Ctrl-u 42 Ctrl-e (C-u 42 C-x e).

El anillo de macros de teclado

Todas las macros de teclado definidas se registran en el anillo de macros de teclado. Sólo hay un anillo de macros de teclado, compartido por todos los buffers.

Ctrl-x Ctrl-k Ctrl-k (C-x C-k C-k)
Ejecuta la macro de teclado en la cabeza del anillo (kmacro-end-o-call-macro-repeat).
Ctrl-x Ctrl-k Ctrl-n (C-x C-k C-n)
Gira el anillo de macros de teclado a la siguiente macro (definida anteriormente) (kmacro-cycle-ring-next).
Ctrl-x Ctrl-p (C-x C-k C-p)
Gira el anillo de macros de teclado a la macro anterior (definida posteriormente) (kmacro-cycle-ring-previous).

Todos los comandos que operan en el anillo de macros de teclado usan el mismo prefijo Ctrl-x Ctrl-k (C-x C-k). La mayoría de estos comandos pueden ser ejecutados y repetidos inmediatamente después de cada uno sin repetir el prefijo C-x C-k. Por ejemplo,

C-x C-k C-p C-p C-k C-k C-k C-n C-n C-k C-p C-k C-d

Girará el anillo de macros de teclado a la segunda macro anterior, ejecutará la macro de cabecera resultante tres veces, girará de nuevo a la macro de cabecera original, la ejecutará una vez, girará a la macro anterior, la ejecutará y finalmente la borrará del anillo de macros.

El comando Ctrl-x Ctrl-k Ctrl-k (C-x C-k C-k, kmacro-end-or-call-macro-repeat) ejecuta la macro del teclado en la cabeza del anillo de macros. Puede repetir la macro inmediatamente escribiendo otra Ctrl-k (C-k), o puede girar el anillo de macros inmediatamente escribiendo Ctrl-n (C-n) o Ctrl-p (C-p).

Cuando se está definiendo una macro de teclado, Ctrl-x Ctrl-k Ctrl-k (C-x C-k C-k) se comporta como F4, excepto que, inmediatamente después, puede utilizar la mayoría de las combinaciones de teclas de esta sección sin el prefijo Ctrl-x Ctrl-k (C-x C-k). Por ejemplo, otro Ctrl-k volverá a ejecutar la macro.

Los comandos Ctrl-x Ctrl-k Ctrl-n (C-x C-k C-n, kmacro-cycle-ring-next) y Ctrl-x-Ctrl-k Ctrl-p (C-x C-k C-p, kmacro-cycle-ring-previous) rotan el anillo de macros, llevando la siguiente o anterior macro de teclado a la cabeza del anillo de macros. La definición de la nueva macro de cabecera se muestra en el área de eco. Puede seguir girando el anillo de macros inmediatamente repitiendo sólo Ctrl-n (C-n) y Ctrl-p (C-p) hasta que la macro deseada esté en la cabeza del anillo. Para ejecutar la nueva macro cabeza del anillo inmediatamente, sólo tiene que teclear Ctrl-k.

Tenga en cuenta que Emacs trata la cabeza del anillo de macros como la última macro de teclado definida. Por ejemplo, F4 ejecutará esa macro, y Ctrl-x Ctrl-k n (C-x C-k n) le dará un nombre.

El número máximo de macros almacenadas en el anillo de macros de teclado está determinado por la variable personalizable kmacro-ring-max.

El contador de macros de teclado

Cada macro de teclado tiene un contador asociado, que se inicializa a 0 cuando se empieza a definir la macro. Este contador actual permite insertar un número en la memoria intermedia que depende del número de veces que se ha llamado a la macro. El contador se incrementa normalmente cada vez que se inserta su valor en el buffer.

Además del contador actual, las macros de teclado también mantienen el contador anterior, que registra el valor que tenía el contador actual la última vez que se incrementó o fijó. Tenga en cuenta que el incremento del contador actual en cero, por ejemplo, con Ctrl-u 0 Ctrl-x Ctrl-k Ctrl-i (C-u 0 C-x C-k C-i), también registra el valor del contador actual como el valor del contador anterior.

F3 (F3)
En una definición de macro de teclado, inserta el valor del contador de la macro de teclado en el buffer (kmacro-start-macro-or-insert-counter).
Ctrl-x Ctrl-k Ctrl-i (C-x C-k C-i)
Inserta el valor del contador de macros de teclado en la memoria intermedia (kmacro-insert-counter).
Ctrl-k Ctrl-k Ctrl-c (C-x C-k C-c)
Establece el contador de macros de teclado (kmacro-set-counter).
Ctrl-x Ctrl-k Ctrl-a (C-x C-k C-a)
Añade el prefijo arg al contador de macros de teclado (kmacro-add-counter).
Ctrl-x Ctrl-k Ctrl-f (C-x C-k C-f)
Especifica el formato de inserción del contador de macros de teclado (kmacro-set-format).

Cuando está definiendo una macro de teclado, el comando (F3, kmacro-start-macro-or-insert-counter) inserta el valor actual del contador de la macro de teclado en el búfer, e incrementa el contador en 1. (Si no está definiendo una macro, F3 (F3) inicia una definición de macro en su lugar. Véase Uso básico). Puede usar un argumento de prefijo numérico para especificar un incremento diferente. Si sólo especifica un prefijo Ctrl-u (C-u), eso inserta el valor anterior del contador, y no cambia el valor actual.

Como ejemplo, vamos a mostrar cómo el contador de macros de teclado puede ser utilizado para construir una lista numerada. Considere la siguiente secuencia de teclas:

F3 C-a F3 . SPC F4

Como parte de esta definición de macro de teclado, la cadena ‘0. ’ se insertó al principio de la línea actual. Si ahora se desplaza a otro lugar del buffer y teclea F4 para invocar la macro, la cadena ‘1. ’ se inserta al principio de esa línea. Las siguientes invocaciones insertan ‘2. ’, ‘3. ’, y así sucesivamente.

El comando Ctrl-x Ctrl-k Ctrl-i (C-x C-k C-i, kmacro-insert-counter) hace lo mismo que F3, pero puede utilizarse fuera de una definición de macro de teclado. Cuando no se está definiendo o ejecutando ninguna macro de teclado, inserta e incrementa el contador de la macro en la cabecera del anillo de macros de teclado.

El comando Ctrl-x Ctrl-k Ctrl-c (C-x C-k C-c, kmacro-set-counter) establece el contador de la macro actual al valor del argumento numérico. Si lo utiliza dentro de la macro, opera en cada repetición de la macro. Si se especifica sólo Ctrl-u (C-u) como prefijo, mientras se ejecuta la macro, eso restablece el contador al valor que tenía al principio de la repetición actual de la macro (deshaciendo cualquier incremento hasta ahora en esta repetición).

El comando Ctrl-x Ctrl-k Ctrl-a (C-x C-k C-a, kmacro-add-counter) añade el argumento del prefijo al contador de la macro actual. Con sólo Ctrl-u (C-u) como argumento, reinicia el contador al último valor insertado por cualquier macro de teclado. (Normalmente, cuando se utiliza esto, la última inserción será en la misma macro y será el mismo contador).

El comando Ctrl-x Ctrl-k Ctrl-f (C-x C-k C-f, kmacro-set-format) pregunta por el formato a utilizar al insertar el contador de la macro. El formato por defecto es ‘%d’, que significa insertar el número en decimal sin ningún relleno. Puede salir con el minibuffer vacío para restablecer el formato por defecto. Puede especificar cualquier cadena de formato que la función format acepte y que tenga sentido con un único argumento entero extra (ver Formatting Strings en The Emacs Lisp Reference Manual). No ponga la cadena de formato dentro de comillas dobles cuando la inserte en el minibuffer.

Si usa este comando mientras no se está definiendo o ejecutando ninguna macro de teclado, el nuevo formato afecta a todas las definiciones de macro posteriores. Las macros existentes siguen utilizando el formato vigente cuando se definieron. Si establece el formato mientras define una macro de teclado, esto afecta a la macro que se está definiendo a partir de ese momento, pero no afecta a las macros posteriores. La ejecución de la macro utilizará, en cada paso, el formato vigente en ese paso durante su definición. Los cambios en el formato de la macro durante la ejecución de la misma, al igual que los cambios correspondientes durante su definición, no afectan a las macros posteriores.

El formato establecido por Ctrl-x Ctrl-k Ctrl-f (C-x C-k C-f) no afecta a la inserción de números almacenados en registros.

Si se utiliza un registro como contador, incrementándolo en cada repetición de la macro, se consigue lo mismo que con un contador de macro de teclado. Vea Mantener números en los registros. Para la mayoría de los propósitos, es más simple usar un contador de macro de teclado.

Ejecución de macros con variaciones

En una macro de teclado, puede crear un efecto similar al de query-replace, en el sentido de que la macro le pregunta cada vez si quiere hacer un cambio.

Ctrl-x q (C-x q)
Cuando se llega a este punto durante la ejecución de la macro, pide confirmación (kbd-macro-query).

Durante la definición de la macro, escriba Ctrl-x q (C-x q) en el punto en el que desea que se produzca la consulta. Durante la definición de la macro, Ctrl-x q no hace nada, pero cuando se ejecuta la macro más tarde, Ctrl-x q le pregunta interactivamente si desea continuar.

Las respuestas válidas cuando Ctrl-x q pregunta son:

SPACE o y (SPC (o y))
Continúa la ejecución de la macro de teclado.
DEL o n (DEL (o n))
Omite el resto de esta repetición de la macro, y comenzar de inmediato con la siguiente repetición.
RETURN o q (RET o q)
Omite el resto de esta repetición y cancela las siguientes.
Ctrl-r (C-r)
Entra en un nivel de edición recursiva, en el que puede realizar una edición que no forma parte de la macro. Al salir de la edición recursiva mediante Ctrl-Alt-c (C-M-c), se le pregunta de nuevo cómo continuar con la macro de teclado. Si en este momento escribe un SPACE (SPC), se ejecuta el resto de la definición de la macro. Depende de usted dejar el punto y el texto en un estado tal que el resto de la macro haga lo que usted desea.

Ctrl-u Ctrl-x q (C-u C-x q), que es Ctrl-x q con un argumento prefijo, realiza una función completamente diferente. Entra en una edición recursiva leyendo la entrada de teclado, tanto cuando la escribe durante la definición de la macro, como cuando se ejecuta desde la macro. Durante la definición, la edición que hace dentro de la edición recursiva no se convierte en parte de la macro. Durante la ejecución de la macro, la edición recursiva le da la oportunidad de hacer alguna edición particularizada en cada repetición. Véase Niveles de edición recursiva.

Cómo nombrar y guardar macros de teclado

Ctrl-x Ctrl-k n (C-x C-k n)
Da un nombre de comando (que permanece durante la sesión de Emacs) a la macro de teclado definida más recientemente (kmacro-name-last-macro).
Ctrl-x Ctrl-k b (C-x C-k b)
Vincula la última macro de teclado definida a una secuencia de teclas (mientras dure la sesión) (kmacro-bind-to-key).
Alt-x insert-kbd-macro (M-x insert-kbd-macro)

Si desea guardar una macro de teclado para su uso posterior, puede darle un nombre utilizando Ctrl-x Ctrl-k n (C-x C-k n, kmacro-name-last-macro). Esto lee un nombre como argumento usando el minibuffer y define ese nombre para ejecutar la última macro de teclado, en su forma actual. (Si más tarde añade algo a la definición de esta macro, eso no altera la definición del nombre como macro). El nombre de la macro es un símbolo de Lisp, y definirlo de esta manera lo convierte en un nombre de comando válido para llamar con Alt-x (M-x) o para vincular una tecla con global-set-key (ver Mapas de teclas). Si se especifica un nombre que tiene una definición anterior que no es una macro de teclado, se muestra un mensaje de error y no se cambia nada.

También puede vincular la última macro de teclado (en su forma actual) a una tecla, usando Ctrl-x Ctrl-k b (C-x C-k b, kmacro-bind-to-key) seguido de la secuencia de teclas que desee vincular. Puede asociar cualquier secuencia de teclas en el mapa de teclas global, pero como la mayoría de las secuencias de teclas ya tienen otras asociaciones, debe seleccionar la secuencia de teclas con cuidado. Si intenta vincular una secuencia de teclas con una vinculación existente (en cualquier mapa de teclas), este comando le pedirá confirmación antes de reemplazar la vinculación existente.

Para evitar problemas causados por la anulación de las vinculaciones existentes, las secuencias de teclas:

  • Ctrl-x Ctrl-k 0 (C-x C-k 0) a Ctrl-x Ctrl-k 9 (C-x C-k 9)
  • Ctrl-x Ctrl-k A (C-x C-k A) a Ctrl-x Ctrl-k Z (C-x C-k Z)
y están reservadas para sus propias macrovinculaciones de teclado. De hecho, para vincular una de estas secuencias de teclas, sólo tiene que escribir el dígito o la letra en lugar de las secuencias de teclas completas. Por ejemplo:

C-x C-k b 4

Vinculará la última macro de teclado a la secuencia de teclas Ctrl-x Ctrl-k 4 (C-x C-k 4).

Una vez que una macro tiene un nombre de comando, puede guardar su definición en un archivo. De este modo, podrá utilizarla en otra sesión de edición. Primero, visite el archivo en el que desea guardar la definición. A continuación, use este comando:

M-x insert-kbd-macro RET macroname RET

Esto inserta un código Lisp que, cuando ejecutado más tarde, definirá la misma macro con la misma definición que tiene ahora. (No necesita entender el código Lisp para hacer esto, porque insert-kbd-macro escribe el código Lisp por usted). Luego guarde el archivo. Puede cargar el archivo más tarde con load-file (ver Bibliotecas de código Lisp para Emacs). Si el archivo que guarda es su archivo init ~/.config/init.el (ver El fichero de inicialización de Emacs) entonces la macro se definirá cada vez que se ejecute el Editor.

Si le da a insert-kbd-macro un argumento de prefijo, hace código Lisp adicional para registrar las teclas (si las hay) que ha vinculado a macroname, de modo que a la macro se le reasignarán las mismas teclas cuando cargue el fichero.

Edición de una macro de teclado

Ctrl-x Ctrl-k Ctrl-e (C-x C-k C-e)
Edita la última macro de teclado definida (kmacro-edit-macro).
Ctrl-x Ctrl-k e nombre RETURN (C-x C-k e nombre RET)
Edita un nombre de macro de teclado previamente definido (edit-kbd-macro).
Ctrl-x Ctrl-k l (C-x C-k l)
Edita las últimas 300 pulsaciones como macro de teclado (kmacro-edit-lossage).

Puede editar la última macro de teclado escribiendo Ctrl-x Ctrl-k Ctrl-e (C-x C-k C-e) o Ctrl-x RETURN (C-x C-k RET, kmacro-edit-macro). Esto formatea la definición de la macro en un buffer y entra en un modo principal especializado para editarla. Escriba Ctrl-h m (C-h m) una vez en ese búfer para mostrar los detalles de cómo editar la macro. Cuando termine de editarla, escriba Ctrl-c Ctrl-c (C-c C-c).

Puede editar una macro de teclado con nombre o una macro vinculada a una tecla escribiendo Ctrl-x Ctrl-k e (C-x C-k e, edit-kbd-macro). A continuación, escriba la entrada de teclado que utilizaría para invocar la macro: Ctrl-x e (C-x e) o Alt-x nombre (M-x nombre) o alguna otra secuencia de teclas.

Puede editar las últimas 300 pulsaciones de teclas como una macro escribiendo Ctrl-x Ctrl-k l (C-x C-k l, kmacro-edit-lossage).

Edición paso a paso de una macro de teclado

Puede reproducir y editar interactivamente la última macro de teclado, un comando a la vez, escribiendo Ctrl-x Ctrl-k SPACE (C-x C-k SPC, kmacro-step-edit-macro). A menos que salga de la macro usando q (q) o Ctrl-g (C-g), la macro editada sustituye a la última macro en el anillo de macros.

Esta función de edición de macros muestra la última macro en el minibuffer junto con el primer (o siguiente) comando a ejecutar, y le pide una acción. Puede introducir ? para obtener un resumen de sus opciones. Estas acciones están disponibles:

  • SPACE (SPC) e y (y) ejecutan el comando actual, y avanzan al siguiente comando en la macro de teclado.
  • n (n), d (d) y DEL (DEL) saltan y eliminan el comando actual.
  • f (f) salta el comando actual en esta ejecución de la macro de teclado, pero no lo borra de la macro.
  • TAB (TAB) ejecuta el comando actual, así como todos los comandos similares inmediatamente posteriores al comando actual; por ejemplo, TAB puede utilizarse para insertar una secuencia de caracteres (correspondiente a una secuencia de comandos de autoinserción).
  • c (c) continúa la ejecución (sin más edición) hasta el final de la macro de teclado. Si la ejecución termina normalmente, la macro editada sustituye a la macro de teclado original.
  • Ctrl-k (C-k) salta y borra el resto de la macro de teclado, termina la edición por pasos y sustituye la macro de teclado original por la editada.
  • q (q) y Ctrl-g (C-g) cancela la edición por pasos de la macro de teclado; descartando cualquier cambio realizado en la macro de teclado.
  • i tecla ... Ctrl-j (i tecla... C-j ) lee y ejecuta una serie de secuencias de teclas (sin incluir el comando Ctrl-j al final), y las inserta antes del comando actual en la macro de teclado, sin avanzar sobre el comando actual.
  • I tecla... (I tecla...) lee una secuencia de teclas, la ejecuta y la inserta antes del comando actual en la macro de teclado, sin avanzar sobre el comando actual.
  • r tecla... C-j (r tecla... C-j) lee y ejecuta una serie de secuencias de teclas (sin incluir el comando Ctrl-j final), y reemplaza el comando actual en la macro de teclado con ellas, avanzando sobre las secuencias de teclas insertadas.
  • R tecla... lee una secuencia de teclas, la ejecuta y reemplaza el comando actual en la macro de teclado con esa secuencia de teclas, avanzando sobre la secuencia de teclas insertada.
  • a tecla... Ctrl-j (a tecla... C-j) ejecuta el comando actual, luego lee y ejecuta una serie de secuencias de teclas (sin incluir el comando Ctrl-j final), y las inserta después del comando actual en la macro de teclado; luego avanza sobre el comando actual y las secuencias de teclas insertadas.
  • A tecla... Ctrl-j ejecuta el resto de los comandos en la macro de teclado, luego lee y ejecuta una serie de secuencias de teclas (sin incluir el comando Ctrl-j final), y las agrega al final de la macro de teclado; luego termina la edición por pasos y reemplaza la macro del teclado original con la macro editada.


Manejo de archivos

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

Para editar un archivo, debe decirle a Emacs que lea el archivo y prepare un buffer que contenga una copia del texto del archivo. Esto se llama visitar el archivo. Los comandos de edición se aplican directamente al texto en el buffer; es decir, a la copia dentro del Editor . Sus cambios aparecen en el propio archivo sólo cuando guarda el buffer de nuevo en el archivo.

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

Nombres de archivos

Muchos comandos de Emacs que operan sobre un archivo requieren que especifique el nombre del archivo, usando el minibuffer (ver Minibuffer para nombres de archivos).

Mientras está en el minibuffer, puede utilizar los comandos habituales de finalización e historial (véase El Minibuffer). Tenga en cuenta que la finalización de nombres de archivo ignora los nombres de archivo cuyas extensiones aparecen en la variable completion-ignored-extensions (véase Opciones de finalización). Tenga en cuenta también que la mayoría de los comandos utilizan la finalización permisiva con confirmación para la lectura de nombres de archivo: se le permite enviar un nombre de archivo inexistente, pero si escribe RETURN (RET) inmediatamente después de completar hasta un nombre de archivo inexistente, Emacs imprime '[Confirm]' y debe escribir un segundo RETURN para confirmar. Ver Salida del Completado, para más detalles.

Los comandos del historial del minibuffer ofrecen algunas características especiales para la lectura de nombres de archivos, ver Historial del minibuffer.

Cada buffer tiene un directorio por defecto, almacenado en la variable local del buffer default-directory. Cada vez que Emacs lee un nombre de archivo usando el minibuffer, normalmente inserta el directorio por defecto en el minibuffer como contenido inicial. Puedes inhibir esta inserción cambiando la variable insert-default-directory a nil (ver Minibuffer para nombres de archivos). 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 archivo en el directorio por defecto.

Cuando visita un archivo, Emacs establece el directorio por defecto en el buffer de visita al directorio de su archivo. Cuando crea un nuevo buffer que no está visitando un archivo, a través de un comando como Ctrl-x b (C-x b), su directorio por defecto es usualmente copiado del buffer que estaba vigente en ese momento (ver Creación y selección de buffers). Puede usar el comando Alt-x pwd (M-x pwd) para ver el valor de directorio por defecto en el buffer actual. El comando Alt-x cd (M-x cd) pide el nombre de un directorio y establece el directorio por defecto del buffer a ese directorio (al hacer esto no se cambia el nombre del archivo del buffer, si lo hay).

Por ejemplo, cuando se visita el archivo /u/rms/gnu/gnu.tasks, el directorio por defecto se establece en /u/rms/gnu/. Si invoca un comando que lee un nombre de archivo, al introducir sólo ‘foo’ en el minibuffer, 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 minibuffer, puede hacer uso de un par de atajos: una barra doble ignora todo lo que hay antes de la segunda barra en el par, y ‘~/’ es su directorio principal. Ver Minibuffer para nombres de archivos.

El carácter ‘$’ se usa para sustituir una variable de entorno en un nombre de archivo. 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 usado el comando del 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, por lo que el carácter ‘$’ se representa a sí mismo. Tenga en cuenta que las variables de entorno establecidas fuera de Emacs afectan al Editor sólo si se aplican antes de que se inicie el programa.

Para acceder a un archivo con ‘$’ en su nombre, si el ‘$’ provoca una expansión, escriba ‘$$’. Este par se convierte en un solo ‘$’ al mismo tiempo que se realiza la sustitución de variables para un solo ‘$’. Como alternativa, se puede entrecomillar todo el nombre del archivo con ‘/:’ (véase Nombres de archivo entrecomillados). Los nombres de archivo que comienzan con un caracter literal ‘~’ también deben citarse con ‘/:’.

Puede incluir caracteres no ASCII en los nombres de archivo. Consulte Sistemas de codificación para nombres de archivos.

Visita de Archivos

Ctrl-x Ctrl-f (C-x C-f)
Visita un archivo (find-files).
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-files-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 convertir su contenido.

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

Para visitar un archivo, escriba Ctrl-x Ctrl-f (C-x C-f, find-file) y use el minibuffer para introducir el nombre del archivo deseado. Mientras está en el minibuffer, puede abortar el comando escribiendo Ctrl-g (C-g). Vea Nombres de Archivos, para más detalles sobre la introducción de nombres de archivos en los minibuffer.

Si el archivo especificado existe pero el sistema no le permite leerlo, se muestra un mensaje de error en el área de eco (en los sistemas GNU y Unix puede ser capaz de visitar tal archivo usando los métodos ‘su’ o ‘sudo’; ver Archivos Remotos). De otro modo, puede saber que Ctrl-x Ctrl-f (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 (ver La línea de modo (modeline)). Emacs normalmente construye el nombre del buffer a partir del nombre del fichero, omitiendo el nombre del directorio. Por ejemplo, un archivo llamado /usr/rms/emacs.tex es visitado en un buffer llamado ‘emacs.tex’. Si ya existe un buffer con ese nombre, Emacs construye un nombre único; el método normal es añadir un sufijo basado en el nombre del directorio (por ejemplo, ‘<rms>’, ‘<tmp>’, etc.), pero puede seleccionar otros métodos. Consulte Hacer que los nombres de los buffers sean únicos.

Para crear un nuevo archivo, simplemente visítelo usando el mismo comando, Ctrl-x Ctrl-f (C-x C-f). ‘(New file)’ 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 hace con los comandos de edición se hacen en el buffer de Emacs. No tienen efecto en el archivo visitado, hasta que guarde el buffer (ver Guardando Archivos). Si un buffer contiene cambios que no han sido guardados, decimos que el buffer está modificado. Esto implica que algunos cambios se perderán si el buffer no se guarda. La línea de modo muestra dos estrellas cerca del margen izquierdo para indicar que el buffer está modificado.

Si visita un archivo que ya está en Emacs, Ctrl-x Ctrl-f (C-x C-f) cambia al buffer 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 archivo ha cambiado, Emacs le ofrece volver a leerlo.

Si intenta visitar un archivo más grande que large-file-warning-threshold (umbral de advertencia de archivo grande, el valor por defecto es 10000000, que son unos 10 megabytes), el Editor primero pide confirmación. Puede responder y (y) para proceder a visitar el archivo o l (l) para visitar el archivo literalmente (ver abajo). Visitar archivos grandes literalmente acelera la navegación y la edición de tales archivos, porque varias características potencialmente costosas están desactivadas. Tenga en cuenta, sin embargo, que Emacs no puede visitar archivos que sean más grandes que el tamaño máximo del búfer, que está limitado por la cantidad de memoria que puede asignar y los enteros que puede representar (ver Usando Múltiples Buffers). Si lo intenta, Emacs muestra un mensaje de error diciendo que se ha superado el tamaño máximo del buffer.

Si el nombre de archivo que especifica contiene caracteres comodín al estilo del shell, Emacs visita todos los archivos que coinciden con él. (En los sistemas de archivos que no distinguen entre mayúsculas y minúsculas, Emacs hace coincidir 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 minibuffer, debe escribir Ctrl-q ? (C-q ?) Consulte Nombres de archivo 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 está visitado en un buffer, pero dicho archivo ha cambiado externamente, Emacs normalmente le pregunta si quiere releer el archivo desde el disco. Pero si establece query-about-changed-file a nil, el Editor no preguntará, sino que simplemente mostrará el contenido del buffer antes de los cambios, y mostrará un mensaje en el área de eco diciéndo cómo revertir el buffer del archivo.

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

Si visita un archivo que en realidad es un directorio, Emacs invoca Dired, el navegador de directorios de Emacs. Ver 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 (archivos de archivos o archivos empaquetados), se visitan en modos especiales que invocan un entorno similar al de Dired para permitir operaciones en los miembros del archivo. Para más información sobre estas características, véase Archivos empaquetados.

Si visita un archivo que el sistema operativo no le deja modificar, o que está marcado como de sólo lectura, Emacs hace que el buffer sea también de sólo lectura, para que no haga cambios que luego le cueste guardar. Puede hacer que el buffer sea escribible con Ctrl-x-Ctrl-q (C-x C-q, read-only-mode). Vea Diversas operaciones en el búfer.

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

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

Ctrl-x 5f (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. Ver Marcos y Pantallas Gráficas.

En las pantallas gráficas, hay dos métodos adicionales para visitar archivos. En primer lugar, cuando Emacs está construido con un kit de herramientas GUI adecuado, los comandos invocados con el ratón (haciendo clic en la barra de menú o en la barra de herramientas) utilizan el diálogo de selección de archivos estándar del kit de herramientas en lugar de pedir el nombre del archivo en el minibuffer. En las plataformas GNU/Linux y Unix, Emacs hace esto cuando se construye con los kits de herramientas GTK+, LessTif y Motif; en MS-Windows y Mac, la versión GUI lo hace por defecto. Para información sobre cómo personalizar esto, vea Uso de los Cuadros de Diálogo.

En segundo lugar, Emacs soporta la función de arrastrar y soltar: al soltar un archivo en una ventana ordinaria se visita el archivo usando esa ventana. Como excepción, soltar un fichero en una ventana que muestra un buffer Dired mueve o copia el fichero en el directorio mostrado. Para más detalles, vea Arrastrar y soltar, y otras características de Dired. ‘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 convención de fin de línea usa, y los convierte a la codificación interna de Emacs y a la convención de fin de línea dentro del buffer. Cuando guarda el buffer, el Editor realiza la conversión inversa, escribiendo el archivo en el disco con su codificación original y la convención de final de línea. Véase Sistemas de codificación.

Si desea editar un archivo como una secuencia de caracteres ASCII sin ninguna codificación o conversión especial, utilice el comando Alt-x find-file-lietrally (M-x find-file-literally). Esto visita un archivo, como Ctrl-x Ctrl-f (C-x C-f), pero no hace conversión de formato (ver Conversión de Formato en el Manual de Referencia de Emacs Lisp), conversión de código de caracteres (ver Sistemas de Codificación), o descompresión automática (ver Acceso a Archivos Comprimidos), y no agrega una nueva línea final debido a require-final-newline (ver Personalización del 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.

Dos variables gancho (hook) 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. Esto no es un gancho normal, y el nombre termina en ‘-functions’ en lugar de ‘-hook’ para indicar este hecho.

La visita exitosa de cualquier archivo, ya sea existente o no, llama a las funciones en find-file-hook, sin argumentos. Esta variable es un hook normal. En el caso de un archivo inexistente, se ejecutan primero las funciones de find-file-not-found. Ver Ganchos.

Hay varias formas de especificar automáticamente el modo principal para editar el archivo (ver Elección de los modos de archivo), y de especificar las variables locales definidas para ese archivo (ver Variables locales en archivos).

Guardando Archivos

Guardar un buffer en Emacs significa escribir su contenido en el archivo que se visitó en el buffer.

Comandos para guardar archivos

Estos son los comandos que se refieren a guardar y escribir archivos.

Ctrl-x Ctrl-s (C-x C-s)
Guarda el buffer 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-~ (Alt-~)
Olvida que el buffer actual ha sido modificado (not-modified). Con el argumento del prefijo Ctrl-u (C-u), marcar el buffer actual como modificado.
Ctrl-x Ctrl-w (C-x C-w)
Guarda el buffer actual con un nombre de archivo especificado (write-file).
Alt-x set-visited-file-name (M-x set-visited-file-name)
Guarda el buffer actual con un nombre de archivo especificado (write-file).

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

Wrote /u/rms/gnu/gnu.tasks

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

(No changes need to be saved)

El mensaje refiere a que No hay cambios que necesiten ser guardados.

Con un argumento de prefijo, Ctrl-u Ctrl-x Ctrl-s (C-u C-x C-s), Emacs también marca el búfer del que se hará una copia de seguridad cuando se realice el siguiente guardado. Ver Copia de seguridad de archivos.

El comando Ctrl-x s (C-x s, save-some-buffers) ofrece guardar cualquiera o todos los buffers modificados. Le pregunta qué hacer con cada búfer. Las posibles respuestas 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 buffer, pero pregunta por el resto de los buffers.
! (!)
Guarda este buffer y el resto sin más preguntas.
q (q)
RETURN (RET)
Termina de guardar algunos búferes sin guardar más.
. (.)
Guarda este buffer y luego sale de save-some-buffers sin preguntar por otros buffers.
Ctrl-r (C-r)
Ver el buffer por el que se está preguntando en ese momento. Al salir del modo de visualización, 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 está preguntando.
d (d)
Difiere (compara) el buffer con su correspondiente archivo, para que pueda ver los cambios que estaría guardando. Esto llama al comando diff-buffer-with-file (ver 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é buffers preguntará Emacs.

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

Si ha cambiado un buffer pero no quiere guardar los cambios, debería tomar alguna medida para evitarlo. De lo contrario, cada vez que utilice Ctrl-x s (C-x s) o Ctrl-x Ctrl-c (C-x C-c), se arriesga a guardar este buffer por error. Una cosa que puede hacer es teclear Alt-~ (M-~) (not-modified, no modificado), que borra la indicación de que el buffer está modificado. Si hace esto, ninguno de los comandos de guardado creerá que el buffer necesita ser guardado. (‘~’ se utiliza a menudo como símbolo matemático para "no"; por lo tanto, M-~ es "no", metafísico). 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 Revertir un buffer. (También podría deshacer todos los cambios repitiendo el comando deshacer Ctrl-x u (C-x u) hasta que haya deshecho todos los cambios; pero revertir es más fácil).

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

Si quiere marcar el buffer como visitado en un archivo diferente y guardarlo inmediatamente, use Ctrl-x Ctrl-w (C-x C-w, write-file). Esto es equivalente a set-visited-file-name seguido de Ctrl-x Ctrl-s (C-x C-s), excepto que Ctrl-x Ctrl-w (C-x C-w) pide confirmación si el archivo existe. Ctrl-x Ctrl-s (C-x C-s) utilizado en un buffer que no está visitando un archivo tiene el mismo efecto que Ctrl-x Ctrl-w (C-x C-w); es decir, lee un nombre de archivo, marca el buffer como visitando ese archivo, y lo guarda allí. El nombre de archivo por defecto en un buffer que no está visitando un archivo se hace combinando el nombre del buffer con el directorio por defecto del buffer (ver Nombres de Archivos).

Si el nuevo nombre de archivo implica un modo principal, entonces Ctrl-x Ctrl-w (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 Elección de los modos de archivo.

Si Emacs está a punto de guardar un fichero y ve que la fecha de la última versión en el disco no coincide con lo que 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 Protección contra la edición simultánea

Copia de seguridad de archivos

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

Emacs hace una copia de seguridad de un archivo sólo la primera vez que el archivo se guarda desde un buffer. No importa cuántas veces se guarde el archivo posteriormente, su copia de seguridad no cambia. Sin embargo, si se elimina el buffer y se vuelve a visitar el archivo, se hará una nueva 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 parte de los sistemas operativos, su valor por defecto es t, por lo que Emacs sí escribe archivos de copia de seguridad.

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

A su elección, Emacs puede mantener una única copia de seguridad para cada archivo, o hacer una serie de archivos de copia de seguridad numerados para cada archivo que edite. Ver Copias de seguridad simples o numeradas.

El valor por defecto de la variable backup-enable-predicate impide que se escriban archivos de copia de seguridad para los archivos en los directorios utilizados para los 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 de un buffer, aunque ese buffer haya sido 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 respaldo si guarda el buffer de nuevo. C-u C-u C-x C-s guarda el búfer, pero primero convierte el contenido del archivo anterior en un nuevo archivo de copia de seguridad. O sea que C-u C-u C-x C-s hace ambas cosas: hace una copia de seguridad a partir del contenido anterior, y se dispone a hacer otra a partir del contenido recién guardado si se vuelve a guardar.

Puede personalizar la variable lista de directorios de copia de seguridad 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 ruta absoluta dir. Emacs modifica los nombres de los archivos de la copia de seguridad para evitar choques entre archivos con los mismos nombres originados en diferentes directorios. Alternativamente, añadiendo, ("." . ".~") haría las copias de seguridad en el subdirectorio invisible .~ del directorio del archivo original. Emacs crea el directorio, si es necesario, para hacer la copia de seguridad.

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, escribe 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 los archivos de respaldo 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
Hace copias de seguridad numeradas para los archivos que ya tienen copias de seguridad numeradas. En caso contrario, hace copias de seguridad individuales. Este es el valor por defecto.
t
Hace copias de seguridad numeradas.
never
Nunca hace copias de seguridad numeradas; hace siempre copias de seguridad individuales.

La forma habitual de establecer esta variable es globalmente, a través de su archivo init o del buffer de personalización. Sin embargo, puede establecer el control de versiones localmente en un buffer individual para controlar la realización de copias de seguridad para el archivo de ese buffer (ver Variables locales). Puede hacer que Emacs establezca el control de versiones localmente cada vez que visite un archivo determinado (ver Variables locales en archivos). Algunos modos, como el modo Rmail, establecen esta variable.

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 Emacs construye los nombres de los archivos de copia de seguridad.

Borrado automático de copias de seguridad

Para evitar el consumo excesivo de espacio en disco, Emacs puede borrar automáticamente las versiones de copia de seguridad numeradas. Generalmente mantiene las primeras copias de seguridad y las últimas, borrando las que están en medio. 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) que se conservan y el número de copias de seguridad más nuevas (con el número más alto) que se conservan, cada vez que se hace una nueva copia de seguridad. Las copias de seguridad del medio (excluyendo las más antiguas y las más nuevas) son las versiones medias 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 hacer una nueva versión de copia de seguridad; la copia de seguridad recién hecha se incluye en el recuento de versiones nuevas conservadas. Por defecto, ambas variables son 2.

Si delete-old-versions es t, Emacs borra los ficheros de copia de seguridad sobrantes de forma silenciosa. Si es nil, el valor por defecto, Emacs le pregunta si debe 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 Marcar varios archivos a la vez.

Copiar vs. Renombrar

Las copias de seguridad pueden hacerse copiando el archivo antiguo o renombrándolo. Esto supone una diferencia cuando el archivo antiguo tiene varios nombres (enlaces duros). Si el archivo antiguo se renombra en el archivo de copia de seguridad, entonces los nombres alternativos se convierten en nombres para el archivo de copia de seguridad. Si en cambio se copia el archivo antiguo, entonces los nombres alternativos siguen siendo nombres para el archivo que se está editando, y el contenido al que se accede con esos nombres será el nuevo contenido.

El método para hacer una copia de seguridad del archivo también puede afectar al propietario y al grupo del archivo. Si se utiliza la copia, éstos no cambian. Si se utiliza el cambio de nombre, usted se convierte en el propietario del archivo, y el grupo del archivo se convierte en el predeterminado (los diferentes sistemas operativos tienen diferentes valores predeterminados para el grupo).

La elección de renombrar o copiar se hace de la siguiente manera:

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

  • Si la variable backup-by-copying-when-linked no es nula (por defecto es nula), y el archivo tiene varios nombres, se utiliza la copia.

  • De lo contrario, si la variable backup-by-copying-when-mismatch es no nula (el valor predeterminado es t), y el cambio de nombre cambiaría el propietario o el grupo del archivo, u tilice la copia.

    Si cambia backup-by-copying-when-mismatch a nil, Emacs comprueba el user-id numérico del propietario del fichero y el group-id numérico del grupo del fichero. Si cualquiera de ellos no es mayor que backup-by-copying-when-privileged-mismatch, entonces se comporta como si backup-by-copying-when-mismatch no fuera nulo.

  • En caso contrario, la opción por defecto es renombrar.

Cuando un fichero se gestiona con un sistema de control de versiones (ver Control de Versiones), Emacs normalmente no hace copias de seguridad de la forma habitual para ese fichero. Pero confirmar (también conocido como check in, ver 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 los enlaces duros, desconectando el nombre del 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.

Personalización del guardado de archivos

Si el valor de la variable require-final-newline es t, al guardar o escribir un fichero se pone silenciosamente una nueva línea al final si no hay ya una. Si el valor es visit, Emacs añade una nueva línea al final de cualquier archivo que no tenga una, justo después de visitar el archivo. (Si el valor es visit-save, añade esas nuevas líneas tanto al visitar como al guardar. Si el valor es nil, deja el final del archivo sin cambios; cualquier otro valor que no sea nil significa que Emacs te pregunta si quieres 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 se supone que siempre terminan 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. Al establecer 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 fichero a través de un enlace simbólico, Emacs romperá el enlace simbólico al guardar el buffer, y escribirá el buffer en un fichero con el mismo nombre que el enlace simbólico, si el valor de file-precious-flag es no nulo (ver file-precious-flag en The Emacs Lisp Reference Manual). Si quiere que Emacs guarde el buffer en el fichero 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 en caché los datos del archivo en la memoria principal antes de enviarlos 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 los datos si el sistema operativo se bloquea antes de que la memoria caché se registre o vuelque en el disco.

Para disminuir 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 implementan fsync correctamente, y en parte porque el procedimiento de guardado de archivos de Emacs normalmente depende también de las actualizaciones de los directorios que podrían no sobrevivir a un fallo incluso si fsync funciona correctamente.

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

Emacs nunca usa fsync cuando escribe archivos de auto-guardado, ya que estos archivos podrían perder datos de todas formas.

Protección contra la edición simultánea

La edición simultánea se produce cuando dos usuarios visitan el mismo archivo, ambos hacen cambios y luego ambos los guardan. Si no se informa a nadie de que esto está ocurriendo, el usuario 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, y emite un aviso inmediato. 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 usuario tomando la acción correctiva adecuada en lugar de guardar el archivo.

Cuando hace la primera modificación en un buffer de Emacs que está visitando un archivo, registra que el archivo está bloqueado por Ud.. (Lo hace creando un enlace simbólico (7) con nombre especial y contenido especial en el mismo directorio. Ver (elisp)File Locks, para más detalles). El Editor elimina el bloqueo cuando guardas los cambios. La idea es que el archivo se bloquee siempre que un buffer de Emacs que lo visite tenga cambios sin guardar.

Nota

(7) Si su sistema de archivos no admite enlaces simbólicos, se utiliza un archivo normal.

Puede evitar la creación de archivos bloqueados estableciendo la variable create-lockfiles a nil. Precaución: al hacer esto perderá los beneficios que esta característica proporciona. También puede controlar dónde se escriben los archivos de bloqueo utilizando la variable lock-file-name-transforms.

Si empieza a modificar el buffer 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
Roba el bloqueo. Quien ya estaba cambiando el archivo pierde el bloqueo y lo gana Ud.
p
Procede. Sigue adelante y edita el archivo a pesar de que esté bloqueado por otra persona.
q
Salir. Esto provoca un error (file-locked, archivo bloqueado), y el contenido del búfer permanece inalterado, la modificación que intentaba hacer no tiene lugar.

En circunstancias en las que el Editor o el sistema operativo se bloquean, puede dejar atrás archivos de bloqueo que son obsoletos, por lo que ocasionalmente puede obtener advertencias sobre colisiones espurias. Cuando determine que la colisión es espuria, simplemente use p para decirle a Emacs que siga adelante de todos modos.

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

Un archivo de bloqueo no puede ser escrito en algunas circunstancias, 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, el Editor todavía puede detectar la colisión cuando 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 lo guardó, eso implica que los cambios se han hecho de alguna otra manera, y se perderán si el Editor procede a guardarlo. Emacs muestra entonces un mensaje de advertencia y pide confirmación antes de guardar; responda yes (si) para guardar, y no o Ctrl-g (C-g) para cancelar el guardado.

Si se le notifica que la edición simultánea ya ha tenido lugar, una forma de comparar el buffer con su archivo es el comando Alt-x diff-buffer-with-file (M-x diff-buffer-with-file). Véase Comparación de archivos.

Puede evitar la creación de archivos de bloqueo remoto 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 buffer actual.

Sombra de archivos

Puede organizar la conservación de copias sombra 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 otras sesiones de Emacs, así como a la actual. Una vez configurado el grupo, cada vez que salga del Editor, éste copiará el archivo que hayas editado a los demás archivos de su grupo. También puede hacer la copia sin salir de Emacs, escribiendo Alt-x shadow-copy-files (M-x shadow-copy-files).

Un shadow cluster (grupo de archivos sombra) es un grupo de hosts que comparten directorios, de modo 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 Alt-x shadow-define-cluster (M-x shadow-define-cluster).

Alt-x shadow-initialize (M-x shadow-initialize)
Configura el shadowing 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 cluster 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 sombrear algunos archivos.

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

Antes de copiar un archivo a sus sombras, Emacs pide confirmación. Puede responder "no" para evitar la copia de este fichero, esta vez. Si quiere cancelar el shadowing permanentemente para un determinado archivo (cancelar la ruta a un determinado archivo), use Alt-x shadow-cancel (M-x shadow-cancel) para eliminar o cambiar el grupo de archivos en sombra.

La sombra de archivos no está disponible en MS Windows.

Actualización automática de las marcas de tiempo

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

Time-stamp: <>

o asi:

Time-stamp: " "

A continuación, añada la función time-stamp al hook before-save-hook (véase Ganchos). Cuando guarde el archivo, esta función actualizará automáticamente la marca de tiempo con la fecha y hora actuales. También puede utilizar 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 local (ver C.4 Variables de entorno) y zona horaria (ver Hora del día en el Manual de referencia de Emacs Lisp). Para las personalizaciones, vea el grupo Personalizar sello de tiempo (time-stamp).

Revertir un buffer

Si ha hecho cambios extensos en un buffer 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, escriba Ctrl-x xg (C-x x g). Como revertir involuntariamente podría perder mucho trabajo, Emacs pide confirmación primero si se modifica el buffer.

El comando revert-buffer trata de 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 hecho cambios importantes, el punto puede terminar en una ubicación totalmente diferente.

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

Para revertir un buffer 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 en el buffer. Dado que revertir de esta manera puede ser muy lento cuando se ha hecho un gran número de cambios, se puede modificar la variable revert-buffer-with-fine-grain-max-seconds para especificar una cantidad máxima de segundos que debe tomar reemplazar el contenido del buffer de esta manera. 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 buffers creados explícitamente con Ctrl-x b (C-x b) no pueden revertirse; revert-buffer informa de un error si se intenta.

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

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

También puedes decirle a Emacs que revierta los buffers automáticamente cuando sus archivos visitados cambien en el disco; ver Reversión automática: Mantener los búferes actualizados automáticamente.

Reversión automática: Mantener los búferes actualizados automáticamente

Un búfer puede desincronizarse con respecto a su archivo visitado en el disco si ese archivo es modificado por otro programa. Para mantenerlo actualizado, puede activar el modo de reversión automática escribiendo Alt-x auto-revert-mode (M-x auto-revert-mode). Esto revierte automáticamente el buffer 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 buffer si tiene cambios sin guardar, o si su archivo en el disco es borrado o renombrado.

Un uso del modo de Reversión Automática es el de "seguir" un archivo como el registro del sistema, de modo que los cambios realizados en ese archivo por otros programas se muestren continuamente. Para ello, basta con mover el punto al final de la memoria intermedia, y se mantendrá allí mientras cambia el contenido del archivo. Sin embargo, si está seguro de que el archivo sólo cambiará creciendo al final, utilice en su lugar el modo de 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 buffer se auto-revierte, se genera un mensaje. Esto puede suprimirse estableciendo auto-revert-verbose a nil.

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

Por defecto, el modo de Reversión Automática funciona usando notificaciones de archivos, por lo que los cambios en el sistema de archivos son reportados a Emacs por el SO. Puede deshabilitar el uso de las notificaciones de archivos personalizando la variable auto-revert-use-notify a un valor nulo, entonces Emacs comprobará los cambios en los archivos haciendo un sondeo cada cinco segundos. Puede cambiar el intervalo de sondeo a través de la variable auto-revert-interval.

No todos los sistemas soportan las notificaciones de archivos; donde no se soportan, auto-revert-use-notify será nulo (nil) por defecto.

Por defecto, el modo de Reversión Automática sondeará los archivos en busca de cambios periódicamente, incluso cuando se utilicen las notificaciones de archivos. El sondeo es innecesario en muchos casos, y desactivarlo puede ahorrar energía al depender sólo de las notificaciones. Para ello, establezca la variable auto-revert-avoid-polling a un valor no nulo. Sin embargo, la notificación es ineficaz en ciertos sistemas de archivos; principalmente los sistemas de archivos de red en máquinas tipo Unix, donde los archivos pueden ser alterados desde otras máquinas. Para estos sistemas de archivos, el sondeo puede ser necesario. 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 buffers de Dired (ver Dired, el editor de directorios), el modo de auto-reversión (Auto Revert mode) refresca el buffer cuando se crea o elimina un archivo en el directorio del buffer.

Consulte Deshacer acciones de control de versiones, para conocer los comandos para revertir a versiones anteriores de archivos bajo control de versiones. Vea 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.

Reversión automática de buffers que no son de archivo

El Modo de Reversión Automática Global normalmente sólo revierte los buffers de archivo. Hay dos maneras de revertir automáticamente ciertos búferes que no son de archivo: habilitando el Modo de Reversión Automática en esos búferes (esto se logra usando Alt-x auto-revert-mode (M-x auto-revert-mode)); y estableciendo global-auto-revert-non-file-buffers a un valor no nulo. Esto último activa la Reversión Automática para todos los tipos de búferes para los que está implementado (listados en el menú de abajo).

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 después de revertirse. Por lo tanto, no se revierten si se modifican. Esto puede ser complicado, porque decidir cuándo un búfer que no es de archivo debe ser marcado como modificado es normalmente más difícil que para los búferes de archivo.

Otro detalle complicado es que, por razones de eficiencia, la Reversión Automática a menudo no trata de detectar todos los posibles cambios en el buffer, sólo los cambios que son 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 necesariamente hace inútiles las reversiones manuales.

En el otro extremo, algunos búferes revierten automáticamente cada intervalo de auto-reversión de segundos. (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 de archivo 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 mayor puede indicar esto estableciendo buffer-auto-revert-by-notification a un valor no nulo en ese buffer, 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 propio directorio.

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

Reversión automática del menú de búferes

Si se activa la reversión automática de los búferes que no son de archivo, el menú de búferes (ver Operar en varios buffers) se revierte automáticamente cada intervalo de reversión automática de segundos, haya o no necesidad de hacerlo. (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, sólo tiene que revertirlo 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 la adición de marcas establezca la bandera de modificación del búfer evita que la reversión automática borre las marcas.

Revertir automáticamente los búferes anulados

Los búfers de Dired sólo se auto-revierten cuando la lista de archivos del directorio principal del búfer cambia (por ejemplo, cuando se añade o elimina un nuevo archivo). No se auto-revierten cuando cambia la información de 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, tiene que revertir manualmente usando g, incluso si la auto-reversión está activada en el buffer de Dired. A veces, puede dar la impresión de que modificar o guardar los archivos listados en el directorio principal realmente 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 auto-guardado. Sin embargo, esto no está garantizado.

Si el buffer de 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 los 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 la reversión, y la auto-reversión no se reanudará. Esto se debe a que, si marca los archivos, puede estar trabajando en el buffer y puede que no quiera que el buffer 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 Alt-~ (M-~). Sin embargo, si se añaden, borran o cambian marcas o banderas, se marcará de nuevo como modificado.

Los búferes remotos Dired no son actualmente auto-revertidos. Tampoco lo son los buffers Dired para los que se han utilizado 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.

Autoguardado: Protección contra desastres

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

Cuando Emacs determina que es el momento de auto-guardar, considera cada buffer, y cada uno es auto-guardado si esta función está habilitada para dicho búfer y este ha tenido cambios desde la última vez que fue auto-guardado. Cuando la variable auto-save-no-message es nula (por defecto), el mensaje ‘Auto-saving...’ (Auto-guardando...) se muestra en el área de eco durante el auto-guardado, si a algún archivo se le está aplicando este proceso; para desactivar los mensajes correspondientes al autoguardado personalice la variable a un valor no nulo. 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.

Guardado automático de archivos

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

Normalmente, el nombre del archivo de auto-guardado 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 guardan automáticamente sólo si lo solicita explícitamente; cuando se guardan automáticamente, el nombre del archivo autoguardado se hace añadiendo ‘#’ al principio y al final del nombre del búfer, y añadiendo dígitos y letras al final para que sea único. Por ejemplo, el búfer *mail* en el que se redactan los mensajes que se van a enviar puede guardarse automáticamente en un archivo llamado #*mail*#704juu. Los nombres de archivos de auto-guardado se hacen de esta manera 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 que se utilizará para el autoguardado en un buffer se calcula cuando se activa el autoguardado en ese buffer.

La variable auto-save-file-name-transforms permite un grado de control sobre el nombre del archivo de auto-guardado. Permite especificar una serie de expresiones regulares y reemplazos para transformar el nombre del archivo de autoguardado. El valor por defecto coloca los archivos de autoguardado de los archivos remotos (ver Archivos remotos) en el directorio de archivos temporales de la máquina local.

Cuando borra una parte sustancial del texto en un buffer grande, el autoguardado se desactiva temporalmente en ese buffer. Esto se debe a que si borró el texto sin querer, podría encontrar el archivo de autoguardado más útil si contiene el texto borrado. Para volver a activar el autoguardado después de que esto ocurra, guarde el búfer con Ctrl-x Ctrl-s (C-x C-s), o use el modo de autoguardado Ctrl-x 1 Alt-x (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 global menor 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 se establece en 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 las operaciones de autoguardado 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 Controlar el autoguardado, para más detalles sobre estas variables.

El archivo de auto-guardado de un buffer se borra cuando se guarda el buffer en su archivo visitado. (Puede impedirlo estableciendo la variable delete-auto-save-files a nil.) Cambiando el nombre del archivo visitado con Ctrl-x Ctrl-w (C-x C-w) o set-visited-file-name se renombra cualquier archivo de auto-guardado para que vaya con el nuevo nombre visitado

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

Controlar el autoguardado

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

Emacs auto-guarda periódicamente basado en cuántos caracteres has escrito 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, se comportará como si el valor fuera 20.

El auto-guardado también tiene lugar cuando deja de escribir durante un tiempo. 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 Garbage Collection en The Emacs Lisp Reference Manual). Para cambiar este intervalo, personalice la variable auto-save-timeout. El período de tiempo real es más largo si el búfer actual es largo; esto es una heurística que pretende mantenerse al margen cuando se editan búferes largos, en los que el auto-guardado lleva una cantidad de tiempo apreciable. El auto-guardado durante los períodos de inactividad logra dos cosas: primero, se asegura de que todo su trabajo se guarda si se aleja de la terminal por un tiempo; segundo, puede evitar algún auto-guardado mientras está escribiendo.

Cuando el modo auto-save-visited está habilitado, Emacs auto-guardará los buffers de visita de archivos después de cinco segundos de tiempo de inactividad. Puede personalizar la variable auto-save-visited-interval para cambiar el intervalo de tiempo de inactividad.

Emacs también realiza el auto-guardado cuando 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 Atl-x (M-x do-auto-save).

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 Alt-x recover-file RETURN archivo RETURN (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 auto-guardado #file#. A continuación, puede guardar con Ctrl-x Ctrl-s (C-x C-s) para poner el texto recuperado en el propio archivo. Por ejemplo, para recuperar el archivo foo.c de su archivo de auto-guardado #foo.c#, haga:

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

Antes de pedir confirmación, Alt-x recover-file (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 cuelgan, puede recuperar todos los archivos que estaba editando desde sus archivos de autoguardado con el comando Alt-x recover-session (M-x recover-session). Esto le muestra primero una lista de sesiones interrumpidas grabadas. Mueva el punto a la que elija y escriba Ctrl-c Ctrl-c (C-c C-c).

Entonces recover-session pregunta por cada uno de los archivos que se estaba editando durante esa sesión, consultando si se debe recuperar ese archivo. Si responde que sí, llama a recover-file, que funciona de forma normal. Muestra las fechas del archivo original y de su archivo de auto-guardado, y pregunta una vez más si se debe recuperar ese archivo.

Cuando recover-session termina, los archivos que has elegido recuperar están presentes en los buffers de Emacs. Entonces debe guardarlos. Sólo esto -guardarlos- actualice los propios archivos.

Emacs registra la información sobre las sesiones interrumpidas en archivos llamados .saves-pid-hostname~ en el directorio ~/.config/emacs/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.

Alias de nombres de archivo

Tanto los enlaces simbólicos como los enlaces duros hacen posible 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 se prefiere ninguno de ellos. Por el contrario, un enlace simbólico es una especie de alias definido: cuando foo es un enlace simbólico a bar, se 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 visita un fichero que Emacs ya está visitando con un nombre diferente, el Editor muestra un mensaje en el área de eco y usa el buffer existente que visita ese fichero. 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 los nombres de archivo largos, o en un sistema de archivos que no distingue entre mayúsculas y minúsculas. Puede suprimir el mensaje estableciendo la variable find-file-suppress-same-file-warnings a un valor no nulo. Puede desactivar esta función por completo 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, el nombre de archivo que se registra en el búfer es el nombre verdadero del archivo (que se obtiene reemplazando todos los enlaces simbólicos por sus nombres de destino), en lugar del nombre que usted especifique. Establecer find-file-visit-truename también implica el efecto de find-file-existing-other-name.

A veces, se accede a un directorio a través de un enlace simbólico, y puede querer que Emacs muestre preferentemente su nombre enlazado. Para hacer esto, personalice directory-abbrev-alist. Cada elemento de esta lista debe tener la forma (from . to), lo que significa sustituir from por to siempre que from aparezca en un nombre de directorio. La cadena from es una expresión regular (ver Sintaxis de Las Expresiones Regulares). Se compara con nombres de directorios anclados en el primer carácter, y debe comenzar con ‘\`’ (para soportar nombres de directorios con nuevas líneas incrustadas, lo que anularía ‘^’). La cadena to debe ser un nombre de directorio absoluto ordinario que apunte al mismo directorio. No use ‘~’ para representar un directorio de origen en la cadena to; 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"))

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 función de navegador de directorios llamada Dired, que puedes invocar con Ctrl-x d (C-x d); ver Dired, el editor de directorios.

Ctrl-x Ctrl-d dir-o-patrón RETURN (C-x C-d dir-o-patrón RET)
Muestra un breve listado de directorios (list-directory).
Ctrl-u Ctrl-x Ctrl-d (C-u C-x C-d dir-o-patrón RET)
Muestra un listado de directorios detallado.
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 RETURN
(M-x delete-directory RET nombredir RET)
Elimina el directorio llamado nombredir. Si no está vacío, se le preguntará si quiere borrarlo recursivamente.

El comando para mostrar un listado de directorios es Ctrl-x Ctrl-d (C-x C-d, list-directory). Lee mediante el minibuffer un nombre de archivo que es un directorio a listar o un patrón que contiene 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. Este es un ejemplo de especificación de un patrón de nombre de archivo:

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

Normalmente, Ctrl-x Ctrl-d (C-x C-d) muestra un breve listado de directorios que sólo contiene los nombres de los archivos. Un argumento numérico (sin importar el valor) le dice 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 los interruptores que se pasan a ls: list-directory-brief-switches es una cadena que da los interruptores a utilizar en los listados breves ("-CF" por defecto), y list-directory-verbose-switches es una cadena que da los interruptores a utilizar en un listado verboso ("-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 Alt-x delete-directory (M-x delete-directory) pide 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 tienen una función de "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. Vea Diversas operaciones de archivo, para más información sobre el uso de la Papelera.

Comparación de archivos

El comando Alt-x diff (M-x diff) solicita dos nombres de archivo, utilizando el minibuffer, y muestra las diferencias entre los dos archivos en un buffer llamado *diff*. Esto funciona ejecutando el programa diff, utilizando 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 Comparación y Fusión de Archivos, para más información sobre el programa diff.

La salida del comando diff se muestra utilizando un modo principal llamado modo Diff. Ver Modo Diff.

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

El comando Alt-x diff-backup (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 Alt-x diff-buffer-with-file (M-x diff-buffer-with-file) compara un buffer especificado con su archivo correspondiente. Esto muestra los cambios que se harían en el archivo si se guarda el buffer.

El comando Alt-x diff-buffers (M-x diff-buffers) compara el contenido de dos buffers especificados.

El comando Alt-x compare-window (M-x compare-window) compara el texto de la ventana actual con el de la ventana que era la ventana seleccionada antes de seleccionar la actual. (Para más información sobre las ventanas en Emacs, vea Ventanas Múltiples.) La comparación comienza en el punto de cada ventana, después de empujar cada valor de punto inicial en el anillo de marcas (vea El anillo de marcas) en su respectivo buffer. 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. Luego el comando sale.

Si el punto en las dos ventanas es seguido por un texto no coincidente cuando el comando comienza, Alt-x compare-window (M-x compare-window) intenta heurísticamente avanzar hasta el texto coincidente en las dos ventanas, y luego sale. Por lo tanto, si utiliza M-x compare-window repetidamente, cada vez se salta un rango coincidente o encuentra el comienzo de otro.

Con un argumento numérico, compare-windows ignora los cambios en los espacios en blanco. Si la variable compare-ignore-case no es nula, la comparación también ignora las diferencias de 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 de prefijo lo desactiva para esa única invocación del comando.

Puede usar Alt-x smerge-mode (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 Fusión de archivos con Emerge, para la facilidad de Emerge, que proporciona una poderosa interfaz para fusionar archivos.

Modo Diff

El modo Diff es un modo principal utilizado para la salida de Alt-x diff (M-x diff) y otros comandos similares. Este tipo de salida se llama parche, porque se puede pasar 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 de texto contiguos que contienen una o más líneas modificadas. Los trozos suelen incluir también líneas no modificadas para dar contexto a los cambios. Cada trozo va precedido de una cabecera del mismo, que especifica los números de línea antiguos y nuevos donde se producen los cambios. El modo Diff resalta cada cabecera del trozo, para distinguirla del contenido real de este.

El primer trozo de un parche está precedido por 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 tal cabecera 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 Diversas operaciones en el búfer). Siempre que edite un trozo, el modo Diff intenta corregir automáticamente los números de línea en las cabeceras de los trozos, para asegurarse de que el parche sigue siendo correcto, y puede seguir siendo aplicado por el 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 pedazos (hunks) sean tratados como mensajes de error del compilador por Alt-g Alt-n (M-g M-n) y otros comandos que manejan mensajes de error (ver Modo de compilación). Así, puede utilizar los comandos del modo de compilación para visitar las ubicaciones de origen correspondientes.

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

Alt-n (M-n)
Se desplaza al siguiente punto de partida (diff-hunk-next). Con el argumento prefijo n, avanza al hunk siguiente.
Por defecto, el modo Diff refina los hunks a medida que Emacs los muestra, resaltando sus cambios con mayor granularidad. Alternativamente, si establece diff-refine en la navegación de símbolos, el modo Diff sólo refina el hunk al que se mueve con este comando o con diff-hunk-prev.
Alt-p (M-p)
Se mueve al hunk-start anterior (diff-hunk-prev). Con el argumento de prefijo n, se mueve hacia atrás al hunk anterior. Al igual que Alt-n (M-n), este comando refina el trozo al que se mueve si establece diff-refine en la navegación de símbolos.
Alt-} ( M-} )
Se mueve al siguiente archivo-inicio, en un parche de varios archivos (diff-file-next). Con el argumento prefijo n, se mueve hacia adelante al inicio del archivo siguiente.
Alt-{ ( M-{ )
Se mueve al inicio del archivo anterior, en un parche de varios archivos (diff-file-prev). Con el argumento prefijo n, retrocede al inicio del archivo anterior.
Alt-k (M-k)
Mata el trozo (hunk) en el punto (diff-hunk-kill).
Alt-K (M-K)
En un parche de varios ficheros, mata la parte del fichero actual. (diff-file-kill).
Ctrl-c Ctrl-a (C-c C-a)
Aplica este hunk a su archivo de destino (diff-apply-hunk). Con un argumento de prefijo Ctrl-u (C-u), revierte este trozo ( hunk), es decir, aplica la inversa del trozo, que cambia la versión "nueva" por la "antigua". Si diff-jump-to-old-file no es nulo, aplica el hunk a la versión "antigua" del archivo en su lugar.
Ctrl-c Ctrl-b (C-c C-b)
Resalta los cambios del 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 encontrar este comando útil si personaliza diff-refine a un valor no predeterminado.
Ctrl-c Ctrl-c (C-c C-c)
Va al fichero fuente y a la línea correspondiente a este hunk (diff-goto-source). Por defecto, esto salta a la "nueva" versión del fichero, la que se muestra primero en la cabecera del fichero. Con un argumento de 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 del 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 (ver Control de Versiones), esto salta al archivo de trabajo por defecto. Con un argumento de prefijo, salta a la revisión "antigua" del fichero (vea Examen y comparación de las antiguas revisiones), cuando el punto está en la línea antigua, o de lo contrario salta a la revisión "nueva".
Ctrl-c Ctrl-e (C-c C-e)
Inicie una sesión de Ediff con el parche (diff-ediff-patch). Ver Ediff en El Manual de Ediff.
Ctrl-c Ctrl-n (C-c C-n)
Restringe la vista al hunk actual (diff-restrict-view). Ver Estrechamiento. Con un argumento de prefijo, restringe la vista al fichero actual de un parche de varios ficheros. Para ampliar de nuevo, utilice Ctrl-x nw (C-x n w, widen, ampliar).
Ctrl-c Ctrl-r (C-c C-r)
Invierte la dirección de comparación para todo el buffer (diff-reverse-direction). Con un argumento prefijo, invierte la dirección sólo dentro de la región actual (ver La marca y la región). Invertir la dirección significa cambiar los hunks y las cabeceras de inicio de archivo para producir un parche que cambie la "nueva" versión por la "antigua".
Ctrl-c Ctrl-s (C-c C-s)
Divide el hunk en el punto (diff-split-hunk) en dos hunks separados. Esto inserta una cabecera del hunk y modifica la cabecera del hunk actual. Este comando es útil para editar manualmente parches, y sólo funciona con el formato diff unificado producido por las opciones -u o --unified del programa diff. Si necesita dividir un trozo en el formato de contexto diff producido por las opciones -c o --context de diff, primero convierta el buffer al formato diff unificado con Ctrl-u Ctrl-u (C-c C-u).
Ctrl-c Ctrl-d (C-c C-d)
Convierte todo el buffer al formato de contexto diff (diff-unified->context). Con un argumento de prefijo, convierte sólo los trozos dentro de la región.
Ctrl-c Ctrl-u (C-c C-u)
Convierte todo el buffer al formato de contexto diff unificado (diff-context->unified). Con un argumento de prefijo, convierte el formato unificado a formato de contexto. Cuando la marca está activa, convierte sólo los trozos (hunks) dentro de la región.
Ctrl-c Ctrl-l (C-c C-l)
Regenera el trozo actual (diff-refresh-hunk).
Ctrl-c Ctrl-w (C-c C-w)
Regenera el trozo actual, ignorando los cambios en los espacios en blanco (diff-ignore-whitespace-hunk).
Ctrl-x 4A (C-x 4 A)
Genera una entrada de ChangeLog, como hace Ctrl-x 4a (C-x 4 a) (ver Registro de cambios), para cada uno de los trozos (diff-add-change-log-entries-other-window). Esto crea un esqueleto del registro de cambios que más tarde puede rellenar con las descripciones reales de los cambios. El propio C-x 4 a en modo Diff opera en nombre del archivo del hunk 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 no intencionado y no deseado. Hay dos maneras de tratar este problema. En primer lugar, si activa el modo de espacios en blanco en un búfer de Diff (véase Espacios en blanco innecesarios), éste resalta automáticamente los espacios en blanco al final de las líneas modificadas. En segundo lugar, puede utilizar el comando Alt-x diff-delete-trailing-whitespace (M-x diff-delete-trailing-whitespace), que busca los espacios en blanco al final de las líneas modificadas por el parche, y elimina esos espacios en blanco tanto en el parche como en los archivos fuente parcheados. Este comando no guarda las modificaciones que realiza, por lo que usted puede decidir si guarda los cambios (la lista de archivos modificados se muestra en el área de eco). Con un argumento de prefijo, intenta modificar los archivos fuente originales ("antiguos") en lugar de los archivos fuente parcheados ("nuevos").

Si la sintaxis de diff-font-lock es distinta de cero, los fragmentos de código fuente en los hunks se resaltan de acuerdo con el modo principal apropiado.

Copiar, nombrar y renombrar archivos

Emacs tiene varios comandos para copiar, nombrar y renombrar archivos. Todos ellos leen dos nombres de archivo, antiguo (o destino) y new (nuevo), utilizando el minibuffer, luego copian o ajustan el nombre de un archivo en consecuencia; no aceptan nombres de archivo con comodines.

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

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

Alt-x copy-file (M-x copy-file) copia el contenido del archivo antiguo al archivo nuevo.

Alt-x copy-directory (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 antiguo y la coloca en nuevo. En caso contrario, copia todo el contenido de antiguo en un directorio llamado nuevo. Si copy-directory-create-symlink es non-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. (Este es el valor por defecto).

Alt-x rename-file (M-x rename-file) renombra el archivo antiguo como nuevo. Si el nombre del archivo nuevo ya existe, debe confirmarlo con un yes (sí) o el renombramiento no se realiza; esto se debe a que el renombramiento hace que se pierda el antiguo significado 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 Control de Versiones), debe renombrarlo utilizando M-x vc-rename-file en lugar de M-x rename-file. Vea Eliminación y cambio de nombre de archivos con control de versiones.

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

Alt-x make-symbolic-link (M-x make-symbolic-link) crea un enlace simbólico llamado nuevo, que apunta a destino. El efecto es que los futuros intentos de abrir el archivo nuevo se referirán a cualquier archivo que se llame destino en el momento de la apertura, o recibirán 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 el objetivo para que pueda especificar fácilmente los directorios de origen, y elimina el ‘/:’ inicial para que pueda especificar nombres relativos que comiencen con el literal ‘~’ o ‘/:’. Véase Nombres de archivos entrecomillados. En MS-Windows, este comando sólo funciona en MS Windows Vista y posteriores. Cuando es new, funciona dependiendo del tipo de sistema.

Diversas operaciones de archivo

Emacs tiene comandos para realizar muchas otras operaciones con ficheros. Todas operan sobre un archivo; no aceptan nombres de archivo con comodines.

Alt-x delete-file (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. Vea Borrar archivos con Dired.

Alt-x move-file-to-trash (M-x move-file-to-trash) mueve un archivo a la papelera del sistema (o a la papelera de reciclaje). Esta es una facilidad disponible en la mayoría de los sistemas operativos; los archivos que se mueven a la Papelera pueden ser recuperados más tarde si cambia de opinión. (La forma de restaurar los archivos en 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 de borrado comunes, cambie la variable delete-by-moving-to-trash a t. Esto afecta a los comandos Alt-x delete-file (M-x delete-file) y Alt-x delete-directory (M-x delete-directory) (ver Directorios de archivos), así como a los comandos de borrado en Dired (ver Borrar archivos con Dired). Suministrar un argumento de prefijo a M-x delete-file o M-x delete-directory hace que se eliminen directamente, en lugar de usar la Papelera, independientemente de la eliminación por movimiento a la Papelera.

Si un archivo está bajo control de versiones (ver Control de Versiones), debería borrarlo usando Alt-x vc-delete-file (M-x vc-delete-file) en lugar de Alt-x delete-file (M-x delete-file). Vea Borrar y renombrar archivos bajo control de versiones.

Alt-x insert-file (M-x insert-file, también Ctrl-x i (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 El anillo de marcas).

Alt-x insert-file-lietrally (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 ni conversión especial, de forma similar al comando M-x find-file-literally (véase Visitar archivos).

Alt-x write-region (M-x write-region) es la inversa de M-x insert-file; copia el contenido de la región en el archivo especificado. Alt-x append-to-file (M-x append-to-file) añade el texto de la región al final del archivo especificado. Véase Acumular texto. La variable write-region-inhibit-fsync se aplica a estos comandos, así como al guardado de archivos; véase Personalización del guardado de archivos.

Alt-x set-file-modes (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 ser leído, escrito o ejecutado, y por quién. Este comando lee los modos de archivo utilizando el mismo formato simbólico u octal aceptado por el comando chmod; por ejemplo, ‘u+x’ significa añadir el permiso de ejecución para el usuario propietario del archivo. No tiene efecto en los sistemas operativos que no soportan los modos de archivo. chmody es un alias de conveniencia para esta función.

Acceso a archivos comprimidos

Emacs descomprime automáticamente los archivos comprimidos cuando se los visita, y los recomprime automáticamente si se los modifica y guarda. Emacs reconoce los archivos comprimidos por su nombre. 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 utiliza el contenido de un fichero. Esto incluye visitarlo, guardarlo, insertar su contenido en un buffer, 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.

Archivos empaquetados

Un archivo cuyo nombre termina en ‘.tar’ es normalmente un archivo hecho por el programa tar. Emacs ve estos archivos en un modo especial llamado modo Tar que proporciona una lista de contenidos similar a la de Dired (ver Dired, el editor de directorios). Puedes moverte por la lista como lo harías en Dired, y visitar los subficheros contenidos en el archivo. Sin embargo, no todos los comandos de Dired están disponibles en el modo Tar.

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

Las teclas e, f y RETURN (RET) extraen un archivo componente en su propio búfer. Puedes editarlo allí, y si guardas el buffer, la versión editada reemplazará a la versión en el buffer Tar. Hacer clic con el ratón en el nombre del archivo en el buffer Tar hace lo mismo. v (v) extrae un archivo en un buffer en el modo de vista (ver Modo de vista). o (o) extrae el archivo y lo muestra en otra ventana, por lo que podría editar el archivo y operar en el archivo simultáneamente.

La tecla I (I) añade un nuevo fichero (normal) al archivo. El archivo está inicialmente vacío, pero puede editarse fácilmente utilizando los comandos anteriores. El comando inserta el nuevo fichero antes del actual, de modo que si se utiliza en la primera línea del buffer de Tar, el nuevo fichero será el primero del archivo, y si se utiliza al final del buffer, será el último.

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

Al guardar el buffer de Tar se escribe una nueva versión del archivo en el disco con los cambios que usted hizo en los componentes.

No necesita el programa tar para utilizar el modo Tar: Emacs lee los archivos directamente. Sin embargo, el acceso a los archivos comprimidos requiere el programa de descompresión apropiado.

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

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

A diferencia del modo Tar, el modo Archivo ejecuta los programas de archivado para desempaquetar y reempaquetar los archivos. Sin embargo, no necesitas estos programas para ver la tabla de contenidos del archivo, sólo para extraer o manipular los subficheros del archivo. Los detalles de los nombres de los programas y sus opciones pueden establecerse en el grupo de personalización ‘Archive’ (ver Grupos de personalización).

Archivos remotos

Puedes referirte a archivos en otras máquinas utilizando una sintaxis especial de nombres de archivo:

/method:host:filename
/method:user@host:filename
/method:user@host#port:filename

Para llevar a cabo esta petición, Emacs utiliza un programa de acceso remoto como ssh. Siempre debe especificar en el nombre del archivo qué método usar, por ejemplo, /ssh:usuario@host:nombredelarchivo 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 del host empieza por ‘ftp.’ (con punto), Emacs utiliza FTP.
  2. Si el nombre de usuario es ‘ftp’ o ‘anonymous’, Emacs utiliza FTP.
  3. Si la variable tramp-default-method se establece como ‘ftp’, Emacs utiliza FTP.
  4. Si ssh-agent se está ejecutando, Emacs utiliza scp.
  5. En caso contrario, Emacs utiliza ssh.

Puedes desactivar completamente la función de nombre de archivo remoto estableciendo la variable tramp-mode a nil. Puedes desactivar la función en casos individuales citando el nombre del fichero con ‘/:’ (ver Nombres de ficheros citados).

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

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

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

Por defecto, los archivos de auto-guardado para los archivos remotos se hacen en el directorio de archivos temporales en la máquina local, según lo especificado por la variable auto-save-file-name-transforms. Consulte la sección de autoguardado de archivos.

Para visitar archivos accesibles por FTP anónimo, se utilizan nombres de usuario especiales ‘anonymous’ o ‘ftp’. Las contraseñas para estos nombres de usuario se manejan de manera especial. La variable ange-ftp-generate-anonymous-password controla lo que sucede: si el valor de esta variable es una cadena, entonces esa cadena se usa como contraseña; si no es nula (el valor por defecto), entonces se usa el valor de user-mail-address; si es nula, entonces Emacs pide una contraseña como siempre (ver Introducir contraseñas).

A veces puede ser incapaz de acceder a los archivos de una máquina remota porque un cortafuegos intermedio bloquea la conexión por razones de seguridad. Si puede iniciar sesión en 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 utilizando nombres de archivos remotos; todo lo que tiene que hacer es especificar el nombre de la máquina pasarela estableciendo la variable ange-ftp-gateway-host, y establecer ange-ftp-smart-gateway en t. De lo contrario, puede hacer que los nombres de archivos remotos funcionen, 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).

Nombres de archivo entrecomillados

Puede entrecomillar un nombre de archivo absoluto para evitar que los caracteres especiales y la sintaxis en él 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 sea tratado como un nombre de archivo remoto. Así, si tienes un directorio llamado /foo: y un archivo de nombre bar en él, puedes referirte a ese archivo en Emacs como ‘/:/foo:/bar’.

Si quieres citar sólo los caracteres especiales en la parte local de un nombre de archivo remoto, puedes 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 principal 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 minibuffer un nombre de fichero que contenga ‘$’. Para que esto funcione, ‘/:’ debe estar al principio del contenido del minibuffer. (También puede duplicar cada ‘$’; vea Nombres de archivos con $).

También puede citar caracteres comodín con ‘/:’, para visitar. 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 en /tmp que comienza con ‘foo’ y termina con ‘bar’ es foo*bar, entonces especificando /tmp/foo*bar visitará sólo /tmp/foo*bar.

Caché de nombres de archivos

Puede utilizar 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 minibuffer, Ctrl-TAB (C-TAB, file-cache-minibuffer-complete) lo completa utilizando la caché de nombres de archivo. Si se repite Ctrl-TAB, eso hace un ciclo a través de las posibles terminaciones de lo que se había tecleado originalmente. (Sin embargo, tenga en cuenta que el carácter Ctrl-TAB no puede ser tecleado en la mayoría de los terminales de texto).

La caché de nombres de archivo no se llena automáticamente. En su lugar, Ud. carga los nombres de archivo en la caché utilizando 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 en el 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 en el 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 en el directorio y todos sus subdirectorios anidados a la caché de nombres de archivo, utilizando locate para encontrarlos todos.
Alt-x file-cache-add-directory-list RETURN variable RETURN
(M-x file-cache-add-directory-list RET variable RET)
Añade a la caché de nombres de archivo cada nombre de archivo de cada directorio enumerado en variable, que debe 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 ella.

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

Funciones de búsqueda de archivos

En esta sección, introducimos algunas facilidades para encontrar archivos abiertos recientemente, leyendo los nombres de los archivos desde un buffer.

Si se activa el modo recentf, con Alt-x recent-mode (M-x recentf-mode), el menú 'Archive' incluye un submenú que contiene una lista de archivos abiertos recientemente. Alt-x recentf-save-list (M-x recentf-save-list) guarda la lista actual de recentf en un archivo, yAlt-x recentf-edit-list (M-x recentf-edit-list) la edita.

El comando Alt-x ffap (M-x ffap) generaliza find-file con valores heurísticos más potentes (ver Finding Files and URLs at Point), a menudo basados en el texto del punto. El modo de finalización parcial ofrece otras características que amplían find-file, que pueden utilizarse con ffap. Véase Opciones de finalización.

Visualización de archivos de imagen

Al visitar archivos de imagen se selecciona automáticamente el modo Imagen. En este modo principal, puedes teclear Ctrl-c Ctrl-c (C-c C-c, image-toggle-display) para alternar entre mostrar el archivo como una imagen en el buffer de Emacs, y mostrar su representación de texto subyacente (o bytes crudos). Además, puedes escribir Ctrl-c Ctrl-x (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 tales 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 utilizando las opciones image-auto-resize y image-auto-resize-on-window-resize.

Para redimensionar la imagen manualmente puede utilizar el comando image-transform-fit-both vinculado a s b que ajusta la imagen tanto a la altura como a la anchura de la ventana. Para escalar la imagen especificando un factor de escala, utilice el comando image-transform-set-scale vinculado a s s. Para restablecer todas las transformaciones al estado inicial, utilice image-transform-reset vinculado a s 0.

Puede pulsar n (n, image-next-file) y p (p, image-previous-file) para visitar el siguiente archivo de imagen y el anterior en el mismo directorio, respectivamente. Estos comandos consultarán la memoria intermedia "padre" para determinar cuál es el siguiente/anterior archivo de imagen. Estos comandos también funcionan cuando se abre un archivo a partir de ficheros comprimidos (como archivos zip o tar), y entonces consultarán en su lugar el buffer del modo de archivo. Si no se encuentra ni un archivo ni un búfer "padre", se abre un búfer "padre".

Cuando se revisan imágenes, a veces es conveniente poder marcar los archivos para procesarlos posteriormente (por ejemplo, si se quiere 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 de Dired que muestre el directorio del archivo actual. Si no hay ningún búfer abierto, el directorio se abre en un nuevo búfer. Para desmarcar los archivos, utilice el comando u (u, image-mode-mark-file). Por último, si sólo quiere copiar el nombre del archivo del búfer actual en el anillo de muerte, puede utilizar el comando w (w, image-mode-copy-file-name-as-kill).

Si la imagen puede ser animada, el comando RETURN (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 (b, image-previous-frame) puede recorrer los distintos fotogramas. Ambos comandos aceptan un prefijo numérico para recorrer varios fotogramas a la vez. Puede ir a un fotograma específico con (F, imagen-goto-frame). Los fotogramas se indexan a partir de 1. Si escribes a+ (a +, image-increase-speed) aumentas la velocidad de la animación, a- (a -, image-decrease-speed) la reduces, y ar (a r, image-reverse-speed) la inviertes. El comando a0 (a 0, image-reset-speed) restablece la velocidad al valor original.

Si Emacs fue compilado con soporte para la biblioteca ImageMagick, puede usar ImageMagick 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 enumera 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 una imagen pero Emacs no debería). Para desactivar ImageMagick por completo, cambie imagemagick-types-inhibit a t.

Si Emacs no tiene soporte nativo para el formato de imagen en cuestión, y image-use-external-converter es non-nil, Emacs intentará determinar si hay utilidades externas que puedan usarse para transformar la imagen en cuestión a PNG antes de mostrarla. Actualmente, GraphicsMagick, ImageMagick y ffmpeg son compatibles con las conversiones de imágenes.

El paquete Image-Dired también puede utilizarse para ver las imágenes como miniaturas. Vea Visualización de miniaturas de imágenes en Dired.

Conjunto de archivos

Si editas regularmente un determinado grupo de archivos, puedes definirlos como un conjunto de archivos. Esto le permite realizar ciertas operaciones, como visitar, query-replace, y comandos del shell en todos los archivos a la vez. Para hacer uso de los conjuntos de ficheros, primero debes añadir la expresión (filesets-init) a tu fichero init (ver El fichero 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 fileset es añadiendo archivos a él de uno en uno. Para añadir un archivo al nombre del fileset, visite el archivo y escriba Alt-x filesets-add-buffer RETURN nombre RETURN (M-x filesets-add-buffer RET nombre RET). Si no hay un nombre de conjunto de archivos, se crea uno nuevo, que inicialmente sólo contiene el archivo actual. El comando Alt-x filesets-remove-buffer (M-x filesets-remove-buffer) elimina el archivo actual de un fileset.

También puede editar la lista de conjuntos de archivos directamente, con Alt-x filesets-edit (M-x filesets-edit), o eligiendo ‘Edit Filesets’, ("Editar conjuntos de archivos") en el menú ‘Filesets’ ("Conjuntos de archivos"). La edición se realiza en un búfer de personalización (ver Interfaz de personalización sencilla). Normalmente, un conjunto de archivos es una simple lista de archivos, pero también se puede definir un conjunto de archivos como una expresión regular que coincide con los nombres de los archivos. Algunos ejemplos de estos conjuntos de archivos más complicados se muestran en el búfer de personalización. Recuerda seleccionar ‘Save to future Sesions’ ("Guardar para futuras sesione") si quieres utilizar los mismos conjuntos de archivos en futuras sesiones de Emacs.

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

Véase Control de versiones, para un concepto diferente de conjuntos de archivos: grupos de archivos agrupados para operaciones de control de versiones. Los conjuntos de archivos de este tipo no tienen nombre, y no persisten a través de las sesiones de Emacs.



Usando Multiples Buffers

El texto que estás editando en Emacs reside en un objeto llamado buffer. Cada vez que visitas un archivo, se utiliza un buffer para mantener el texto del archivo. Cada vez que invocas a Dired, se utiliza un buffer para mantener el listado de directorios. Si envías un mensaje con Ctrl-x m (C-x m), se utiliza una memoria intermedia para contener el texto del mensaje. Cuando pides la documentación de un comando, ésta aparece en un buffer llamado *Help* (*Ayuda*).

Los búferes existen mientras están en uso, y son borrados ("matados") cuando ya no se necesitan, ya sea por ti (ver Matar búferes) o por Emacs (por ejemplo, cuando sales de Emacs, ver Salir de Emacs).

Cada buffer tiene un nombre único, que puede ser de cualquier longitud. Cuando un buffer se muestra en una ventana, su nombre se muestra en la línea de modo (ver La línea de modo). La distinción entre mayúsculas y minúsculas es importante en los nombres de los búferes. La mayoría de los búferes se hacen visitando archivos, y sus nombres se derivan de los nombres de los archivos; sin embargo, también puedes crear un búfer vacío con cualquier nombre que quieras. Un Emacs recién iniciado tiene varios buffers, incluyendo uno llamado *scratch*, que puede ser usado para evaluar expresiones Lisp y no está asociado a ningún archivo (ver Buffers de Interacción Lisp).

En cualquier momento, uno y sólo un búfer está seleccionado; lo llamamos el búfer actual. A veces decimos que un comando opera sobre "el buffer"; esto realmente significa que opera sobre el buffer actual. Cuando sólo hay una ventana de Emacs, el buffer mostrado en esa ventana es el actual. Cuando hay múltiples ventanas, el buffer mostrado en la ventana seleccionada es el actual. Ver Ventanas múltiples.

El contenido de un búfer consiste en una serie de caracteres, cada uno de los cuales lleva opcionalmente un conjunto de propiedades de texto (ver Propiedades de texto) que pueden especificar más información sobre ese carácter.

Aparte de su contenido textual, cada búfer registra varios datos, como el archivo que está visitando (si lo hay), si está modificado y qué modo mayor y menor están en vigor (véase Modos mayor y menor). Estos datos se almacenan en variables locales del búfer, que pueden tener un valor diferente en cada búfer. Ver Variables Locales.

El tamaño de un búfer no puede ser mayor que un máximo, que está definido por la mayor posición del búfer representable por los enteros de Emacs. Esto se debe a que el Editor rastrea las posiciones del buffer usando ese tipo de datos. Para las máquinas típicas de 64 bits, este tamaño máximo del buffer es de 2^{61} - 2 bytes, o aproximadamente 2 EiB. Para máquinas típicas de 32 bits, el máximo suele ser 2^{29} - 2 bytes, o unos 512 MiB. El tamaño del búfer también está limitado por la cantidad de memoria del sistema.

Creación y Selección de Búferes

Ctrl-x b buffer RETURN (C-x b buffer RET)
Seleccionar o crear un búfer llamado buffer (switch-to-buffer).
Ctrl-x 4b buffer RETURN (C-x 4 b buffer RET)
Similar, pero seleccionando el buffer en otra ventana (switch-to-buffer-other-window).
Ctrl-x 5b buffer RETURN (C-x 5 b buffer RET)
Similar, pero seleccionando el buffer en un marco separado (switch-to-buffer-other-frame).
Ctrl-x (C-x IZQUIERDA)
Selecciona el búfer anterior en la lista de búferes (previous-buffer).
Ctrl-x (C-x DERECHA)
Selecciona el siguiente búfer de la lista de búferes (next-buffer).
Ctrl-u Alt-g Alt-g (C-u M-g M-g)
Ctrl-u Alt-g g (C-u M-g g)
Lee un número n y se desplaza a la línea n del último búfer seleccionado que no sea el actual, en otra ventana.

El comando Ctrl-x b (C-x b, switch-to-buffer) lee un nombre de buffer usando el minibuffer. A continuación, convierte ese búfer en actual y lo muestra en la ventana seleccionada en ese momento. Una entrada vacía especifica el búfer que fue actual más recientemente entre los que no se muestran ahora en ninguna ventana.

Mientras se introduce el nombre del búfer, se pueden utilizar los comandos habituales de finalización e historial (véase El minibúfer). Ten en cuenta que C-x b, y los comandos relacionados, utilizan la finalización permisiva con confirmación para la finalización del minibuffer: si escribes RET cuando el texto del minibuffer nombra un buffer inexistente, Emacs imprime ‘[Confirm]’ y debes pulsar por segunda vez la tecla RETURN para enviar ese nombre de buffer. Vea Completion Exit, para más detalles. Para otras opciones y características de finalización, vea Opciones de finalización.

Si se especifica un buffer que no existe, C-x b crea un nuevo buffer vacío que no está visitando ningún archivo, y lo selecciona para su edición. El valor por defecto de la variable major-mode determina el modo mayor del nuevo búfer; el valor por defecto es el modo fundamental. Véase Modos principales. Una razón para crear un nuevo búfer es utilizarlo para hacer notas temporales. Si intentas guardarlo, Emacs te pregunta por el nombre del archivo a utilizar, y el modo mayor del buffer se restablece teniendo en cuenta ese nombre de archivo (ver Elección de los modos de archivo).

Para cambiar cómodamente entre varios buffers, utilice los comandos C-x IZQUIERDA y C-x DERECHA. Ctrl-x (C-x IZQUIERDA, previous-buffer) selecciona el buffer anterior (siguiendo el orden de la selección más reciente en el marco actual), mientras que Ctrl-x (C-x DERECHA, next-buffer) se mueve a través de los buffers en la dirección inversa. Ambos comandos admiten un argumento de prefijo numérico que sirve como recuento de repeticiones.

Para seleccionar un búfer en una ventana distinta de la actual (véase Ventanas múltiples), escriba Ctrl-x 4b (C-x 4 b, switch-to-buffer-other-window). Esto solicita un nombre de búfer utilizando el minibúfer, muestra ese búfer en otra ventana y selecciona esa ventana.

Del mismo modo, Ctrl-x 5b (C-x 5 b, switch-to-buffer-other-frame) pide un nombre de búfer, muestra ese búfer en otro marco (ver Marcos y Pantallas Gráficas), y selecciona ese marco. Si el buffer ya se está mostrando en una ventana en otro marco, Emacs selecciona esa ventana y ese marco en lugar de crear un nuevo marco.

Ver Mostrar un buffer en una ventana, para saber cómo los comandos Ctrl-x 4b (C-x 4 b) y Ctrl-x 5b (C-x 5 b) obtienen la ventana y/o el marco a mostrar.

Además, Ctrl-x Ctrl-f (C-x C-f), y cualquier otro comando para visitar un archivo, también se puede utilizar para cambiar a un buffer de visita de archivos existente. Véase Visitar archivos.

Ctrl-u Alt-g Alt-g (C-u M-g M-g), es decir, goto-line con un argumento de prefijo simple, lee un número n usando el minibuffer, selecciona el buffer más recientemente seleccionado que no sea el actual en otra ventana, y luego mueve el punto al comienzo de la línea número n en ese buffer. Esto es principalmente útil en un buffer que hace referencia a los números de línea en otro buffer: si punto está en o justo después de un número, goto-line utiliza ese número como el predeterminado para n. Tenga en cuenta que los argumentos de prefijo distintos de sólo Ctrl-u (C-u) se comportan de manera diferente. Ctrl-u 4 Alt-g Alt-g (C-u 4 M-g M-g) va a la línea 4 en el buffer actual, sin leer un número del minibuffer. (Recuerda que Alt-g Alt-g (M-g M-g) sin argumento prefijo lee un número n y luego se mueve a la línea número n en el buffer actual. Ver Cambiar la ubicación del punto).

Emacs utiliza nombres de búferes que comienzan con un espacio para propósitos internos. Trata estos búferes de forma especial en aspectos menores, por ejemplo, por defecto no registran información de deshacer. Es mejor evitar el uso de tales nombres de búferes.

Listado de buffer's existentes

Ctrl-x Ctrl-b (C-x C-b)
Listar los buffers existentes (list-buffers).

Para mostrar una lista de los búferes existentes, escriba C-x C-b. Esto despliega un menú de búferes en un búfer llamado *Buffer List* (*Lista de búferes*). Cada línea de la lista muestra el nombre de un búfer, su tamaño, el modo principal y el archivo visitado. Los búferes se enumeran en el orden en que fueron actuales; los búferes que fueron actuales más recientemente vienen primero. Esta sección describe cómo se muestra la lista de búferes y cómo interpretar las distintas indicaciones de la lista; véase Operar en varios búferes, para la descripción del modo especial en el búfer *Buffer List* y los comandos disponibles en él.

.’ en el primer campo de una línea indica que el buffer es actual. ‘%’ indica que el búfer es de sólo lectura. El símbolo ‘*’ indica que el búfer ha sido modificado. Si se modifican varios búferes, puede ser el momento de guardar algunos con Ctrl-x s C-x s (ver Comandos para guardar archivos). Este es un ejemplo de una lista de búferes:

CRM Buffer                Size  Mode              File
. * .emacs                3294  Emacs-Lisp        ~/.emacs
 %  *Help*                 101  Help
    search.c             86055  C                 ~/cvs/emacs/src/search.c
 %  src                  20959  Dired by name     ~/cvs/emacs/src/
  * *mail*                  42  Mail
 %  HELLO                 1607  Fundamental       ~/cvs/emacs/etc/HELLO
 %  NEWS                481184  Outline           ~/cvs/emacs/etc/NEWS
    *scratch*              191  Lisp Interaction
  * *Messages*            1554  Messages

El buffer *Help* (*Ayuda*) fue hecho por una petición de ayuda (ver Ayuda); no está visitando ningún archivo. El buffer src fue creado por Dired en el directorio ~/cvs/emacs/src/. Puede listar sólo los búferes que están visitando archivos dando al comando un argumento de prefijo, como en Ctrl-u Ctrl-x Ctrl-b (C-u C-x C-b).

list-buffers omite los buffers cuyos nombres comienzan con un espacio, a menos que visiten archivos: tales buffers son usados internamente por Emacs.

Diversas operaciones en el búfer

Ctrl-x Ctrl-q (C-x C-q)
Conmuta el estado de sólo lectura del buffer (read-only-mode).
Ctrl-x xr RETURN buffer RETURN (C-x x r RET buffer RET)
Cambia el nombre del buffer actual (rename-buffer).
Ctrl-x xu (C-x x u)
Cambia el nombre del buffer actual añadiendo ‘<número>’ al final.
Alt-x view-buffer RETURN buffer RETURN (M-x view-buffer RET buffer RET)
Desplazarse por el buffer de nombre buffer. Véase el modo de visualización.

Un buffer puede ser de sólo lectura, lo que significa que los comandos para insertar o borrar su texto no están permitidos. (Sin embargo, otros comandos, como Ctrl-x RETURN f (C-x RET f), pueden marcarlo como modificado, véase Especificar un sistema de codificación para el texto de los archivos). La línea de modo indica los búferes de sólo lectura con ‘%%' o '%*’ cerca del margen izquierdo. Vea La línea de modo. Los buffers de sólo lectura suelen ser realizados por subsistemas como Dired y Rmail que tienen comandos especiales para operar sobre el texto. Visitar un archivo cuyo control de acceso dice que no se puede escribir también hace que el buffer sea de sólo lectura.

El comando Ctrl-x Ctrl-q (C-x C-q, read-only-mode) hace que un buffer de sólo lectura sea escribible, y hace que un buffer escribible sea de sólo lectura. Esto funciona estableciendo la variable buffer-read-only, que tiene un valor local en cada búfer y hace que el búfer sea de sólo lectura si su valor es no nulo. Si se cambia la opción view-read-only a un valor no nulo, al hacer que el buffer sea de sólo lectura con Ctrl-x Ctrl-q también se activa el modo de visualización en el buffer (ver Modo de visualización).

Ctrl-x xr (C-x x r, rename-buffer) cambia el nombre del buffer actual. Se especifica el nuevo nombre como argumento del minibuffer; no hay un valor por defecto. Se especifica el nuevo nombre como argumento del minibuffer; no hay ningún valor por defecto. Si especifica un nombre que está en uso para algún otro búfer, se produce un error y no se realiza el cambio de nombre.

Ctrl-x x xu (C-x x u, rename-uniquely) renombra el buffer actual con un nombre similar con un sufijo numérico añadido para hacerlo diferente y único. Este comando no necesita un argumento. Es útil para crear múltiples búferes de shell: si renombras el búfer *shell*, y luego haces M-x shell de nuevo, se crea un nuevo búfer de shell llamado *shell*; mientras tanto, el antiguo búfer de shell sigue existiendo con su nuevo nombre. Este método también es bueno para los búferes de correo, los búferes de compilación, y la mayoría de las características de Emacs que crean búferes especiales con nombres particulares. (Con algunas de estas características, como Alt-x compile (M-x compile), Alt-x grep (M-x grep), necesitas cambiar a algún otro buffer antes de usar el comando de nuevo, de lo contrario reutilizará el buffer actual a pesar del cambio de nombre).

Los comandos Alt-x append-to-buffer (M-x append-to-buffer) y Ctrl-x xi (C-x x i, insert-buffer) también pueden utilizarse para copiar texto de un buffer a otro. Véase Acumular texto.

Eliminación de buffers

Si continúas una sesión de Emacs durante un tiempo, puedes acumular un gran número de buffers. Entonces puede encontrar conveniente matar los búferes que ya no necesita. (Algunos otros editores llaman a esta operación cerrar, y hablan de "cerrar el buffer" o "cerrar el archivo" visitado en el buffer). En la mayoría de los sistemas operativos, matar un búfer libera la memoria que Emacs usó para el búfer de vuelta al sistema operativo para que otros programas puedan usarlo. Estos son algunos comandos para matar búferes:

Ctrl-x k buffer RETURN (C-x k buffer RET)
Mata el buffer (kill-buffer).
Alt-x kill-some-buffers (M-x kill-some-buffers)
Ofrece matar cada buffer, uno por uno.
Alt-x kill-matching-buffers (M-x kill-matching-buffers)
Ofrece matar todos los búferes que coincidan con una expresión regular.

Ctrl-x k (C-x k, kill-buffer) mata un buffer, cuyo nombre se especifica en el minibuffer. El valor por defecto, utilizado si se escribe sólo RETURN (RET) en el minibuffer, es matar el buffer actual. Si matas el búfer actual, otro búfer se convierte en actual: uno que fue actual en el pasado reciente pero que no se muestra en ninguna ventana ahora. Si se pide matar un buffer que visita un archivo y que ha sido modificado, se debe confirmar con un sí antes de que el buffer sea matado.

El comando Alt-x kill-some-buffers (M-x kill-some-buffers) pregunta por cada buffer, uno por uno. Una respuesta afirmativa significa matar el búfer, al igual que kill-buffer. Este comando ignora los búferes cuyos nombres comienzan con un espacio, que son utilizados internamente por Emacs.

El comando Alt-x kill-matching-buffers (M-x kill-matching-buffers) pide una expresión regular y mata todos los buffers cuyos nombres coinciden con esa expresión. Ver Sintaxis de Expresiones Regulares. Al igual que kill-some-buffers, pide confirmación antes de cada eliminación. Este comando normalmente ignora los buffers cuyos nombres comienzan con un espacio, los cuales son usados internamente por Emacs. Para matar también los buffers internos, llame a kill-matching-buffers con un argumento de prefijo.

El menú de búferes también es conveniente para matar varios búferes. Ver Operar con varios buffers.

Si quieres hacer algo especial cada vez que se mata un búfer, puedes añadir funciones hook al hook kill-buffer-hook (ver Hooks).

Si ejecutas una sesión de Emacs durante un periodo de días, como hace mucha gente, puede llenarse de búferes que usaste hace varios días. El comando Alt-x clean-buffer-list (M-x clean-buffer-list) es una forma conveniente de purgarlos; mata todos los búferes no modificados que no has usado durante mucho tiempo. Un búfer ordinario es eliminado si no ha sido mostrado durante tres días; sin embargo, puedes especificar ciertos búferes que nunca deben ser eliminados automáticamente, y otros que deben ser eliminados si no han sido utilizados durante una simple hora. Estos valores predeterminados, y otros aspectos del comportamiento de este comando, pueden controlarse personalizando varias opciones descritas en la cadena de documentos de clean-buffer-list.

También puede hacer que esta purga del búfer se realice por usted, una vez al día, activando el modo de medianoche (Midnight mode). Dicho modo funciona cada día a medianoche; a esa hora, ejecuta clean-buffer-list, o cualquier función que haya colocado en el hook normal midnight-hook (ver Hooks). Para habilitar el modo medianoche, utilice el buffer de personalización para establecer la variable midnight-mode en t. Véase Interfaz de personalización sencilla.

Operar en varios buffers

Alt-x buffer-menu (M-x buffer-menu)
Empieza a editar un buffer con la lista de todos los buffers de Emacs.
Alt-x buffer-menu-other-window (M-x buffer-menu-other-window)
Similar, pero hacerlo en otra ventana.

El menú de búferes que se abre con Ctrl-x Ctrl-b (C-x C-b) (ver Listado de búferes existentes) no se limita a listar los búferes. También permite realizar varias operaciones en los buffers, a través de una interfaz similar a la de Dired (ver Dired, el editor de directorios). Puede guardar los búferes, eliminarlos (lo que aquí se llama borrarlos, por coherencia con Dired), o mostrarlos.

Para utilizar el menú de búferes, escriba Ctrl-x Ctrl-b (C-x C-b) y cambie a la ventana que muestra el búfer *Buffers List* (*Lista de búferes*). También puede escribir M-x buffer-menu para abrir el Menú Buffer en la ventana seleccionada. Alternativamente, el comando Alt-x buffer-menu-other-window (M-x buffer-menu-other-window) abre el Menú Buffer en otra ventana, y selecciona esa ventana.

El Menú del Buffer es un buffer de sólo lectura, y puede ser cambiado sólo a través de los comandos especiales descritos en esta sección. Los comandos habituales de movimiento del cursor se pueden utilizar en este búfer. Los siguientes comandos se aplican al buffer descrito en la línea actual:

d (d)
Marca el búfer para su borrado (killing), luego mover el punto a la siguiente línea (Buffer-menu-delete). La bandera de borrado se indica con el carácter ‘D’ en la línea, antes del nombre del buffer. El borrado sólo se produce cuando se teclea el comando x (x) (ver más abajo).
Ctrl-d (C-d)
Como d, pero moviendo el punto hacia arriba en lugar de hacia abajo (Buffer-menu-delete-backwards).
s (s)
Como d, pero moviendo el punto hacia arriba en lugar de hacia abajo (Buffer-menu-delete-backwards).
x (x)
Realiza todos los borrados y guardados marcados (buffer-menu-execute).
u (u)
Elimina todas las banderas de la línea actual, y se mueve hacia abajo (buffer-menu-unmark). Con un argumento de prefijo, se mueve hacia arriba después de eliminar las banderas.
DEL (DEL)
Se mueve a la línea anterior y elimina todas las banderas de esa línea (buffer-menu-backup-unmark).
Alt-DEL (M-DEL)
Elimina una bandera concreta de todas las líneas (buffer-menu-unmark-all-buffers). Esto pide un solo carácter, y desmarca los buffers marcados con ese carácter; al escribir RETURN (RET) se eliminan todas las marcas.
U (U)
Elimina todas las banderas de todas las líneas (buffer-menu-unmark-all).

Los comandos para eliminar banderas, d (d) y Ctrl-d (C-d), aceptan un argumento numérico como cuenta de repetición.

Los siguientes comandos operan inmediatamente en el buffer listado en la línea actual. También aceptan un argumento numérico como cuenta de repetición.

~ (~)
Marca el buffer como no modificado (buffer-menu-not-modified). Ver comandos para guardar archivos.
% (%)
Conmuta el estado de sólo lectura del buffer (buffer-menu-toggle-read-only). Ver Operaciones varias en el buffer.
t (t)
Visita el buffer como una tabla de etiquetas (buffer-menu-visit-tags-table). Consulte Selección de una tabla de etiquetas.

Los siguientes comandos se utilizan para seleccionar otro búfer o búferes:

q (q)
Sale del menú de búferes (quit-window). En su lugar se muestra el último búfer visible anteriormente.
RETURN (RET)
f (f)
Selecciona el búfer de esta línea, sustituyendo el búfer *Buffers List* (*Lista de búferes*) de su ventana (buffer-menu-this-window).
o (o)
Selecciona el búfer de esta línea en otra ventana, como si fuera por Ctrl-x 4b (C-x 4 b), dejando visible *Buffers List* (*Lista de búferes*) (buffer-menú-other-window).
Ctrl-o (C-o)
Visualiza el buffer de esta línea en otra ventana, sin seleccionarla (buffer-menu-switch-other-window).
1 (1)
Selecciona el buffer de esta línea en una ventana de cuadro completo (buffer-menu-1-window).
2 (2)
Establece dos ventanas en el fotograma actual, con el buffer de esta línea seleccionado en una, y un buffer previamente actual (aparte de *Buffers List*) en la otra (buffer-menu-2-window).
b (b)
Entierra el buffer de esta línea (buffer-menu-bury) (es decir, moverlo al final de la lista de buffers).
m (m)
Marca el buffer de esta línea para que se muestre en otra ventana si se sale con el comando v (v, buffer-menu-mark). La marca de visualización se indica con el carácter ‘>‘ al principio de la línea. (Un mismo búfer no puede tener tanto banderas de borrado como de visualización).
v (v)
Selecciona el búfer de esta línea, y también muestra en otras ventanas cualquier búfer marcado con el comando m (m, buffer-menu-select). Si no ha marcado ningún búfer, este comando equivale a 1.

Los siguientes comandos afectan a toda la lista de búferes:

S (S)
Ordena las entradas del menú de búferes según sus valores en la columna del punto. Con un argumento prefijo numérico n, ordena según la columna n-ésima (tabulated-list-sort).
} ( } )
Amplía el ancho de la columna actual en n (el argumento numérico del prefijo) caracteres.
{ ( { )
Reduce el ancho de la columna actual en n (el argumento numérico del prefijo) caracteres.
T (T)
Borra, o reinserta, las líneas de los buffers que no son archivos (buffer-menu-toggle-files-only). Este comando activa la inclusión de dichos búferes en la lista de búferes.

Normalmente, la *Lista de búferes* (*BufferList*) no se actualiza automáticamente cuando se crean y eliminan búferes; su contenido es sólo texto. Si ha creado, borrado o renombrado búferes, la forma de actualizar *BufferList* para mostrar lo que ha hecho es escribir g (g, revert-buffer). Puedes hacer que esto ocurra regularmente cada auto-revert-interval segundos si activas el modo Auto Revert en este buffer, siempre y cuando no esté marcado como modificado. El modo de reversión automática global se aplica al búfer *BufferList* sólo si global-auto-revert-non-file-buffers es distinto de cero. Véase global-auto-revert-non-file-buffers, para más detalles.

Bufferes indirectos

Un búfer indirecto comparte el texto de algún otro búfer, que se denomina búfer base del búfer indirecto. En cierto modo, es un análogo del búfer de un enlace simbdólico entre archivos.

Alt- make-indirect-buffer RETURN buffer-base RETURN nombre-ind RETURN
(M-x make-indirect-buffer RET buffer-base RET nombre-ind RET)
Crea un buffer indirecto llamado nombre-ind (nombre indirecto) a partir de un buffer de nombre buffer-base.
Alt-x clone-indirect-buffer RETURN (M-x clone-indirect-buffer RET)
Crea un buffer indirecto que es una copia gemela del buffer actual.
Ctrl-x 4c (C-x 4 c)
Crea un buffer indirecto que es una copia gemela del buffer actual, y lo selecciona en otra ventana (clone-indirect-buffer-other-window).

El texto del búfer indirecto es siempre idéntico al de su búfer base; los cambios realizados al editar cualquiera de ellos son visibles inmediatamente en el otro. Pero en todos los demás aspectos, el búfer indirecto y su búfer base están completamente separados. Pueden tener diferentes nombres, diferentes valores de punto, diferentes estrechamientos, diferentes marcadores, diferentes modos principales y diferentes variables locales.

Un buffer indirecto no puede visitar un archivo, pero su buffer base sí. Si tratas de guardar el buffer indirecto, eso en realidad funciona guardando el buffer base. Matar el buffer base efectivamente mata al buffer indirecto, pero matar un buffer indirecto no tiene efecto en su buffer base.

Una forma de utilizar los búferes indirectos es mostrar múltiples vistas de un contorno. Vea Visualización de un esquema en múltiples vistas.

Una forma rápida y práctica de crear un buffer indirecto es con el comando Alt-x clone-indirect-buffer (M-x clone-indirect-buffer). Crea y selecciona un buffer indirecto cuya base es el buffer actual. Con un argumento numérico, pide el nombre del búfer indirecto; de lo contrario, utiliza el nombre del búfer actual, con un sufijo ‘<n>’ añadido. Ctrl-x 4c (C-x 4 c, clone-indirect-buffer-other-window) funciona como Alt-x clone-indirect-buffer (M-x clone-indirect-buffer), pero selecciona el nuevo buffer en otra ventana. Estas funciones ejecutan el hook clone-indirect-buffer-hook después de crear el buffer indirecto.

La forma más general de crear un buffer indirecto es con el comando M-x make-indirect-buffer. Crea un búfer indirecto llamado nombre-ind a partir de un búfer base, solicitando ambos usar el minibúfer.

Nota: Cuando se realiza una modificación en el texto de un búfer, los ganchos de modificación se ejecutan sólo en el búfer base, porque la mayoría de las funciones de esos ganchos no están preparadas para funcionar correctamente en los búferes indirectos. Así que si necesitas una función de gancho de modificación en un buffer indirecto, tienes que añadir manualmente esa función al gancho en el buffer base y luego hacer que la función opere en el buffer indirecto deseado.

Características de comodidad y personalización del manejo de los buffers

En esta sección se describen varios modos y características que hacen más cómodo el cambio entre buffers.

Hacer que los nombres de los buffers sean únicos

Cuando varios buffers visitan archivos con nombres idénticos, Emacs debe dar a los buffers nombres distintos. El método por defecto añade un sufijo basado en los nombres de los directorios que contienen los archivos. Por ejemplo, si visitas los ficheros /foo/bar/mumble/name y /baz/quux/mumble/name al mismo tiempo, sus buffers se llamarán ‘nombre<bar/mumble>’ y ‘nombre<quux/mumble>’, respectivamente. Emacs añade tantas partes de directorio como sean necesarias para hacer un nombre único.

Puedes elegir entre varios estilos diferentes para construir nombres de búferes únicos, personalizando la opción uniquify-buffer-name-style.

El método de nomenclatura hacia adelante (forward) incluye parte del nombre del directorio del fichero al principio del nombre del búfer; usando este método, los búferes que visitan los ficheros /u/rms/tmp/Makefile y /usr/projects/zaphod/Makefile se llamarían ‘tmp/Makefile’ y ‘zaphod/Makefile’.

Por el contrario, el método de nombramiento post-forward llamaría a los buffers ‘Makefile|tmp’ y ‘Makefile|zaphod’. El método por defecto post-forward-angle-brackets es como post-forward, excepto que encierra la ruta única entre paréntesis angulares. El método de nombramiento inverso los llamaría ‘Makefile\tmp’ y ‘Makefile\zaphod’. La diferencia no trivial entre post-forward y reverse ocurre cuando un solo nombre de directorio no es suficiente para distinguir dos archivos; entonces reverse pone los nombres de directorio en orden inverso, de modo que /top/middle/file se convierte en ‘file\middle\top’, mientras que post-forward los pone en orden hacia adelante después del nombre del archivo, como en ‘file|top/middle’. Si uniquify-buffer-name-style se establece en nil, los nombres de los búferes simplemente se añaden ‘<2>’, ‘<3>’, etc.

El valor de uniquify-buffer-name-style puede establecerse en una función personalizada con dos argumentos base y extra-strings donde base es una cadena y extra-strings es una lista de cadenas. Por ejemplo, la implementación actual para los post-forward-angle-brackets podría ser:

(defun mi-parentesis-angular (base extra-strings)
  (concat base \"<\" (mapconcat #'identity extra-string \"/\") \">\")

La regla a seguir para poner los nombres de los directorios en el nombre del buffer no es muy importante si vas a mirar los nombres del buffer antes de escribir uno. Pero como usuario experimentado, si conoce la regla, no tendrá que mirar. Y entonces puedes encontrar que una regla u otra te resulta más fácil de recordar y aplicar rápidamente.

Selección rápida de minibuffer

El modo menor global Icomplete ofrece una forma cómoda de seleccionar rápidamente un elemento entre las posibles terminaciones de un minibuffer. Cuando está activado, al escribir en el minibuffer se muestra continuamente una lista de posibles terminaciones que coinciden con la cadena que has escrito.

En cualquier momento, puede escribir Ctrl-j (C-j) para seleccionar la primera terminación de la lista. Por lo tanto, la forma de seleccionar una terminación en particular es hacerla la primera de la lista. Hay dos maneras de hacerlo. Puede escribir más del nombre de la terminación y así reducir la lista, excluyendo las terminaciones no deseadas por encima de la deseada. Alternativamente, puede utilizar Ctrl-. (C-.) y Ctrl-, (C-,) para girar la lista hasta que la terminación deseada sea la primera.

Alt-TAB (M-TAB) seleccionará la primera terminación de la lista, como Ctrl-j (C-j) pero sin salir del minibuffer, para que pueda seguir editando. Esto se utiliza típicamente cuando se introduce un nombre de archivo, donde Alt-TAB (M-TAB) se puede utilizar varias veces para descender en la jerarquía de directorios.

Para habilitar el modo Icomplete, escriba Alt-x icomplete-mode (M-x icomplete-mode), o personalice la variable icomplete-mode a t (ver Interfaz de Personalización Fácil).

Una alternativa al modo Icomplete es el modo Fido. Este es muy similar al modo Icomplete, pero conserva algunas funcionalidades de una popular extensión llamada modo Ido (de hecho el nombre deriva de "Fake Ido"). Entre otras cosas, en el modo Fido, Ctrl-s (C-s) y Ctrl-r (C-r) también se usan para rotar la lista de completados, Ctrl-k (C-k) puede usarse para borrar archivos y matar buffers en la lista. Otro aspecto destacable es que se utiliza flex como estilo de finalización por defecto (ver Cómo se eligen las alternativas de finalización). Para cambiar esto, añada lo siguiente a su fichero de inicialización (vea El fichero de inicialización de Emacs):

(defun my-icomplete-styles ()
  (setq-local completion-styles '(initials flex)))
(add-hook 'icomplete-minibuffer-setup-hook 'my-icomplete-styles)

Para habilitar el modo Fido, escriba Alt-x fido-mode (M-x fido-mode), o personalice la variable fido-mode a t (ver Interfaz de Personalización Fácil).

El modo Icomplete y el modo Fido muestran por defecto las posibles terminaciones en la misma línea que el prompt. Para mostrar los candidatos a completar en vertical bajo el prompt, escriba Alt-x icomplete-vertical-mode (M-x icomplete-vertical-mode), o personalice la variable icomplete-vertical-mode a t (ver Interfaz de Personalización Fácil).

Personalización de los menús del búfer

Atl-x bs-show (M-x bs-show)
Hacer una lista de buffers similar a Alt-x list-buffers (M-x list-buffers) pero personalizable.
Alt-x ibuffer (M-x ibuffer)
Hace una lista de búferes y opera sobre ellos de manera similar a Dired.

Alt-x bs-show (M-x bs-show) Muestra una lista de búferes similar a la que normalmente muestra Ctrl-x Ctrl-b (C-x C-b), pero cuya visualización se puede personalizar de forma más flexible. Por ejemplo, puede especificar la lista de atributos de los búferes que se van a mostrar, el ancho mínimo y máximo de la columna de nombres de los búferes, una expreg para los nombres de los búferes que nunca se mostrarán y los que siempre se mostrarán, etc. Si prefiere esto a la lista de búferes habitual, puede vincular este comando a Ctrl-x Ctrl-b (C-x C-b). Para personalizar esta lista de búferes, utilice el grupo mbs Custom (véase Interfaz de personalización sencilla), o invoque bs-customize.

El modo menor global MSB ("MSB" significa "mouse select buffer") proporciona un menú de búferes de ratón diferente y personalizable que usted puede preferir. Sustituye los comandos del buffer del ratón, normalmente vinculados a C-Down-mouse-1 y C-F10, por sus propios comandos, y también modifica el menú del buffer de la barra de menús. Puedes personalizar el menú en el grupo msb Custom.

IBuffer es un modo principal para ver una lista de búferes y operar sobre ellos de forma análoga a la de Dired (ver Dired, el editor de directorios), incluyendo filtrar, marcar, ordenar de varias formas y actuar sobre los búferes.



Ventanas Múltiples

Emacs puede dividir un cuadro en dos o varias ventanas. Las ventanas múltiples pueden mostrar partes de diferentes buffers, o diferentes partes de un buffer. Los marcos múltiples siempre implican múltiples ventanas, porque cada marco tiene su propio conjunto de ventanas. Cada ventana pertenece a uno y sólo un marco.

Conceptos de las ventanas de Emacs

Cada ventana de Emacs muestra un buffer de Emacs en cualquier momento. Un solo buffer puede aparecer en más de una ventana; si lo hace, cualquier cambio en su texto se muestra en todas las ventanas donde aparece. Pero estas ventanas pueden mostrar diferentes partes del buffer, porque cada ventana tiene su propio valor de punto.

En cualquier momento, una ventana de Emacs es la ventana seleccionada; el buffer que esta ventana está mostrando es el buffer actual. En las pantallas gráficas, el punto se indica con un cursor sólido y parpadeante en la ventana seleccionada, y con una caja hueca en las ventanas no seleccionadas. En los terminales de texto, el cursor se dibuja sólo en la ventana seleccionada. Véase Visualización del cursor.

Los comandos para mover el punto afectan al valor del punto sólo para la ventana Emacs seleccionada. No cambian el valor del punto en otras ventanas de Emacs, ni siquiera en las que muestran el mismo buffer. Lo mismo ocurre con los comandos de cambio de búfer como Ctrl-x b (C-x b); no afectan a otras ventanas en absoluto. Sin embargo, hay otros comandos como Ctrl-x 4b (C-x 4 b) que seleccionan una ventana diferente y cambian los buffers en ella. Además, todos los comandos que muestran información en una ventana, incluyendo (por ejemplo) Ctrl-h f (C-h f, describe-function) y Ctrl-x Ctrl-b (C-x C-b, list-búffers), normalmente funcionan mostrando los búferes en una ventana no seleccionada sin afectar a la ventana seleccionada.

Cuando varias ventanas muestran el mismo buffer, pueden tener regiones diferentes, ya que pueden tener diferentes valores de punto. Sin embargo, todas tienen el mismo valor de marca, porque cada búfer sólo tiene una posición de marca.

Cada ventana tiene su propia línea de modo, que muestra el nombre del búfer, el estado de modificación y los modos mayor y menor del búfer que se muestra en la ventana. La línea de modo de la ventana seleccionada aparece en un color diferente. Para más detalles, consulte la línea de modo.

Dividir las ventanas

Ctrl-x 2 (C-x 2)
Dividir la ventana seleccionada en dos ventanas, una encima de la otra (split-window-below).
Ctrl-x 3 (C-x 3)
Dividir la ventana seleccionada en dos ventanas, situadas una al lado de la otra (split-window-right).
Ctrl- (C-ratón 2)
En la línea de modo de una ventana, divide esa ventana.

Ctrl-x 2 (C-x 2, split-window-below) divide la ventana seleccionada en dos ventanas, una encima de la otra. Después de la división, la ventana seleccionada es la superior, y la nueva ventana dividida está debajo. Ambas ventanas tienen el mismo valor de punto que antes, y muestran la misma porción de la memoria intermedia (o lo más cercana posible). Si es necesario, las ventanas se desplazan para mantener el punto en la pantalla. Por defecto, las dos ventanas obtienen cada una la mitad de la altura de la ventana original. Un argumento numérico positivo especifica cuántas líneas dar a la ventana superior; un argumento numérico negativo especifica cuántas líneas dar a la ventana inferior.

Si se cambia la variable split-window-keep-point a nil, Ctrl-x 2 (C-x 2) en cambio ajusta la porción del buffer mostrada por las dos ventanas, así como el valor de point en cada ventana, para mantener el texto en la pantalla lo más cercano posible a lo que era antes; además, si point estaba en la mitad inferior de la ventana original, se selecciona la ventana inferior en lugar de la superior.

Ctrl-x 3 (C-x 3, split-window-right) divide la ventana seleccionada en dos ventanas contiguas. La ventana izquierda es la seleccionada; la ventana derecha muestra la misma porción del mismo buffer, y tiene el mismo valor de punto. Un argumento numérico positivo especifica cuántas columnas hay que dar a la ventana izquierda; un argumento numérico negativo especifica cuántas columnas hay que dar a la ventana derecha.

Cuando se divide una ventana con Ctrl-x 3 (C-x 3), cada ventana resultante ocupa menos que el ancho total del cuadro. Si se estrecha demasiado, el búfer puede ser difícil de leer si se utilizan líneas de continuación (véase Líneas de continuación). Por lo tanto, Emacs cambia automáticamente al truncamiento de líneas si el ancho de la ventana se vuelve más estrecho que 50 columnas. Este truncamiento se produce independientemente del valor de la variable truncate-lines (ver Truncamiento de líneas); en su lugar se controla mediante la variable truncate-partial-width-windows. Si el valor de esta variable es un número entero positivo (el valor por defecto es 50), esto especifica el ancho total mínimo para una ventana de ancho parcial antes de que se produzca el truncamiento automático de líneas; si el valor es nulo, el truncamiento automático de líneas se desactiva; y para cualquier otro valor no nulo, Emacs trunca las líneas en cada ventana de ancho parcial independientemente de su ancho. El ancho total de una ventana está en unidades de columna como se informa en window-total-width (ver Window Sizes en The Emacs Lisp Reference Manual), incluye las franjas (al costado del texto), los glifos de continuación y truncamiento, los márgenes y la barra de desplazamiento.

En los terminales de texto, las ventanas contiguas están separadas por un divisor vertical que se dibuja utilizando la cara del borde vertical.

Si pulsas Ctrl- (C-ratón-2) en la línea de modo de una ventana, eso divide la ventana, poniendo un divisor vertical donde pulsas. Dependiendo de cómo esté compilado Emacs, también puedes dividir una ventana pulsando Ctrl- (C-ratón-2) en la barra de desplazamiento, que pone un divisor horizontal donde pulsas (esta característica no funciona cuando Emacs usa barras de desplazamiento GTK+).

Por defecto, cuando divides una ventana, Emacs da a cada una de las ventanas resultantes unas dimensiones que son un múltiplo integral del tamaño de la fuente por defecto del marco. Eso puede subdividir el espacio de la pantalla de forma desigual entre las ventanas resultantes. Si estableces la variable window-resize-pixelwise a un valor no nulo, Emacs dará a cada ventana el mismo número de píxeles (más o menos un píxel si la dimensión inicial era un número impar de píxeles). Tenga en cuenta que cuando el tamaño de los píxeles de un marco no es un múltiplo del tamaño de los caracteres del marco, al menos una ventana puede ser redimensionada a nivel de píxeles incluso si esta opción es nula.

Uso de otras ventanas

Ctrl-x o (C-x o)
Seleccionar otra ventana (other-window).
Ctrl-Alt-v (C-M-v)
Desplazar la siguiente ventana hacia arriba (scroll-other-window).
Ctrl-Alt-Shift v (C-M-S-v)
Desplazar la siguiente ventana hacia abajo (scroll-other-window-down).
Ctrl-Alt-Shift-l (C-M-S-l)
Centrar la ventana siguiente (recenter-other-window).
(ratón-1)
Un clic con (mouse-1), en el área de texto de una ventana, selecciona la ventana y desplaza el punto a la posición pulsada. Al hacer clic en la línea de modo, se selecciona la ventana sin mover el punto en ella.

Con el teclado, puedes cambiar de ventana escribiendo Ctrl-o (C-x o, other-window). Es una o, de "otra ventana", no un cero. Cuando hay más de dos ventanas, este comando recorre todas las ventanas en un orden cíclico, generalmente de arriba a abajo y de izquierda a derecha. Después de la ventana más a la derecha y más abajo, vuelve a la que está en la esquina superior izquierda. Un argumento numérico significa moverse varios pasos en el orden cíclico de las ventanas. Un argumento negativo se desplaza por el ciclo en el orden inverso. Cuando el minibuffer está activo, la ventana del minibuffer es la última ventana del ciclo; se puede pasar de la ventana del minibuffer a una de las otras ventanas, y más tarde volver a pasar y terminar de suministrar el argumento del minibuffer que se pide. Véase Editar en el minibuffer.

El comando de otra ventana normalmente sólo cambiará a la siguiente ventana en el marco actual (a menos que se configure de otra manera). Si trabaja en un entorno de varios fotogramas y desea que las ventanas de todos los fotogramas formen parte del ciclo, puede volver a vincular Ctrl-x o (C-x o) al comando next-window-any-frame. (Véase Cambio de las combinaciones de teclas de forma interactiva, para saber cómo volver a vincular un comando).

Los comandos de desplazamiento habituales (véase Control de la pantalla) se aplican sólo a la ventana seleccionada, pero también existen comandos para desplazarse a la siguiente ventana. Ctrl-Alt-v (C-M-v, scroll-other-window) desplaza la ventana que Ctrl-x o (C-x o) seleccionaría. En otros aspectos, el comando se comporta como Ctrl-v (C-v); ambos mueven el texto del buffer hacia arriba en relación con la ventana, y toman argumentos positivos y negativos. (En el minibuffer, Ctrl-Alt-v (C-M-v) desplaza la ventana de ayuda asociada al minibuffer, si la hay, en lugar de la siguiente ventana en el orden cíclico estándar; véase Edición en el minibuffer). Ctrl-Alt-Shift-v (C-M-S-v, scroll-other-window-down) desplaza la siguiente ventana hacia abajo de forma similar. Del mismo modo, Ctrl-Alt-Shift-l (C-M-S-l, recenter-other-window) se comporta como Ctrl-l (C-l, recenter-top-bottom) en la siguiente ventana.

Si se establece un valor no nulo en mouse-autoselect-window, al mover el ratón sobre una ventana diferente se selecciona esa ventana. Esta función está desactivada por defecto.

Visualización en otra ventana

Ctrl-x 4 (C-x 4) es una tecla de prefijo para una variedad de comandos que cambian a un buffer en una ventana diferente, ya sea otra ventana existente, o una nueva ventana creada al dividir la ventana seleccionada. Ver Cómo funciona display-buffer, para saber cómo Emacs elige o crea la ventana a utilizar.

Ctrl-x 4b nombrebuffer RETURN (C-x 4 b nombrebuffer RET)
Selecciona el buffer nombrebuffer en otra ventana (switch-to-buffer-other-window). Ver Creación y selección de buffers.
Ctrl-x 4 Ctrl-o nombrebuffer RETURN (C-x 4 C-o nombrebuffer RET)
Mostrar el buffer nombrebuffer en alguna ventana, sin intentar seleccionarlo (display-buffer). Ver Mostrar un buffer en una ventana, para detalles sobre cómo se elige la ventana.
Ctrl-x 4 f nombrearchivo RETURN (C-x 4 f nombrearchivo RET)
Visita el archivo nombrearchivo y selecciona su buffer en otra ventana (find-file-other-window). Ver Visitar archivos.
Ctrl-x 4d directorio RETURN (C-x 4 d directorio RET)
Seleccionar un buffer Dired para el directorio en otra ventana (dired-other-window). Ver Dired, el editor de directorios.
Ctrl-x 4m (C-x 4 m)
Comienza a redactar un mensaje de correo, de forma similar a Ctrl-x m (C-x m) (ver Envío de correo), pero en otra ventana (compose-mail-other-window).
Ctrl-x 4. (C-x 4 .)
Buscar la definición de un identificador, similar a Alt-. (M-.) (ver Buscar referencias de identificadores), pero en otra ventana (xref-find-definitions-other-window).
Ctrl-x 4r nombrearchivo RETURN (C-x 4 r nombrearchivo RET)
Visita el archivo de nombre nombrearchivo de sólo lectura, y selecciona su buffer en otra ventana (find-file-read-only-other-window). Véase Visitar archivos.
Ctrl-44 (C-x 4 4)
Un comando de prefijo más general afecta al búfer mostrado por el siguiente comando invocado inmediatamente después de este comando de prefijo. Solicita que el buffer del siguiente comando se muestre en otra ventana.
Ctrl-x 41 (C-x 4 1)
Este comando de prefijo general solicita el buffer del siguiente comando que se mostrará en la misma ventana.

Borrar y cambiar el tamaño de las ventanas

Ctrl-x 0 (C-x 0)
Borra la ventana seleccionada (delete-window).
Ctrl-x 1 (C-x 1)
Borra todas las ventanas del marco seleccionado excepto la ventana seleccionada (delete-other-windows).
Ctrl-x 4 0 (C-x 4 0)
Elimina la ventana seleccionada y mata el buffer que se mostraba en ella (kill-buffer-and-window). El último carácter de esta secuencia de teclas es un cero.
Alt-x delete-windows-on RETURN buffer RETURN
(M-x delete-windows-on RET buffer RET)
Elimina las ventanas que muestran el buffer especificado.
Ctrl-x ^ (C-x ^)
Hacer más grande la ventana seleccionada (enlarge-window).
Ctrl-x } ( C-x })
Hacer más ancha la ventana seleccionada (enlarge-window-horizontally).
Ctrl-x { ( C-x { )
Hacer más estrecha la ventana seleccionada (shrink-window-horizontally).
Ctrl-x - (C-x -)
Reducir esta ventana si su buffer no necesita tantas líneas (shrink-window-if-larger-than-buffer).
Ctrl-x + (C-x +)
Hacer que todas las ventanas tengan la misma altura (balance-windows).

Para borrar la ventana seleccionada, escriba Ctrl-x 0 (C-x 0 (Es un cero.), delete-window). Una vez que se borra una ventana, el espacio que ocupaba se cede a una ventana adyacente (pero no a la ventana del minibuffer, aunque esté activa en ese momento). La eliminación de la ventana no tiene ningún efecto sobre el búfer que mostraba; el búfer sigue existiendo, y todavía se puede pasar a él con Ctrl-x b (C-x b). La opción delete-window-choose-selected permite elegir qué ventana se convierte en la nueva ventana seleccionada en su lugar (ver Deleting Windows en The Emacs Lisp Reference Manual).

Ctrl-x 40 (C-x 4 0, kill-buffer-and-window) es un comando más fuerte que Ctrl-x 0 (C-x 0); mata el buffer actual y luego borra la ventana seleccionada.

Ctrl-x 1 (C-x 1, delete-other-windows) borra todas las ventanas, excepto la seleccionada; la ventana seleccionada se expande para usar todo el marco. (Este comando no puede utilizarse mientras la ventana del minibuffer está activa; al intentarlo se produce un error).

M-x delete-windows-on borra las ventanas que muestran un buffer específico. Pide el búfer, por defecto el búfer actual. Con el argumento de prefijo cero, Ctrl-u 0 C-u 0, este comando borra las ventanas sólo en los marcos de la pantalla actual.

El comando Ctrl-x ^ (C-x ^, enlarge-window) hace que la ventana seleccionada sea una línea más alta, tomando espacio de una ventana verticalmente adyacente sin cambiar la altura del marco. Con un argumento numérico positivo, este comando aumenta la altura de la ventana en esa cantidad de líneas; con un argumento negativo, reduce la altura en esa cantidad de líneas. Si no hay ventanas adyacentes verticalmente (es decir, la ventana está a la altura completa del marco), esto señala un error. El comando también señala un error si se intenta reducir la altura de cualquier ventana por debajo de un cierto número mínimo de líneas, especificado por la variable window-min-height (el valor por defecto es 4).

Del mismo modo, Ctrl-x } (C-x }, enlarge-window-horizontally) amplía la ventana seleccionada, y Ctrl-x { (C-x {, shrink-window-horizontally) la estrecha. Estos comandos señalan un error si se intenta reducir el ancho de cualquier ventana por debajo de un determinado número mínimo de columnas, especificado por la variable window-min-width (el valor por defecto es 10).

Los clics del ratón en la línea de modo (véase Comandos del ratón en la línea de modo) o en los divisores de ventanas (véase Divisores de ventanas) proporcionan otra forma de cambiar la altura de las ventanas y de dividir o eliminar ventanas.

Ctrl-x - (C-x -, shrink-window-if-larger-than-buffer) reduce la altura de la ventana seleccionada, si es más alta de lo necesario para mostrar todo el texto del buffer que está mostrando. Da las líneas extra a otras ventanas en el marco.

También puede utilizar Ctrl-x + (C-x +, balance-windows) para igualar las alturas de todas las ventanas del marco seleccionado.

Mostrar un buffer en una ventana

Es una operación común de Emacs mostrar o hacer aparecer algún buffer en respuesta a un comando del usuario. Hay varias formas diferentes en que los comandos hacen esto.

Muchos comandos, como Ctrl-x Ctrl-f (C-x C-f, find-file), por defecto muestran el buffer "tomando" la ventana seleccionada, esperando que la atención del usuario se desvíe a ese buffer.

Algunos comandos intentan mostrar de forma inteligente, tratando de no ocupar la ventana seleccionada, por ejemplo, dividiendo una nueva ventana y mostrando el buffer deseado allí. Dichos comandos, entre los que se encuentran los distintos comandos de ayuda (ver Ayuda), funcionan llamando internamente a display-buffer. Ver Cómo funciona display-buffer, para más detalles.

Otros comandos hacen lo mismo que display-buffer, y adicionalmente seleccionan la ventana de visualización para que pueda comenzar a editar su buffer. El comando Alt-g Alt-n (M-g M-n, next-error) es un ejemplo (ver Modo de compilación). Estos comandos funcionan llamando internamente a la función pop-to-buffer. Ver Cambiar a un buffer en una ventana en el Manual de Referencia de Emacs Lisp.

Los comandos con nombres que terminan en -other-window se comportan como display-buffer, excepto que nunca se muestran en la ventana seleccionada. Varios de estos comandos están ligados a la tecla de prefijo Ctrl-x 4 (C-x 4) (ver Mostrar en otra ventana).

Los comandos con nombres que terminan en -other-frame se comportan como display-buffer, excepto que (i) nunca se muestran en la ventana seleccionada y (ii) prefieren crear un nuevo marco o utilizar una ventana en algún otro marco para mostrar el buffer deseado. Varios de estos comandos están vinculados a la tecla de prefijo Ctrl-x 5 (C-x 5).

Cómo funciona display-buffer

El comando tdisplay-buffer (así como los comandos que lo llaman internamente) elige una ventana para mostrar siguiendo los pasos que se indican a continuación. Ver Elegir una ventana para mostrar un buffer en el Manual de Referencia de Emacs Lisp, para detalles sobre cómo alterar esta secuencia de pasos.

  • Si el buffer debe mostrarse en la ventana seleccionada independientemente de otras consideraciones, reutilice la ventana seleccionada. Por defecto, este paso se omite, pero puedes decirle a Emacs que no lo omita añadiendo una expresión regular que coincida con el nombre del buffer junto con una referencia a la función de acción display-buffer-same-window (ver Action Functions for Buffer Display en The Emacs Lisp Reference Manual) a la opción display-buffer-alist (ver Choosing a Window for Displaying a Buffer en The Emacs Lisp Reference Manual). Por ejemplo, para mostrar el búfer *scratch* preferentemente en la ventana seleccionada escriba:
    (customize-set-variable
     'display-buffer-alist
     '(("\\*scratch\\*" (display-buffer-same-window))))
    	
    Por defecto, display-buffer-alist es nil.

  • En caso contrario, si el buffer ya se muestra en una ventana existente, reutiliza esa ventana. Normalmente, sólo se tienen en cuenta las ventanas del marco seleccionado, pero las ventanas de otros marcos también son reutilizables si se utiliza la correspondiente entrada de la lista de acciones reusable-frames (véase Action Alists for Buffer Display en The Emacs Lisp Reference Manual). Vea el siguiente paso para un ejemplo de cómo hacerlo.

  • Si no, opcionalmente, cree un nuevo marco y muestre el buffer allí. Por defecto, este paso se omite. Para habilitarlo, cambie el valor de la opción display-buffer-base-action (ver Elegir una ventana para mostrar un buffer en El Manual de Referencia de Emacs Lisp) como sigue:
    (customize-set-variable
     'display-buffer-base-action
     '((display-buffer-reuse-window display-buffer-pop-up-frame)
       (reusable-frames . 0)))
    	
    Esta personalización también intentará que el paso anterior busque una ventana reutilizable en todos los marcos visibles o iconificados.

  • En caso contrario, intentará crear una nueva ventana dividiendo una ventana en el marco seleccionado, y mostrará el buffer en esa nueva ventana.

    La división puede ser vertical u horizontal, dependiendo de las variables split-height-threshold y split-width-threshold. Estas variables deben tener valores enteros. Si split-height-threshold es menor que la altura de la ventana elegida, la división pone la nueva ventana debajo. En caso contrario, si split-width-threshold es menor que el ancho de la ventana, la división coloca la nueva ventana a la derecha. Si no se cumple ninguna de las dos condiciones, Emacs intenta dividir para que la nueva ventana esté debajo, pero sólo si la ventana no se ha dividido antes (para evitar una división excesiva).

  • En caso contrario, muestra el búfer en una ventana que ya lo tenía. Normalmente, sólo se consideran las ventanas en el marco seleccionado, pero con una entrada adecuada de la acción entrada de la lista reusable-frames (ver arriba) la ventana puede estar también en otro marco.

  • En caso contrario, muestra el buffer en una ventana existente en el marco seleccionado.

  • Si todos los métodos anteriores fallan por cualquier razón, cree un nuevo marco y muestre el buffer allí.

Visualización de buffers no editables.

Algunos búferes se muestran en ventanas para su lectura en lugar de para su edición. Los comandos de ayuda (ver Ayuda) suelen utilizar un búfer llamado *Help* (*Ayuda*) para este fin, el minibúfer de finalización (ver Finalización) utiliza un búfer llamado *Completions* (*Terminaciones*), etc. Estos búferes suelen mostrarse sólo durante un corto período de tiempo.

Normalmente, Emacs elige la ventana para tales visualizaciones temporales mediante display-buffer, como se describe en la subsección anterior. El buffer *Completions*, por otro lado, se muestra normalmente en una ventana en la parte inferior del marco seleccionado, independientemente del número de ventanas que ya se muestren en ese marco.

Si prefieres que Emacs muestre un búfer temporal de una manera diferente, personaliza la variable display-buffer-alist (ver Elegir una ventana para mostrar un búfer en El Manual de Referencia de Emacs Lisp) de manera apropiada. Por ejemplo, para mostrar *Completions* siempre debajo de la ventana seleccionada, use la siguiente forma en su fichero de inicialización (vea El fichero de inicialización de Emacs):

(customize-set-variable
 'display-buffer-alist
 '(("\\*Completions\\*" display-buffer-below-selected)))

El buffer *Completions* también es especial en el sentido de que Emacs normalmente intenta hacer su ventana tan grande como sea necesario para mostrar todo su contenido. Para redimensionar las ventanas que muestran otras pantallas temporales, como, por ejemplo, el buffer *Help*, active el modo menor (ver Modos menores) temp-buffer-resize-mode (ver Temporary Displays en The Emacs Lisp Reference Manual).

El tamaño máximo de las ventanas redimensionadas por temp-buffer-resize-mode puede controlarse personalizando las opciones temp-buffer-max-height y temp-buffer-max-width (ver Temporary Displays en The Emacs Lisp Reference Manual), y no puede exceder el tamaño del marco que lo contiene.

Características convenientes para el manejo de las ventanas

El Modo winner es un modo global menor que registra los cambios en la configuración de las ventanas (es decir, cómo se dividen los cuadros en ventanas), para poder deshacerlos. Puede activar este modo con Alt-x winner-mode (M-x winner-mode), o personalizando la variable winner-mode. Cuando el modo está activado, Ctrl-c (C-c IZQUIERDA, winner-undo) deshace el último cambio de configuración de la ventana. Si cambias de opinión mientras deshaces, puedes rehacer los cambios que habías deshecho usando Ctrl-c (C-c DERECHA, M-x winner-redo). Para evitar que el modo Winner vincule Ctrl-c (C-c IZQUIERDA) y Ctrl-c (C-c DERECHA), puede personalizar la variable winner-dont-bind-my-keys a un valor no nulo. Por defecto, el modo Winner almacena un máximo de 200 configuraciones de ventana por marco, pero puede cambiar esto modificando la variable winner-ring-size. Si hay algunos búferes cuyas ventanas no quiere que el modo Winner restaure, añada sus nombres a la variable de lista winner-boring-buffers o a la expresión regular twinner-boring-buffers-regexp.

El modo de seguimiento (M-x follow-mode) sincroniza varias ventanas en el mismo buffer para que siempre muestren secciones adyacentes de ese buffer. Véase Modo de seguimiento.

El paquete Windmove define comandos para moverse direccionalmente entre ventanas vecinas en un marco. M-x windmove-right selecciona la ventana inmediatamente a la derecha de la actualmente seleccionada, y de manera similar para las contrapartes izquierda, arriba y abajo. windmove-default-keybindings vincula estos comandos a Shift- (S-right) etc.; al hacerlo se desactiva la selección de mayúsculas para esas teclas (ver Selección de mayúsculas). De la misma manera que se pueden definir las combinaciones de teclas para los comandos que seleccionan ventanas direccionalmente, puedes usar windmove-display-default-keybindings para definir combinaciones de teclas para los comandos que especifican en qué dirección mostrar la ventana para el buffer que el siguiente comando va a mostrar. También hay windmove-delete-default-keybindings para definir keybindings (combinaciones de teclas) para comandos que borran ventanas direccionalmente, y windmove-swap-states-default-keybindings que define keybindings para comandos que intercambian el contenido de la ventana seleccionada con la ventana en la dirección especificada.

El comando Alt-x compare-windows (M-x compare-windows) le permite comparar el texto mostrado en diferentes ventanas. Véase Comparación de archivos.

El modo Desplazar todo (M-x scroll-all-mode) es un modo menor global que hace que los comandos de desplazamiento y de movimiento de puntos se apliquen a todas las ventanas.

Pestaña de la ventana

El comando global-tab-line-mode activa la visualización de una línea de pestañas en la línea superior de la pantalla de cada ventana. La línea de pestañas muestra botones especiales ("pestañas", tabs) para cada búfer que se mostró en una ventana, y permite cambiar a cualquiera de estos búferes haciendo clic en el botón correspondiente. Al hacer clic en el icono + se añade un nuevo búfer a la línea de pestañas de la ventana, y al hacer clic en el icono x de una pestaña se borra. La rueda del ratón en la línea de pestañas desplaza las pestañas horizontalmente.

Seleccionar la pestaña local de la ventana anterior es lo mismo que escribir Ctrl-x (C-x IZQUIERDA, previous-buffer), seleccionar la siguiente pestaña es lo mismo que Ctrl-x (C-x DERECHA, next-buffer). Ambos comandos admiten un argumento de prefijo numérico como cuenta de repetición.

Puedes personalizar la variable tab-line-tabs-function para definir el contenido preferido de la línea de tabulación. Por defecto, muestra todos los buffers visitados previamente en la ventana, como se ha descrito anteriormente. Pero también puede configurarla para que muestre una lista de búferes con el mismo modo principal que el búfer actual, o para que muestre los búferes agrupados por su modo principal, donde al hacer clic en el nombre del modo en la primera pestaña se muestra una lista de todos los modos principales donde puede seleccionar otro grupo de búferes.

Tenga en cuenta que la línea de pestañas es diferente de la barra de pestañas (ver Barras de pestañas). Mientras que las pestañas de la Barra de Pestañas en la parte superior de cada cuadro se utilizan para cambiar entre configuraciones de ventanas que contienen varias ventanas con buffers, las pestañas de la Línea de Pestañas en la parte superior de cada ventana se utilizan para cambiar entre los buffers de la ventana.



Marcos y Pantallas Gráficas

Cuando Emacs se inicia en una pantalla gráfica, por ejemplo, en el sistema X Window, ocupa una región de visualización gráfica a nivel de sistema. En este manual, llamamos a esto un marco, reservando la palabra "ventana" para la parte del marco utilizada para mostrar un buffer. Un marco contiene inicialmente una ventana, pero puede subdividirse en múltiples ventanas (véase Ventanas múltiples). Un marco normalmente también contiene una barra de menú, una barra de herramientas y un área de eco.

También puedes crear marcos adicionales (ver Crear marcos). Todos los marcos creados en la misma sesión de Emacs tienen acceso a los mismos buffers subyacentes y a otros datos. Por ejemplo, si un búfer se muestra en más de un marco, cualquier cambio realizado en un marco se muestra inmediatamente en los otros marcos también.

Al teclear Ctrl-x Ctrl-c (C-x C-c) se cierran todos los marcos de la pantalla actual, y se termina la sesión de Emacs si no tiene marcos abiertos en ninguna otra pantalla (ver Salir de Emacs). Para cerrar sólo el marco seleccionado, escriba Ctrl-x Ctrl-x 50 (C-x 5 0) (es decir, cero, no o).

Este capítulo describe las características de Emacs específicas para las pantallas gráficas (particularmente los comandos del ratón), y las características para manejar múltiples marcos. En los terminales de texto, muchas de estas características no están disponibles. Sin embargo, todavía es posible crear múltiples marcos en terminales de texto; dichos marcos se muestran de uno en uno, llenando toda la pantalla del terminal (ver Terminales sin ventana). También es posible utilizar el ratón en algunos terminales de texto (ver Uso del ratón en terminales de texto, para hacerlo en sistemas GNU y Unix; y ver Uso del ratón en MS-DOS, para hacerlo en MS-DOS). Los menús son compatibles con todos los terminales de texto.Este capítulo describe las características de Emacs específicas para las pantallas gráficas (particularmente los comandos del ratón), y las características para manejar múltiples marcos. En los terminales de texto, muchas de estas características no están disponibles. Sin embargo, todavía es posible crear múltiples marcos en terminales de texto; dichos marcos se muestran de uno en uno, llenando toda la pantalla del terminal (ver Terminales sin ventana). También es posible utilizar el ratón en algunos terminales de texto (ver Uso del ratón en terminales de texto, para hacerlo en sistemas GNU y Unix; y ver Uso del ratón en MS-DOS, para hacerlo en MS-DOS). Los menús son compatibles con todos los terminales de texto.

Comandos del ratón para editar

(ratón-1)
Mover el punto donde se hace clic (mouse-set-point).
Arrastrar-ratón-1
Activar la región alrededor del texto seleccionado al arrastrar, y poner el texto en la selección primaria (mouse-set-region).
(ratón-2)
Mover el punto a donde se hace clic, e insertar el contenido de la selección primaria allí (mouse-yank-primary).
(ratón-3)
Si la región está activa, mueva el extremo más cercano de la región a la posición del clic; en caso contrario, establezca la marca en el valor actual del punto y el punto en la posición del clic. Guarda la región resultante en el anillo de muerte; en un segundo clic, la mata (mouse-save-then-kill).
Ctrl-Alt- (C-M-mouse-1)
Activar una región rectangular alrededor del texto seleccionado al arrastrarlo. Ver Rectángulos.

El comando más básico del ratón es mouse-set-point, que se invoca haciendo clic con el botón izquierdo del ratón, (ratón-1), en el área de texto de una ventana. Esto mueve el punto a la posición donde se hizo clic. Si esa ventana no era la seleccionada, se convierte en la ventana seleccionada. También puede activar una región haciendo doble clic con (ratón-1) (véase Comandos del ratón para palabras y líneas).

Normalmente, si el marco en el que ha hecho clic no era el marco seleccionado, se convierte en el marco seleccionado, además de seleccionar la ventana y fijar el cursor. En el sistema X Window, puede cambiar esto estableciendo la variable x-mouse-click-focus-ignore-position a t. En ese caso, el clic inicial en un marco no seleccionado sólo selecciona el marco, sin hacer nada más; hacer clic de nuevo selecciona la ventana y establece la posición del cursor.

Si se mantiene pulsado el botón 1 del ratón () y se arrastra el ratón sobre un tramo de texto, se activa la región alrededor de ese texto (mouse-set-region), colocando la marca en el lugar donde se empezó a mantener pulsado el botón del ratón, y el punto donde se suelta (véase La marca y la región). Además, el texto de la región se convierte en la selección principal (véase Cortar y pegar con otras aplicaciones de ventana).

Si cambia la variable mouse-drag-copy-region a un valor no nulo, al arrastrar el ratón sobre un tramo de texto también se añade el texto al anillo de muerte. El valor por defecto es nulo.

Si mueve el ratón fuera de la parte superior o inferior de la ventana mientras arrastra, la ventana se desplaza a un ritmo constante hasta que vuelva a mover el ratón dentro de la ventana. De este modo, puede seleccionar regiones que no caben completamente en la pantalla. El número de líneas que se desplazan por paso depende de la distancia del borde de la ventana que haya recorrido el ratón; la variable mouse-scroll-min-lines especifica un tamaño de paso mínimo.

Al hacer clic con el botón central del ratón (, ratón-2), se mueve el punto a la posición donde se hizo clic y se inserta el contenido de la selección primaria (ratón-yank-primary). Véase Cortar y pegar con otras aplicaciones de ventana. Este comportamiento es consistente con otras aplicaciones X. Como alternativa, puede volver a enlazar ratón-2 a mouse-yank-at-click, que realiza un tirón en la posición en la que se hace clic.

Si cambias la variable mouse-yank-at-point a un valor no nulo, ratón-2 () no mueve el punto; inserta el texto en el punto, independientemente de dónde hayas hecho clic o incluso en cuál de las ventanas del marco has hecho clic. Esta variable afecta tanto a mouse-yank-primary como a mouse-yank-at-click.

Al hacer clic con el botón derecho del ratón, mouse-3, se ejecuta el comando mouse-save-then-kill. Esto realiza varias acciones dependiendo de dónde se haga clic y del estado de la región:

  • Si no hay ninguna región activa, al hacer clic con (ratón-3) se activa la región, colocando la marca donde estaba el punto y el punto en la posición pulsada.

  • Si hay una región activa, al hacer clic con se ajusta el extremo más cercano de la región, moviéndolo a la posición en la que se ha hecho clic. El texto de la región ajustada se copia en el anillo de muerte; si el texto de la región original ya estaba en el anillo de muerte, lo sustituye allí.

  • Si originalmente especificó la región usando un doble o triple (ratón-1), de modo que la región se define para consistir en palabras o líneas enteras (ver Comandos del ratón para palabras y líneas), entonces el ajuste de la región con (ratón-3) también procede por palabras o líneas enteras.

  • Si utiliza (ratón-3) una segunda vez consecutiva, en el mismo lugar, eso mata la región ya seleccionada. Por lo tanto, la forma más sencilla de matar el texto con el ratón es hacer clic con (ratón-1) en un extremo, a continuación, haga doble clic con en el otro extremo. Para copiar el texto en el anillo de muerte sin borrarlo de la memoria intermedia, haga un solo clic con (ratón-3), o simplemente arrastra el texto con (ratón-1). Luego puedes copiarlo en otro lugar tirando de él.

El comando mouse-save-then-kill también obedece a la variable mouse-drag-copy-region (descrita anteriormente). Si el valor es no nulo, entonces cada vez que el comando establece o ajusta la región activa, el texto de la región también se añade al anillo de muerte. Si la última entrada del anillo de muerte se había añadido de la misma manera, esa entrada se sustituye en lugar de hacer una nueva entrada.

Siempre que se ajuste la región mediante cualquiera de los comandos del ratón descritos anteriormente, la marca se desactivará mediante cualquier comando posterior de movimiento del cursor sin desplazamiento, además de las formas habituales de desactivar la marca. Véase Selección por desplazamiento.

Algunos ratones tienen una "rueda" que puede ser usada para desplazarse. Emacs soporta el desplazamiento de ventanas con la rueda del ratón, por defecto, en la mayoría de las pantallas gráficas. Para activar esta función, utilice M-x mouse-wheel-mode. Las variables mouse-wheel-follow-mouse y mouse-wheel-scroll-amount determinan dónde y cuánto se desplazan los buffers. La variable mouse-wheel-progressive-speed determina si la velocidad de desplazamiento está vinculada a la rapidez con que se mueve la rueda. Este modo también soporta el aumento o disminución de la altura de face configurada por defecto, que por defecto está ligada al desplazamiento con el modificador Ctrl.

Emacs también soporta el desplazamiento horizontal con el modificador Shift. Escribiendo un prefijo numérico arg (por ejemplo, M-5) antes de iniciar el desplazamiento horizontal cambia su valor de paso definido por la opción de usuario mouse-wheel-scroll-amount-horizontal.

Si la rueda de su ratón se puede inclinar, o si su touchpad lo soporta, entonces también puede habilitar el desplazamiento horizontal personalizando la variable mouse-wheel-tilt-scroll a un valor no nulo. Por defecto, al inclinar la rueda del ratón, la vista de la ventana se desplaza horizontalmente en la dirección de la inclinación: por ejemplo, si se inclina hacia la derecha, la ventana se desplaza hacia la derecha, de modo que el texto mostrado en la ventana se mueve horizontalmente hacia la izquierda. Si desea invertir la dirección del desplazamiento horizontal, personalice la variable mouse-wheel-flip-direction a un valor no nulo.

Cuando el puntero del ratón está sobre una imagen en el modo Imagen, véase Visualización de archivos de imagen, al desplazar la rueda del ratón con el modificador Ctrl se escala la imagen bajo el puntero del ratón, y al desplazar la rueda del ratón con el modificador Shift se desplaza la imagen horizontalmente.

Comandos del ratón para palabras y líneas

Estas variantes de ratón-1 () seleccionan palabras o líneas enteras a la vez. Emacs activa la región que rodea al texto seleccionado, que también se copia en el anillo de eliminación.

Doble-ratón-1
Selecciona el texto alrededor de la palabra o el carácter sobre el que se hace clic.

Al hacer doble clic en un carácter con sintaxis de símbolo (como el guión bajo, en modo C) se selecciona el símbolo que rodea a ese carácter. Al hacer doble clic en un carácter con sintaxis de paréntesis abierto o cerrado, se selecciona la agrupación de paréntesis que inicia o termina ese carácter. Haciendo doble clic en un carácter con sintaxis de delimitador de cadena (como una comilla simple o doble en C) selecciona la constante de la cadena (Emacs utiliza la heurística para averiguar si ese carácter es el principio o el final de la misma).

Haciendo doble clic en el comienzo de una agrupación parentética o en el comienzo de un delimitador de cadena se mueve el punto al final de la región, desplazando la pantalla del buffer hacia delante si es necesario para mostrar la nueva ubicación del punto. Al hacer doble clic en el final de una agrupación parentética o un delimitador de cadena final se mantiene el punto al final de la región por defecto, por lo que el principio de la región no será visible si está por encima de la parte superior de la ventana; si se establece la opción de usuario mouse-select-region-move-to-beginning a un valor no nulo, se mueve el punto al principio de la región, desplazando la pantalla hacia atrás si es necesario.
doble-clic arrastre ratón-1 ()
Selecciona el texto que arrastra, en unidades de palabras enteras.
(triple-clic ratón-1)
Selecciona la línea sobre la que se hace clic.
triple-clic arrastrar mouse-1 ()
Selecciona el texto que arrastra, en unidades de líneas enteras.

Seguir referencias con el ratón

Algunos buffers de Emacs incluyen botones, o hipervínculos: trozos de texto que realizan alguna acción (por ejemplo, seguir una referencia) cuando se activan (por ejemplo, haciendo clic sobre ellos). Normalmente, el texto de un botón se resalta visualmente: se subraya o se dibuja un recuadro a su alrededor. Si mueve el ratón sobre un botón, la forma del cursor del ratón cambia y el botón se ilumina. Si cambias la variable mouse-highlight a nil, Emacs desactiva este resaltado.

Puedes activar un botón moviendo el punto hacia él y escribiendo RETURN (RET), o clicando sobre (ratón-1) o (ratón-2) sobre el botón. Por ejemplo, en un buffer Dired, cada nombre de archivo es un botón; activarlo hace que Emacs visite ese archivo (ver Dired, el editor de directorios). En un buffer de *Compilation*, cada mensaje de error es un botón, y al activarlo se visita el código fuente de ese error (ver Ejecutar compilaciones en Emacs).

Aunque al hacer clic con (ratón-1) en un botón normalmente se activa el botón, si mantienes el botón del ratón pulsado durante un periodo de tiempo antes de soltarlo (concretamente, durante más de 450 milisegundos), entonces Emacs se desplaza al punto donde has hecho clic, sin activar el botón. De esta manera, puedes usar el ratón para mover el punto sobre un botón sin activarlo. Arrastrar el ratón por encima o sobre un botón tiene su comportamiento habitual de fijar la región, y no activa el botón.

Puedes cambiar cómo se aplica ratón-1 () a los botones personalizando la variable mouse-1-click-follows-link. Si el valor es un número entero positivo, determina el tiempo que hay que mantener pulsado el botón del ratón, en milisegundos, para cancelar la activación de los botones; el valor por defecto es 450, como se describe en el párrafo anterior. Si el valor es nulo, (ratón-1) sólo fija el punto donde se ha hecho clic, y no activa los botones. Si el valor es doble, los clics dobles activan los botones, pero los clics simples sólo fijan el punto.

Normalmente, (ratón-1) en un botón activa el botón incluso si está en una ventana no seleccionada. Si cambias la variable mouse-1-click-in-non-selected-windows a nil, ratón-1 sobre un botón en una ventana no seleccionada mueve el punto a la posición del clic y selecciona esa ventana, sin activar el botón.

Clics del ratón para los menús

Ctrl- (C-ratón-1)
Este menú sirve para seleccionar un búfer.
El modo global menor MSB ("mouse select buffer") hace que este menú sea más inteligente y personalizable. Ver Personalización de los menús del buffer.
Ctrl- (C-ratón-2)
Este menú contiene entradas para examinar faces y otras propiedades del texto, así como para ajustarlas (esto último es útil principalmente cuando se edita texto enriquecido; véase Texto enriquecido).
Ctrl- (C-ratón-3)
Este menú es específico del modo. Para la mayoría de los modos, si el modo Barra de menús está activado, este menú tiene los mismos elementos que todos los menús de la barra de menús específicos del modo juntos. Algunos modos pueden especificar un menú diferente para este botón. Si el modo de barra de menús está desactivado, este menú contiene todos los elementos que estarían presentes en la barra de menús -no sólo los específicos del modo- para que pueda acceder a ellos sin tener que mostrar la barra de menús.
Shift- (S-ratón-1)
Este menú sirve para cambiar la face por defecto dentro del buffer de la ventana. Véase Escala de texto.

Muchas aplicaciones GUI usan (mouse-3) para mostrar menús contextuales: menús que proporcionan acceso a varios ajustes y acciones pertinentes para la ubicación y el contexto del clic del ratón. Si prefieres esto en Emacs sobre la función por defecto de (mouse-3), que está ligada al comando mouse-save-then-kill (ver Comandos del ratón para editar), puedes activar el modo menor context-menu-mode. Entonces Emacs mostrará menús contextuales cuando pulse (ratón-3). El contenido exacto de estos menús contextuales depende del modo mayor actual y del contenido del búfer alrededor del lugar donde se hace clic con el ratón. Para personalizar el contenido del menú contextual, puedes usar la variable context-menu-functions (ver Major Mode Conventions en The Emacs Lisp Reference Manual). También puede invocar el menú contextual pulsando Shift-F10 (S-F10).

Comandos del ratón en la línea de modo

Puede utilizar los clics del ratón en las líneas de modo de la ventana para seleccionar y manipular las ventanas.

Algunas áreas de la línea de modo, como el nombre del búfer y los nombres de los modos mayor y menor, tienen sus propios enlaces especiales del ratón. Estas áreas se resaltan cuando se mantiene el ratón sobre ellas, y se mostrará información sobre los enlaces especiales (ver Información sobre herramientas). Los comandos de esta sección no se aplican en esas áreas.

(ratón-1)
en una línea de modo selecciona la ventana a la que pertenece. Arrastrando (ratón-1) sobre la línea de modo, puedes moverlo, cambiando así la altura de las ventanas de arriba y de abajo. Al cambiar la altura con el ratón de esta manera nunca se borran las ventanas, sólo rechaza hacer cualquier ventana más pequeña que la altura mínima.
(ratón-2)
en una línea de modo expande esa ventana para llenar su marco.
(ratón-3)
en una línea de modo borra la ventana a la que pertenece. Si el marco sólo tiene una ventana, no hace nada.
Ctrl- (C-ratón-2)
C-ratón-2 en una línea de modo divide esa ventana, produciendo dos ventanas laterales con el límite que pasa por la posición del clic (ver Dividir ventanas).

Además, haciendo clic y arrastrando con (ratón-1) en la línea divisoria entre dos líneas de modo contiguas, puede mover el límite vertical a la izquierda o a la derecha.

Tenga en cuenta que el cambio de tamaño de las ventanas se ve afectado por el valor de window-resize-pixelwise, véase Dividir ventanas.

Crear marcos

La tecla de prefijo Ctrl-x 5 (C-x 5) es análoga a Ctrl-x 4 (C-x 4). Mientras que cada comando C-x 4 hace aparecer un buffer en una ventana diferente en el marco seleccionado (ver Visualización en otra ventana), los comandos (C-x 5) utilizan un marco diferente. Si un marco visible o iconificado (también conocido como "minimizado", ver Visibilidad de los marcos en el Manual de Referencia de Emacs Lisp) ya muestra el búfer solicitado, ese marco es levantado y deiconificado ("desminimizado"); de lo contrario, se crea un nuevo marco en el terminal de visualización actual.

Los distintos comandos de Ctrl-x 5 (C-x 5) difieren en cómo encuentran o crean el búfer a seleccionar:

Ctrl-x 52 (C-x 5 2)
Crea un nuevo marco utilizando los parámetros de marco por defecto (make-frame-command).
Ctrl-x 5c (C-x 5 c)
Crear un nuevo marco utilizando la configuración de la ventana y los parámetros del marco actual (clone-frame).
Ctrl-x 5b nombrebuffer RETURN (C-x 5 b nombrebuffer RET)
Selecciona nombrebuffer en otro marco. Esto ejecuta switch-to-buffer-other-frame.
Ctrl-x 5f nombrefichero RETURN (C-x 5 f nombrefichero RET)
Visita el archivo nombrefichero y selecciona su buffer en otro marco. Esto ejecuta find-file-other-frame. Ver Visitar archivos.
Ctrl-x 5d directorio RETURN (C-x 5 d directorio RET)
Selecciona un búfer Dired para el directorio en otro marco. Esto ejecuta dired-other-frame. Ver Dired, el editor de directorios.
Ctrl-x 5m (C-x 5 m)
Comienza a componer un mensaje de correo en otro marco. Esto ejecuta compose-mail-other-frame. Es la variante de otro marco de C-x m. Ver Envío de correo.
Ctrl-x 5. (C-x 5.)
Encuentra la definición de un identificador en otro marco. Esto ejecuta xref-find-definitions-other-frame, la variante de múltiples marcos de Alt-. (M-.). Véase Buscar referencias de identificadores.
Ctrl-x 5r nombrearchivo RETURN (C-x 5 r nombrearchivo RET)
Visita el archivo nombredearchivo con permiso de solo lectura, y selecciona su buffer en otro marco. Esto ejecuta find-file-read-only-other-frame. Ver Visitar archivos.
Ctrl-x 55 (C-x 5 5)
Un comando de prefijo más general que afecta al búfer mostrado por el siguiente comando invocado inmediatamente después de este comando de prefijo (other-frame-prefix). Solicita que el buffer del siguiente comando se muestre en otro marco.

Puede controlar la apariencia y el comportamiento de los marcos recién creados especificando los parámetros de los marcos. Véase Parámetros de marco.

Comandos de los marcos

Los siguientes comandos se utilizan para borrar y operar sobre los marcos:

Ctrl-x 50 (C-x 5 0)
Borra el marco seleccionado (delete-frame). Esto señala un error si sólo hay un marco.
Ctrl-z (C-z)
Minimizar (o iconizar) el marco de Emacs seleccionado (suspend-frame). Ver Salir de Emacs.
Ctrl-x 5 o (C-x 5 o)
Selecciona otro marco y lo levanta. Si el comando se repite, se recorren todos los marcos de la terminal.
Ctrl-x 5 1 (C-x 5 1)
Borra todos los marcos de la terminal actual, excepto el seleccionado.
Alt-F10 (M-F10)
Cambia el estado de maximización del marco actual. Cuando un marco está maximizado, llena la pantalla.
F11 (F11)
Conmuta el modo de pantalla completa para el marco actual. (La diferencia entre pantalla completa y maximizada es normalmente que la primera oculta las decoraciones del gestor de ventanas, dando un poco más de espacio en pantalla al propio Emacs).

Ten en cuenta que con algunos gestores de ventanas puedes tener que personalizar la variable frame-resize-pixelwise a un valor no nulo para que un marco esté realmente maximizado o a pantalla completa. Esta variable, cuando se establece a un valor no nulo, en general permite redimensionar los marcos a resolución de píxeles, en lugar de en múltiplos integrales de líneas y columnas.

El comando Ctrl-x 50 (C-x 5 0, delete-frame) borra el marco seleccionado. Sin embargo, se negará a borrar el último marco de una sesión de Emacs, para evitar que se pierda la capacidad de interactuar con la sesión del Editor. Ten en cuenta que cuando Emacs se ejecuta como demonio (ver Uso de Emacs como Servidor), siempre hay un marco virtual que permanece después de que todos los marcos ordinarios e interactivos sean borrados. En este caso, C-x 5 0 puede borrar el último marco interactivo; puedes usar emacsclient para reconectarte a la sesión.Emacs.

El comando Ctrl-x 51 (C-x 5 1, delete-other-frames) borra todos los otros marcos en la terminal actual (esta terminal se refiere a una pantalla gráfica, o a una terminal de texto; ver Terminales no-X). Si la sesión de Emacs tiene marcos abiertos en otras pantallas gráficas o terminales de texto, éstos no se borran.

El comando Ctrl-x 5o (C-x 5 o, other-frame) selecciona el siguiente marco en el terminal actual. Si estás usando Emacs en el sistema X Window con un gestor de ventanas que selecciona (o da foco) cualquier marco sobre el que esté el cursor del ratón, tienes que cambiar la variable focus-follows-mouse a t para que este comando funcione correctamente. Entonces, al invocar C-x 5 o también se deformará el cursor del ratón al marco elegido.

Fuentes

Por defecto, Emacs muestra el texto en pantallas gráficas utilizando una fuente monospace de 10 puntos, y el tamaño de la fuente puede cambiarse interactivamente (ver Escala de texto).

Hay varias maneras de especificar un tipo de letra diferente:

  • Haga clic en ‘Set Default Font’ ("Establecer fuente por defecto") en el menú ‘Options’ ("Opciones"). Esto hace que la fuente seleccionada sea la predeterminada en todos los marcos gráficos existentes. Para guardar esto para futuras sesiones, haga clic en ‘Save Options’ ("Guardar opciones") del mismo menú ("Opciones").

  • Añade una línea a tu archivo init, modificando la variable default-frame-alist para especificar el parámetro de la fuente (ver Parámetros de los Marcos), así:
    (add-to-list 'default-frame-alist
                 '(font . "DejaVu Sans Mono-10"))
    	
    Esto hace que la fuente sea la predeterminada en todos los marcos gráficos creados después de reiniciar Emacs con ese archivo init.

  • Añade una configuración de recursos X ‘emacs.font’ a tu archivo de recursos X, así:
    emacs.font: DejaVu Sans Mono-12
    	
    Debe reiniciar X, o utilizar el comando xrdb, para que el archivo de recursos X tenga efecto. Véase Recursos X. No cite los nombres de las fuentes en los archivos de recursos X.

  • Si está ejecutando Emacs en el escritorio GNOME, puede decirle al Editor que use la fuente del sistema por defecto estableciendo la variable font-use-system-font a t (el valor por defecto es nil). Para que esto funcione, Emacs debe haber sido compilado con soporte para Gsettings (o el antiguo Gconf). (Para ser específicos, los nombres de configuración de Gsettings utilizados son ‘org.gnome.desktop.interface monospace-font-name’ y ‘org.gnome.desktop.interface font-name’).

  • Utilice la opción de línea de comandos ‘-fn’ (o ‘--font’). Consulte las opciones de especificación de fuentes.

Para comprobar qué fuente está utilizando actualmente, el comando Ctrl-u Ctrl-x (C-u C-x =) puede ser útil. Describe el carácter en el punto, y nombra la fuente en la que se representa.

Hay cuatro formas diferentes de expresar el nombre de una fuente. La primera es utilizar un patrón Fontconfig. Los patrones Fontconfig tienen la siguiente forma:

fontname[-fontsize][:name1=values1][:name2=values2]...

Dentro de este formato, se puede omitir cualquiera de los elementos entre paréntesis. Aquí, fontname es el nombre de la familia de la fuente, como ‘Monospace’ o ‘DejaVu Sans Mono’; fontsize es el tamaño del punto de la fuente (un punto de impresora es aproximadamente 1/72 de pulgada); y las entradas ‘name=values’ especifican ajustes como la inclinación y el peso de la fuente. Cada valor puede ser un único valor o una lista de valores separados por comas. Además, algunos valores de propiedades sólo son válidos con un tipo de nombre de propiedad, en cuyo caso se puede omitir la parte ‘name=’.

A continuación se muestra una lista de propiedades de fuentes comunes:

‘slant’ (inclinación)
Una de las siguientes: ‘italic’, ’oblique’ o ‘roman’.
‘weight’ (peso)
Uno de los siguientes: ‘light’, ‘medium’, ‘demibold’, ‘bold’ o ‘black’.
‘style’ (estilo)
Algunas fuentes definen estilos especiales que son una combinación de inclinación y peso. Por ejemplo, ‘Dejavu Sans’ define el estilo ‘book’, que anula las propiedades de inclinación y peso.
‘width’ (ancho)
Uno de los estilos ‘condensed’, ‘normal’ o ‘expanded’.
‘spacing’ (espaciado)
Uno de los siguientes: ‘monospace’, ‘proportional’, ‘dual-width’ o ‘charcell’.

Estos son algunos ejemplos de patrones de Fontconfig

Monospace
Monospace-12
Monospace-12:bold
DejaVu Sans Mono:bold:italic
Monospace-12:weight=bold:slant=italic

Para una descripción más detallada de los patrones de Fontconfig, consulte el manual de Fontconfig, que se distribuye con Fontconfig y está disponible en línea en fontconfig-user

En MS-Windows, sólo se admite el subconjunto de la forma fontname[-fontsize] para todas las fuentes; el patrón Fontconfig completo podría no funcionar para todas ellas.

La segunda forma de especificar una fuente es utilizar un patrón de fuente GTK. Estos tienen la sintaxis:

fontname [properties] [fontsize]

donde fontname es el nombre de la familia, properties es una lista de valores de propiedades separados por espacios, y fontsize es el tamaño de punto. Las propiedades que puede especificar para los patrones de fuentes GTK son las siguientes:

  • Propiedades de inclinación: ‘Italic’ u 'Oblique' (Cursiva). Si se omite, la inclinación por defecto (roman) está implícita.

  • Propiedades de peso: ‘Bold’, ‘Book’, ‘Light’, ‘Medium’, ‘Semi-bold’, o ‘Ultra-light ’ . Si se omite, se implica el peso ‘Medium’.

  • Propiedades de anchura: ‘Semi-condensed’ o ‘Condensed’. Si se omite, se utiliza un ancho por defecto.

Estos son algunos ejemplos de patrones de fuentes GTK:

Monospace 12
Monospace Bold Italic 12

En MS-Windows, sólo se admite el subconjunto fontname.

La tercera forma de especificar un tipo de letra es utilizar un XLFD (X Logical Font Description, Descripción de las Fuentes Lógicas). Este es el método tradicional para especificar fuentes en X, y también se admite en MS-Windows. Cada XLFD está formado por catorce palabras o números, separados por guiones, así:

-misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1

Un carácter comodín (‘*’) en un XLFD coincide con cualquier secuencia de caracteres (incluyendo ninguna), y ‘?’ coincide con cualquier carácter único. Sin embargo, la coincidencia depende de la implementación, y puede ser inexacta cuando los comodines coinciden con los guiones en un nombre largo. Para obtener resultados fiables, proporcione los 14 guiones y utilice los comodines sólo dentro de un campo. Las mayúsculas y minúsculas son insignificantes en un XLFD. La sintaxis de un XLFD es la siguiente:

-maker-family-weight-slant-widthtype-style…
…-pixels-height-horiz-vert-spacing-width-registry-encoding

Las entradas tienen los siguientes significados:

maker
El nombre del que hizo la fuente.
family
El nombre de la familia de fuentes (por ejemplo, ‘courier’).
weigth
El peso de la fuente, normalmente ‘bold’, ‘medium’ o ‘light’. Algunos nombres de fuentes admiten otros valores.
slan
La inclinación de la fuente, normalmente ‘r’ (roman), ‘i’ (italic), ‘o’ (oblique), ‘ri’ (reverse-italic, cursiva inversa), u 'ot' (other, otra). Algunos nombres de fuentes admiten otros valores.
widthtype
El ancho de la fuente, normalmente ‘normal’, ‘condensed’, ‘semicondensed’, o ‘extended’. Algunos nombres de fuentes admiten otros valores.
style
Un nombre de estilo adicional opcional. Normalmente está vacío; la mayoría de los XLFD tienen dos guiones seguidos en este punto. El nombre de estilo también puede especificar un nombre de idioma ISO-639 de dos letras, como ‘ja’ o ‘ko’; algunas fuentes que admiten los alfabetos CJK lo tienen escrito en la parte del nombre de estilo.
pixels
La altura de la fuente, en píxeles.
height
La altura de la fuente en la pantalla, medida en décimas de punto de impresora. Es el tamaño de punto de la fuente, multiplicado por diez. Para una resolución vertical dada, la altura y los píxeles son proporcionales; por lo tanto, es común especificar sólo uno de ellos y utilizar ‘*’ para el otro.
horiz
La resolución horizontal, en píxeles por pulgada, de la pantalla para la que está destinada la fuente.
vert
La resolución vertical, en píxeles por pulgada, de la pantalla para la que está destinada la fuente. Normalmente, la resolución de las fuentes en su sistema es el valor correcto para su pantalla; por lo tanto, normalmente se especifica ‘*’ para esto y horiz.
spacing
Es ‘m’ (monospace), ‘p’ (proportional) o ‘c’ (character cell, celda de caracteres).
width
La anchura media de los caracteres, en píxeles, multiplicada por diez.
registry
encoding
El conjunto de caracteres de la fuente X que representa la fuente. (Los conjuntos de caracteres de X font no son los mismos que los de Emacs, pero son similares). Puede utilizar el programa xfontsel para comprobar qué opciones tiene. Normalmente deberías usar ‘iso8859’ para el registro y ‘1’ para la codificación.

El cuarto y último método para especificar una fuente es utilizar un apodo de fuente. Algunas fuentes tienen apodos más cortos, que puedes utilizar en lugar de una especificación de fuente normal. Por ejemplo, ‘6x13’ equivale a:

-misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1

Esta forma no está soportada en MS-Windows.

En X, Emacs reconoce dos tipos de fuentes: las fuentes del lado del cliente, que son proporcionadas por las bibliotecas Xft y Fontconfig, y las fuentes del lado del servidor, que son proporcionadas por el propio servidor X. La mayoría de las fuentes del lado del cliente soportan características avanzadas de las fuentes como el antialiasing y el subpixel hinting, mientras que las fuentes del lado del servidor no lo hacen. Los patrones de Fontconfig y GTK sólo coinciden con las fuentes del lado del cliente.

Probablemente querrá utilizar una fuente predeterminada de ancho fijo, es decir, una fuente en la que todos los caracteres tengan el mismo ancho. Para las fuentes Xft y Fontconfig, puede utilizar el comando fc-list para listar las fuentes de ancho fijo disponibles, de esta manera:

fc-list :spacing=mono
fc-list :spacing=charcell

Para las fuentes X del lado del servidor, puede utilizar el programa xlsfonts para enumerar las fuentes de ancho fijo disponibles, de esta manera:

xlsfonts -fn '*x*' | grep -E '^[0-9]+x[0-9]+'
xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-m*'
xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-c*'

Cualquier fuente con ‘m’ o ‘c’ en el campo de espaciado del XLFD es una fuente de ancho fijo. Para ver el aspecto de un determinado tipo de letra, utilice el comando xfd. Por ejemplo:

xfd -fn 6x13

muestra la fuente completa ‘6x13’.

Mientras se ejecuta Emacs, también se puede establecer el tipo de letra de un tipo de texto específico (véase estilos de texto de texto), o un marco particular (véase Parámetros de marco).

Marco speedbar

speedbar es un marco especial para navegar cómodamente en otro marco u operar sobre él. Cuando speedbar existe, está siempre asociada a un marco específico, llamado marco adjunto; todas las operaciones de la barra rapida actúan sobre ese marco.

Escriba Alt-x speedbar (M-x speedbar) para crear la barra y asociarla al marco actual. Para descartar speedbar, escriba M-x speedbar de nuevo, o seleccione la barra y escriba q (q). (También puede eliminar el marco de la barra como cualquier otro marco de Emacs.) Si desea asociar speedbar con un marco diferente, deséchela y llame a M-x speedbar desde ese marco.

speedbar puede funcionar en varios modos. Su modo por defecto es el de visualización de archivos, que muestra los archivos del directorio actual de la ventana seleccionada del marco adjunto, un archivo por línea. Al hacer clic en un no-directorio se visita ese archivo en la ventana seleccionada del marco adjunto, y al hacer clic en un directorio se muestra ese directorio en speedbar (véase Seguir referencias con el ratón). Cada línea tiene también una casilla, ‘[+]’ o ‘<+>’, sobre la que puede hacer clic para ampliar el contenido de ese elemento. La ampliación de un directorio añade el contenido de ese directorio a la pantalla de speedbar , debajo de la propia línea del directorio. La ampliación de un archivo ordinario añade una lista de las etiquetas de ese archivo a la pantalla de speedbar; puede hacer clic en el nombre de una etiqueta para saltar a esa etiqueta en la ventana seleccionada del marco adjunto. Cuando se expande un archivo o directorio, el signo ‘[+]’ cambia a ‘[-]’; puedes hacer clic en esa casilla para contraer el elemento, ocultando su contenido.

También se puede navegar por speedbar utilizando el teclado. Escribir RETURN (RET) mientras el punto está en una línea de la barra equivale a hacer clic en el elemento de la línea actual, y SPACE (SPC) expande o contrae el elemento. U (U) muestra el directorio principal del directorio actual. Para copiar, borrar o renombrar el archivo en la línea actual, escriba C (C), D (D) y R (R) respectivamente. Para crear un nuevo directorio, escriba M (M).

Otro modo de uso general de esta barra es el modo de visualización de buffers; en este modo, speedbar muestra una lista de buffers de Emacs. Para cambiar a este modo, escriba b b en la barra rapida. Para volver al modo de visualización de archivos, escribe f (f). También puedes cambiar el modo de visualización haciendo clic con (ratón-3) en cualquier lugar de la ventana de la barra rapida (o con (ratón-1) en la línea de modo) y seleccionando ‘Displays’ en el menú emergente.

Algunos modos principales, incluyendo el modo Rmail, Info y GUD, tienen formas especializadas de poner elementos útiles en speedbar para que Usted los seleccione. Por ejemplo, en el modo Rmail, la barra muestra una lista de archivos Rmail, y le permite mover el mensaje actual a otro archivo Rmail haciendo clic en su casilla ‘<M>’.

Para más detalles sobre el uso y la programación de speedbar, véase speedbar en el Manual de speedbar.

Múltiples pantallas

Un solo Emacs puede hablar con más de una pantalla X. Inicialmente, el Editor utiliza sólo una pantalla, la especificada con la variable de entorno DISPLAY o con la opción ‘--display’ (ver Opciones iniciales). Para conectarse a otra pantalla, utilice el comando make-frame-on-display:

Alt-x make-frame-on-display RETURN pantalla RETURN
(M-x make-frame-on-display RET pantalla RET)
Crea un nuevo marco en pantalla.

Un único servidor X puede manejar más de una pantalla. Cuando abres marcos en dos pantallas pertenecientes a un mismo servidor, Emacs sabe que comparten un mismo teclado, y trata todos los comandos que llegan desde estas pantallas como un único flujo de entrada.

Cuando abres marcos en diferentes servidores X, Emacs hace un flujo de entrada separado para cada servidor. Cada servidor también tiene su propio marco seleccionado. Los comandos que introduzca con un servidor X en particular se aplican al marco seleccionado de ese servidor.

En pantallas multimonitor es posible utilizar el comando make-frame-on-monitor:

Alt-x make-frame-on-monitor RETURN monitor RETURN
(M-x make-frame-on-monitor RET monitor RET)
Crea un nuevo marco en el monitor cuya área de pantalla es una parte de la pantalla actual.

Parámetros de los Marcos

Puede controlar la apariencia y el comportamiento por defecto de todos los marcos especificando una lista de parámetros de marco por defecto en la variable default-frame-alist. Su valor debe ser una lista de entradas, cada una especificando un nombre de parámetro y un valor para ese parámetro. Estas entradas tienen efecto cada vez que Emacs crea un nuevo marco, incluyendo el marco inicial.

Por ejemplo, puedes añadir las siguientes líneas al fichero init (ver El fichero de inicialización de Emacs) para establecer la anchura del marco por defecto a 90 columnas de caracteres, la altura del marco por defecto a 40 filas de caracteres, y la fuente por defecto a ‘Monospace-10’:

(add-to-list 'default-frame-alist '(width  . 90))
(add-to-list 'default-frame-alist '(height . 40))
(add-to-list 'default-frame-alist '(font . "Monospace-10"))

Para una lista de parámetros de marco y sus efectos, vea Parámetros de marco en el Manual de Referencia de Emacs Lisp.

También puedes especificar una lista de parámetros de marco que se aplican sólo al marco inicial, personalizando la variable initial-frame-alist.

Si Emacs está compilado para usar un kit de herramientas X, los parámetros de marco que especifican los colores y las fuentes no afectan a los menús y a la barra de menús, ya que éstos son dibujados por el kit de herramientas y no directamente por el Editor.

La apariencia y el comportamiento del marco también pueden ser personalizados a través de los recursos X (ver Opciones y Recursos X); estos anulan los parámetros del marco inicial especificado en su archivo de inicio.

Tenga en cuenta que si está utilizando la biblioteca del escritorio para guardar y restaurar sus sesiones, los marcos a restaurar se registran en el archivo del escritorio, junto con sus parámetros. Cuando estos marcos se restauran, los parámetros grabados tienen prioridad sobre los parámetros de los marcos especificados por default-frame-alist y initial-frame-alist en su archivo de inicio. Vea Guardar sesiones de Emacs, para saber cómo evitar esto.

Barras de desplazamiento

En las pantallas gráficas, hay una barra de desplazamiento vertical en el lateral de cada ventana de Emacs. Haciendo un clic con (ratón-1) sobre los botones de la barra de desplazamiento hacia arriba y hacia abajo, la ventana se desplaza una línea cada vez (pero algunos kits de herramientas permiten personalizar las barras de desplazamiento para que no tengan esos botones). Hacer clic con (ratón-1) por encima o por debajo de la caja interior de la barra de desplazamiento desplaza la ventana por casi toda la altura de la ventana, como Alt-v (M-v) y Ctrl-v (C-v) respectivamente (ver Cambiar la ubicación del punto). (Esto, también, puede comportarse de forma diferente con algunos kits de herramientas.) Arrastrando la caja interior se desplaza continuamente.

Si Emacs está compilado en el sistema X Window sin soporte del kit de herramientas X, la barra de desplazamiento se comporta de forma diferente. Haciendo clic con (ratón-1) en cualquier parte de la barra de desplazamiento se desplaza hacia adelante como Ctrl-v (), mientras que (ratón-3) se desplaza hacia atrás como Alt-v (M-v). Al hacer clic con (ratón-2) en la barra de desplazamiento se puede arrastrar el cuadro interior hacia arriba y hacia abajo.

Para alternar el uso de las barras de desplazamiento verticales, escribe Alt-x (M-x scroll-bar-mode). Este comando se aplica a todos los cuadros, incluidos los que aún no se han creado. Para activar las barras de desplazamiento verticales sólo para el cuadro seleccionado, utilice el comando Alt-x toggle-scroll-bar (M-x toggle-scroll-bar).

Para controlar el uso de las barras de desplazamiento verticales al inicio, personalice la variable scroll-bar-mode (ver Personalización). Su valor debe ser right (poner las barras de desplazamiento en el lado derecho de las ventanas), left (ponerlas a la izquierda), o nil (deshabilitar las barras de desplazamiento vertical). Por defecto, Emacs pone las barras de desplazamiento a la derecha si fue compilado con soporte GTK+ en el Sistema X Window, y en MS-Windows o macOS; sino, coloca pone las barras de desplazamiento a la izquierda si fue compilado en el Sistema X Window sin soporte GTK+ (siguiendo la antigua convención para aplicaciones X).

También puedes usar el recurso X ‘verticalScrollBars’ para activar o desactivar las barras de desplazamiento (ver Recursos X). Para controlar el ancho de la barra de desplazamiento, cambie el parámetro de marco scroll-bar-width (vea Parámetros de marco en el Manual de referencia de Emacs Lisp).

Si esta usando Emacs en X (con GTK+ o Motif), puedes personalizar la variable scroll-bar-adjust-thumb-portion para controlar el sobredesplazamiento de la barra de desplazamiento, es decir, arrastrar el pulgar hacia abajo incluso cuando el final del buffer es visible. Si su valor es no nulo, la barra de desplazamiento puede ser arrastrada hacia abajo aunque se muestre el final del buffer; si es nulo, el pulgar estará en la parte inferior cuando se muestre el final del buffer. No se puede sobre-desplazar cuando todo el buffer es visible.

El aspecto visual de las barras de desplazamiento está controlado por los parámetros de la configuración face de scroll-bar de la barra de desplazamiento. (Algunos kits de herramientas, como GTK+ y MS-Windows, ignoran esta cara; la apariencia de la barra de desplazamiento sólo se puede personalizar en todo el sistema, para GTK+ vea los recursos de GTK+).

En los marcos gráficos, las barras de desplazamiento verticales sirven implícitamente para separar visualmente las ventanas contiguas. Cuando las barras de desplazamiento vertical están desactivadas, Emacs separa por defecto dichas ventanas con la ayuda de un borde vertical de un píxel de ancho. Ese borde ocupa la primera columna de píxeles de la ventana de la derecha y, por tanto, puede sobredibujar los píxeles más a la izquierda de cualquier glifo que se muestre allí. Si estos píxeles transmiten información importante, puede hacerlos visibles activando los divisores de ventana, véase Divisores de ventana. Para replicar el aspecto de los bordes verticales, establezca el parámetro right-divider-width de los marcos a uno y haga que la cara del divisor de ventana herede la de vertical-border, Window Dividers en The Emacs Lisp Reference Manual.

En las pantallas gráficas que soportan el kit de herramientas, Emacs también puede proporcionar una barra de desplazamiento horizontal en la parte inferior de cada ventana. Haciendo clic con (ratón-1) en los botones izquierdo y derecho de esa barra de desplazamiento se desplaza la ventana horizontalmente una columna cada vez. (Tenga en cuenta que algunos kits de herramientas permiten personalizar la barra de desplazamiento para que no se muestren estos botones). Si se pulsa con (ratón-1) a la izquierda o a la derecha de la caja interior de la barra de desplazamiento, la ventana se desplaza cuatro columnas. Si se arrastra el cuadro interior, la ventana se desplaza continuamente.

Tenga en cuenta que este desplazamiento horizontal puede hacer desaparecer la posición del punto de la ventana a la izquierda o a la derecha. Si se escribe un carácter para insertar texto o se mueve el punto con un comando del teclado, normalmente se volverá a ver.

Para alternar el uso de las barras de desplazamiento horizontal, escriba Alt-x horizontal-scroll-bar-mode (M-x horizontal-scroll-bar-mode). Este comando se aplica a todos los marcos, incluidos los que están por crear. Para activar las barras de desplazamiento horizontales sólo para el marco seleccionado, utilice el comando Alt-x toggle-horizontal-scroll-bar (M-x toggle-horizontal-scroll-bar).

Para controlar el uso de las barras de desplazamiento horizontales al inicio, personalice la variable horizontal-scroll-bar-mode.

También puede utilizar el recurso X ‘horizontalScrollBars’ para activar o desactivar las barras de desplazamiento horizontales (ver Recursos X). Para controlar la altura de la barra de desplazamiento, cambie el parámetro de marco scroll-bar-height (vea Parámetros de marco en el Manual de referencia de Emacs Lisp).

Separadores de ventanas

En las pantallas gráficas, puede utilizar los divisores de ventanas para separarlas visualmente. Los divisores de ventanas son barras que se pueden arrastrar con el ratón, lo que permite cambiar fácilmente el tamaño de las ventanas adyacentes.

Para cambiar la visualización de los divisores de ventanas, utilice el comando Alt-x window-divide-mode (M-x window-divide-mode).

Para personalizar dónde deben aparecer los divisores, utilice la opción window-divider-default-places. Su valor debe ser bottom-only (para mostrar los divisores sólo en la parte inferior de las ventanas), right-only (para mostrar los divisores sólo a la derecha de las ventanas), o t (para mostrarlos en la parte inferior y a la derecha).

Para ajustar el ancho de los divisores de ventanas que se muestran en este modo, personalice las opciones window-divider-default-bottom-width y window-divider-default-right-width.

Cuando las barras de desplazamiento vertical están deshabilitadas, los divisores también pueden ser útiles para hacer visible la primera columna de píxeles de una ventana, que de otro modo quedaría cubierta por el borde vertical utilizado para separar las ventanas de lado a lado (véase Barras de desplazamiento).

Para más detalles sobre los divisores de ventanas, vea Window Dividers en The Emacs Lisp Reference Manual.

Arrastrar y soltar

En la mayoría de los entornos gráficos de escritorio, Emacs tiene un soporte básico para las operaciones de arrastrar y soltar. Por ejemplo, al soltar un texto en un marco de Emacs se inserta el texto en el lugar donde se suelta. Cuando se suelta un archivo en un marco, el Editor visita ese archivo. Como caso especial, soltar el archivo en un buffer Dired mueve o copia el archivo (según las convenciones de la aplicación de la que procede) en el directorio mostrado en ese buffer.

Al soltar un archivo, normalmente se visita en la ventana en la que se suelta. Si prefiere visitar el fichero en una nueva ventana en estos casos, personalice la variable dnd-open-file-other-window.

Actualmente se soportan los protocolos de arrastrar y soltar de XDND y Motif, y el antiguo protocolo de KDE 1.x.

Emacs también puede -opcionalmente- arrastrar la región con el ratón a otra porción de este u otro buffer. Para habilitarlo, personaliza la variable mouse-drag-and-drop-region a un valor no nulo. Normalmente, el texto se mueve, es decir, se corta y se pega, cuando el destino es el mismo búfer que el origen; al soltar la región en otro búfer se copia el texto en su lugar. Si el valor de esta variable nombra una tecla modificadora, como ‘shift’, ‘control’ o ‘alt’, entonces al pulsar esa tecla modificadora al soltar el texto se copiará en lugar de cortarse, incluso si se suelta en el mismo buffer del que procede el texto.

Para cortar el texto incluso cuando los búferes de origen y destino difieren, establece la opción mouse-drag-and-drop-region-cut-when-buffers-differ a un valor no nulo. Por defecto, en una pantalla gráfica el texto seleccionado se muestra en un tooltip (recuadro de informacion) y el punto se mueve junto con el cursor del ratón durante el arrastre. Para suprimir este comportamiento, establezca las opciones mouse-drag-and-drop-region-show-tooltip y/o mouse-drag-and-drop-region-show-cursor a nil.

Barras de menús

Puede alternar el uso de las barras de menú con Alt-x menu-bar-mode (M-x menu-bar-mode). Sin argumento, este comando activa el modo de barras de menú, un modo global menor. Con un argumento, el comando activa el modo de barras de menú si el argumento es positivo, y lo desactiva si el argumento no es positivo. Para controlar el uso de las barras de menú al inicio, personalice la variable menu-bar-mode.

Los usuarios expertos suelen desactivar la barra de menús, especialmente en los terminales de texto, donde esto hace que haya una línea adicional disponible para el texto. Si la barra de menús está desactivada, todavía se puede abrir un menú con su contenido con Ctrl- (C-ratón-3) en una pantalla que soporte menús emergentes. O puede activar el modo de menú contextual y personalizar la variable context-menu-functions para que aparezca un menú contextual cuando pincha con ratón-3 (). Ver Clics del ratón para los menús.

Vea La barra de menús, para información sobre cómo invocar comandos con la barra de menús. Ver X Opciones y Recursos, para saber cómo personalizar la apariencia visual de los menús de la barra de menús.

Barras de herramientas

En las pantallas gráficas, Emacs coloca una barra de herramientas en la parte superior de cada cuadro, justo debajo de la barra de menús. Se trata de una fila de iconos sobre los que puedes pulsar con el ratón para invocar varios comandos.

La barra de herramientas global (por defecto) contiene comandos generales. Algunos modos principales definen sus propias barras de herramientas; siempre que haya un búfer con dicho modo principal, la barra de herramientas del modo sustituye a la barra de herramientas global.

Para cambiar el uso de las barras de herramientas, escriba Alt-x tool-bar-mode (M-x tool-bar-mode). Este comando se aplica a todos los marcos, incluidos los que aún no se han creado. Para controlar el uso de las barras de herramientas al inicio, personalice la variable tool-bar-mode.

Cuando Emacs se compila con soporte GTK+, cada elemento de la barra de herramientas puede consistir en una imagen, o una etiqueta de texto, o ambas. Por defecto, Emacs sigue la configuración del estilo de la barra de herramientas del escritorio Gnome; si no se define ninguno, muestra los elementos de la barra de herramientas como simples imágenes. Para imponer un estilo de barra de herramientas específico, personaliza la variable tool-bar-style.

También puede controlar la colocación de la barra de herramientas para la barra de herramientas GTK+ con el parámetro de marco tool-bar-position. Ver Frame Parameters en The Emacs Lisp Reference Manual.

Las construcciones NS consideran la barra de herramientas como una decoración de la ventana, y por lo tanto no la muestran cuando una ventana no está decorada. Ver Frame Parameters en The Emacs Lisp Reference Manual. En macOS la barra de herramientas se oculta cuando el marco se pone en pantalla completa, pero puede mostrarse moviendo el puntero del ratón a la parte superior de la pantalla.

Barras de pestañas

En pantallas gráficas y en terminales de texto, Emacs puede mostrar opcionalmente una Barra de Pestañas en la parte superior de cada marco, justo debajo de la barra de menús (ver Barras de menús) y encima o debajo de la barra de herramientas (ver Barras de herramientas) dependiendo de la variable tab-bar-positions. La barra de pestañas es una fila de pestañas-botones en los que puede hacer clic para cambiar entre las configuraciones de las ventanas.

Cada pestaña de la barra de pestañas representa una configuración de ventana persistente con nombre de su marco, es decir, cómo está dividido ese marco en ventanas y qué búfer se muestra en cada ventana. El nombre de la pestaña se compone de la lista de nombres de los búferes que se muestran en las ventanas de esa configuración de ventana. Al hacer clic en la pestaña se pasa a la configuración de ventanas registrada por la pestaña; se trata de una configuración de ventanas y búferes que se utilizaba anteriormente en el marco cuando esa pestaña era la pestaña actual.

Si está usando la biblioteca del escritorio para guardar y restaurar tus sesiones (ver Guardar sesiones de Emacs), las pestañas de la Barra de Pestañas se registran en el archivo del escritorio, junto con sus configuraciones de ventanas asociadas, y estarán disponibles después de restaurar la sesión.

Tenga en cuenta que la Barra de Pestañas es diferente de la Línea de Pestañas (vea Línea de Pestañas de la Ventana). Mientras que las pestañas de la Línea de Pestañas en la parte superior de cada ventana se utilizan para cambiar entre los buffers de la ventana, las pestañas de la Barra de Pestañas en la parte superior de cada cuadro se utilizan para cambiar entre las configuraciones de ventanas que contienen varias ventanas que muestran uno o más buffers.

Para alternar el uso de las barras de pestañas, escriba Alt-x tab-bar-mode (M-x tab-bar-mode). Este comando se aplica a todos los marcos, incluidos los que están por crear. Para controlar el uso de las barras de pestañas al inicio, personalice la variable tab-bar-mode y guarde su personalización.

La variable tab-bar-show controla si el modo de barra de pestañas se activa automáticamente. Si el valor es t, tab-bar-mode (modo de barra de pestañas) se activa cuando se utilizan los comandos que crean nuevas pestañas. El valor 1 oculta la barra de pestañas cuando sólo tiene una pestaña, y la muestra de nuevo cuando se crean más pestañas. Más generalmente, un valor que es un entero no negativo hace que la barra de pestañas se muestre sólo si el número de pestañas es mayor que ese entero. El valor nil siempre mantiene la barra de pestañas oculta; en este caso es posible cambiar entre configuraciones de ventanas con nombre sin mostrar la barra de pestañas utilizando Alt-x tab-next (M-x tab-next), Alt-x tab-switcher (M-x tab-switcher), y otros comandos que proporcionan la finalización de los nombres de las pestañas. También es posible crear y cerrar pestañas sin la barra de pestañas utilizando los comandos Alt-x tab-new (M-x tab-new), Alt-x tab-close (M-x tab-close), etc.

Tenga en cuenta que un valor numérico de tab-bar-show puede hacer que la barra de pestañas se muestre en algunos marcos, pero no en otros, dependiendo del número de pestañas creadas en cada marco.

Para activar el uso de la barra de pestañas sólo en el marco seleccionado, escriba Alt-x toggle-frame-tab-bar (M-x toggle-frame-tab-bar). Este comando permite activar la visualización de la barra de pestañas en algunos marcos y desactivarla en otros, independientemente de los valores de tab-bar-mode y tab-bar-show.

La tecla de prefijo Ctrl-x t (C-x t) es análoga a Ctrl-x 5 (C-x 5). Mientras que cada comando C-x 5 abre una memoria intermedia en un marco diferente (ver Creación de marcos), los comandos C-x t utilizan una pestaña diferente con una configuración de ventana diferente en el marco seleccionado.

Los distintos comandos Ctrl-x t (C-x t) difieren en cómo encuentran o crean el buffer a seleccionar. Los siguientes comandos pueden utilizarse para seleccionar un búfer en una nueva pestaña:

Ctrl-x t2 (C-x t 2)
Añadir una nueva pestaña (tab-new). Puede controlar la elección del búfer que se muestra en una nueva pestaña personalizando la variable tab-bar-new-tab-choice. Puede controlar los nombres dados por defecto a las nuevas pestañas personalizando la variable tab-bar-tab-name-function.
Ctrl-x tb nombrebuf RETURN (C-x t b nombrebuf RET)
Selecciona nombrebuf en otra pestaña. Esto ejecuta switch-to-buffer-other-tab.
Ctrl-x tf nombrearchivo RETURN (C-x t f nombrearchivo RET)
Visita nombrearchivo (ver Visiting Files) y selecciona su buffer en otra pestaña. Esto ejecuta find-file-other-tab.
Ctrl-x td directorio RETURN (C-x t d directorio RET)
Editar el directorio especificado (ver Dired, el editor de directorios) en otra pestaña. Esto ejecuta dired-other-tab.
Ctrl-x tt (C-x t t)
Este es un comando prefijo (other-tab-prefix) que afecta al siguiente comando invocado inmediatamente después. Solicita que el buffer mostrado por el siguiente comando se muestre en otra pestaña.

Por defecto, una nueva pestaña comienza con el buffer que estaba vigente antes de llamar al comando que añade una nueva pestaña. Para iniciar una nueva pestaña con otros buffers, personaliza la variable tab-bar-new-tab-choice.

La variable tab-bar-new-tab-to define dónde colocar una nueva pestaña. Por defecto, una nueva pestaña se añade a la derecha de la pestaña actual.

Los siguientes comandos se pueden utilizar para eliminar pestañas:

Ctrl-x t0 (C-x t 0)
Cierra la pestaña seleccionada (tab-close). Esto no tiene efecto si sólo hay una pestaña, a menos que la variable tab-bar-close-last-tab-choice se personalice con un valor no predeterminado.
Ctrl-x t1 (C-x t 1)
Cierra todas las pestañas, excepto la seleccionada, en el marco seleccionado.

La variable tab-bar-close-tab-select define qué pestaña seleccionar después de cerrar la pestaña actual. Por defecto, selecciona una pestaña usada recientemente.

El comando tab-undo restaura la última pestaña cerrada.

Los siguientes comandos se pueden utilizar para cambiar entre pestañas:

Ctrl-x to (C-x t o)
Ctrl-TAB (C-TAB)
Pasa a la siguiente pestaña (tab-next). Si se repite este comando, se recorren todas las pestañas del marco seleccionado. Con un argumento numérico positivo n, pasa a la enésima pestaña siguiente; con un argumento negativo -n, vuelve a la enésima pestaña anterior.
Shift-Ctrl-TAB (S-C-TAB)
Pasa a la pestaña anterior (tab-previous). Con un argumento numérico positivo n, pasa a la enésima pestaña anterior; con un argumento negativo -n, pasa a la enésima pestaña siguiente.
Ctrl-x t RETURN nombrepest RETURN (C-x t RET nombrepest RET)
Cambia a la pestaña por su nombre (tab-switch), con finalización en todos los nombres de pestañas. El valor por defecto y el "historial futuro" de los nombres de pestañas se ordenan por recencia, por lo que puede utilizar Alt-n (M-n, next-history-element) para obtener el nombre de la última pestaña visitada, la penúltima, y así sucesivamente.
modifier-tab-numer (modificador-número de pestaña)
Cambia a la pestaña por su número tab-number (tab-select). Después de personalizar la variable tab-bar-select-tab-modifiers para especificar uno o más modificadores, puede seleccionar una pestaña por su número ordinal utilizando uno de los modificadores especificados en combinación con el número de pestaña a seleccionar. El número 9 puede utilizarse para seleccionar la última pestaña. Puedes seleccionar cualquier modificador soportado por Emacs, ver Teclas modificadoras. Para mostrar el número de pestaña junto al nombre de la pestaña, puede personalizar otra variable tab-bar-tab-hints. Esto le ayudará a decidir qué tecla numérica debe pulsar para seleccionar la pestaña por su número.
modifier-9 (modificador-9)
Pasa a la última pestaña (tab-last). La combinación de teclas es la tecla modificadora definida por tab-barra-select-tab-modifiers y la tecla 9. Con un argumento numérico n, se pasa a la enésima última pestaña.
modifier-0 (modificador-0)
Pasa a la pestaña reciente (tab-recent). La combinación de teclas es la tecla modificadora definida por tab-bar-select-tab-modifiers y la tecla 0 (0, cero). Con un argumento numérico n, se pasa a la enésima pestaña reciente.

Se pueden utilizar los siguientes comandos para operar con las pestañas:

Ctrl-x tr nombrepest RETURN (C-x t r nombrepest RET)
Cambiar el nombre de la pestaña actual a nombrepest (tab-rename).
Ctrl-x tm (C-x t m)
Mueve la pestaña actual una posición a la derecha (tab-move). Con un argumento numérico positivo n, se mueve esa cantidad de posiciones a la derecha; con un argumento negativo -n, se mueve n posiciones a la izquierda.

Puedes habilitar tab-bar-history-mode para recordar las configuraciones de las ventanas utilizadas en cada pestaña y restaurarlas más tarde.

Puedes utilizar el ratón para operar sobre las pestañas. Al hacer clic con (ratón-2) se cierra la pestaña. Al hacer clic con (ratón-3) se abre el menú contextual con los elementos que operan sobre la pestaña seleccionada. Arrastrando la pestaña con (ratón-1) se mueve a otra posición en la barra de pestañas. Al desplazarse con la rueda del ratón se pasa a la pestaña siguiente o anterior. Si mantienes pulsada la tecla SHIFT durante el desplazamiento, la pestaña se desplaza a la izquierda o a la derecha.

Alt-x tab-bar-history-backward (M-x tab-bar-history-backward)
Restaura una configuración de ventana anterior utilizada en la pestaña actual. De esta forma, se navega hacia atrás en el historial de configuraciones de ventanas.
Alt-x tab-bar-history-forward (M-x tab-bar-history-forward)
Cancelar la restauración de la configuración de ventana anterior. Esto se desplaza hacia adelante en el historial de configuraciones de ventanas.

Es posible personalizar los elementos mostrados en la barra de pestañas mediante la opción de usuario tab-bar-format.

Un cuadro de diálogo es un tipo especial de menú para hacer una pregunta de sí o no o alguna otra pregunta especial. Muchos comandos de Emacs usan un cuadro de diálogo para hacer este tipo de consultas si usaste el ratón para invocar el comando que te llevó a la pregunta.

Para desactivar el uso de cuadros de diálogo, cambia la variable use-dialog-box a nil. En ese caso, Emacs siempre realiza preguntas de sí o no utilizando el área de eco y la entrada del teclado. Esta variable también controla si se utilizan ventanas de selección de archivos (pero éstas no están soportadas en todas las plataformas).

Una ventana de selección de archivos es un tipo especial de cuadro de diálogo para pedir nombres de archivos. Puede personalizar la variable use-file-dialog para suprimir el uso de las ventanas de selección de archivos, incluso si todavía quiere otros tipos de diálogos. Esta variable no tiene efecto si has suprimido todos los cuadros de diálogo con la variable use-dialog-box.

Cuando Emacs se compila con soporte GTK+, utiliza el diálogo del selector de archivos GTK+. Emacs añade un botón adicional a este diálogo, que puedes usar para activar o desactivar la visualización de los archivos ocultos (archivos que empiezan por un punto) en ese diálogo. Si quieres que este botón esté activado por defecto, cambia la variable x-gtk-show-hidden-files a t. Además, Emacs añade texto de ayuda al diálogo del selector de archivos GTK+; para desactivar este texto de ayuda, cambia la variable x-gtk-file-dialog-help-text a nil.

Información sobre herramientas (tooltips)

Los tooltips son pequeños marcos especiales que muestran información de texto en la posición actual del ratón. Se activan cuando hay una pausa en el movimiento del ratón sobre algún trozo de texto significativo en una ventana, o la línea de modo, o alguna otra parte del marco de Emacs como un botón de la barra de herramientas o un elemento del menú.

Puedes alternar el uso de tooltips con el comando Alt-x tooltip-mode (M-x tooltip-mode). Cuando el modo Tooltip está desactivado, el texto de ayuda se muestra en el área de eco. Para controlar el uso de la información sobre herramientas al inicio, personalice la variable tooltip-mode.

Las siguientes variables proporcionan opciones de personalización para la visualización de la información sobre herramientas:

tooltip-delay
Esta variable especifica el tiempo que Emacs debe esperar antes de mostrar la primera información sobre herramientas. El valor está en segundos.
tooltip-short-delay
Esta variable especifica el tiempo que Emacs debe esperar antes de mostrar los siguientes tooltips en diferentes elementos, habiendo ya mostrado el primer tooltip. El valor está en segundos.
tooltip-hide-delay
El número de segundos desde que se muestra un tooltip para ocultarlo, si el ratón no se mueve.
tooltip-x-offset
tooltip-y-offset
Los desplazamientos X e Y, en píxeles, de la esquina superior izquierda de la información sobre herramientas desde la posición del puntero del ratón. Tenga en cuenta que se ignoran si tooltip-frame-parameters se personalizó para incluir, respectivamente, los parámetros izquierdo y superior. Los valores de los desplazamientos deben elegirse de forma que la información sobre herramientas no cubra el punto caliente del puntero del ratón, o podría interferir con el clic del ratón.
tooltip-frame-parameters
Los parámetros del marco utilizados para mostrar la información sobre herramientas. Ver Frame Parameters en The Emacs Lisp Reference Manual, y también Tooltips en The Emacs Lisp Reference Manual.

Para opciones adicionales de personalización para mostrar información sobre herramientas, use Alt-x customize-group RETURN tooltip (M-x customize-group RET tooltip).

Si Emacs está construido con soporte para GTK+, muestra la información sobre herramientas a través de GTK+, utilizando la apariencia por defecto de la información sobre herramientas de GTK+. Para desactivar esto, cambie la variable x-gtk-use-system-tooltips a nil. Si hace esto, o si Emacs está construido sin soporte GTK+, la mayoría de los atributos del texto de la información sobre herramientas son especificados por la cara de la información sobre herramientas, y por los recursos X (ver Opciones y Recursos X).

Los tooltips de GUD son tooltips especiales que muestran los valores de las variables cuando se depura un programa con GUD. Ver Operación del depurador.

Evitar el ratón

En los terminales gráficos, el puntero del ratón puede oscurecer el texto en el marco de Emacs, por lo que proporciona dos métodos para evitar este problema.

En primer lugar, Emacs oculta el puntero del ratón cada vez que escribes un carácter autoinsertado, si el puntero se encuentra dentro de un marco de; moviendo el puntero del ratón lo hace visible de nuevo. Para desactivar esta característica, establece la variable make-pointer-invisible a nil. Ver Personalización de la pantalla.

En segundo lugar, puedes usar el modo Mouse Avoidance, un modo menor, para mantener el puntero del ratón alejado del punto. Para utilizar el modo Mouse Avoidance (modo Evitar el ratón), personalice la variable mouse-avoidance-mode. Puede establecerla en varios valores para mover el ratón de varias maneras:

banish
Mover el puntero a una esquina del marco en cualquier pulsación de tecla. Puedes personalizar la variable mouse-avoidance-banish-position para especificar a dónde va el puntero cuando es desterrado.
exile
Desterrar el puntero sólo si el cursor se acerca demasiado, y permitir que regrese una vez que el cursor esté fuera del camino.
jump
Si el cursor se acerca demasiado al puntero, desplaza el puntero en una distancia y dirección aleatorias.
animate
Como jump, pero muestra pasos a lo largo del camino para la ilusión de movimiento.
cat-and-mouse
Lo mismo que animate.
proteus
Como animar, pero también cambia la forma del puntero del ratón.

También puedes usar el comando Alt-x mouse-avoidante-mode M-x mouse-avoidante-mode para activar el modo. Cada vez que el modo Modo Avoidance mueve el ratón, también eleva el marco.

Terminales sin ventana

En un terminal de texto, Emacs sólo puede mostrar un marco a la vez. Sin embargo, puedes crear múltiples marcos y cambiar entre ellos. El cambio de marcos en estos terminales es muy parecido al cambio entre diferentes configuraciones de ventanas.

Use Ctrl-x 52 (C-x 5 2) para crear un nuevo marco y cambiar a él; use Ctrl-x 5o (C-x 5 o) para recorrer los marcos existentes; use Ctrl-x 50 (C-x 5 0) para borrar el marco actual.

Cada marco tiene un número para distinguirlo. Si su terminal sólo puede mostrar una marco a la vez, el número n del marco seleccionado aparece cerca del principio de la línea de modo, en la forma ‘Fn’.

Fn’ es, de hecho, el nombre inicial del marco. Si lo desea, puede dar a los marcos nombres más significativos, y puede seleccionar un marco por su nombre. Utilice el comando Alt-x set-frame-name RETURN nombre RETURN (M-x set-frame-name RET nombre RET) para especificar un nuevo nombre para el marco seleccionado, y utilice Alt-x select-frame-by-name RETURN nombre RETURN (M-x select-frame-by-name RET nombre RET) para seleccionar un marco según su nombre. El nombre especificado aparece en la línea de modo cuando se selecciona el marco.

Uso del ratón en los terminales de texto

Algunos terminales de texto soportan los clics del ratón en la ventana del terminal.

En un emulador de terminal que sea compatible con xterm, puede utilizar Alt-x xterm-mouse-mode (M-x xterm-mouse-mode) para dar a Emacs el control sobre los usos simples del ratón - básicamente, sólo se soportan los clics simples no modificados. Las nuevas versiones de xterm también soportan el seguimiento del ratón. La funcionalidad normal del ratón de xterm para tales clics sigue estando disponible manteniendo pulsada la tecla SHIFT cuando se pulsa el botón del ratón. El modo ratón en xterm es un modo menor global (ver Modos menores). Repitiendo el comando se desactiva el modo de nuevo.

En la consola de GNU/Linux, puede utilizar Alt-x gpm-mouse-mode (M-x gpm-mouse-mode) para activar el soporte del ratón. Debe tener el servidor gpm instalado y funcionando en su sistema para que esto funcione. Tenga en cuenta que cuando este modo está activado, no puede utilizar el ratón para transferir texto entre Emacs y otros programas que utilizan GPM. Esto se debe a las limitaciones de GPM y del kernel de Linux.

Vea Uso del ratón en MS-DOS, para información sobre el soporte del ratón en MS-DOS.



Soporte de juegos de caracteres internacionales

Emacs es compatible con una gran variedad de juegos de caracteres internacionales, incluyendo las variantes europea y vietnamita del alfabeto latino, así como los alfabetos árabe, brahmánico (para idiomas como el bengalí, el hindi y el tailandés), cirílico, etíope, georgiano, griego, han (para el chino y el japonés), hangul (para el coreano), hebreo e IPA. Emacs también admite varias codificaciones de estos caracteres que son utilizadas por otro software internacionalizado, como los procesadores de texto y los programas de correo.

Emacs permite la edición de texto con caracteres internacionales soportando todas las actividades relacionadas:

  • Puedes visitar archivos con caracteres no ASCII, guardar texto no ASCII y pasar texto no ASCII entre Emacs y los programas que invoca (como compiladores, correctores ortográficos y programas de correo). La configuración de su entorno de lenguaje (véase Entornos de lenguaje) se encarga de configurar los sistemas de codificación y otras opciones para un lenguaje o cultura específicos. Alternativamente, puede especificar cómo Emacs debe codificar o decodificar el texto para cada comando; vea Especificar un sistema de codificación para el texto de los archivos.

  • Puede mostrar los caracteres no ASCII codificados por los distintos scripts. Esto funciona utilizando las fuentes apropiadas en las pantallas de gráficos (véase Definir conjuntos de fuentes), y enviando códigos especiales a las pantallas de texto (véase Sistemas de codificación para la E/S del terminal). Si algunos caracteres se visualizan de forma incorrecta, consulte la sección Caracteres no visualizables, que describe los posibles problemas y explica cómo resolverlos.

  • Los caracteres de las escrituras cuyo orden natural del texto es de derecha a izquierda se reordenan para su visualización (véase Edición bidireccional). Entre estas escrituras se encuentran el árabe, el hebreo, el siríaco, el thaana y algunas otras.

  • Puede insertar caracteres no ASCII o buscarlos. Para ello, puede especificar un método de entrada (véase Selección de un método de entrada) adecuado a su idioma, o utilizar el método de entrada por defecto configurado al elegir su entorno lingüístico. Si tu teclado puede producir caracteres no ASCII, puedes seleccionar un sistema de codificación de teclado apropiado (ver Sistemas de codificación para la E/S del terminal), y Emacs aceptará esos caracteres. Los caracteres Latin-1 también pueden ser introducidos usando el prefijo Ctrl-x 8 (C-x 8), ver Modo de Edición Unibyte.

    Con el Sistema X Window, su configuración regional debe ser ajustada a un valor apropiado para asegurarse de que Emacs interpreta la entrada del teclado correctamente; ver configuraciones regionales.

En el resto de este capítulo se describen estas cuestiones en detalle.

Introducción a los juegos de caracteres internacionales

Los usuarios de conjuntos de caracteres y guiones internacionales han establecido muchos sistemas de codificación más o menos estándar para almacenar archivos. Estos sistemas de codificación son típicamente multibyte, lo que significa que se utilizan secuencias de dos o más bytes para representar caracteres individuales no ASCII.

Internamente, Emacs utiliza su propia codificación de caracteres multibyte, que es un superconjunto del estándar Unicode. Esta codificación interna permite que los caracteres de casi todas las escrituras conocidas se entremezclen en un solo búfer o cadena. Emacs traduce entre la codificación de caracteres multibyte y otros sistemas de codificación cuando lee y escribe archivos, y cuando intercambia datos con subprocesos.

El comando Ctrl-h h (C-h h, view-hello-file) muestra el archivo etc/HELLO, que ilustra varios scripts mostrando cómo se dice "hola" en muchos idiomas. Si algunos caracteres no pueden ser mostrados en su terminal, aparecen como ‘?’ o como cuadros huecos (ver Caracteres no visualizables).

Los teclados, incluso en los países en los que se utilizan estos conjuntos de caracteres, no suelen tener teclas para todos los caracteres. Puede insertar caracteres que su teclado no admita, utilizando Ctrl-x 8 RETURN (C-x 8 RET, insert-char). Véase Inserción de texto. Existen abreviaturas para algunos caracteres comunes; por ejemplo, puede insertar una comilla izquierda simple escribiendo Ctrl-x 8[ (C-x 8 [), o en el modo de comillas eléctricas, normalmente escribiendo simplemente `. Vea Comillas. Emacs también soporta varios métodos de entrada, normalmente uno para cada script o lenguaje, que facilitan la escritura de caracteres en el script. Ver Métodos de entrada.

La tecla de prefijo Ctrl-x RETURN (C-x RET) se utiliza para los comandos relacionados con los caracteres multibyte, los sistemas de codificación y los métodos de entrada.

El comando Ctrl-x = (C-x =, what-cursor-position) muestra información sobre el carácter en el punto. Además de la posición del carácter, que se describió en Información sobre la posición del cursor, este comando muestra cómo está codificado el carácter. Por ejemplo, muestra la siguiente línea en el área de eco para el carácter ‘c’:

Char: c (99, #o143, #x63) point=28062 of 36168 (78%) column=53

Los cuatro valores que siguen a ‘Char:’ describen el carácter que sigue al punto, primero mostrándolo y luego dando su código de carácter en decimal, octal y hexadecimal. En el caso de un carácter multibyte no ASCII, éstos van seguidos de ‘file’ y de la representación del carácter, en hexadecimal, en el sistema de codificación del buffer, si ese sistema de codificación codifica el carácter de forma segura y con un solo byte (véase Sistemas de codificación). Si la codificación del carácter es más larga que un byte, Emacs muestra ‘file ...’.

En raras ocasiones, Emacs encuentra bytes crudos: bytes individuales cuyos valores están en el rango de 128 (0200 octal) a 255 (0377 octal), que Emacs no puede interpretar como parte de una codificación conocida de algún carácter no ASCII. Tales bytes crudos se tratan como si pertenecieran a un conjunto de caracteres especiales de ocho bits; Emacs los muestra como códigos octales escapados (esto puede personalizarse; véase Personalización de la visualización). En este caso, Ctrl-x = (C-x =) muestra ‘raw-byte’ en lugar de ‘file’. Además, C-x = muestra los códigos de caracteres de los bytes crudos como si estuvieran en el rango #x3FFF80..#x3FFFFF, que es donde Emacs los mapea para distinguirlos de los caracteres Unicode en el rango #x0080..#x00FF.

Con un argumento de prefijo (Ctrl-u Ctrl-x =, C-u C-x =), este comando llama adicionalmente al comando describe-char, que muestra una descripción detallada del carácter:

  • El nombre del conjunto de caracteres, y los códigos que identifican el carácter dentro de ese conjunto de caracteres; los caracteres ASCII se identifican como pertenecientes al conjunto de caracteres ascii.
  • La escritura, la sintaxis y las categorías del carácter.
  • Las teclas que hay que presionar para introducir el carácter en el método de entrada actual (si admite el carácter).
  • La codificación del carácter, tanto internamente en el buffer, como externamente si guardas el buffer en un archivo.
  • Si estás ejecutando Emacs en una pantalla gráfica, el nombre de la fuente y el código del glifo para el carácter. Si estás ejecutando Emacs en un terminal de texto, el código(s) enviado(s) al terminal.
  • Si el carácter fue compuesto en pantalla con alguno de los siguientes caracteres para formar uno o más grupos de grafemas, la información de la composición: los glifos de la fuente si el marco está en una pantalla gráfica, y los caracteres que fueron compuestos.
  • Las propiedades del texto del carácter (ver Propiedades del Texto en el Manual de Referencia de Emacs Lisp), incluyendo cualquier cara no predeterminada utilizada para mostrar el carácter, y cualquier superposición que lo contenga (ver Superposiciones en el mismo manual).

He aquí un ejemplo, con algunas líneas plegadas para que quepan en este manual:

             position: 1 of 1 (0%), column: 0
            character: ê (displayed as ê) (codepoint 234, #o352, #xea)
    preferred charset: unicode (Unicode (ISO10646))
code point in charset: 0xEA
               script: latin
               syntax: w        which means: word
             category: .:Base, L:Left-to-right (strong), c:Chinese,
                       j:Japanese, l:Latin, v:Viet
             to input: type "C-x 8 RET ea" or
                       "C-x 8 RET LATIN SMALL LETTER E WITH CIRCUMFLEX"
          buffer code: #xC3 #xAA
            file code: #xC3 #xAA (encoded by coding system utf-8-unix)
              display: by this font (glyph code)
    xft:-PfEd-DejaVu Sans Mono-normal-normal-
        normal-*-15-*-*-*-m-0-iso10646-1 (#xAC)

Character code properties: customize what to show
  name: LATIN SMALL LETTER E WITH CIRCUMFLEX
  old-name: LATIN SMALL LETTER E CIRCUMFLEX
  general-category: Ll (Letter, Lowercase)
  decomposition: (101 770) ('e' '^')

Entornos lingüísticos

Todos los conjuntos de caracteres soportados son admitidos en los buffers de Emacs siempre que los caracteres multibyte estén habilitados; no hay necesidad de seleccionar un idioma en particular para mostrar sus caracteres. Sin embargo, es importante seleccionar un entorno de lenguaje para establecer varios valores por defecto. A grandes rasgos, el entorno de idioma representa una elección de escritura preferida más que una elección de idioma.

El entorno lingüístico controla los sistemas de codificación que se reconocen al leer el texto (véase Reconocer los sistemas de codificación). Esto se aplica a los archivos, al correo entrante y a cualquier otro texto que leas en Emacs. También puede especificar el sistema de codificación por defecto a utilizar cuando se crea un archivo. Cada entorno de lenguaje también especifica un método de entrada por defecto.

Para seleccionar un entorno de lenguaje, personalice current-language-environment o utilice el comando Alt-x set-language-environment (M-x set-language-environment). No hay diferencia en el búfer actual cuando se usa este comando, porque los efectos se aplican a la sesión de Emacs en forma global. Vea la variable language-info-alist para la lista de entornos de lenguaje soportados, y use el comando Ctrl-h L lang-env RETURN (C-h L lang-env RET, describe-language-environment) para más información sobre el entorno de lenguaje lang-env. Los entornos lingüísticos admitidos son:

ACIIárabebielorrusobengalíportugués de Brasilbúlgarocham
chino-BIG5chino-CNSchino-EUC-TWchino-GBchino-GB18030chino-GBKcroata
cirílico-ALTcirílico-ISOcirílico-KOI8checodevanagariholandésinglés
esperantoetíopefrancésgeorgianoalemángriegogujarati
hebreoIPAitalianojaponésCanarésjemercoreano
laolatín-1latín-2latín-3latín-4latín-5latín-6
latín-7latín-8latín-9letónlituanomalayalamoriya
persapolacopunjabirumanorusocingaléseslovaco
eslovenoespañolsuecotayikotamiltelugutailandés
tibetanoturcoUTF-8ucranianovietnamitagalésWindows-1255

Para mostrar la(s) escritura(s) utilizada(s) por su entorno lingüístico en una pantalla gráfica, es necesario disponer de fuentes adecuadas. Vea Fontsets, para más detalles sobre la configuración de sus fuentes.

Algunos sistemas operativos permiten especificar la configuración regional del juego de caracteres que se está utilizando mediante la configuración de las variables de entorno LC_ALL, LC_CTYPE o LANG. (Si se establece más de una de ellas, la primera que no esté vacía especifica su configuración regional para este propósito). Durante el arranque, Emacs busca el nombre de su conjunto de caracteres en la tabla de alias de configuración regional del sistema, compara su nombre canónico con las entradas en el valor de las variables locale-charset-language-names y locale-language-names (la primera anula a la segunda), y selecciona el entorno de lenguaje correspondiente si se encuentra una coincidencia. También ajusta la tabla de visualización y el sistema de codificación de la terminal, el sistema de codificación de la configuración regional, el sistema de codificación preferido según sea necesario para la configuración regional y, por último pero no menos importante, la forma en que Emacs decodifica los caracteres no ASCII enviados por su teclado.

Si modificas las variables de entorno LC_ALL, LC_CTYPE o LANG mientras ejecuta Emacs (usando Alt-x setenv (M-x setenv)), es posible que quieras invocar el comando set-locale-environment después para reajustar el entorno de lenguaje de la nueva localización.

La función set-locale-environment normalmente utiliza el sistema de codificación preferido establecido por el entorno de idioma para decodificar los mensajes del sistema. Pero si su locale coincide con una entrada de la variable locale-preferred-coding-systems, Emacs utiliza el sistema de codificación correspondiente. Por ejemplo, si la configuración regional ‘ja_JP.PCK’ coincide con japanese-shift-jis en locale-preferred-coding-systems, el Editor usará esa codificación aunque normalmente use utf-8.

Puede anular el entorno de idioma elegido al inicio con el uso explícito del comando set-language-environment, o con la personalización de current-language-environment en su archivo init.

Para mostrar información sobre los efectos de un determinado entorno de lenguaje lang-env, utilice el comando Ctrl-h L lang-ev RETURN (C-h L lang-env RET, describe-language-environment). Esto le indica para qué idiomas es útil este entorno de lenguaje, y enumera los conjuntos de caracteres, los sistemas de codificación y los métodos de entrada que van con él. También muestra algunos ejemplos de texto para ilustrar los scripts utilizados en este entorno de lenguaje. Si da una entrada vacía para lang-env, este comando describe el entorno de lenguaje elegido.

Puede personalizar cualquier entorno de idioma con el hook normal set-language-environment-hook. El comando set-language-environment ejecuta ese hook después de configurar el nuevo entorno de idioma. Las funciones del gancho pueden comprobar un entorno de idioma específico comprobando la variable current-language-environment. Este gancho es el lugar en el que debe poner las configuraciones no predeterminadas para entornos de lenguaje específicos, como los sistemas de codificación para la entrada del teclado y la salida del terminal, el método de entrada predeterminado, etc.

Antes de empezar a configurar el nuevo entorno de lenguaje, set-language-environment ejecuta primero el hook exit-language-environment-hook. Este gancho es útil para deshacer las personalizaciones que se hicieron con set-language-environment-hook. Por ejemplo, si configuras un enlace especial de teclas en un entorno de lenguaje específico usando set-language-environment-hook, debería configurar exit-language-environment-hook para restaurar el enlace normal para esa tecla.

Métodos de entrada

Un método de entrada es un tipo de conversión de caracteres diseñado específicamente para la entrada interactiva. En Emacs, normalmente cada idioma tiene su propio método de entrada; a veces varios idiomas que usan los mismos caracteres pueden compartir un método de entrada. Algunos lenguajes soportan varios métodos de entrada.

El método de entrada más simple funciona mapeando las letras ASCII en otro alfabeto; esto le permite usar otro alfabeto en lugar de ASCII. Los métodos de entrada griegos y rusos funcionan de esta manera.

Una técnica más potente es la composición: convertir secuencias de caracteres en una sola letra. Muchos métodos de entrada europeos utilizan la composición para producir una sola letra no ASCII a partir de una secuencia que consta de una letra seguida de caracteres acentuados (o viceversa). Por ejemplo, algunos métodos convierten la secuencia o ^ en una sola letra acentuada. Estos métodos de entrada no tienen comandos especiales propios; lo único que hacen es componer secuencias de caracteres de imprenta.

Los métodos de entrada de las escrituras silábicas suelen utilizar el mapeo seguido de la composición. Los métodos de entrada del tailandés y el coreano funcionan así. En primer lugar, las letras se convierten en símbolos para determinados sonidos o marcas de tono; a continuación, las secuencias de éstos que forman una sílaba completa se convierten en un signo silábico.

El chino y el japonés requieren métodos más complejos. En los métodos de entrada chinos, primero se introduce la ortografía fonética de una palabra china (en el método de entrada chinese-py, entre otros), o una secuencia de porciones del carácter (métodos de entrada chinese-4corner y chinese-sw, y otros). Una secuencia de entrada suele corresponder a muchos caracteres chinos posibles. El usuario selecciona el que desea utilizar mediante teclas como Ctrl-f (C-f), Ctrl-b (C-b), Ctrl-n (C-n), Ctrl-p (C-p) (o las teclas de flecha) y los dígitos, que tienen un significado especial en esta situación.

Los posibles caracteres están dispuestos conceptualmente en varias filas, y cada fila contiene hasta 10 alternativas. Normalmente, Emacs muestra sólo una fila a la vez, en el área de eco; (i/j) aparece al principio, para indicar que ésta es la fila Nº i de un total de j filas. Escriba Ctrl-p (C-n) o Ctrl-p (C-p) para mostrar la siguiente fila o la anterior.

Escriba Ctrl-f (C-f) y Ctrl-b (C-b) para avanzar y retroceder entre las alternativas de la fila actual. Al hacer esto, Emacs resalta la alternativa actual con un color especial; escriba Ctrl-SPACE (C-SPC) para seleccionar la alternativa actual y usarla como entrada. Las alternativas de la fila también están numeradas; el número aparece antes de la alternativa. Al escribir un número se selecciona la alternativa asociada de la fila actual y se utiliza como entrada.

TAB (TAB) en estos métodos de entrada de datos chinos muestra un búfer con todos los caracteres posibles a la vez; luego, al hacer clic con el (ratón-2) en uno de ellos, se selecciona esa alternativa. Las teclas Ctrl-f (C-f), Ctrl-b (C-b), Ctrl-n (C-n), Ctrl-p (C-p) y los dígitos siguen funcionando como de costumbre, pero hacen el resaltado en el búfer que muestra los posibles caracteres, en lugar de en el área de eco.

Para introducir caracteres según el método de transliteración pīnyīn, utilice el método de entrada chinese-sisheng. Se trata de un método basado en la composición, en el que, por ejemplo, pi1 da como resultado ‘’.

En los métodos de entrada japoneses, primero se introduce una palabra completa utilizando la ortografía fonética; después, una vez que la palabra está en el buffer, Emacs la convierte en uno o más caracteres utilizando un gran diccionario. Una ortografía fonética corresponde a un número de palabras japonesas diferentes; para seleccionar una de ellas, utilice Ctrl-n (C-n) y Ctrl-p (C-p) para recorrer las alternativas.

A veces es útil cortar el procesamiento del método de entrada para que los caracteres que acaba de introducir no se combinen con los siguientes. Por ejemplo, en el método de entrada latin-1-postfix, la secuencia o ^ se combina para formar una ‘o’ con acento. ¿Y si quiere introducirlos como caracteres separados?

Una forma es escribir el acento dos veces; se trata de una función especial para introducir la letra y el acento por separado. Por ejemplo, o^^ (o ^ ^) da los dos caracteres ‘o^’. Otra forma es escribir otra letra después de la o -algo que no se combine con ésta- y borrarla inmediatamente. Por ejemplo, puedes escribir ooDEL^ (o o DEL ^) para obtener ‘o’ y ‘^’ por separado. Otro método, más general pero no tan fácil de escribir, es usar Ctrl-\ Ctrl-\ (C-\ C-\) entre dos caracteres para evitar que se combinen. Este es el comando Ctrl-\ (C-\, toggle-input-method) usado dos veces. Vea Seleccionar un método de entrada.

Ctrl-\ Ctrl-\ (C-\ C-\) es especialmente útil dentro de una búsqueda incremental, porque deja de esperar a que se combinen más caracteres, y empieza a buscar lo que ya ha introducido.

Para saber cómo introducir el carácter después del punto utilizando el método de entrada actual, escriba Ctrl-u Ctrl-x = (C-u C-x =). Véase Información sobre la posición del cursor.

Las variables input-method-highlight-flag y input-method-verbose-flag controlan cómo los métodos de entrada explican lo que está sucediendo. Si input-method-highlight-flag es no nulo, la secuencia parcial se resalta en el buffer (para la mayoría de los métodos de entrada-algunos deshabilitan esta característica). Si input-method-verbose-flag es non-nil, la lista de posibles caracteres a escribir a continuación se muestra en el área de eco (pero no cuando está en el minibuffer).

Puedes modificar el funcionamiento de un método de entrada haciendo tus cambios en una función que añadas a la variable hook quail-activate-hook. Ver Hooks. Por ejemplo, puedes redefinir algunas de las teclas del método de entrada definiendo las vinculaciones de las teclas en el mapa de teclas devuelto por la función quail-translation-keymap, utilizando define-key. Véase Reencuadernación de teclas en el archivo de entrada.

Los métodos de entrada se inhiben cuando el texto en el búfer es de sólo lectura por alguna razón. Esto es para que las vinculaciones de teclas de un solo carácter funcionen en los modos que hacen que el texto del búfer o partes de él sean de sólo lectura, como el modo de sólo lectura y el modo de imagen, incluso cuando un método de entrada está activo.

Otra facilidad para escribir caracteres que no están en el teclado es usar Ctrl-x 8 RETURN (C-x 8 RET, insert-char) para insertar un solo carácter basado en su nombre Unicode o punto de código; ver Insertar texto.

Selección de un método de entrada

Ctrl-\ (C-\)
Activar o desactivar el uso del método de entrada seleccionado (toggle-input-method).
Ctrl-x RETURN método RETURN (C-x RET método RET)
Seleccionar un nuevo método de entrada para el buffer actual (set-input-method).
Ctrl-x \ método RETURN (C-x \ método RET)
Activar temporalmente el método de entrada transitorio seleccionado; se desactivará automáticamente después de insertar un solo carácter (activate-transient-input-method).
Ctrl-h I método RETURN (C-h I método RET)
Ctrl-h método Ctrl-\ RETURN (C-h método C-\ RET)
Describe el método de entrada (describe-input-method). Por defecto, describe el método de entrada actual (si lo hay). Esta descripción debería dar todos los detalles de cómo utilizar cualquier método de entrada en particular. Describe el método de entrada (describe-input-method). Por defecto, describe el método de entrada actual (si lo hay). Esta descripción debería dar todos los detalles de cómo utilizar cualquier método de entrada en particular.
Alt-x list-input-methods (M-x list-input-methods)
Muestra una lista de todos los métodos de entrada admitidos.

Para elegir un método de entrada para el búfer actual, utilice Ctrl-x RETURN Ctrl-\ (C-x RET C-\, set-input-method). Este comando lee el nombre del método de entrada del minibuffer; el nombre normalmente comienza con el entorno de lenguaje con el que se va a utilizar. La variable current-input-method registra el método de entrada seleccionado.

Los métodos de entrada utilizan varias secuencias de caracteres ASCII para representar caracteres no ASCII. A veces es útil desactivar el método de entrada temporalmente. Para ello, escriba Ctrl-\ (C-\, toggle-input-method). Para volver a activar el método de entrada, escriba de nuevo Ctrl-\.

Si teclea Ctrl-\ (C-\) y aún no ha seleccionado un método de entrada, le pedirá que lo especifique. Esto tiene el mismo efecto que usar Ctrl-x RETURN Ctrl-\ (C-x RET C-\) para especificar un método de entrada.

Cuando se invoca con un argumento numérico, como en Ctrl-u Ctrl-\ (C-u C-\), toggle-input-method siempre le pide un método de entrada, sugiriendo el más reciente seleccionado como el predeterminado.

La selección de un entorno de lenguaje especifica un método de entrada por defecto para su uso en varios buffers. Cuando tiene un método de entrada por defecto, puede seleccionarlo en el búfer actual escribiendo Ctrl-\ (C-\). La variable default-input-method especifica el método de entrada por defecto (nil significa que no hay ninguno).

En algunos entornos de lenguaje, que soportan varios métodos de entrada diferentes, es posible que desee utilizar un método de entrada diferente al elegido por defecto por set-language-environment. Puedes ordenar a Emacs que seleccione un método de entrada por defecto diferente para un determinado entorno de lenguaje, si lo deseas, utilizando set-language-environment-hook (ver set-language-environment-hook). Por ejemplo:

(defun my-chinese-setup ()
  "Set up my private Chinese environment."
  (if (equal current-language-environment "Chinese-GB")
      (setq default-input-method "chinese-tonepy")))
(add-hook 'set-language-environment-hook 'my-chinese-setup)

Esto establece que el método de entrada por defecto sea chinese-tonepy siempre que elijas un entorno de lenguaje Chinese-GB.

Puedes ordenar a Emacs que active un determinado método de entrada automáticamente. Por ejemplo:

(add-hook 'text-mode-hook
  (lambda () (set-input-method "german-prefix")))

Esto activa automáticamente el método de entrada german-prefix en el modo Texto.

Algunos métodos de entrada para scripts alfabéticos funcionan (en efecto) reasignando el teclado para emular varias distribuciones de teclado comúnmente usadas para esos scripts. La forma de realizar esta reasignación correctamente depende de la disposición real de su teclado. Para especificar la distribución de su teclado, utilice el comando Alt-x quail-set-keyboard-layout (M-x quail-set-keyboard-layout).

Puede utilizar el comando Alt-x quail-show-key (M-x quail-show-key) para mostrar qué tecla (o secuencia de teclas) debe escribir para introducir el carácter que sigue al punto, utilizando la distribución de teclado seleccionada. El comando Ctrl-u Ctrl-x = (C-u C-x =) también muestra esa información, además de otra información sobre el carácter.

Alt-x list-input-method (M-x list-input-methods) muestra una lista de todos los métodos de entrada soportados. La lista da información sobre cada método de entrada, incluyendo la cadena que lo representa en la línea de modo.

Método de Entrada de forma transitoria

A veces puede ser conveniente activar un método de entrada de forma transitoria, para insertar sólo un carácter. Si escribe Ctrl-x \ (C-x \, activate-transient-input-method), se activará temporalmente un método de entrada, le permitirá insertar un solo carácter utilizando las reglas del método de entrada y, a continuación, desactivará automáticamente el método de entrada. Si aún no se ha seleccionado ningún método de entrada transitorio, Ctrl-x (C-x \) le pedirá un método de entrada; las siguientes invocaciones de este comando habilitarán el método de entrada transitorio seleccionado. Para seleccionar otro método de entrada de transitorios, escriba Ctrl-u Ctrl-x \ (C-u C-x \). Puede seleccionar un método transitorio diferente del método de entrada que seleccionó con Ctrl-u Ctrl-\ (C-u C-\).

Sistemas de codificación

Los usuarios de varios lenguajes han establecido muchos sistemas de codificación más o menos estándar para representarlos. Emacs no utiliza estos sistemas de codificación internamente; en su lugar, convierte de varios sistemas de codificación a su propio sistema cuando lee datos, y convierte el sistema de codificación interno a otros sistemas de codificación cuando escribe datos. La conversión es posible en la lectura o escritura de ficheros, en el envío o recepción desde el terminal, y en el intercambio de datos con subprocesos.

Emacs asigna un nombre a cada sistema de codificación. La mayoría de los sistemas de codificación se utilizan para un idioma, y el nombre del sistema de codificación comienza con el nombre del idioma. Algunos sistemas de codificación se utilizan para varios idiomas; sus nombres suelen empezar por ‘iso’. También hay sistemas de codificación especiales, como no-conversion (no conversión), raw-text (texto crudo) y emacs-internal (interno de emacs).

Una clase especial de sistemas de codificación, conocidos colectivamente como codepages, está diseñada para soportar el texto codificado por el software de MS-Windows y MS-DOS. Los nombres de estos sistemas de codificación son cpnnnn, donde nnnn es un número de 3 o 4 dígitos de la página de código. Puede utilizar estas codificaciones como cualquier otro sistema de codificación; por ejemplo, para visitar un archivo codificado en la codificación 850, escriba Ctrl-x RETURN c cp850 RETURN Ctrl-x Ctrl-f nombre de archivo RETURN (C-x RET c cp850 RET C-x C-f nombre de archivo RET).

Además de convertir varias representaciones de caracteres no ASCII, un sistema de codificación puede realizar la conversión de final de línea. Emacs maneja tres convenciones diferentes para la separación de líneas en un fichero: nueva línea (Unix), retorno de carro seguido de salto de línea (DOS), y sólo retorno de carro (Mac).

Ctrl-h C codificación RETURN (C-h C codificación RET)
Describe la codificación del sistema (describe-coding-system).
Ctrl-h C RETURN (C-h C RET)
Describir los sistemas de codificación actualmente en uso (describe-coding-system).
Alt-x list-coding-systems (M-x list-coding-systems)
Mostrar una lista de todos los sistemas de codificación soportados.

El comando Ctrl-h C (C-h C, describe-coding-system) muestra información sobre sistemas de codificación particulares, incluyendo la conversión de final de línea especificada por esos sistemas de codificación. Puede especificar un nombre de sistema de codificación como argumento; alternativamente, con un argumento vacío, describe los sistemas de codificación actualmente seleccionados para varios propósitos, tanto en el buffer actual como en los predeterminados, y la lista de prioridades para reconocer sistemas de codificación (ver Reconocer sistemas de codificación).

Para mostrar una lista de todos los sistemas de codificación soportados, escriba Alt-x list-coding-systems (M-x list-coding-systems). La lista da información sobre cada sistema de codificación, incluyendo la letra que lo representa en la línea de modo (ver La línea de modo).

Cada uno de los sistemas de codificación que aparecen en esta lista, excepto el de no-conversión, que significa que no hay conversión de ningún tipo, especifica cómo y si se convierten los caracteres de impresión, pero deja que la elección de la conversión de final de línea se decida en función del contenido de cada archivo. Por ejemplo, si el archivo parece utilizar la secuencia de retorno de carro y salto de línea para separar las líneas, se utilizará la conversión de final de línea de DOS.

Cada uno de los sistemas de codificación enumerados tiene tres variantes, que especifican exactamente qué hacer para la conversión de fin de línea:

...-unix
No hace ninguna conversión de final de línea; asume que el archivo utiliza la nueva línea para separar las líneas. (Esta es la convención normalmente utilizada en los sistemas Unix y GNU, y en macOS).
...-dos
Asume que el archivo utiliza el retorno de carro seguido del salto de línea para separar las líneas, y realiza la conversión apropiada. (Esta es la convención que se utiliza normalmente en los sistemas Microsoft. (8))

Nota

(8) También se especifica para los cuerpos MIME ‘text/*’ y en otros contextos de transporte de red. Es diferente del formato de sintaxis de referencia SGML inicio-record-fin, que Emacs no soporta directamente.

...-mac
Asumir que el archivo utiliza el retorno de carro para separar las líneas, y hacer la conversión apropiada. (Esta era la convención utilizada en el sistema operativo Mac clásico).

Estas variantes de los sistemas de codificación se omiten en la lista de sistemas de codificación por razones de brevedad, ya que son totalmente predecibles. Por ejemplo, el sistema de codificación iso-latin-1 tiene variantes iso-latin-1-unix, iso-latin-1-dos e iso-latin-1-mac.

Los sistemas de codificación unix, dos y mac son alias de undecided-unix, undecided-dos y undecided-mac, respectivamente. Estos sistemas de codificación sólo si especifican la conversión de final de línea, y dejan que la conversión del código de caracteres se deduzca del propio texto.

El sistema de codificación raw-text es bueno para un archivo que es principalmente texto ASCII, pero puede contener valores de bytes por encima de 127 que no están destinados a codificar caracteres no ASCII. Con raw-text, Emacs copia esos valores de bytes sin cambiarlos, y establece enable-multibyte-characters a nil en el buffer actual para que sean interpretados correctamente. raw-text maneja la conversión de final de línea de la forma habitual, basándose en los datos encontrados, y tiene las tres variantes habituales para especificar el tipo de conversión de final de línea a utilizar.

Por el contrario, el sistema de codificación no-conversion no especifica ninguna conversión de código de caracteres en absoluto, ninguna para los valores de bytes no ASCII y ninguna para el final de línea. Esto es útil para leer o escribir archivos binarios, archivos tar y otros archivos que deben ser examinados textualmente. También establece que enable-multibyte-characters sea nil.

La forma más fácil de editar un archivo sin ningún tipo de conversión es con el comando Alt-x find-file-literally (M-x find-file-literally). Esto utiliza la no-conversión, y también suprime otras características de Emacs que podrían convertir el contenido del archivo antes de que usted lo vea. Ver Visitar archivos.

El sistema de codificación emacs-internal (o utf-8-emacs, que es equivalente) significa que el archivo contiene caracteres no ASCII almacenados con la codificación interna de Emacs. Este sistema de codificación maneja la conversión de final de línea en función de los datos encontrados, y tiene las tres variantes habituales para especificar el tipo de conversión de final de línea.

Reconocimiento de sistemas de codificación

Cada vez que Emacs lee un texto determinado, intenta reconocer qué sistema de codificación debe utilizar. Esto se aplica a los archivos que se leen, a la salida de los subprocesos, al texto de las selecciones X, etc. Emacs puede seleccionar el sistema de codificación correcto automáticamente la mayoría de las veces, una vez que hayas especificado tus preferencias.

Algunos sistemas de codificación pueden ser reconocidos o distinguidos por las secuencias de bytes que aparecen en los datos. Sin embargo, hay sistemas de codificación que no se pueden distinguir, ni siquiera potencialmente. Por ejemplo, no hay manera de distinguir entre Latin-1 y Latin-2; utilizan los mismos valores de bytes con diferentes significados.

Emacs maneja esta situación mediante una lista de prioridad de sistemas de codificación. Cada vez que lee un archivo, si no se especifica el sistema de codificación a utilizar, comprueba los datos contra cada sistema de codificación, empezando por el primero en prioridad y trabajando hacia abajo en la lista, hasta que encuentra un sistema de codificación que se ajuste a los datos. Entonces convierte el contenido del archivo asumiendo que está representado en este sistema de codificación.

La lista de prioridad de los sistemas de codificación depende del entorno lingüístico seleccionado (véase Entornos lingüísticos). Por ejemplo, si utiliza el francés, probablemente querrá que Emacs prefiera el latín-1 al latín-2; si utiliza el checo, probablemente querrá que se prefiera el latín-2. Esta es una de las razones para especificar un entorno de lenguaje.

Sin embargo, puedes alterar la lista de prioridades del sistema de codificación en detalle con el comando Alt-x prefer-codign-system (M-x prefer-coding-system). Este comando lee el nombre de un sistema de codificación del minibuffer, y lo añade al frente de la lista de prioridades, para que sea preferido a todos los demás. Si utiliza este comando varias veces, cada vez que lo utilice añadirá un elemento al frente de la lista de prioridades.

Si usas un sistema de codificación que especifica el tipo de conversión de final de línea, como iso-8859-1-dos, lo que esto significa es que Emacs debería intentar reconocer iso-8859-1 con prioridad, y debería usar la conversión de final de línea DOS cuando reconozca iso-8859-1.

A veces, el nombre de un archivo indica qué sistema de codificación debe usarse para el archivo. La variable file-coding-system-alist especifica esta correspondencia. Existe una función especial modify-coding-system-alist para añadir elementos a esta lista. Por ejemplo, para leer y escribir todos los archivos ‘.txt’ utilizando el sistema de codificación chinese-iso-8bit, puede ejecutar esta expresión Lisp:

(modify-coding-system-alist 'file "\\.txt\\'" 'chinese-iso-8bit)

El primer argumento debe ser archivo, el segundo argumento debe ser una expresión regular que determine a qué archivos se aplica esto, y el tercer argumento dice qué sistema de codificación usar para estos archivos.

Emacs reconoce qué tipo de conversión de final de línea debe utilizar basándose en el contenido del fichero: si sólo ve retornos de carro, o sólo retornos de carro seguidos de secuencias de salto de línea, entonces elige la conversión de final de línea en consecuencia. Puede inhibir el uso automático de la conversión de fin de línea estableciendo la variable inhibit-eol-conversion a un valor no nulo. Si lo hace, los archivos estilo DOS se mostrarán con los caracteres ’^M’ visibles en el búfer; algunas personas prefieren esto a la indicación más sutil del tipo de fin de línea ‘(DOS)’ cerca del borde izquierdo de la línea de modo (ver eol-mnemónico).

Por defecto, la detección automática del sistema de codificación es sensible a las secuencias de escape. Si Emacs ve una secuencia de caracteres que comienza con un carácter de escape, y la secuencia es válida como un código ISO-2022, eso le dice al Editor que use una de las codificaciones ISO-2022 para decodificar el archivo.

Sin embargo, puede haber casos en los que quieras leer las secuencias de escape en un archivo tal cual. En tal caso, puedes establecer la variable inhibit-iso-escape-detection a un valor no nulo. Entonces la detección de código ignora cualquier secuencia de escape, y nunca utiliza una codificación ISO-2022. El resultado es que todas las secuencias de escape son visibles en el buffer.

El valor por defecto de inhibit-iso-escape-detection es nil. Te recomendamos que no lo cambies permanentemente, sólo para una operación específica. Esto se debe a que algunos archivos fuente de Emacs Lisp en la distribución de Emacs contienen caracteres no ASCII codificados en el sistema de codificación iso-2022-7bit, y no serán decodificados correctamente cuando visite esos archivos si suprime la detección de secuencias de escape.

Las variables auto-coding-alist y auto-coding-regexp-alist son la forma más fuerte de especificar el sistema de codificación para ciertos patrones de nombres de archivos, o para archivos que contienen ciertos patrones, respectivamente. Estas variables incluso anulan las etiquetas ‘-*-coding:-*-’ en el propio archivo (ver Especificar el sistema de codificación de un archivo). Por ejemplo, Emacs utiliza la lista de codificación automática para los ficheros tar y de archivo, para evitar que se confunda con una etiqueta ‘-*-coding:-*-’ en un miembro del archivo y piense que se aplica al fichero de archivo en su totalidad.

Otra forma de especificar un sistema de codificación es con la variable auto-coding-functions. Por ejemplo, una de las funciones de codificación automática incorporadas detecta la codificación de los archivos XML. A diferencia de las dos anteriores, esta variable no anula ninguna etiqueta ‘-*-coding:-*-’.

Especificar el sistema de codificación de un archivo

Si Emacs reconoce la codificación de un archivo de forma incorrecta, puedes releer el archivo usando el sistema de codificación correcto con Ctrl-x RETURN r (C-x RET r, revert-buffer-with-coding-system). Este comando pregunta por el sistema de codificación a utilizar. Para ver qué sistema de codificación utilizó Emacs para decodificar el archivo, mire la letra mnemotécnica del sistema de codificación cerca del borde izquierdo de la línea de modo (vea La línea de modo), o escriba Ctrl-h C (C-h C, describe-coding-system).

Puede especificar el sistema de codificación para un archivo en particular en el propio archivo, utilizando la construcción '-*-...-*-' al principio, o una lista de variables locales al final (ver Variables locales en archivos). Esto se hace definiendo un valor para la "variable" llamada codificación. Emacs no tiene realmente una codificación variable; en lugar de establecer una variable, esto utiliza el sistema de codificación especificado para el archivo. Por ejemplo, ‘-*-mode: C; codificación: latin-1; -*-’ especifica el uso del sistema de codificación Latin-1, así como el modo C. Cuando se especifica la codificación explícitamente en el archivo, esto anula la lista de sistemas de codificación del archivo file-coding-system-alist.

Elección de sistemas de codificación para la salida

Una vez que Emacs ha elegido un sistema de codificación para un buffer, almacena ese sistema de codificación en buffer-file-coding-system. Eso lo convierte en el sistema por defecto para las operaciones que escriben desde este buffer en un archivo, como save-buffer y write-region. Puedes especificar un sistema de codificación diferente para la salida del archivo desde el buffer usando set-buffer-file-coding-system (ver Especificando un sistema de codificación para el texto del archivo)

Puedes insertar cualquier carácter que Emacs soporte en cualquier buffer, pero la mayoría de los sistemas de codificación sólo pueden manejar un subconjunto de estos caracteres. Por lo tanto, es posible que los caracteres que insertes no puedan ser codificados con el sistema de codificación que se utilizará para guardar el buffer. Por ejemplo, puedes visitar un archivo de texto en polaco, codificado en iso-8859-2, y añadirle algunas palabras en ruso. Cuando guardas ese buffer, Emacs no puede usar el valor actual de buffer-file-coding-system, porque los caracteres que has añadido no pueden ser codificados por ese sistema de codificación.

Cuando esto sucede, Emacs intenta el sistema de codificación más preferido (establecido por Alt-x-x prefer-coding-system (M-x prefer-coding-system) o Alt-x set-language-environment (M-x set-language-environment)). Si ese sistema de codificación puede codificar con seguridad todos los caracteres del buffer, Emacs lo utiliza y almacena su valor en buffer-file-coding-system. Si no, muestra una lista de sistemas de codificación adecuados para codificar el contenido del buffer, y te pide que elijas uno de esos sistemas de codificación.

Si insertas los caracteres inadecuados en un mensaje de correo, Emacs se comporta de forma un poco diferente. Además, comprueba si el sistema de codificación más preferido se recomienda para su uso en mensajes MIME; si no es así, te informa de este hecho y te pide otro sistema de codificación. Esto es para que no envíe inadvertidamente un mensaje codificado de manera que el software de correo de su destinatario tenga dificultades para decodificarlo. (Puede seguir utilizando un sistema de codificación inadecuado si introduce su nombre en la pregunta).

Cuando envías un mensaje de correo (ver Envío de correo), Emacs tiene cuatro maneras diferentes de determinar el sistema de codificación a utilizar para codificar el texto del mensaje. Primero intenta el valor propio del búfer de buffer-file-coding-system, si no es nulo. En segundo lugar, utiliza el valor de sendmail-coding-system, si no es nulo. En tercer lugar, utiliza el valor de default-sendmail-coding-system. Si estos tres valores son nulos, Emacs codifica el correo saliente utilizando el sistema de codificación por defecto para los nuevos archivos (es decir, el valor por defecto de buffer-file-coding-system), que es controlado por su elección del entorno de lenguaje.

Especificar un sistema de codificación para el texto de un archivo

En los casos en los que Emacs no elige automáticamente el sistema de codificación adecuado para el contenido de un archivo, puede utilizar estos comandos para especificar uno:

Ctrl-x RETURN f codificación RETURN (C-x RET f codificación RET)
Usa la codificación del sistema de codificación para guardar o volver a visitar el archivo en el buffer actual (set-buffer-file-coding-system).
Ctrl-x RETURN c codifcación RETURN (C-x RET c codificación RET)
Especifica la codificación del sistema de codificación para el comando inmediatamente siguiente (universal-coding-system-argument).
Ctrl-x RETURN r codificación RETURN (C-x RET r codificación RET)
Revisa el archivo actual utilizando la codificación del sistema de codificación (revert-buffer-with-coding-system).
Alt-x recode-region RETURN correcto RETURN incorrecto RETURN
(M-x recode-region RET correcto RET incorrecto RET)
Convertir una región que fue decodificada usando el sistema de codificación incorrecto, decodificándola usando el sistema de codificación correcto en su lugar.

El comando Ctrl-x RETURN f (C-x RET f, set-buffer-file-coding-system) establece el sistema de codificación del archivo para el buffer actual (es decir, el sistema de codificación que se utilizará al guardar o revertir el archivo). El sistema de codificación se especifica mediante el minibuffer. También puede invocar este comando haciendo clic con (ratón-3) en el indicador del sistema de codificación en la línea de modo (véase La línea de modo).

Si especifica un sistema de codificación que no puede manejar todos los caracteres del buffer, Emacs advertirá sobre los caracteres problemáticos, y pedirá que elija otro sistema de codificación cuando intente guardar el buffer (ver Elección de sistemas de codificación para la salida).

También puede usar este comando para especificar la conversión de final de línea (ver conversión de final de línea) para codificar el buffer actual. Por ejemplo, Ctrl-x RETURN f dos RETURN (C-x RET f dos RET) hará que Emacs guarde el texto del buffer actual con un retorno de carro estilo DOS seguido de un final de línea con salto de línea.

Otra forma de especificar el sistema de codificación de un archivo es cuando se visita el archivo. Primero utilice el comando Ctrl-x RETURN c (C-x RET c, universal-coding-system-argument); este comando utiliza el minibuffer para leer un nombre de sistema de codificación. Después de salir del minibuffer, el sistema de codificación especificado se utiliza para el comando inmediatamente siguiente.

Así, si el comando inmediato siguiente es Ctrl-x Ctrl-f (C-x C-f), por ejemplo, se lee el archivo utilizando ese sistema de codificación (y se registra el sistema de codificación para cuando se guarde el archivo posteriormente). O, si el comando inmediato siguiente es Ctrl-x Ctrl-w (C-x C-w), escribe el archivo usando ese sistema de codificación. Cuando se especifica el sistema de codificación para guardar de esta manera, en lugar de usar Ctrl-x RETURN f, no hay ninguna advertencia si el buffer contiene caracteres que el sistema de codificación no puede manejar.

Otros comandos de archivo afectados por un sistema de codificación especificado incluyen Ctrl-x i (C-x i) y Ctrl-x Ctrl-v (C-x C-v), así como las variantes de Ctrl-x Ctrl-f (C-x C-f) para otras ventanas. Ctrl-x RETURN (C-x RET c) también afecta a los comandos que inician subprocesos, incluyendo Alt-x shell (M-x shell) (ver Ejecutar comandos de shell desde Emacs). Si el comando inmediatamente siguiente no utiliza el sistema de codificación, entonces Ctrl-x RETURN c (C-x RET c) no tiene finalmente ningún efecto.

Una forma fácil de visitar un archivo sin conversión es con el comando Alt-x find-file-literally (M-x find-file-literally). Véase Visitar archivos.

El valor por defecto de la variable buffer-file-coding-system especifica la elección del sistema de codificación a utilizar cuando se crea un nuevo archivo. Se aplica cuando se encuentra un nuevo archivo, y cuando se crea un buffer y luego se guarda en un archivo. La selección de un entorno de lenguaje normalmente establece esta variable a una buena elección de sistema de codificación por defecto para ese entorno de lenguaje.

Si visita un archivo con un sistema de codificación equivocado, puede corregirlo con Ctrl-x RETURN r (C-x RET r, revert-buffer-with-coding-system). Esto visita el archivo actual de nuevo, utilizando el sistema de codificación que usted especifique.

Si un trozo de texto ya ha sido insertado en un búfer utilizando un sistema de codificación erróneo, puede rehacer la decodificación del mismo utilizando Alt-x recode-region (M-x recode-region). Esto le pide el sistema de codificación correcto, luego el sistema de codificación incorrecto que se usó realmente, y hace la conversión. Primero codifica la región utilizando el sistema de codificación incorrecto, y luego la decodifica de nuevo utilizando el sistema de codificación correcto.

Sistemas de codificación para la comunicación entre procesos

Esta sección explica cómo especificar sistemas de codificación para su uso en la comunicación con otros procesos.

Ctrl-x RETURN codificación RETURN (C-x RET x codificación RET)
Utiliza la codificación del sistema de codificación para transferir selecciones hacia y desde otras aplicaciones gráficas (set-selection-codificación-system).
Ctrl-x RETURN X codificación RETURN (C-x RET X codificación RET)
Utiliza la codificación del sistema de codificación para transferir una selección, la siguiente, hacia o desde otra aplicación gráfica (set-next selection-coding-system).
Ctrl-x RETURN p codific-entrada RETURN codific-salida RETURN
(C-x RET p codific-entrada RET codifc-salida RET)
Utiliza los sistemas de codificación codific-entrada y codific-salida para la entrada y salida del subproceso en el buffer actual (set-buffer-process-coding-system).

El comando Ctrl-x RETURN x (C-x RET x, set-selection-coding-system) especifica el sistema de codificación para enviar el texto seleccionado a otras aplicaciones de ventanas, y para recibir el texto de las selecciones realizadas en otras aplicaciones. Este comando se aplica a todas las selecciones subsiguientes, hasta que se anule utilizando el comando de nuevo. El comando Ctrl-x RETURN X (C-x RET X, set-next-selection-coding-system) especifica el sistema de codificación para la siguiente selección hecha en Emacs o leída por Emacs.

La variable x-select-request-type especifica el tipo de datos a solicitar al sistema X Window para recibir selecciones de texto de otras aplicaciones. Si el valor es nil (por defecto), Emacs intenta UTF8_STRING y COMPOUND_TEXT, en este orden, y utiliza varias heurísticas para elegir el más apropiado de los dos resultados; si ninguno de ellos tiene éxito, Emacs vuelve a STRING. Si el valor de x-select-request-type es uno de los símbolos COMPOUND_TEXT, UTF8_STRING, STRING o TEXT, Emacs utiliza sólo ese tipo de petición. Si el valor es una lista de algunos de estos símbolos, intenta sólo los tipos de petición de la lista, en orden, hasta que uno de ellos tenga éxito, o hasta que la lista se agote.

El comando Ctrl-x RETURN p (C-x RET p, set-buffer-process-coding-system) especifica el sistema de codificación para la entrada y salida a un subproceso. Este comando se aplica al búfer actual; normalmente, cada subproceso tiene su propio búfer, por lo que se puede utilizar este comando para especificar la traducción hacia y desde un subproceso concreto dando el comando en el búfer correspondiente.

También puede utilizar Ctrl-x RETURN c (C-x RET c, universal-coding-system-argument) justo antes del comando que ejecuta o inicia un subproceso, para especificar el sistema de codificación para comunicarse con ese subproceso. Véase Especificar un sistema de codificación para el texto de los archivos.

El valor por defecto para la traducción de la entrada y salida del proceso depende del entorno lingüístico actual.

La variable locale-coding-system especifica un sistema de codificación a utilizar cuando se codifican y decodifican las cadenas del sistema, como los mensajes de error del sistema y los formatos de las cadenas y las marcas de tiempo. Este sistema de codificación también se utiliza para decodificar la entrada del teclado no ASCII en el sistema X Window y para codificar el texto enviado a la salida estándar y a los flujos de error cuando se está en modo por lotes. Debe elegir un sistema de codificación que sea compatible con la representación de texto del sistema subyacente, que normalmente se especifica mediante una de las variables de entorno LC_ALL, LC_CTYPE y LANG. (La primera, en el orden especificado anteriormente, cuyo 1valor no esté vacío es la que determina la representación de texto).

Sistemas de codificación para nombres de archivos

Ctrl-x RETURN codificación (C-x RET F codificaciónRET)
Utilizar la codificación del sistema de codificación para codificar y descodificar los nombres de archivo (set-file-name-coding-system).

El comando Ctrl-x RETURN F (C-x RET F, set-file-name-coding-system) especifica un sistema de codificación a utilizar para codificar los nombres de archivo. No tiene ningún efecto sobre la lectura y escritura del contenido de los archivos.

De hecho, todo lo que hace este comando es establecer el valor de la variable file-name-coding-system. Si estableces la variable a un nombre de sistema de codificación (como un símbolo Lisp o una cadena), Emacs codifica los nombres de archivo usando ese sistema de codificación para todas las operaciones de archivo. Esto hace posible el uso de caracteres no ASCII en los nombres de archivos o, al menos, aquellos caracteres no ASCII que el sistema de codificación especificado puede codificar.

Si file-name-coding-system es nil, Emacs utiliza un sistema de codificación por defecto determinado por el entorno de lenguaje seleccionado, y almacenado en la variable default-file-name-coding-system (normalmente UTF-8).

Cuando Emacs se ejecuta en versiones de MS-Windows descendientes de la familia NT (Windows 2000, XP y todas las versiones posteriores), el valor de file-name-coding-system se ignora en gran medida, ya que Emacs utiliza por defecto APIs que permiten pasar nombres de archivo Unicode directamente. Por el contrario, en Windows 9X, los nombres de archivo se codifican utilizando file-name-coding-system, que debe establecerse a la codepage (ver codepage) pertinente para la configuración regional actual del sistema. El valor de la variable w32-unicode-filenames controla si Emacs utiliza las APIs Unicode cuando llama a funciones del SO que aceptan nombres de archivo. El código de inicio establece esta variable como nula en Windows 9X, y como t en las nuevas versiones de MS-Windows.

Advertencia: si cambias el sistema de codificación de nombres de archivo (o el entorno de lenguaje) en medio de una sesión de Emacs, pueden surgir problemas si ya has visitado archivos cuyos nombres fueron codificados usando el sistema de codificación anterior y no pueden ser codificados (o están codificados de forma diferente) bajo el nuevo sistema de codificación. Si intenta guardar uno de estos búferes con el nombre del archivo visitado, es posible que al guardarlo se utilice un nombre de archivo incorrecto o que se produzca un error. Si se produce este problema, utilice Ctrl-x Ctrl-w (C-x C-w) para especificar un nuevo nombre de archivo para ese búfer.

Si se produce un error al codificar un nombre de archivo, utilice el comando Alt-x recode-file-name (M-x recode-file-name) para cambiar el sistema de codificación del nombre de archivo. Esto solicita un nombre de archivo existente, su antiguo sistema de codificación y el sistema de codificación al que se desea convertir.

Sistemas de codificación para E/S de terminales

Ctrl-x RETURN t codificación RETURN (C-x RET t codificación RET)
Utilizar la codificación del sistema para la salida del terminal (set-terminal-coding-system).
Ctrl-x RETURN codificación k RETURN (C-x RET codificación k RET)
Utilizar la codificación del sistema de codificación para la entrada del teclado (set-keyboard-coding-system).

El comando Ctrl-x RETURN t (C-x RET t, set-terminal-coding-system) especifica el sistema de codificación para la salida del terminal. Si se especifica un código de caracteres para la salida del terminal, todos los caracteres que salgan al terminal se traducirán a ese sistema de codificación.

Esta función es útil para ciertos terminales de sólo caracteres construidos para soportar idiomas o conjuntos de caracteres específicos, por ejemplo, terminales europeos que soportan uno de los conjuntos de caracteres latinos ISO. Es necesario especificar el sistema de codificación del terminal cuando se utiliza texto multibyte, para que Emacs sepa qué caracteres puede manejar el terminal.

Por defecto, la salida al terminal no se traduce en absoluto, a menos que Emacs pueda deducir el sistema de codificación apropiado a partir de su tipo de terminal o de su especificación de localización (ver Entornos de lenguaje).

El comando Ctrl-x RETURN k (C-x RET k, set-keyboard-coding-system), o la variable keyboard-coding-system, especifica el sistema de codificación para la entrada del teclado. La traducción del código de caracteres de la entrada del teclado es útil para los terminales con teclas que envían caracteres gráficos no ASCII, por ejemplo, algunos terminales diseñados para ISO Latin-1 o subconjuntos de ella.

Por defecto, la entrada del teclado se traduce en función de la configuración regional del sistema. Si su terminal no admite realmente la codificación implícita en su configuración regional (por ejemplo, si descubre que inserta un carácter no ASCII si escribe Alt-i (M-i), deberá establecer keyboard-coding-system en nil para desactivar la codificación. Puede hacerlo poniendo:

(set-keyboard-coding-system nil)

en su archivo init.

Establecer el sistema de codificación del teclado (keyboard-coding-system) no tiene ningún efecto en MS-Windows, excepto en los antiguos sistemas Windows 9X, en cuyo caso la codificación debe coincidir con la página de código actual de la consola de MS-Windows, que puede cambiarse llamando a w32-set-console-codepage.

Existe una similitud entre el uso de una traducción del sistema de codificación para la entrada del teclado, y el uso de un método de entrada: ambos definen secuencias de entrada del teclado que se traducen en caracteres individuales. Sin embargo, los métodos de entrada están diseñados para ser convenientes para el uso interactivo de los humanos, y las secuencias que se traducen son típicamente secuencias de caracteres de impresión ASCII. Los sistemas de codificación suelen traducir secuencias de caracteres no gráficos.

Conjuntos de fuentes

Un tipo de letra suele definir las formas de un solo alfabeto o escritura. Por lo tanto, mostrar toda la gama de scripts que Emacs soporta requiere una colección de muchas fuentes. Tal colección se llama conjunto de fuentes. Un conjunto de fuentes está definido por una lista de especificaciones de fuentes, cada una asignada para manejar un rango de códigos de caracteres, y puede recurrir a otro conjunto de fuentes para los caracteres que no están cubiertos por las fuentes que especifica.

Cada conjunto de fuentes tiene un nombre, como una fuente. Sin embargo, mientras que las fuentes se almacenan en el sistema y los nombres de las fuentes disponibles son definidos por el sistema, los conjuntos de fuentes se definen dentro de Emacs. Una vez que se ha definido un conjunto de fuentes (fontset), puede usarlo dentro del Editor especificando su nombre, en cualquier lugar en el que pudieras usar una sola fuente. Por supuesto, los conjuntos de fuentes de Emacs sólo pueden utilizar las fuentes que su sistema soporta. Si algunos caracteres aparecen en la pantalla como cajas vacías o códigos hexadecimales, esto significa que el conjunto de fuentes en uso para ellos no tiene ninguna fuente para esos caracteres. En este caso, o si los caracteres se muestran, pero no tan bien como le gustaría, es posible que tenga que instalar fuentes adicionales o modificar el juego de fuentes para utilizar fuentes específicas ya instaladas en su sistema (véase más adelante). Su sistema operativo puede tener fuentes opcionales que puede instalar; o puede instalar el paquete GNU Intlfonts, que incluye fuentes para la mayoría de los scripts soportados.(9)

Nota

(9) Si ejecuta Emacs en X, es posible que tenga que informar al servidor X sobre la ubicación de las fuentes recién instaladas con comandos como:

xset fp+ /usr/local/share/emacs/fonts
xset fp rehash~

Emacs crea tres conjuntos de fuentes automáticamente: el conjunto de fuentes estándar, el conjunto de fuentes de inicio y el conjunto de fuentes por defecto. El conjunto de fuentes por defecto es el más probable que tenga fuentes para una amplia variedad de caracteres no ASCII, y es el recurso por defecto para los otros dos conjuntos de fuentes, y si se establece una fuente por defecto en lugar de un conjunto de fuentes. Sin embargo, no especifica los nombres de las familias de fuentes, por lo que los resultados pueden ser algo aleatorios si se utiliza directamente. Puedes especificar un conjunto de fuentes concreto iniciando Emacs con la opción ‘-fn’. Por ejemplo,

emacs -fn fontset-standard

También puedes especificar un conjunto de fuentes con el recurso ‘Font’ (ver Opciones y Recursos X).

Si no se especifica ningún conjunto de fuentes para su uso, Emacs utiliza una fuente ASCII, con ‘fontset-default’ como reserva para los caracteres que la fuente no cubre. El conjunto de fuentes estándar sólo se utiliza si se solicita explícitamente, a pesar de su nombre.

Para mostrar la información sobre un conjunto de fuentes específico, utilice el comando Alt-x describe-fonset (M-x describe-fontset). Pide un nombre de juego de fuentes, por defecto el usado por el marco actual, y luego muestra todos los subrangos de caracteres y las fuentes asignadas a ellos en ese juego de fuentes. Para ver qué fuentes está utilizando Emacs en una sesión iniciada sin un juego de fuentes específico (que es lo que ocurre normalmente), escriba fontset-default RETURN (fontset-default RET) en el prompt, o simplemente RETURN (RET) para describir el juego de fuentes utilizado por el marco actual.

Un conjunto de fuentes no especifica necesariamente una fuente para cada código de carácter. Si un conjunto de fuentes no especifica ninguna fuente para un determinado carácter, o si especifica una fuente que no existe en su sistema, entonces no puede mostrar ese carácter correctamente. En su lugar, mostrará ese carácter como un código hexadecimal o un espacio delgado o una caja vacía. (Ver caracteres sin glifos, para más detalles.) O un conjunto de fuentes puede especificar una fuente para algún rango de caracteres, pero puede que no le guste su aspecto visual. Si esto ocurre, es posible que desee modificar su conjunto de fuentes; vea Modificación de conjuntos de fuentes, para saber cómo hacerlo.

Definición de conjuntos de fuentes

Cuando se ejecuta en X, Emacs crea automáticamente un conjunto de fuentes estándar según el valor de standard-fontset-spec. El nombre de este juego de fuentes es:

-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard

o simplemente 'fontset-standard' para abreviar.

En GNUstep y macOS, el conjunto de fuentes estándar se crea usando el valor de ns-standard-fontset-spec, y en MS Windows se crea usando el valor de w32-standard-fontset-spec.

Las variantes de negrita, cursiva y negrita-cursiva del conjunto de fuentes estándar se crean automáticamente. Sus nombres tienen ‘bold’ en lugar de ‘medium’, o ‘i’ en lugar de ‘r’, o ambos.

Emacs genera un juego de fuentes automáticamente, basado en cualquier fuente ASCII por defecto que especifiques con el recurso ‘Font’ o el argumento ‘-fn’, o la fuente por defecto que Emacs encontró cuando se inició. Este es el conjunto de fuentes de inicio y su nombre es fontset-startup. Emacs genera este conjunto de fuentes sustituyendo el campo charset_registry por ‘fontset’, y sustituyendo el campo charset_encoding por ‘startup’, y utilizando la cadena resultante para especificar un conjunto de fuentes.

Por ejemplo, si inicias Emacs con una fuente de esta forma

emacs -fn "*courier-medium-r-normal--14-140-*-iso8859-1"

Emacs genera el siguiente conjunto de fuentes y lo utiliza para el marco inicial de la ventana X:

-*-courier-medium-r-normal-*-14-140-*-*-*-*-fontset-startup

El conjunto de fuentes de inicio utilizará la fuente que especifiques, o una variante con un registro y codificación diferentes, para todos los caracteres que sean soportados por esa fuente, y recurrirá a ‘fontset-default’ para otros caracteres.

Con el recurso X ‘Emacs.Font’, puede especificar un nombre de conjunto de fuentes igual que un nombre de fuente real. Pero tenga cuidado de no especificar un nombre de conjunto de fuentes en un recurso comodín como ‘Emacs*Font’ - esa especificación comodín coincide con varios otros recursos, como los menús, y los menús no pueden manejar conjuntos de fuentes. Ver Opciones y Recursos X.

Puede especificar conjuntos de fuentes adicionales usando recursos X llamados ‘Fontset-n’, donde n es un número entero empezando por 0. El valor del recurso debe tener esta forma:

fontpattern, [charset:font]…

donde fontpattern debe tener la forma de un nombre de fuente X estándar (véase el ejemplo anterior de fontset-startup), excepto los dos últimos campos. Deben tener la forma ‘fontset-alias’.

Cada conjunto de fuentes tiene dos nombres, uno largo y otro corto. El nombre largo es fontpattern. El nombre corto es ‘fontset-alias’, los dos últimos campos del nombre largo (por ejemplo, ‘fontset-startup’ para el conjunto de fuentes creado automáticamente al inicio). Puede referirse al conjunto de fuentes por cualquiera de los dos nombres.

La construcción ‘charset:font’ especifica qué fuente utilizar (en este conjunto de fuentes) para un conjunto de caracteres concreto. Aquí, charset es el nombre de un conjunto de caracteres, y font es la fuente a utilizar para ese conjunto de caracteres. Puedes usar esta construcción cualquier número de veces al definir un conjunto de fuentes.

Para los otros conjuntos de caracteres, Emacs elige una fuente basada en fontpattern. Reemplaza ‘fontset-alias’ con valores que describen el conjunto de caracteres. Para la fuente de caracteres ASCII, ‘fontset-alias’ se sustituye por ‘ISO8859-1’.

Además, cuando varios campos consecutivos son comodines, Emacs los colapsa en un único comodín. Esto es para evitar el uso de fuentes autoescaladas. Las fuentes hechas mediante el escalado de fuentes más grandes no son utilizables para la edición, y el escalado de una fuente más pequeña tampoco es útil, porque es mejor utilizar la fuente más pequeña en su propio tamaño, que es lo que hace Emacs.

Por lo tanto, si fontpattern es esto

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

la especificación de la fuente para los caracteres ASCII sería esta:

-*-fixed-medium-r-normal-*-24-*-ISO8859-1

y la especificación de la fuente para los caracteres chinos GB2312 sería ésta:

-*-fixed-medium-r-normal-*-24-*-gb2312*-*

Es posible que no tenga ninguna fuente china que coincida con la especificación de fuentes anterior. La mayoría de las distribuciones de X sólo incluyen fuentes chinas que tienen ‘song ti’ o ‘fangsong ti’ en el campo family. En tal caso, se puede especificar ‘Fontset-n’ como:

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
        chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

La función que procesa el valor del recurso fontset para crear el fontset se llama create-fontset-from-fontset-spec. También puede llamar a esta función explícitamente para crear un conjunto de fuentes.

Consulte Fuentes, para obtener más información sobre la denominación de las fuentes.

Modificación de conjuntos de fuentes

No siempre es necesario crear conjuntos de fuentes desde cero. Si sólo se necesitan pequeños cambios, puede ser más fácil modificar un conjunto de fuentes existente, normalmente ‘fontset-default’. La modificación de ‘fontset-default’ también afectará a otros conjuntos de fuentes que lo utilizan como reserva, por lo que puede ser una forma efectiva de solucionar problemas con las fuentes que Emacs elige para un script en particular.

Los conjuntos de fuentes pueden modificarse utilizando la función set-fontset-font, especificando un carácter, un conjunto de caracteres, un script o un rango de caracteres para modificar la fuente, y una especificación de la fuente a utilizar. Algunos ejemplos son:

;; Prefiero una fuente big5 para los caracteres han.
(set-fontset-font "fontset-default"
                  'han (font-spec :registry "big5")
                  nil 'prepend)

;; Usar MyPrivateFont para el área de uso privado de unicode.
(set-fontset-font "fontset-default"  '(#xe000 . #xf8ff)
                  "MyPrivateFont")

;; Usar Liberation-Mono para el conjunto de caracteres latinos-3.
(set-fontset-font "fontset-default" 'iso-8859-3
                  "Liberation Mono")

;; Usar DejaVu Sans Mono como alternativa en el arranque de la fuente
;; before resorting to fontset-default.
(set-fontset-font "fontset-startup" nil "DejaVu Sans Mono"
                  nil 'append)

Vea Fontsets en el Manual de Referencia de GNU Emacs Lisp, para más detalles sobre el uso de la función set-fontset-font.

Si no conoce el punto de código del carácter o el script al que pertenece, puede preguntar a Emacs. Con el punto en el carácter, tecleando Ctrl-u Ctrl-x = (C-u C-x =, what-cursor-position), y esta información, junto con mucho más, se mostrará en el buffer *Help* (*Ayuda*) que Emacs despliega. Ver Información sobre la posición del cursor. Por ejemplo, los caracteres japoneses pertenecen a la escritura ‘kana’, pero el texto japonés también los mezcla con caracteres chinos, así que lo siguientey utiliza la escritura 'han' para configurar Emacs para que utilice la fuente ‘Kochi Gothic’ para el texto japonés:

(set-fontset-font "fontset-default" 'han "Kochi Gothic")

(Por comodidad, el script 'han' de Emacs está configurado para soportar todos los caracteres chinos, japoneses y coreanos, también conocidos como CJK, y no sólo los chinos).

Para ver la lista de escrituras conocidas, consulte la variable script-representative-chars.

Las configuraciones de conjuntos de fuentes como las anteriores sólo afectan a los caracteres que la fuente por defecto no soporta, así que si la fuente ‘Kochi Gothic’ cubre los caracteres latinos, no se utilizará para mostrar los guiones latinos, ya que la fuente por defecto utilizada por Emacs suele cubrir el latín básico.

Algunas fuentes instaladas en tu sistema pueden estar rotas, o producir resultados desagradables para los caracteres para los que se utilizan, y es posible que desees instruir a Emacs para que las ignore completamente mientras busca una fuente adecuada necesaria para mostrar un carácter. Puedes hacerlo añadiendo las fuentes ofensivas al valor de la variable face-ignored-fonts, que es una lista. Aquí tienes un ejemplo para poner en el archivo ~/.emacs:

(add-to-list 'face-ignored-fonts "Some Bad Font")

Caracteres no visualizables

Puede haber algunos caracteres no ASCII que su terminal no pueda mostrar. La mayoría de los terminales de texto soportan un único conjunto de caracteres (usa la variable default-terminal-coding-system para decirle a Emacs cuál es, Coding Systems for Terminal I/O); los caracteres que no pueden ser codificados en ese sistema de codificación se muestran como ‘?’ por defecto.

Las pantallas gráficas pueden mostrar una gama más amplia de caracteres, pero es posible que no tengas instaladas fuentes para todos ellos; los caracteres que no tienen fuente aparecen como un cuadro hueco.

Si utiliza caracteres Latin-1 pero su terminal no puede mostrarlos, puede hacer que se muestren secuencias ASCII mnemónicas en su lugar, por ejemplo, ‘"o’ para la o-umlaut. Para ello, cargue la biblioteca iso-ascii.

Si su terminal puede mostrar Latin-1, puede mostrar caracteres de otros conjuntos de caracteres europeos utilizando una mezcla de caracteres Latin-1 equivalentes y mnemónicos ASCII. Personalice la variable latin1-display para habilitar esto. Las secuencias mnemónicas ASCII corresponden en su mayoría a las de los métodos de entrada de prefijos.

Modo de edición de unibytes

Los conjuntos de caracteres ISO 8859 Latin-n definen códigos de caracteres en el rango 0240 a 0377 octal (160 a 255 decimal) para manejar las letras acentuadas y los signos de puntuación que necesitan varios idiomas europeos (y algunos no europeos). Ten en cuenta que Emacs considera los bytes con códigos en este rango como bytes brutos, no como caracteres, incluso en un buffer de unibyte, es decir, si desactivas los caracteres multibyte. Sin embargo, Emacs puede seguir manejando estos códigos de caracteres como si pertenecieran a uno de los conjuntos de caracteres de un byte a la vez. Para especificar cuál de estos códigos utilizar, invoque Alt-x set-language-environment (M-x set-language-environment) y especifique un entorno de lenguaje adecuado como ‘Latin-n’. Ver Desactivación de los caracteres multibyte en el Manual de Referencia de GNU Emacs Lisp.

Emacs también puede mostrar bytes en el rango de 160 a 255 como caracteres legibles, siempre que el terminal o la fuente en uso los soporte. Esto funciona automáticamente. En una pantalla gráfica, Emacs también puede mostrar caracteres de un solo byte a través de conjuntos de fuentes, en efecto mostrando los caracteres multibyte equivalentes según el entorno de lenguaje actual. Para solicitar esto, establezca la variable unibyte-display-via-language-environment a un valor no nulo. Tenga en cuenta que este ajuste sólo afecta a cómo se muestran estos bytes, pero no cambia el hecho fundamental de que Emacs los trata como bytes en bruto, no como caracteres.

Si la terminal no soporta la visualización del conjunto de caracteres Latin-1, Emacs puede mostrar estos caracteres como secuencias ASCII que al menos dan una idea clara de lo que son los caracteres. Para ello, cargue la biblioteca iso-ascii. Podrían implementarse bibliotecas similares para otros conjuntos de caracteres latinos, pero no se ha hecho hasta ahora.

Normalmente los caracteres que no son ISO-8859 (códigos decimales entre 128 y 159 inclusive) se muestran como escapes octales. Puede cambiar esto para las versiones extendidas no estándar de los juegos de caracteres ISO-8859 utilizando la función standard-display-8bit en la biblioteca disp-table.

Hay dos maneras de introducir caracteres de un solo byte que no sean ASCII:

  • Puede utilizar un método de entrada para el entorno lingüístico seleccionado. Véase Métodos de entrada. Cuando se utiliza un método de entrada en un búfer unibyte, el carácter no ASCII que se especifica con él se convierte en unibyte.

  • Si su teclado puede generar códigos de caracteres 128 (decimal) y superiores, que representan caracteres no ASCII, puede escribir esos códigos de caracteres directamente.
    En una pantalla gráfica, no debería ser necesario hacer nada especial para utilizar estas teclas; simplemente deberían funcionar. En un terminal de texto, debe utilizar el comando Alt-x set-keyboard-codign-system (M-x set-keyboard-coding-system) o personalizar la variable keyboard-coding-system para especificar qué sistema de codificación utiliza su teclado (véase Sistemas de codificación para E/S de terminales). Activar esta función probablemente requerirá que utilice ESC (ESC) para escribir caracteres Meta; sin embargo, en una terminal de consola o en un emulador de terminal como xterm, puede hacer que Meta se convierta en ESC y seguir pudiendo escribir caracteres de 8 bits presentes directamente en el teclado o utilizando las teclas Compose o AltGr. Ver Tipos de entrada del usuario.

  • Puede utilizar la tecla Ctrl-x 8 (C-x 8) como prefijo de caracteres de composición para introducir caracteres Latin-1 no ASCII y algunos otros caracteres de impresión. C-x 8 es buena para la inserción (en el minibuffer así como en otros buffers), para la búsqueda y en cualquier otro contexto donde se permita una secuencia de teclas.

    C-x 8 funciona cargando la biblioteca iso-transl. Una vez cargada esa biblioteca, la tecla modificadora Alt (Alt), si el teclado tiene una, sirve para el mismo propósito que C-x 8: usar Alt (Alt) junto con un carácter acentuado para modificar la siguiente letra. Además, si el teclado dispone de teclas para los caracteres de acento muerto latinos-1, también se definen para componer con el siguiente carácter, una vez cargado iso-transl.

  • Utilice Ctrl-x 8 Ctrl-h (C-x 8 C-h) para listar todas las traducciones C-x 8 disponibles.

Juegos de caracteres

En Emacs, charset es la abreviatura de "juego de caracteres". Soporta los conjuntos de caracteres más populares (como ascii, iso-8859-1, cp1250, big5 y unicode), además de algunos conjuntos de caracteres propios (como emacs, unicode-bmp y eight-bit). Todos los caracteres soportados pertenecen a uno o más conjuntos de caracteres.

Emacs normalmente hace lo correcto con respecto a los conjuntos de caracteres, de modo que no tienes que preocuparte por ellos. Sin embargo, a veces es útil conocer algunos de los detalles subyacentes sobre los conjuntos de caracteres.

Un ejemplo es la selección de fuentes (ver Fuentes). Cada entorno de lenguaje (ver Entornos de lenguaje) define una lista de prioridades para los distintos conjuntos de caracteres. Cuando se busca una fuente, Emacs intenta inicialmente encontrar una que pueda mostrar los conjuntos de caracteres de mayor prioridad. Por ejemplo, en el entorno lingüístico japonés, el conjunto de caracteres japanese-jisx0208 tiene la mayor prioridad, por lo que Emacs intenta utilizar una fuente cuya propiedad de registro sea ‘JISX0208.1983-0’.

Hay dos comandos que se pueden utilizar para obtener información sobre los conjuntos de caracteres. El comando Alt-x list-charset-chars (M-x list-charset-chars) solicita un nombre de conjunto de caracteres y muestra todos los caracteres de ese conjunto. El comando Alt-x describe-character-set (M-x describe-character-set) pide un nombre de juego de caracteres y muestra información sobre ese juego, incluyendo su representación interna dentro de Emacs.

Alt-x list-character-sets (M-x list-character-sets) muestra una lista de todos los juegos de caracteres soportados. La lista da los nombres de los juegos de caracteres e información adicional para identificar cada juego de caracteres; para más detalles, vea el Registro Internacional ISO de Juegos de Caracteres Codificados para ser Usados con Secuencias de Escape (ISO-IR) mantenido por la Sociedad de Procesamiento de la Información de Japón/Comisión de Estándares de Tecnología de la Información de Japón (IPSJ/ITSCJ). En esta lista, los conjuntos de caracteres se dividen en dos categorías: los conjuntos de caracteres normales aparecen en primer lugar, seguidos de los conjuntos de caracteres suplementarios. Un juego de caracteres suplementario es aquel que se utiliza para definir otro juego de caracteres (como padre o subconjunto), o para proporcionar compatibilidad con versiones anteriores de Emacs.

Para saber a qué juego de caracteres pertenece un carácter en el búfer, pon punto antes y escribe Ctrl-u Ctrl-x = (C-u C-x =) (ver Introducción a los juegos de caracteres internacionales).

Edición Bidireccional

Emacs admite la edición de texto escrito en alfabetos, como el árabe, el farsi y el hebreo, cuya ordenación natural del texto horizontal para su visualización es de derecha a izquierda. Sin embargo, los dígitos y el texto en latín incrustados en estos alfabetos se siguen mostrando de izquierda a derecha. También es frecuente que haya pequeñas porciones de texto en árabe o hebreo incrustadas en un documento que, por lo demás, es latino; por ejemplo, como comentarios y cadenas en un archivo fuente de un programa. Por estas razones, el texto que utiliza estos alfabetos es en realidad bidireccional: una mezcla de carreras de caracteres de izquierda a derecha y de derecha a izquierda.

Esta sección describe las facilidades y opciones proporcionadas por Emacs para editar texto bidireccional.

Emacs almacena el texto de derecha a izquierda y bidireccional en el llamado orden lógico (o de lectura): la posición del búfer o de la cadena del primer carácter que se lee precede a la del siguiente. La reordenación del texto bidireccional en el orden visual se produce en el momento de la visualización. Como resultado, las posiciones de los caracteres ya no aumentan monotónicamente con sus posiciones en la pantalla. Emacs implementa el Algoritmo Bidireccional Unicode (UBA) descrito en el Anexo #9 del Estándar Unicode, para la reordenación del texto bidireccional para su visualización. Se desvía del UBA sólo en cómo se muestran las líneas de continuación cuando la dirección del texto es opuesta a la dirección del párrafo base, por ejemplo, cuando una línea larga de texto en inglés aparece en un párrafo de derecha a izquierda.

La variable local del búfer bidi-display-reordering controla si el texto del búfer se reordena para su visualización. Si su valor es no nulo, Emacs reordena los caracteres que tienen direccionalidad de derecha a izquierda cuando se muestran. El valor por defecto es t.

Cada párrafo de texto bidireccional puede tener su propia dirección base, ya sea de derecha a izquierda o de izquierda a derecha. El texto de los párrafos de izquierda a derecha comienza en la pantalla en el margen izquierdo de la ventana y se trunca o continúa cuando llega al margen derecho. Por el contrario, el texto de los párrafos de derecha a izquierda se muestra a partir del margen derecho y se continúa o se trunca en el margen izquierdo. Por defecto, los límites de los párrafos son líneas vacías, es decir, líneas formadas enteramente por caracteres de espacio en blanco. Para cambiar esto, puede personalizar las dos variables bidi-paragraph-start-re y bidi-paragraph-separate-re, cuyos valores deben ser expresiones regulares (cadenas); por ejemplo, para que una sola línea nueva comience un nuevo párrafo, establezca ambas variables como ‘^’. Estas dos variables son locales del buffer (ver Variables Locales).

Emacs determina la dirección de la base de cada párrafo dinámicamente, basándose en el texto del principio del párrafo. Sin embargo, a veces un buffer puede necesitar forzar una determinada dirección base para sus párrafos. La variable bidi-paragraph-direction, si no es nula, desactiva la determinación dinámica de la dirección base, y en su lugar obliga a todos los párrafos del buffer a tener la dirección especificada por su valor local del buffer. El valor puede ser de derecha a izquierda o de izquierda a derecha. Cualquier otro valor se interpreta como nulo.

Como alternativa, puede controlar la dirección base de un párrafo insertando caracteres especiales de formato delante del párrafo. El carácter especial RIGHT-TO-LEFT MARK (MARCA DE DERECHA A IZQUIERDA), o RLM, fuerza la dirección de derecha a izquierda en el párrafo siguiente, mientras que LEFT-TO-RIGHT MARK (MARCA DE IZQUIERDA A DERECHA), o LRM, fuerza la dirección de izquierda a derecha. (Puede utilizar Ctrl-x 8 RETURN (C-x 8 RET) para insertar estos caracteres.) En una sesión GUI, los caracteres LRM y RLM se muestran como caracteres en blanco muy finos; en los terminales de texto se muestran como espacios en blanco.

Debido a que los caracteres se reordenan para su visualización, los comandos de Emacs que operan en el orden lógico o en tramos de posiciones del buffer pueden producir efectos inusuales. Por ejemplo, los comandos Ctrl-f (C-f) y Ctrl-b (C-b) mueven el punto en el orden lógico, por lo que el cursor a veces saltará cuando el punto atraviese texto bidireccional reordenado. Del mismo modo, una región resaltada que cubra un rango contiguo de posiciones de caracteres puede parecer discontinua si la región abarca texto reordenado. Esto es normal y similar al comportamiento de otros programas que soportan texto bidireccional.

Los comandos de movimiento del cursor vinculados a las teclas de flecha, como (LEFT) y Ctrl- (C-RIGHT), son sensibles a la dirección base del párrafo actual. En un párrafo de izquierda a derecha, los comandos ligados a DERECHA con o sin modificadores se mueven hacia adelante a través del texto del buffer, pero en un párrafo de derecha a izquierda se mueven hacia atrás. Esto refleja el hecho de que en un párrafo de derecha a izquierda las posiciones del búfer aumentan predominantemente cuando se mueve hacia la izquierda en la pantalla.

Cuando se sale de un párrafo, el significado de las teclas de flecha puede cambiar si la dirección base del párrafo anterior o del siguiente es diferente a la del párrafo del que se ha salido. Cuando esto ocurre, es necesario ajustar la tecla de flecha que se pulsa a la nueva dirección base.

Por defecto, (LEFT, IZQUIERDA) y (RIGHT, DERECHA) se mueven en el orden lógico, pero si visual-order-cursor-movement es no nulo, estos comandos se mueven al carácter que está, correspondientemente, a la izquierda o a la derecha de la posición actual de la pantalla, moviéndose a la línea de pantalla siguiente o anterior, según sea el caso. Ten en cuenta que esto podría mover el punto a muchas posiciones del buffer, dependiendo del contexto bidireccional circundante.



Modos mayores y menores

Emacs contiene muchos modos de edición que alteran su comportamiento básico de forma útil. Se dividen en modos mayores y menores.

Los modos mayores proporcionan facilidades especializadas para trabajar en un tipo de archivo en particular, como un archivo fuente en C (ver Editar Programas), o un tipo particular de búfer que no es un archivo, como un búfer de la shell (ver Ejecutar Comandos de la Shell desde Emacs). Los modos mayores son mutuamente excluyentes; cada búfer tiene uno y sólo un modo mayor en cualquier momento.

Los modos menores son características opcionales que puedes activar o desactivar, no necesariamente específicas de un tipo de archivo o búfer. Por ejemplo, el modo Auto Fill (Relleno Automático) es un modo menor en el que SPACE (SPC) rompe las líneas entre las palabras mientras se escribe (ver Modo de Relleno Automático). Los modos menores son independientes entre sí y del modo mayor seleccionado.

Modos principales o Mayores

Cada búfer posee un modo principal, que determina el comportamiento de edición de Emacs mientras ese búfer está activo. La línea de modo normalmente muestra el nombre del modo principal actual, entre paréntesis (ver La línea de modo).

El modo principal menos especializado se llama Modo Fundamental. Este modo no tiene redefiniciones específicas de modo o ajustes de variables, por lo que cada comando de Emacs se comporta de la manera más general, y cada variable de opción de usuario está en su estado por defecto.

Para editar texto de un tipo específico que Emacs conoce, como el código Lisp o el texto en inglés, normalmente se utiliza un modo principal más especializado, como el modo Lisp o el modo Texto. La mayoría de los modos principales se dividen en tres grandes grupos. El primer grupo contiene modos para texto normal, ya sea simple o con marcas. Incluye el modo Texto, el modo HTML, el modo SGML, el modo TeX y el modo Esquema. El segundo grupo contiene modos para lenguajes de programación específicos. Entre ellos se encuentran el modo Lisp (que tiene varias variantes), el modo C y el modo Fortran, entre otros. El tercer grupo consiste en los modos principales que no están asociados directamente con los archivos; se utilizan en los buffers creados para propósitos específicos de Emacs. Los ejemplos incluyen el modo Dired para los buffers creados por Dired (ver Dired, el editor de directorios), el modo Message para los buffers creados por Ctrl-x m (C-x m) (ver Envío de correo), y el modo Shell para los buffers utilizados para comunicarse con un proceso shell inferior (ver Subshell interactivo).

Normalmente, el modo mayor es establecido automáticamente por Emacs, cuando visita por primera vez un archivo o crea un buffer (ver Elección de los modos de archivo). Puede seleccionar explícitamente un nuevo modo mayor usando un comando Alt-x (M-x). Tome el nombre del modo y añada -mode para obtener el nombre del comando para seleccionar ese modo (por ejemplo, Alt-x lisp-mode (M-x lisp-mode) entra en el modo Lisp). Dado que cada búfer tiene exactamente un modo principal, no hay manera de "desactivar" un modo principal; en su lugar, debe cambiar a uno diferente.

El valor de la variable local del búfer major-mode es un símbolo con el mismo nombre que el comando major mode (por ejemplo, lisp-mode). Esta variable se establece automáticamente; no debe cambiarla usted mismo.

El valor por defecto de major-mode determina el modo mayor a utilizar para los archivos que no especifican un modo mayor, y para los nuevos buffers creados con Alt-x b (C-x b). Normalmente, este valor por defecto es el símbolo fundamental-mode, que especifica el modo fundamental. Puedes cambiar este valor por defecto a través de la interfaz de personalización (ver Interfaz de personalización fácil), o añadiendo una línea como esta a tu fichero init (ver El fichero de inicialización de Emacs):

(setq-default major-mode 'text-mode)

Si el valor por defecto de major-mode es nil, el modo mayor se toma del buffer previamente actual.

Los modos principales especializados a menudo cambian el significado de ciertas teclas para hacer algo más adecuado para el modo. Por ejemplo, los modos de lenguaje de programación vinculan TAB (TAB) para sangrar la línea actual de acuerdo con las reglas del lenguaje (ver Sangría). Las teclas que suelen cambiarse son TAB (TAB), DEL (DEL) y Ctrl-j (C-j). Muchos modos también definen comandos especiales propios, normalmente ligados a secuencias de teclas cuyo prefijo es Ctrl-c (C-c) (ver Teclas). Los modos principales también pueden alterar las opciones y variables del usuario; por ejemplo, los modos de lenguaje de programación suelen establecer un valor local del búfer para la variable comment-start, que determina cómo se delimitan los comentarios del código fuente (véase Manipulación de comentarios).

Para ver la documentación del modo principal actual, incluyendo una lista de sus enlaces de teclas, escriba Ctrl-h m (C-h m, describe-mode). Véase Otros comandos de ayuda.

Cada modo principal, aparte del modo Fundamental, define un mode hook (gancho del modo), una lista personalizable de funciones Lisp que se ejecutan cada vez que el modo se activa en un búfer. Vea Hooks, para más información sobre los hooks. Cada gancho de modo recibe el nombre de su modo principal, por ejemplo, el modo Fortran tiene un gancho de nombre: fortran-mode-hook. Además, todos los modos principales basados en texto ejecutan text-mode-hook, y muchos modos de lenguaje de programación (10) (incluyendo todos los distribuidos con Emacs) ejecutan prog-mode-hook, antes de ejecutar sus propios hooks de modo. Las funciones de gancho (hook) pueden mirar el valor de la variable major-mode para ver en qué modo se está entrando realmente.

Nota

(10) Más específicamente, los modos que son "derivados" de prog-mode (ver Derived Modes en The Emacs Lisp Reference Manual)

Los ganchos de modo (mode hooks) se usan comúnmente para habilitar los modos menores (ver Modos menores). Por ejemplo, puede poner las siguientes líneas en su fichero init para habilitar el modo menor de Flyspell en todos los modos mayores basados en texto (ver Comprobación y corrección de la ortografía), y el modo menor de ElDoc en el modo Emacs Lisp (ver Búsqueda de documentación en Emacs Lisp):

(add-hook 'text-mode-hook 'flyspell-mode)
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode)

Modos menores

Un modo menor es un modo de edición opcional que altera el comportamiento de Emacs de alguna manera bien definida. A diferencia de los modos mayores, cualquier número de modos menores puede estar en efecto en cualquier momento. Algunos modos menores son locales al búfer, y pueden ser activados (habilitados) en ciertos búferes y desactivados (deshabilitados) en otros. Otros modos menores son globales: mientras están activados, afectan a todo lo que hagas en la sesión de Emacs, en todos los buffers. La mayoría de los modos menores están desactivados por defecto, pero algunos están activados por defecto.

La mayoría de los modos menores locales del buffer dicen en la línea de modo cuando están habilitados, justo después del indicador de modo mayor. Por ejemplo, ‘Fill’ en la línea de modo significa que el modo Auto Fill está habilitado. Vea la línea de modo.

Al igual que los modos mayores, cada modo menor está asociado a un comando de modo, cuyo nombre consiste en el nombre del modo seguido de ‘-mode’. Por ejemplo, el comando de modo para el modo de relleno automático es auto-fill-mode. Pero a diferencia de un comando de modo mayor, que simplemente activa el modo, el comando de modo para un modo menor puede activarlo o desactivarlo:

  • Si se invoca el comando de modo directamente sin argumento de prefijo (ya sea a través de Alt-x (M-x), o vinculándolo a una tecla y escribiendo esa tecla; ver Personalización de los enlaces de las teclas), eso activa el modo menor. El modo menor se activa si estaba desactivado, y se desactiva si estaba activado.

  • Si invoca el comando mode con un argumento de prefijo, el modo menor se desactiva incondicionalmente si ese argumento es cero o negativo; en caso contrario, se activa incondicionalmente.

  • Si la orden mode se invoca a través de Lisp, el modo menor se activa incondicionalmente si el argumento se omite o es nulo. Esto facilita la activación de un modo menor desde el gancho de modo de un modo mayor (véase Modos mayores). Un argumento no nulo se maneja como un argumento de prefijo interactivo, como se ha descrito anteriormente.

La mayoría de los modos menores también tienen una variable de modo, con el mismo nombre que el comando de modo. Su valor es no nulo si el modo está activado, y nil si está desactivado. En general, no debería intentar activar o desactivar el modo cambiando el valor de la variable mode directamente en Lisp; en su lugar, debería ejecutar la orden mode. Sin embargo, si se establece la variable mode a través de la interfaz Customize (véase Interfaz de personalización sencilla) siempre se habilitará o deshabilitará correctamente el modo, ya que Customize ejecuta automáticamente el comando mode por usted.

La siguiente es una lista de algunos modos menores del buffer local:

  • El modo Abbrev amplía automáticamente el texto basándose en definiciones de abreviaturas predefinidas. Ver Abreviaturas.

  • El modo Relleno automático inserta líneas nuevas a medida que se escribe para evitar que las líneas sean demasiado largas. Ver Relleno de texto.

  • El modo de autoguardado guarda el contenido del búfer periódicamente para reducir la cantidad de trabajo que se puede perder en caso de un fallo. Ver Autoguardado: Protección contra desastres.

  • El modo Electric Quote convierte automáticamente las comillas. Por ejemplo, cambia el texto escrito `así' por un texto ‘’. Puede controlar el tipo de texto en el que opera, y puede desactivarlo por completo en los buffers individuales. Véase Comillas.

  • El modo enriquecido permite editar y guardar el texto formateado. Véase Texto enriquecido.

  • El modo Flyspell resalta automáticamente las palabras mal escritas. Véase Comprobar y corregir la ortografía.

  • El modo Font-Lock resalta automáticamente ciertas unidades textuales que se encuentran en los programas. Está activado globalmente por defecto, pero se puede desactivar en los buffers individuales. Véase Caras de texto.

  • El modo de visualización de números de línea es una envoltura de conveniencia alrededor de la visualización de números de línea, que se establece utilizando el valor de la visualización de números de línea tipo. Ver Personalización de la pantalla.

  • El modo menor Outline proporciona facilidades similares al modo mayor llamado Outline mode. Véase Modo Outline.

  • El modo de sobreescritura hace que los caracteres de impresión ordinarios sustituyan al texto existente en lugar de desplazarlo a la derecha. Por ejemplo, si el punto está delante de la ‘B’ en ‘FOOBAR’, entonces en el modo de sobreescritura escribir una G (G) lo cambia a ‘FOOGAR’, en lugar de producir ‘FOOGBAR’ como es habitual. En el modo de sobreescritura, el comando Ctrl-q (C-q) inserta el siguiente carácter cualquiera que sea, incluso si es un dígito, esto da una manera de insertar un carácter en lugar de reemplazar un carácter existente. El comando de modo, overwrite-mode (modo de sobreescritura), está vinculado a la tecla Insert (Insert).

  • El modo de sobrescritura binaria es una variante del modo de sobrescritura para la edición de archivos binarios; trata las nuevas líneas y los tabuladores como otros caracteres, de modo que sobrescriben otros caracteres y pueden ser sobrescritos por ellos. En el modo de sobrescritura binaria, los dígitos después de Ctrl-q (C-q) especifican un código de carácter octal, como es habitual.

  • El modo de línea visual realiza el ajuste de palabras, haciendo que las líneas largas se ajusten a los límites de las palabras. Véase el modo de línea visual.

Y aquí hay algunos modos menores globales útiles:

  • El modo de número de columna permite mostrar el número de columna actual en la línea de modo. Véase La línea de modo.

  • El modo Borrar selección hace que la inserción de texto borre primero el texto de la región, si ésta está activa. Véase Operar en la región.

  • El modo Icompletar muestra una indicación de las terminaciones disponibles cuando se está en el minibuffer y la terminación está activa. Véase Selección rápida del minibuffer.

  • El modo Número de línea permite mostrar el número de línea actual en la línea de modo. Está activado por defecto. Véase La línea de modo.

  • El modo de barra de menús da a cada cuadro una barra de menús. Está activado por defecto. Ver Barras de Menú.

  • El modo de barra de desplazamiento da a cada ventana una barra de desplazamiento. Está activado por defecto, pero la barra de desplazamiento sólo se muestra en los terminales gráficos. Ver Barras de desplazamiento.

  • El modo de barra de herramientas da a cada cuadro una barra de herramientas. Está activado por defecto, pero la barra de herramientas sólo se muestra en los terminales gráficos. Véase Barras de herramientas.

  • El modo de barra de pestañas da a cada cuadro una barra de pestañas. Ver Barras de pestañas.

  • El modo Línea de pestañas da a cada ventana una línea de pestañas. Véase Línea de pestañas de la ventana.

  • El modo Marca transitoria resalta la región, y hace que muchos comandos de Emacs operen en la región cuando la marca está activa. Está activado por defecto. Ver La marca y la región.

Elección de los modos de archivo

Cuando se visita un archivo, Emacs elige un modo principal automáticamente. Normalmente, hace la elección basándose en el nombre del fichero -por ejemplo, los ficheros cuyos nombres terminan en ‘.c’ se editan normalmente en modo C, pero a veces elige el modo principal basándose en un texto especial en el fichero. Este texto especial también se puede utilizar para habilitar los modos menores en el búfer.

Este es el procedimiento exacto:

Primero, Emacs comprueba si el fichero contiene variables de modo local. Ver Variables locales en archivos. Si hay una variable local de fichero que especifica un modo mayor, entonces el Editor usa ese modo mayor, ignorando todos los demás criterios. Hay varios métodos para especificar un modo principal usando una variable local de fichero; el más simple es poner el nombre del modo en la primera línea no en blanco, precedida y seguida por ‘-*-’. También puede aparecer otro texto en la línea. Por ejemplo,

; -*-Lisp-*-

le dice a Emacs que use el modo Lisp. Observe cómo el punto y coma se utiliza para que Lisp trate esta línea como un comentario. Podría escribir de forma equivalente

; -*- mode: Lisp;-*-

También puede utilizar variables locales de archivo para especificar modos menores en el búfer, utilizando especificaciones eval. Por ejemplo, esta primera línea que no está en blanco pone el búfer en modo Lisp y activa el modo Auto-Fill:

; -*- mode: Lisp; eval: (auto-fill-mode 1); -*-

Tenga en cuenta, sin embargo, que normalmente no es apropiado activar los modos menores de esta manera, ya que la mayoría de los modos menores representan las preferencias individuales de los usuarios. Si quieres usar personalmente un modo menor para un tipo de archivo en particular, es mejor activar el modo menor a través de un gancho de modo mayor (ver Modos Mayores).

En segundo lugar, Emacs comprueba si la extensión del fichero coincide con una entrada de cualquier lista de modos automáticos local del directorio (auto-mode-alist). Estas se encuentran usando la facilidad .dir-locals.el (ver Variables locales por directorio).

En tercer lugar, si no hay una variable de archivo que especifique un modo principal, Emacs comprueba si el contenido del archivo comienza con ‘#!’. Si es así, eso indica que el fichero puede servir como un comando de shell ejecutable, que funciona ejecutando un intérprete nombrado en la primera línea del fichero (el resto del fichero se usa como entrada para el intérprete). Por lo tanto, Emacs intenta utilizar el nombre del intérprete para elegir un modo. Por ejemplo, un archivo que comienza con ‘#!/usr/bin/perl’ se abre en modo Perl. La variable interpreter-mode-alist especifica la correspondencia entre los nombres de los programas intérpretes y los modos principales.

Cuando la primera línea comienza con ‘#!’, normalmente no se puede utilizar la función ‘-*-’ en la primera línea, porque el sistema se confundiría al ejecutar el intérprete. Así que Emacs busca ‘-*-’ en la segunda línea en tales archivos, así como en la primera línea. Lo mismo ocurre con las páginas de manual que comienzan con la cadena mágica ‘'\"’ para especificar una lista de preprocesadores troff.

En cuarto lugar, Emacs intenta determinar el modo principal mirando el texto al principio del buffer, basándose en la variable magic-mode-alist. Por defecto, esta variable es nil (una lista vacía), por lo que Emacs se salta este paso; sin embargo, puede personalizarla en fichero init (ver El fichero de inicialización de Emacs). El valor debe ser una lista de elementos de la forma:

(regexp . mode-function)

donde regexp es una expresión regular (ver Sintaxis de expresiones regulares), y mode-function es un comando de modo mayor. Si el texto al principio del fichero coincide con regexp, Emacs elige el modo principal especificado por mode-function.

Alternativamente, un elemento de magic-mode-alist puede tener la forma

(match-function . mode-function)

donde match-function es una función Lisp que se llama al principio del buffer; si la función devuelve un valor no nulo, Emacs establece el modo mayor con mode-function.

En quinto lugar, si Emacs todavía no ha encontrado un modo principal adecuado, mira el nombre del archivo. La correspondencia entre los nombres de los archivos y los modos principales está controlada por la variable auto-mode-alist. Su valor es una lista en la que cada elemento tiene esta forma,

(regexp . mode-function)

o este formulario,

(regexp mode-function flag)

Por ejemplo, un elemento que normalmente se encuentra en la lista tiene la forma ("\.c\'" . c-mode), y se encarga de seleccionar el modo C para los archivos cuyos nombres terminan en .c. (Tenga en cuenta que ‘\’ es necesario en la sintaxis de Lisp para incluir un ‘\’ en la cadena, que debe utilizarse para suprimir el significado especial de ‘.’ en los regexps). Si el elemento tiene la forma (regexp mode-function flag) y flag es non-nil, entonces después de llamar a mode-function, Emacs descarta el sufijo que coincida con regexp y busca de nuevo en la lista otra coincidencia.

En GNU/Linux y otros sistemas con nombres de archivo que distinguen entre mayúsculas y minúsculas, Emacs realiza una búsqueda que distingue entre mayúsculas y minúsculas a través de auto-mode-alist; si esta búsqueda falla, realiza una segunda búsqueda que no distingue entre mayúsculas y minúsculas a través de alist. Para suprimir la segunda búsqueda, cambie la variable auto-mode-case-fold a nil. En sistemas con nombres de archivo que no distinguen entre mayúsculas y minúsculas, como Microsoft Windows, Emacs realiza una única búsqueda que no distingue entre mayúsculas y minúsculas a través de auto-mode-alist.

Finalmente, si Emacs todavía no ha encontrado un modo principal para usar, compara el texto al comienzo del buffer con la variable magic-fallback-mode-alist. Esta variable funciona como magic-mode-alist, descrita anteriormente, excepto que se consulta sólo después de auto-mode-alist. Por defecto, magic-fallback-mode-alist contiene formularios que comprueban archivos de imagen, archivos HTML/XML/SGML, archivos PostScript y archivos Conf de estilo Unix.

Si ha cambiado el modo principal de un buffer, puedes volver al modo principal que Emacs habría elegido automáticamente, escribiendo Alt-x normal-mode (M-x normal-mode). Esta es la misma función que find-file llama para elegir el modo principal. También procesa la línea ‘-*-’ del fichero o la lista de variables locales (si la hay). Véase Variables locales en los archivos.

Los comandos Ctrl-x Ctrl-w (C-x C-w) y set-visited-file-name cambian a un nuevo modo principal si el nuevo nombre del archivo implica un modo (ver Guardar archivos). (Ctrl-x Ctrl-s (C-x C-s) también hace esto, si el buffer no estaba visitando un archivo.) Sin embargo, esto no sucede si el contenido del buffer especifica un modo mayor, y ciertos modos mayores especiales no permiten el cambio de modo. Puede desactivar esta función de cambio de modo estableciendo el valor nulo de change-major-mode-with-file-name.



Sangría

La sangría se refiere a la inserción o el ajuste de caracteres de espacio en blanco (espacio y/o caracteres de tabulación) al principio de una línea de texto. Este capítulo documenta los comandos y opciones de sangría que son comunes al modo Texto y a los modos relacionados, así como a los modos de lenguaje de programación. Consulte la sección Sangría de los programas, para obtener documentación adicional sobre la sangría en los modos de programación.

La forma más sencilla de realizar la sangría es la tecla TAB (TAB). En la mayoría de los modos principales, esto ejecuta el comando indent-for-tab-command. (En C y modos relacionados, TAB ejecuta el comando c-indent-line-or-region, que se comporta de forma similar, ver Comandos para la sangría en C).

TAB (TAB)
Inserta un espacio en blanco, o aplica una sangría a la línea actual, de forma apropiada al modo (comando indent-for-tab). Si la región está activa, indenta todas las líneas dentro de ella.

El comportamiento exacto de TAB depende del modo principal. En el modo Texto y en los modos principales relacionados, TAB normalmente inserta alguna combinación de caracteres de espacio y tabulación para avanzar hasta la siguiente parada de tabulación (véase Paradas de tabulación). Para ello, la posición del primer carácter que no sea un espacio en blanco en la línea precedente se trata como una parada de tabulación adicional, por lo que puedes utilizar TAB para alinear el punto con la línea precedente. Si la región está activa (ver Operar en la región), TAB actúa de forma especial: indenta cada línea de la región de forma que su primer carácter que no sea un espacio en blanco se alinee con la línea precedente.

En los modos de programación, TAB aplica una sangría a la línea de código actual de forma que tenga sentido teniendo en cuenta el código de las líneas anteriores. Si la región está activa, todas las líneas de la región tienen esta sangría. Si el punto estaba inicialmente dentro de la sangría de la línea actual, se reposiciona al primer carácter no blanco de la línea.

Si sólo desea insertar un carácter de tabulación en el búfer, escriba Ctrl-q TAB (C-q TAB) (véase Inserción de texto).

Comandos de sangría

Aparte del comando TAB (indent-for-tab-command), Emacs proporciona una variedad de comandos para realizar la indentación de otras maneras.

Ctrl-Alt-o (C-M-o)
Divide la línea actual en el punto (split-line). El texto en la línea después del punto se convierte en una nueva línea, con sangría en la misma columna donde se encuentra el punto. Este comando primero mueve el punto hacia adelante sobre cualquier espacio y tabulación. Después, el punto se sitúa antes de la nueva línea insertada.
Alt-m (M-m)
Se mueve (hacia adelante o hacia atrás) hasta el primer carácter que no sea un espacio en blanco en la línea actual (back-to-indentation). Si no hay caracteres que no sean espacios en blanco en la línea, se mueve al final de la línea.
Alt-i (M-i)
Sangra el espacio en blanco en un punto, hasta la siguiente parada de tabulación (tab-to-tab-stop). Ver Tabuladores.
Alt-x indent-relative (M-x indent-relative)
Inserta espacios en blanco en el punto, hasta que el punto esté alineado con el primer carácter que no sea un espacio en blanco de la línea anterior (en realidad, la última línea que no esté en blanco). Si el punto ya está más a la derecha que eso, ejecuta tab-to-tab-stop en su lugar, a menos que sea llamado con un argumento numérico, en cuyo caso no hace nada.
Alt-^ (M-^)
Une la línea anterior y la actual (delete-indentation). Esto une las dos líneas limpiamente, reemplazando cualquier sangría al frente de la línea actual, junto con el límite de la línea, con un solo espacio.

Como caso especial (útil para el código Lisp), el espacio único se omite si los caracteres a unir son paréntesis consecutivos de apertura y cierre, o si la unión sigue a otra nueva línea.

Si hay un prefijo de relleno, Alt-^ (M-^) borra el prefijo de relleno si aparece después de la nueva línea que se borra. Véase El prefijo de relleno.

Con un argumento de prefijo, une la línea actual con la siguiente. Si la región está activa, y no se da ningún argumento de prefijo, une todas las líneas de la región en su lugar.
Ctrl-Alt-\ (C-M-\)
Sangra todas las líneas de la región, como si se hubiera escrito TAB al principio de cada línea (indent-region).

Si se suministra un argumento numérico, la sangría de cada línea de la región será la de ese número de columna.
Ctrl-x TAB (C-x TAB)
Este comando se utiliza para cambiar la sangría de todas las líneas que comienzan en la región, moviendo las líneas afectadas como una unidad rígida.

Si se llama sin argumento, el comando activa un modo transitorio para ajustar la sangría de las líneas afectadas de forma interactiva. Mientras este modo transitorio está activo, al teclear (LEFT, IZQUIERDA) o (RIGHT, DERECHA) se hace una sangría hacia la izquierda y hacia la derecha, respectivamente, de un espacio. También puede escribir Shift- (S-LEFT) o Shift- (S-RIGHT) para sangrar hacia la izquierda o hacia la derecha hasta el siguiente tabulador (ver Tabuladores). Si se escribe cualquier otra tecla, se desactiva el modo transitorio, y se actúa sobre esta tecla como normalmente.

Si se llama con un argumento prefijo n, este comando hace una sangría de las líneas hacia delante de n espacios (sin activar el modo transitorio). Los valores negativos de n hacen la sangría hacia atrás, por lo que se puede eliminar toda la sangría de las líneas de la región utilizando un argumento negativo grande, así:
C-u -999 C-x TAB
	

Tabuladores

Emacs define ciertos números de columna como paradas de tabulación. Estos son usados como puntos de parada por TAB cuando se insertan espacios en blanco en el modo Texto y modos relacionados (ver Sangría), y por comandos como Alt-i (M-i) (ver Comandos de Sangría). La variable tab-stop-list controla estas posiciones. El valor por defecto es nil, lo que significa una parada de tabulación cada 8 columnas. El valor también puede ser una lista de números de columna basados en cero (en orden creciente) en los que colocar las paradas de tabulación. Emacs extiende la lista para siempre repitiendo la diferencia entre el último y el penúltimo elemento.

En lugar de personalizar la variable tab-stop-list directamente, una forma conveniente de ver y establecer las paradas de tabulación es a través del comando Alt-x edit-tab-stops (M-x edit-tab-stops). Esto cambia a un búfer que contiene una descripción de la configuración de las paradas de tabulación, que tiene el siguiente aspecto:

        :       :       :       :       :       :
0         1         2         3         4
0123456789012345678901234567890123456789012345678
To install changes, type C-c C-c

La primera línea contiene dos puntos en cada tabulador. Los números de las dos líneas siguientes están presentes sólo para indicar dónde están los dos puntos. Si el valor de tab-stop-list es nulo, como lo es por defecto, no se muestran dos puntos inicialmente.

Puede editar este búfer para especificar diferentes paradas de tabulación colocando dos puntos en las columnas deseadas. El búfer utiliza el modo de sobreescritura (ver Modos menores). Recuerde que Emacs extenderá la lista de paradas de tabulación para siempre repitiendo la diferencia entre las dos últimas paradas explícitas que coloque. Cuando haya terminado, escriba Ctrl-c Ctrl-c (C-c C-c) para que los nuevos tabuladores tengan efecto. Normalmente, los nuevos ajustes de tabulación se aplican a todos los buffers. Sin embargo, si has hecho que la variable tab-stop-list sea local para el buffer en el que has llamado a Alt-x edit-tab-stops (M-x edit-tab-stops) (ver Variables Locales), entonces los nuevos ajustes de tabulación se aplican sólo a ese buffer. Para guardar la configuración de las paradas de tabulación para futuras sesiones de Emacs, usa la interfaz de personalización para guardar el valor de tab-stop-list (ver Interfaz de personalización fácil).

Tenga en cuenta que las paradas de tabulación discutidas en esta sección no tienen nada que ver con cómo se muestran los caracteres de tabulación en el buffer. Los caracteres de tabulación siempre se muestran como espacios vacíos que se extienden hasta la siguiente parada de tabulación. Véase Cómo se muestra el texto.

Tabulaciones vs. Espacios

Normalmente, los comandos de sangría insertan (o eliminan) la serie más corta posible de caracteres de tabulación y espacio para alinearse con la columna deseada. Los caracteres de tabulación se muestran como un tramo de espacio vacío que se extiende hasta la siguiente parada de tabulación de la pantalla. Por defecto, hay una parada de tabulación cada columna de ancho de tabulación (el valor predeterminado es 8). Véase Cómo se muestra el texto.

Si lo prefiere, toda la sangría puede hacerse sólo con espacios. Para solicitarlo, establezca la variable local del buffer indent-tabs-mode a nil. Consulte Variables locales, para obtener información sobre la configuración de las variables locales del búfer. Tenga en cuenta, sin embargo, que Ctrl-q TAB (C-q TAB) siempre inserta un carácter de tabulación, independientemente del valor de indent-tabs-mode.

Una de las razones para establecer indent-tabs-mode a nil es que no todos los editores muestran los caracteres de tabulación de la misma manera. Los usuarios de Emacs, también, pueden tener diferentes valores personalizados de ancho de tabulación. Usando sólo espacios, puedes asegurarte de que tu archivo tenga siempre el mismo aspecto. Si sólo te importa cómo se ve dentro de Emacs, otra forma de abordar este problema es establecer la variable de ancho de tabulación en una variable local del archivo (ver Variables locales en archivos).

También hay comandos para convertir tabuladores en espacios o viceversa, conservando siempre las columnas de todo el texto que no tenga espacios en blanco. Atl-x tabify (M-x tabify) explora la región en busca de secuencias de espacios, y convierte las secuencias de al menos dos espacios en tabulaciones si puede hacerse sin cambiar la sangría. M-x untabify cambia todos los tabuladores de la región por un número adecuado de espacios.

Funciones de conveniencia para la sangría

La variable tab-always-indent ajusta el comportamiento del comando TAB (TAB, indent-for-tab-command). El valor por defecto, t, da el comportamiento descrito en Sangría. Si cambias el valor por el símbolo complete, entonces TAB primero intenta sangrar la línea actual, y si la línea ya estaba sangrada, intenta completar el texto en el punto (ver Completar los nombres de los símbolos). Si el valor es nulo, TAB aplica una sangría a la línea actual sólo si el punto está en el margen izquierdo o en la sangría de la línea; en caso contrario, inserta un carácter de tabulación.

Si tab-always-indent es completo, la decisión de expandir o sangrar se puede personalizar aún más a través de la variable tab-first-completion. Por ejemplo, si esa variable es eol, sólo completa si el punto está al final de una línea. Vea Modo-Specific Indent en The Emacs Lisp Reference Manual, para más detalles.

El modo de sangría eléctrica es un modo global menor que automáticamente sangrará la línea después de cada RETURN (RET) que se escriba. Este modo está activado por defecto. Para activar este modo menor, escriba Alt-x electric-indent-mode (M-x electric-indent-mode). Para activar el modo en un solo búfer, utilice Alt-x electric-indent-local-mode (M-x electric-indent-local-mode).



Comandos para lenguajes Humanos

Este capítulo describe los comandos de Emacs que actúan sobre el texto, es decir, las secuencias de caracteres de un lenguaje humano (a diferencia de, por ejemplo, un lenguaje de programación). Estos comandos actúan teniendo en cuenta las convenciones sintácticas y estilísticas de los lenguajes humanos: convenciones que implican palabras, frases, párrafos y mayúsculas. También hay comandos para rellenar, es decir, reorganizar las líneas de un párrafo para que tengan una longitud aproximadamente igual. Estos comandos, aunque están pensados principalmente para editar texto, también suelen ser útiles para editar programas.

Emacs tiene varios modos principales para editar texto en lenguaje humano. Si el archivo contiene texto ordinario, utilice el modo Texto, que personaliza Emacs en pequeños aspectos para las convenciones sintácticas del texto. El modo Contorno proporciona comandos especiales para operar en texto con una estructura de contorno. Vea el modo Outline.

El modo Org extiende el modo Outline y convierte a Emacs en un organizador de pleno derecho: puedes gestionar listas TODO, almacenar notas y publicarlas en muchos formatos. Ver el manual Org Info, que se distribuye con Emacs.

Emacs tiene otros modos importantes para el texto que contiene comandos incrustados, como TeX y LaTeX (ver Modo TeX); HTML y SGML (ver Modos SGML y HTML); XML (ver el manual Info del modo nXML, que se distribuye con Emacs); y Groff y Nroff (ver Modo Nroff).

Si necesitas editar imágenes artísticas ASCII hechas con caracteres de texto, utiliza el modo Picture, un modo principal especial para editar dichas imágenes. Vea Editar imágenes.

Palabras

Emacs define varios comandos para desplazarse u operar sobre las palabras:

Alt-f (M-f)
Avanza sobre una palabra (forward-word).
Alt-d (M-d)
Mueve hacia atrás sobre una palabra (backward-word).
Alt-d (M-d)
Mata hasta el final de una palabra (kill-word).
Alt-DEL (M-DEL)
Mata hacia atrás hasta el principio de una palabra (backward-kill-word).
Alt-@ (M-@)
Pone la marca al final de la siguiente palabra (mark-word).
Alt-t (M-t)
Transpone dos palabras o arrastra una palabra a través de otras (traspose-word).

Fíjese en que estas teclas forman una serie paralela a la de los caracteres Ctrl-f (C-f), Ctrl-b (C-b), Ctrl-d (C-d), DEL (DEL) y Ctrl-t (C-t). Alt-@ (M-@) es afín a Ctrl-@ (C-@), que es un alias de Ctrl-SPACE (C-SPC).

Alt-d (M-d, kill-word) mata la palabra después del punto. Para ser precisos, mata todo lo que hay desde el punto hasta el lugar al que se movería Alt-f (M-f). Por lo tanto, si el punto está en el medio de una palabra, Alt-d (M-d) mata sólo la parte después del punto. Si hay algún signo de puntuación entre el punto y la siguiente palabra, se elimina junto con la palabra. (Si desea matar sólo la palabra siguiente pero no la puntuación anterior, simplemente haga Alt-f (M-f) para obtener el final, y mate la palabra hacia atrás con Alt-DEL (M-DEL). Alt-d (M-d) toma argumentos como Alt-f (M-f).

Alt-DEL (M-DEL, backward-kill-word) mata la palabra anterior al punto. Mata todo desde el punto hasta donde Alt-b (M-b) se movería. Por ejemplo, si el punto está después del espacio en ‘FOO, BAR’, elimina ‘FOO, ‘. Si desea eliminar sólo ‘FOO’, y no la coma y el espacio, utilice Alt-b Alt-d (M-b M-d) en lugar de Alt-DEL (M-DEL).

Alt-t (M-t, transpose-word) intercambia la palabra que precede o contiene al punto con la palabra siguiente. Los caracteres delimitadores entre las palabras no se mueven. Por ejemplo, ‘FOO, BAR’ se transpone a ‘BAR, FOO’ en lugar de ‘BAR FOO, ’. Para más información sobre la transposición, consulte Transposición de texto.

Para operar sobre las palabras con una operación que actúe sobre la región, utilice el comando Alt-@ (M-@, mark-word). Este comando establece la marca a la que se movería Alt-f (M-f). Vea Comandos para marcar objetos textuales, para más información sobre este comando.

La comprensión de los límites de las palabras por parte de los comandos de palabra está controlada por la tabla de sintaxis. Cualquier carácter puede, por ejemplo, ser declarado como un delimitador de palabra. Ver Tablas de Sintaxis en el Manual de Referencia de Emacs Lisp.

Además, vea Información de la Posición del Cursor para los comandos Alt-= (M-=, count-words-region) y Alt-x count-word (M-x count-words), que cuentan y reportan el número de palabras en la región o buffer.

Frases

Los comandos de Emacs para manipular oraciones y párrafos están en su mayoría en las teclas Meta, como los comandos de manejo de palabras.

Alt-a (M-a)
Retrocede al principio de la frase (backward-sentence).
Alt-e (M-e)
Avanza hasta el final de la frase (forward-sentence).
Alt-k (M-k)
Avanza hasta el final de la frase (kill-sentence).
Ctrl-x DEL (C-x DEL)
Retrocede al principio de la frase (backward-kill-sentence).

Los comandos Alt-a (M-a, backward-sentence) y Alt-e (M-e, forward-sentence) se mueven al principio y al final de la frase actual, respectivamente. Se han elegido para que se parezcan a Ctrl-a (C-a) y Ctrl-e (C-e), que se mueven al principio y al final de una línea. A diferencia de ellas, Alt-a (M-a) y Alt-e (M-e) se mueven sobre frases sucesivas si se repiten.

Al retroceder sobre una frase, el punto se sitúa justo antes del primer carácter de la frase; al avanzar, el punto se sitúa justo después de la puntuación que termina la frase. Ninguno de los dos se mueve sobre el espacio en blanco en el límite de la frase.

Al igual que Ctrl-a (C-a) y Ctrl-e (C-e) tienen un comando de eliminación, Ctrl-k (C-k), que los acompaña, Alt-a (M-a) y Alt-e (M-e) tienen su correspondiente comando de eliminación: Alt-k (M-k, kill-sentence) mata desde el punto hasta el final de la sentencia. Con un argumento numérico positivo n, mata las siguientes n frases; con un argumento negativo -n, mata hasta el principio de la enésima frase anterior.

DEL Ctrl-x (DEL C-x, backward-kill-sentence) mata hasta el principio de la frase.

Los comandos de frases suponen que usted sigue la convención de los mecanógrafos americanos de poner dos espacios al final de una frase. Es decir, una frase termina donde hay un ‘.’, ‘?’ o ‘!’ seguido del final de una línea o dos espacios, con cualquier número de caracteres ‘)’, ‘]’, ‘'’ o ‘"’ entre ellos. Una frase también empieza o termina donde empieza o termina un párrafo. Es útil seguir esta convención, porque permite a los comandos de frase de Emacs distinguir entre los puntos que terminan una frase y los puntos que indican abreviaturas.

Si quiere usar sólo un espacio entre frases, puede establecer la variable sentence-end-double-space a nil para que los comandos de frase se detengan por espacios simples. Sin embargo, esto tiene un inconveniente: no hay forma de distinguir entre los puntos que terminan las frases y los que indican abreviaturas. Por tanto, para una edición cómoda y fiable, le recomendamos que siga la convención de los dos espacios. La variable sentence-end-double-space también afecta al relleno (véase Comandos de relleno explícitos).

La variable sentence-end controla cómo reconocer el final de una frase. Si no es nil, su valor debe ser una expresión regular, que se utiliza para coincidir con los últimos caracteres de una frase, junto con el espacio en blanco que sigue a la frase (véase Sintaxis de expresiones regulares). Si el valor es nil, el valor por defecto, entonces Emacs calcula los finales de las frases de acuerdo a varios criterios como el valor de sentence-end-double-space.

Algunos idiomas, como el tailandés, no utilizan puntos para indicar el final de una frase. Establezca la variable sentence-end-without-period a t en estos casos.

Párrafos

Los comandos de Emacs para manipular párrafos también están en las teclas Meta.

Alt-{ ( M-{ )
Retroceder al principio del párrafo anterior (backward-paragraph).
Alt-} ( M-} )
Mover hacia adelante al final del párrafo siguiente (forward-paragraph).
Alt-h (M-h)
Poner punto y aparte en este párrafo o en el siguiente (mark-paragraph).

Alt-{ (M-{, backward-paragraph) se mueve al principio del párrafo actual o anterior, dependiendo de dónde se encuentre el punto cuando se invoque el comando (ver más abajo la definición de párrafo). Alt-} (M-}, forward-paragraph) se desplaza de forma similar al final del párrafo actual o del siguiente. Si hay una línea en blanco antes del párrafo, Alt-{ ( M-{ ) se mueve a la línea en blanco.

Cuando desee operar sobre un párrafo, escriba Alt-h (M-h, mark-paragraph) para fijar la región que lo rodea. Por ejemplo, Alt-h Ctrl-w (M-h C-w) mata el párrafo alrededor o después de punto. Alt-h (M-h) pone el punto al principio y la marca al final del párrafo en el que estaba el punto. Si el punto está entre párrafos (en una serie de líneas en blanco, o en un límite), Alt-h (M-h) establece la región alrededor del párrafo que sigue al punto. Si hay líneas en blanco antes de la primera línea del párrafo, una de estas líneas en blanco se incluye en la región. Si la región ya está activa, el comando establece la marca sin cambiar el punto, y cada M-h posterior hace avanzar la marca un párrafo.

La definición de un párrafo depende del modo fundamental. En el modo Fundamental, así como en el modo Texto y otros modos relacionados, un párrafo está separado de los párrafos vecinos por una o más líneas en blanco, líneas que están vacías o que consisten únicamente en espacios, tabuladores y/o caracteres de salto de página. En los modos de lenguaje de programación, los párrafos suelen definirse de forma similar, de modo que se pueden utilizar los comandos de párrafo aunque no haya párrafos como tales en un programa.

Tenga en cuenta que una línea indentada no es en sí misma un salto de párrafo en el modo Texto. Si desea que las líneas sangradas separen los párrafos, utilice en su lugar el modo Texto con sangría de párrafo. Consulte el modo de texto.

Si establece un prefijo de relleno, los párrafos estarán delimitados por todas las líneas que no comiencen con el prefijo de relleno. Véase Texto de Relleno.

La definición precisa de un límite de párrafo está controlada por las variables paragraph-separate y paragraph-start. El valor de paragraph-start es una expresión regular que debe coincidir con las líneas que inician o separan párrafos (véase Sintaxis de expresiones regulares). El valor de paragraph-separate es otra expresión regular que debe coincidir con las líneas que separan párrafos sin formar parte de ningún párrafo (por ejemplo, las líneas en blanco). Las líneas que inician un nuevo párrafo y están contenidas en él deben coincidir sólo con paragraph-start, no con paragraph-separate. Por ejemplo, en el modo Fundamental, el inicio de párrafo es "\f\|[ \t]*$", y la separación de párrafos es "[ \t\f]*$".

Tenga en cuenta que paragraph-start y paragraph-separate se comparan con el texto del margen izquierdo, que no es necesariamente el principio de la línea, por lo que estas expresiones regulares (regexps) no deben usar ‘^’ como ancla, para garantizar que las funciones de párrafo funcionen igualmente dentro de una región de texto sangrado por un ajuste de margen.

Páginas

En algunos archivos de texto, el texto se divide en páginas delimitadas por el carácter de salto de página (código ASCII 12, también denominado ‘control-L’), que se muestra en Emacs como la secuencia de escape ‘^L’ (véase Cómo se muestra el texto). Tradicionalmente, cuando estos archivos de texto se imprimen en papel, cada carácter de salto de página fuerza un salto de página. La mayoría de los comandos del Editor lo tratan como cualquier otro carácter, así que puedes insertarlo con Ctrl-q Ctrl-l (C-q C-l), borrarlo con DEL (DEL), etc. Además, Emacs proporciona comandos para desplazarse por las páginas y operar sobre ellas.

Alt-x what-page (M-x what-page)
Muestra el número de página del punto, y el número de línea dentro de esa página.
Ctrl-x [ ( C-x [ )
Mueve el punto al límite de la página anterior (backward-page).
Ctrl-x ] ( C-x ] )
Mueve el punto al límite de la página siguiente (forward-page).
Ctrl-x Ctrl-p (C-x C-p)
Pone el punto y la marca alrededor de esta página (u otra página) (mark-page).
Ctrl-x l (C-x l)
Cuenta las líneas de esta página (count-lines-page).

Alt-x what-page (M-x what-page) cuenta las páginas desde el principio del archivo, y cuenta las líneas dentro de la página, mostrando ambos números en el área de eco.

El comando (C-x [, backward-page) mueve el punto inmediatamente después del delimitador de página anterior. Si el punto ya está justo después de un delimitador de página, se salta éste y se detiene en el anterior. Un argumento numérico sirve como cuenta de repetición. El comando C-x ] (avance de página) avanza hasta el siguiente delimitador de página.

El comando Ctrl-x Ctrl-p (C-x C-p, mark-page) pone el punto al principio de la página actual (después del delimitador de página al principio), y la marca al final de la página (después del delimitador de página al final).

Ctrl-x Ctrl-p Ctrl-w (C-x C-p C-w) es una forma práctica de matar una página para moverla a otro lugar. Si se desplaza a otro delimitador de página con Ctrl-x-[ ( C-x [ ) y Ctrl-x ] ( C-x ] ), y luego tira de la página eliminada, todas las páginas volverán a estar correctamente delimitadas. La razón por la que Ctrl-x Ctrl-p (C-x C-p) incluye sólo el siguiente delimitador de página en la región es para asegurar que esto funcione como se espera.

Un argumento numérico para Ctrl-x Ctrl-p (C-x C-p) especifica a qué página ir, en relación con la actual. Cero significa la página actual, 1 significa la página siguiente, y -1 significa la anterior.

El comando Ctrl-x l (C-x l, count-lines-page) es bueno para decidir dónde romper una página en dos. Muestra en el área de eco el número total de líneas en la página actual, y luego lo divide en las que preceden a la línea actual y las que siguen, como en

Page has 96 (72+25) lines (La página tiene 96 (72+25) líneas)

Observe que la suma está desviada en uno; esto es correcto si el punto no está al principio de una línea.

La variable delimitador de página controla dónde comienzan las páginas. Su valor es una expresión regular que coincide con el comienzo de una línea que separa las páginas (véase Sintaxis de expresiones regulares). El valor normal de esta variable es "^\f", que coincide con un carácter de salto de página al principio de una línea.

Comillas

Una forma común de citar es la convención de la máquina de escribir, que cita utilizando apóstrofes rectos ‘'así'’ o comillas dobles ‘"así"’. Otra forma común es la convención de las comillas curvas, que utiliza comillas simples o dobles a la izquierda o a la derecha ‘así’ o ”así” (11). En los archivos de texto, las comillas de máquina de escribir son simples y portátiles; las comillas curvas son menos ambiguas y suelen tener un aspecto más agradable.

Nota

(11) Los caracteres de comillas simples curvas son U+2018 MARCA DE COMILLAS SIMPLES IZQUIERDA y U+2019 MARCA DE COMILLAS SIMPLES DERECHA; las comillas dobles curvas son U+201C MARCA DE COMILLAS DOBLES IZQUIERDA y U+201D MARCA DE COMILLAS DOBLES DERECHA. En los terminales de texto que no pueden mostrar estos caracteres, el lector de información podría mostrarlos como los caracteres de comillas ASCII de la máquina de escribir.

El modo de comillas eléctricas facilita la escritura de comillas curvas. A medida que se escriben los caracteres, convierte opcionalmente ` en , ' en , `` en , y '' en . Es posible cambiar las comillas por defecto enumeradas arriba, personalizando la variable electric-quote-chars, una lista de cuatro caracteres, donde los elementos corresponden a la comilla simple izquierda, la comilla simple derecha, la comilla doble izquierda y la comilla doble derecha, respectivamente, cuyo valor por defecto es '(?‘ ?’ ?“ ?”).

Puede personalizar el comportamiento del modo Electric Quote mediante la configuración de las variables que controlan dónde está activo. Se activa en los párrafos de texto si electric-quote-paragraph es distinto de nil, en los comentarios de lenguaje de programación si electric-quote-comment es distinto de nil, y en las cadenas de lenguaje de programación si electric-quote-string es distinto de nil. El valor predeterminado para electric-quote-string es nil y t para las demás variables.

También puede establecer la opción electric-quote-replace-double a un valor no nulo. Entonces, escribiendo " inserta una comilla doble curva apropiada dependiendo del contexto: al principio del búfer o después de un salto de línea, espacio en blanco, paréntesis de apertura o carácter de comilla, y en caso contrario.

El modo de comillas eléctricas está desactivado por defecto. Para activarlo en un solo búfer, utilice Alt-x electric-quote-local-mode (M-x electric-quote-local-mode). Para activarlo globalmente, escriba Alt-electric-quote-mode (M-x electric-quote-mode). Para suprimirla en un solo uso, escriba Ctrl-q ` (C-q `) o Ctrl-q ' (C-q ') en lugar de ` o '. Para insertar una comilla curva incluso cuando la Cotización Eléctrica está desactivada o inactiva, puede escribir Ctrl-x 8 [ (C-x 8 [) para , Ctrl-x 8 ] (C-x 8 ]) para , Ctrl-x 8 { (C-x 8 {) para , y Ctrl-x 8 } (C-x 8 }) para ”. Véase Inserción de texto. Tenga en cuenta que el valor de electric-quote-chars no afecta a estas combinaciones de teclas, ya que no son combinaciones de teclas del modo electric-quote (electric-quote-mode), sino que están vinculadas en global-map.

Texto de Relleno

Rellenar un texto significa dividirlo en líneas que se ajusten a un ancho determinado. Emacs hace el relleno de dos maneras. En el modo de relleno automático, la inserción de texto con caracteres autoinsertables también lo rellena automáticamente. También hay comandos de relleno explícitos que puede utilizar al editar el texto.

Modo de relleno automático

El modo de relleno automático (Auto Fill mode) es un modo menor del búfer (véase Modos menores) en el que las líneas se rompen automáticamente cuando la línea se vuelve demasiado ancha y se escribe SPACE (SPC) o RETURN (RET).

Alt-x auto-fill-mode (M-x auto-fill-mode)
Activa o desactiva el modo de relleno automático.
SPACE (SCP)
RETURN (RET)
En el modo de Relleno Automático, rompe las líneas cuando es apropiado.

El comando de modo Alt-x auto-fill-mode (M-x auto-fill-mode) activa el modo Auto Fill en el buffer actual. Como cualquier otro modo menor, con un argumento numérico positivo, activa el modo Auto Fill, y con un argumento negativo lo desactiva. Para habilitar el modo de Relleno Automático automáticamente en ciertos modos mayores, añada auto-fill-mode a los ganchos de modo (hook) (ver Modos Mayores). Cuando el modo de Relleno Automático está activado, el indicador de modo ‘Fill’ aparece en la línea de modo (ver La línea de modo).

El modo de auto-relleno rompe las líneas automáticamente en los lugares apropiados cuando las líneas se alargan más allá del ancho deseado. Este salto de línea sólo se produce cuando se escribe SPACE (SPC) o RETURN (RET). Si desea insertar un espacio o una nueva línea sin permitir el salto de línea, escriba Ctrl-q SPACE (C-q SPC) o Ctrl-q Ctrl-j (C-q C-j) respectivamente. Además, Ctrl-o (C-o) inserta una nueva línea sin romper la línea.

El lugar donde Auto Fill rompe una línea depende de los caracteres de la línea. Para los caracteres de ASCII, latín y la mayoría de los otros scripts, Emacs rompe una línea en los caracteres de espacio, para mantener las palabras intactas. Pero para las escrituras CJK, una línea puede romperse entre dos caracteres cualquiera. (Si cargas la biblioteca kinsoku, el Editor evitará romper una línea entre ciertos pares de caracteres CJK, donde las reglas especiales lo prohíben).

Cuando el modo de Relleno Automático rompe una línea, intenta obedecer el prefijo de relleno adaptativo: si se puede deducir un prefijo de relleno de la primera y/o segunda línea del párrafo actual, se inserta en la nueva línea (ver Relleno Adaptativo). En caso contrario, la nueva línea se sangrará, como si se hubiera tecleado TAB en ella (véase Sangría). En el modo de lenguaje de programación, si se interrumpe una línea en medio de un comentario, éste se divide insertando nuevos delimitadores de comentario según corresponda.

El modo de relleno automático no rellena párrafos enteros; rompe líneas pero no las fusiona. Por lo tanto, la edición en medio de un párrafo puede dar lugar a un párrafo que no se rellena correctamente. Para rellenarlo, llame a los comandos de relleno explícito (véase Comandos de relleno explícito).

Una función similar que envuelve las líneas largas automáticamente en el momento de la visualización es el Modo de línea visual (véase Modo de línea visual).

Comandos de relleno explícitos

Alt-q (M-q)
Rellena el párrafo actual (fill-paragraph).
Ctrl-x f (C-x f)
Establece la columna de relleno (set-fill-column).
Alt-x fill-region (M-x fill-region)
Rellena cada párrafo de la región (fill-region).
Alt-x fill-region-as-paragraph (M-x fill-region-as-paragraph)
Rellena la región, considerándola como un párrafo.
Alt-x center-line (M-x center-line)
Centrar una línea.

El comando Alt-q fill-paragraph (M-q, fill-paragraph) rellena el párrafo actual. Redistribuye los saltos de línea dentro del párrafo, y elimina el exceso de espacio y de caracteres de tabulación que se producen dentro del párrafo, de forma que las líneas acaban encajando dentro de una determinada anchura máxima. Al igual que el modo de relleno automático, éste y otros comandos de relleno suelen romper las líneas en los caracteres de espacio, pero para los caracteres CJK estos comandos pueden romper una línea entre casi cualquier par de caracteres, y también pueden obedecer las reglas kinsoku. Véase el modo de relleno automático.

Normalmente, Alt-q (M-q) actúa en el párrafo donde se encuentra el punto, pero si el punto está entre párrafos, actúa en el párrafo posterior al punto. Si la región está activa, actúa en cambio sobre el texto de la región. También puede llamar a Alt-x fill-region (M-x fill-region) para rellenar específicamente el texto de la región.

Alt-q (M-q) y fill-region utilizan los criterios habituales de Emacs para encontrar los límites de los párrafos (ver Párrafos). Para un mayor control, puede utilizar Alt-x fill-region-as-paragraph (M-x fill-region-as-paragraph), que rellena todo lo que hay entre el punto y la marca como un único párrafo. Este comando elimina cualquier línea en blanco dentro de la región, por lo que los bloques de texto separados terminan combinados en un solo bloque.

Un argumento numérico para Alt-q (M-q) le dice que justifique el texto además de rellenarlo. Esto significa que se insertan espacios adicionales para que el margen derecho quede alineado exactamente en la columna de relleno. Para eliminar los espacios adicionales, utilice Alt-q (M-q) sin argumento. (Lo mismo ocurre con fill-region).

El ancho máximo de línea para el relleno se especifica mediante la variable local del buffer fill-column. El valor por defecto (ver Variables Locales) es 70. La forma más sencilla de establecer la columna de relleno en el búfer actual es utilizar el comando Ctrl-x f (C-x f, set-fill-column). Con un argumento numérico, utiliza ese valor como la nueva columna de relleno. Con sólo Ctrl-u (C-u) como argumento, establece la columna de relleno en la posición horizontal actual del punto.

El comando Alt-x center-line (M-x center-line) centra la línea actual dentro de la columna de relleno actual. Con un argumento n, centra n líneas individualmente y las pasa. Esta vinculación la realiza el modo Texto y sólo está disponible en ese modo y en otros relacionados (ver Modo Texto).

Por defecto, Emacs considera un punto seguido de dos espacios o de una nueva línea como el final de una frase; un punto seguido de un solo espacio indica una abreviatura, no el final de una frase. En consecuencia, los comandos de relleno no romperán una línea después de un punto seguido de un solo espacio. Si establece la variable sentence-end-double-space a nil, los comandos de relleno romperán una línea después de un punto seguido de un espacio, y pondrán sólo un espacio después de cada punto. Vea Sentencias, para otros efectos y posibles inconvenientes de esto.

Si la variable colon-double-space es distinta de nil, los comandos de relleno ponen dos espacios después de los dos puntos.

Para especificar condiciones adicionales en las que no se permite el salto de línea, personalice la variable hook anormal fill-nobreak-predicate (ver Hooks). Cada función en este gancho es llamada sin argumentos, con el punto posicionado donde Emacs está considerando romper una línea. Si una función devuelve un valor no nulo, Emacs no romperá la línea allí. Las funciones que puedes usar aquí incluyen: fill-single-word-nobreak-p (no rompe después de la primera palabra de una frase o antes de la última); fill-single-char-nobreak-p (no rompe después de una palabra de una letra precedida por un carácter de espacio en blanco); fill-french-nobreak-p (no rompe después de ‘(’ o antes de ‘)’, ‘:’ o ‘?’ ); y fill-polish-nobreak-p (no rompe después de una palabra de una letra, incluso si está precedida por un carácter que no sea un espacio en blanco).

Emacs puede mostrar un indicador en la posición de columna de relleno utilizando el modo de indicador de columna de relleno (ver indicador de columna de relleno).

El prefijo de relleno

La función de prefijo de relleno permite rellenar los párrafos de forma que cada línea comience con una cadena de caracteres especial (como una secuencia de espacios, dando lugar a un párrafo sangrado). Puede especificar un prefijo de relleno explícitamente; de lo contrario, Emacs intenta deducir uno automáticamente (véase Relleno adaptativo).

Ctrl-x . (C-x .)
Establece el prefijo de relleno (set-fill-prefix).
Alt-q (M-q)
Rellena un párrafo usando el prefijo de relleno actual (fill-paragraph).
Alt-x fill-individual-paragraph (M-x fill-individual-paragraph)
Rellena la región, considerando cada cambio de sangría como el inicio de un nuevo párrafo.
Alt-x fill-nonuniform-paragraph (M-x fill-nonuniform-paragraph)

Para especificar un prefijo de relleno para el búfer actual, muévase a una línea que comience con el prefijo deseado, ponga punto al final del prefijo y escriba Ctrl-x . (C-x ., set-fill-prefix). (Para desactivar el prefijo de relleno, especifique un prefijo vacío: escriba Ctrl-x . con punto al principio de la línea.

Cuando un prefijo de relleno está en efecto, los comandos de relleno eliminan el prefijo de relleno de cada línea del párrafo antes de rellenar, y lo insertan en cada línea después de rellenar. (El comienzo de la primera línea del párrafo se deja sin cambios, ya que a menudo es intencionadamente diferente). El modo de relleno automático también inserta el prefijo de relleno automáticamente cuando hace una nueva línea (ver Modo de relleno automático). El comando Ctrl-o (C-o) inserta el prefijo de relleno en las nuevas líneas que crea, cuando lo utiliza al principio de una línea (ver Líneas en blanco). A la inversa, el comando Alt-^ (M-^) borra el prefijo (si se produce) después de la nueva línea que borra (ver Sangría).

Por ejemplo, si la columna de relleno (fill-column) es 40 y el prefijo de relleno es ‘;; ’, entonces Alt-q (M-q) en el siguiente texto

;; Este es un
;; ejemplo de un párrafo
;; dentro de un comentario de estilo Lisp.

produce esto:

;; Este es un ejemplo de un párrafo
;; dentro de un comentario de estilo Lisp.

Las líneas que no comienzan con el prefijo de relleno se consideran como inicio de párrafo, tanto en Alt-q (M-q) como en los comandos de párrafo; esto da buenos resultados para los párrafos con sangría colgante (cada línea sangrada excepto la primera). Las líneas que quedan en blanco o con sangría una vez eliminado el prefijo también separan o inician párrafos; esto es lo que se desea si se escriben comentarios de varios párrafos con un delimitador de comentario en cada línea.

Puede utilizar Alt-x fill-individual-paragraphs (M-x fill-individual-paragraphs) para establecer el prefijo de relleno para cada párrafo automáticamente. Este comando divide la región en párrafos, tratando cada cambio en la cantidad de sangría como el comienzo de un nuevo párrafo, y rellena cada uno de estos párrafos. Así, todas las líneas de un párrafo tienen la misma cantidad de sangría. Esa sangría sirve como prefijo de relleno para ese párrafo.

Alt-x fill-nonuniform-paragraphs (M-x fill-nonuniform-paragraphs) es un comando similar que divide la región en párrafos de una manera diferente. Considera que sólo las líneas que separan los párrafos (definidas por paragraph-separate) comienzan un nuevo párrafo. Como esto significa que las líneas de un párrafo pueden tener diferentes cantidades de sangría, el prefijo de relleno utilizado es la menor cantidad de sangría de cualquiera de las líneas del párrafo. Esto da buenos resultados con estilos que sangren la primera línea de un párrafo más o menos que el resto del párrafo.

El prefijo de relleno se almacena en la variable fill-prefix. Su valor es una cadena, o nil cuando no hay prefijo de relleno. Esta es una variable por búfer; la alteración de la variable afecta sólo al búfer actual, pero hay un valor por defecto que también se puede cambiar. Ver Variables Locales.

La propiedad de texto de sangría proporciona otra forma de controlar la cantidad de sangría que reciben los párrafos. Véase Sangría en el texto enriquecido.

Relleno adaptativo

Los comandos de relleno pueden deducir el prefijo de relleno adecuado para un párrafo de forma automática en ciertos casos: los espacios en blanco o ciertos caracteres de puntuación al principio de una línea se propagan a todas las líneas del párrafo.

Si el párrafo tiene dos o más líneas, el prefijo de relleno se toma de la segunda línea del párrafo, pero sólo si aparece también en la primera línea.

Si un párrafo tiene sólo una línea, los comandos de relleno pueden tomar un prefijo de esa línea. La decisión es complicada porque hay tres cosas razonables que se pueden hacer en ese caso:

  • Utilizar el prefijo de la primera línea en todas las líneas del párrafo.
  • Indentar las líneas subsiguientes con espacios en blanco, para que queden alineadas bajo el texto que sigue al prefijo de la primera línea, pero sin copiar realmente el prefijo de la primera línea.
  • No hacer nada especial con la segunda línea y las siguientes.

Estos tres estilos de formato son de uso común. Así que los comandos de relleno tratan de determinar lo que usted desea, basándose en el prefijo que aparece y en el modo principal. He aquí cómo.

Si el prefijo encontrado en la primera línea coincide con adaptive-fill-first-line-regexp, o si parece ser una secuencia de inicio de comentario (esto depende del modo principal), entonces el prefijo encontrado se utiliza para rellenar el párrafo, siempre que no actúe como inicio de párrafo en líneas posteriores.

En caso contrario, el prefijo encontrado se convierte en un número equivalente de espacios, y esos espacios se utilizan como prefijo de relleno para el resto de las líneas, siempre que no actúen como inicio de párrafo en las líneas siguientes.

En el modo Texto, y en otros modos en los que sólo las líneas en blanco y los delimitadores de página separan los párrafos, el prefijo elegido por el relleno adaptativo nunca actúa como iniciador de párrafo, por lo que siempre puede utilizarse para el relleno.

La variable adaptive-fill-regexp determina qué tipos de inicios de línea pueden servir como prefijo de relleno: se utiliza cualquier carácter de inicio de línea que coincida con esta expresión regular. Si establece la variable adaptive-fill-mode a nil, el prefijo de relleno nunca se elige automáticamente.

Puede especificar formas más complejas de elegir un prefijo de relleno automáticamente estableciendo la variable adaptive-fill-function a una función. Esta función se llama con un punto después del margen izquierdo de una línea, y debe devolver el prefijo de relleno apropiado basado en esa línea. Si devuelve nil, adaptive-fill-regex tiene la oportunidad de encontrar un prefijo.

Comandos de conversión de mayúsculas y minúsculas

Emacs tiene comandos para convertir una sola palabra o cualquier rango arbitrario de texto a mayúsculas o minúsculas.

Alt-l (M-l)
Convierte la siguiente palabra a minúsculas (downcase-word).
Alt-u (M-u)
Convierte la siguiente palabra en mayúscula (upcase-word).
Alt-c (M-c)
Poner en mayúscula la palabra siguiente (capitalize-word).
Ctrl-x Ctrl-l (C-x C-l)
Convertir la región en minúscula (downcase-region).
Ctrl-x Ctrl-u (C-x C-u)
Convertir la región en mayúscula (upcase-region).

Alt-l (M-l, downcase-word) convierte en minúscula la palabra que sigue al punto, pasando por encima de él. Así, la repetición de Alt-l (M-l) convierte las palabras sucesivas. Alt-u (M-u, upcase-word) convierte en cambio a mayúsculas, mientras que Alt-c (M-c, capitalize-word) pone la primera letra de la palabra en mayúsculas y el resto en minúsculas. Todos estos comandos convierten varias palabras a la vez si se les da un argumento. Son especialmente convenientes para convertir una gran cantidad de texto de todas las mayúsculas a minúsculas mixtas, porque puedes moverte a través del texto usando Alt-l (M-l), Alt-u (M-u) o Alt-c (M-c) en cada palabra según sea apropiado, usando ocasionalmente Alt-f (M-f) en su lugar para saltar una palabra.

Cuando se da un argumento negativo, los comandos de conversión de mayúsculas y minúsculas se aplican al número apropiado de palabras antes del punto, pero no mueven el punto. Esto es conveniente cuando se acaba de escribir una palabra en el caso incorrecto: se puede dar el comando de conversión de mayúsculas y minúsculas y continuar escribiendo.

Si el comando de conversión de mayúsculas y minúsculas se da en medio de una palabra, se aplica sólo a la parte de la palabra que sigue al punto. (Esto es comparable a lo que hace Alt-d (M-d, kill-word). Con un argumento negativo, la conversión de mayúsculas y minúsculas se aplica sólo a la parte de la palabra anterior al punto.

Los otros comandos de conversión de mayúsculas y minúsculas son Ctrl-x Ctrl-u (C-x C-u, upcase-region) y Ctrl-x Ctrl-l (C-x C-l, downcase-region), que convierten todo lo que hay entre el punto y la marca a la mayúscula y minúscula especificada. El punto y la marca no se mueven.

Los comandos de conversión de casos de región upcase-region y downcase-region están normalmente desactivados. Esto significa que piden confirmación si intenta utilizarlos. Cuando confirme, puede habilitar el comando, lo que significa que no pedirá confirmación de nuevo. Consulte la sección "Desactivación de comandos".

Modo Texto

El modo Texto es un modo principal para editar archivos de texto en lenguaje humano. Los archivos que tienen nombres que terminan en la extensión .txt se abren normalmente en modo Texto (ver Elección de los modos de archivo). Para cambiar explícitamente al modo Texto, escriba Alt-x text-mode (M-x text-mode).

En el modo Texto, sólo las líneas en blanco y los delimitadores de página separan los párrafos. Como resultado, los párrafos pueden tener sangría, y el llenado adaptativo determina qué sangría utilizar cuando se llena un párrafo. Véase Relleno adaptativo.

En el modo Texto, el comando TAB (TAB, indent-for-tab-command) normalmente inserta espacios en blanco hasta la siguiente parada de tabulación, en lugar de sangrar la línea actual. Vea Sangría, para más detalles.

El modo texto desactiva las funciones relacionadas con los comentarios, excepto cuando las invoca explícitamente. Cambia la tabla de sintaxis para que los apóstrofos se consideren parte de las palabras (por ejemplo, ‘no’ se considera una palabra). Sin embargo, si una palabra comienza con un apóstrofe, se trata como un prefijo a efectos de mayúsculas (por ejemplo, Alt-c (M-c) convierte ‘'hola'’ en ‘'Hola'’, como es de esperar).

Si se sangraran las primeras líneas de los párrafos, se debería utilizar el modo de texto con sangría de párrafo Alt-x (M-x, paragraph-indent-text-mode) en lugar del modo de texto. En ese modo, no es necesario tener líneas en blanco entre párrafos, porque la sangría de la primera línea es suficiente para iniciar un párrafo; sin embargo, no se admiten los párrafos en los que cada línea está sangrada. Use Alt-x paragraph-indent-minor-mode (M-x paragraph-indent-minor-mode) para habilitar un modo menor equivalente para situaciones en las que no debería cambiar el modo mayor, en la composición del correo, por ejemplo.

El modo texto vincula Alt-TAB (M-TAB) a ispell-complete-word. Este comando realiza la finalización de la palabra parcial en el búfer antes del punto, utilizando el diccionario ortográfico como espacio de palabras posibles. Véase Comprobar y corregir la ortografía. Si su gestor de ventanas define M-TAB para cambiar de ventana, puede escribir ESC TAB (ESC TAB) o Ctrl-Alt-i (C-M-i) en su lugar.

Al entrar en el modo de texto se ejecuta el gancho de modo: text-mode-hook (véase Modos principales).

Las siguientes secciones describen varios modos principales que se derivan del modo Texto. Estos derivados comparten la mayoría de las características del modo Texto descritas anteriormente. En particular, los derivados del modo Texto ejecutan text-mode-hook antes de ejecutar sus propios hooks de modo.

Modo Contorno

El modo Esquema es un modo principal derivado del modo Texto, que está especializado en la edición de esquemas. Proporciona comandos para navegar entre las entradas de la estructura del esquema, y comandos para hacer que partes de un búfer sean temporalmente invisibles, de modo que la estructura del esquema pueda verse más fácilmente. Escriba Alt-x outline-mode (M-x outline-mode) para cambiar al modo Outline. Al entrar en el modo Outline se ejecuta el gancho text-mode-hook seguido de otro gancho: outline-mode-hook (ver Hooks).

Cuando se utiliza un comando de modo Outline para hacer invisible una línea (ver Comandos de visibilidad Outline), la línea desaparece de la pantalla. Se muestra una elipsis (tres puntos seguidos) al final de la línea visible anterior, para indicar el texto oculto. Varias líneas invisibles consecutivas producen una sola elipsis.

Los comandos de edición que operan sobre líneas, como Ctrl-n (C-n) y Ctrl-p (C-p), tratan el texto de la línea invisible como parte de la línea visible anterior. Matar la elipsis al final de una línea visible realmente mata todo el texto invisible siguiente asociado a la elipsis.

El modo menor de contorno es un modo menor local del búfer que proporciona los mismos comandos que el modo mayor, el modo de contorno, pero puede utilizarse junto con otros modos mayores. Puede teclear Alt-x outline-minor-mode (M-x outline-minor-mode) para activar el modo menor Outline en el buffer actual, o utilizar una configuración de variable local de archivo para activarlo en un archivo específico (ver Variables locales en archivos).

El modo mayor, el modo Outline, proporciona enlaces de teclas especiales en el prefijo Ctrl-c (C-c). El modo menor, Outline, proporciona un enlace similar con Ctrl-c @ (C-c @) como prefijo; esto es para reducir los conflictos con los comandos especiales del modo mayor. (La variable outline-minor-mode-prefix controla el prefijo utilizado).

Si la opción de usuario outline-minor-mode-cycle no es nula, las teclas TAB (TAB) y Shift-TAB (S-TAB) se activan en las líneas de encabezamiento del esquema. TAB (TAB) hace un ciclo para ocultar, mostrar el subtítulo y mostrar todo para la sección actual. Shift-TAB (S-TAB) hace lo mismo para todo el buffer.

Formato de los esquemas

El modo de esquema supone que las líneas del búfer son de dos tipos: líneas de encabezamiento y líneas de cuerpo. Una línea de encabezamiento representa un tema en el esquema. Las líneas de encabezamiento comienzan con uno o más caracteres de asterisco (‘*’); el número de asteriscos determina la profundidad del encabezamiento en la estructura del esquema. Así, una línea de encabezamiento con un ‘*’ es un tema principal; todas las líneas de encabezamiento con dos ‘*’ entre ella y el siguiente encabezamiento con un ‘*’ son sus subtemas; y así sucesivamente. Cualquier línea que no sea un título es una línea de cuerpo. Las líneas de cuerpo pertenecen a la línea de encabezamiento precedente. He aquí un ejemplo:

* Alimentación
Este es el cuerpo
que dice algo sobre el tema de la comida.

** Comida deliciosa
Este es el cuerpo del encabezado de segundo nivel.

** Comida desagradable
Esto podría tener
un cuerpo también, con
varias líneas.

*** Comida de Dormitorio

* Refugio
Otro tema de primer nivel con su línea de cabecera.

Una línea de encabezamiento junto con todas las líneas de cuerpo siguientes se denomina colectivamente una entrada. Una línea de encabezamiento junto con todas las siguientes líneas de encabezamiento más profundas y sus líneas de cuerpo se denomina subárbol.

Puede personalizar el criterio para distinguir las líneas de encabezamiento estableciendo la variable outline-regexp. (Las formas recomendadas de hacerlo son en una función de modo principal o con una variable local de archivo). Cualquier línea cuyo comienzo tenga una coincidencia con esta regexp se considera una línea de encabezamiento. Las coincidencias que comienzan dentro de una línea (no en el margen izquierdo) no cuentan.

La longitud del texto coincidente determina el nivel del encabezamiento; las coincidencias más largas hacen un nivel más profundo. Así, por ejemplo, si un formateador de texto tiene los comandos ‘@capítulo’, ‘@sección’ y ‘@subsección’ para dividir el documento en capítulos y secciones, puede hacer que esas líneas cuenten como líneas de encabezamiento estableciendo outline-regexp a ‘"@cap\\|@\(sub\)*sección"’. Fíjese en el truco: las dos palabras ‘capítulo’ y ‘sección’ son igual de largas, pero al definir la regexp para que coincida sólo con ‘cap’ nos aseguramos de que la longitud del texto coincidente en un encabezado de capítulo es más corta, de modo que el modo Esquema sabrá que las secciones están contenidas en los capítulos. Esto funciona siempre que ningún otro comando comience con ‘@cap’.

Puede especificar explícitamente una regla para calcular el nivel de una línea de encabezamiento estableciendo la variable outline-level. El valor de outline-level debe ser una función que no tome argumentos y devuelva el nivel del encabezado actual. Las formas recomendadas de establecer esta variable son en un comando de modo principal o con una variable local de archivo.

Comandos de movimiento de contorno

El modo Outline proporciona comandos de movimiento especiales que se mueven hacia atrás y hacia delante en las líneas de encabezamiento.

Ctrl-c Ctrl-n (C-c C-n)
Mueve el punto a la siguiente línea de encabezamiento visible (outline-next-visible-heading).
Ctrl-c Ctrl-p (C-c C-p)
Mueve el punto a la línea de encabezamiento visible anterior (outline-previous-visible-heading).
Ctrl-c Ctrl-f (C-c C-f)
Mueve el punto a la siguiente línea de encabezado visible en el mismo nivel en el que se encuentra el punto (outline-forward-same-level).
Ctrl-c Ctrl-b (C-c C-b)
Mueve el punto a la anterior línea de encabezamiento visible en el mismo nivel (outilne-backward-same-level).
Ctrl-c Ctrl-u (C-c C-u)
Mover el punto hacia arriba a una línea de encabezamiento visible de nivel inferior (más inclusivo) (outline-up-heading).

Todos los comandos anteriores aceptan argumentos numéricos como cuentas de repetición. Por ejemplo, Ctrl-c Ctrl-f (C-c C-f), cuando se le da un argumento, se mueve hacia adelante esa cantidad de líneas de encabezado visibles en el mismo nivel, y Ctrl-c Ctrl-u (C-c C-u) con un argumento se mueve fuera de esa cantidad de niveles anidados.

Comandos de visibilidad del contorno

El modo de contorno proporciona varios comandos para ocultar o revelar temporalmente partes del búfer, basándose en la estructura del contorno. Estos comandos no se pueden deshacer; sus efectos simplemente no son registrados por el mecanismo de deshacer, por lo que puede deshacerlos justo después (ver Deshacer).

Muchos de estos comandos actúan sobre la línea de encabezado actual. Si el punto está en una línea de encabezado, esa es la línea de encabezado actual; si el punto está en una línea de cuerpo, la línea de encabezado actual es la línea de encabezado precedente más cercana.

Ctrl-c Ctrl-c (C-c C-c)
Hace invisible el cuerpo de la línea de encabezado actual (outline-hide-entry).
Ctrl-c Ctrl-e (C-c C-e)
Hace visible el cuerpo de la línea de encabezado actual (outline-show-entry).
Ctrl-c Ctrl-d (C-c C-d)
Hace invisible todo bajo el encabezado actual, sin incluir el encabezado mismo (outline-hide-subtree).
Ctrl-c Ctrl-s (C-c C-s)
Hace visible todo bajo el encabezado actual, incluyendo el cuerpo, los subencabezados y sus cuerpos (outline-show-subtree).
Ctrl-c Ctrl-l (C-c C-l)
Hace invisible el cuerpo de la línea de encabezado actual, y de todos sus subencabezados (outline-hide-leaves).
Ctrl-c Ctrl-k (C-c C-k)
Hace visibles todos los subtítulos de la línea de encabezado actual, en todos los niveles (outline-show-branches).
Ctrl-c Ctrl-i (C-c C-i)
Hace visibles los subtítulos inmediatos (un nivel abajo) de la línea de encabezado actual (outline-show-children).
Ctrl-c Ctrl-t (C-c C-t)
Hace invisibles todas las líneas del cuerpo en el buffer (outline-hide-body).
Ctrl-c Ctrl-a (C-c C-a)
Hace visibles todas las líneas del buffer (outline-show-all).
Ctrl-c Ctrl-q (C-c C-q)
Oculta todo excepto los n niveles superiores de las lineas de encabezado (outline-hide-sublevels).
Ctrl-o Ctrl-o (C-c C-o)
Oculta todo excepto el encabezado o cuerpo en el que está ese punto, más los encabezados que suben desde ahí hasta el nivel superior del contorno (outline-hide-other).

Los comandos más sencillos son Ctrl-c Ctrl-Ctrl-o (C-c C-o, outline-hide-entry), que oculta las líneas del cuerpo que siguen directamente a la línea del encabezado actual, y Ctrl-c Ctrl-e (C-c C-e, outline-show-entry), que las revela. Los subtítulos y sus cuerpos no se ven afectados.

Los comandos Ctrl-c Ctrl-d (C-c C-d, outline-hide-subtree) y Ctrl-c Ctrl-s (C-c C-s, outline-show-subtree) son más potentes. Se aplican al subárbol de la línea de encabezado actual: su cuerpo, todos sus subencabezados, tanto directos como indirectos, y todos sus cuerpos.

El comando Ctrl-c Ctrl-l (C-c C-l, outline-hide-leaves) oculta el cuerpo de la línea de encabezado actual, así como todos los cuerpos de su subárbol; los subencabezados mismos quedan visibles. El comando Ctrl-c Ctrl-k (C-c C-k, outline-show-branches) revela los subtítulos, si se habían ocultado previamente (por ejemplo, con Ctrl-c Ctrl-d (C-c C-d)). El comando Ctrl-c Ctrl-i (C-c C-i, outline-show-children) es una versión más débil de éste; revela sólo los subtítulos directos, es decir, los que están un nivel por debajo.

El comando Ctrl-c Ctrl-o (C-c C-o, outline-hide-other) oculta todo excepto la entrada en la que se encuentra ese punto, además de sus padres (los encabezados que suben desde allí hasta el nivel superior en el esquema) y los encabezados de nivel superior. También revela las líneas del cuerpo que preceden al primer encabezado en el buffer.

Los demás comandos afectan a todo el buffer. Ctrl-c Ctrl-t (C-c C-t, outline-hide-body) hace que todas las líneas del cuerpo sean invisibles, de modo que sólo se vea la estructura del contorno (como excepción especial, no ocultará las líneas de la parte superior del archivo, que preceden a la primera línea de la cabecera, aunque éstas sean técnicamente líneas del cuerpo). Ctrl-c Ctrl-a (C-c C-a, outline-show-all) hace visibles todas las líneas. Ctrl-c Ctrl-q (C-c C-q, outline-hide-sublevels) oculta todos los encabezados excepto los de nivel superior al nivel de la línea de encabezado actual (por defecto 1 si el punto no está en un encabezado); con un argumento numérico n, oculta todo excepto los n niveles superiores de las líneas de encabezado. Tenga en cuenta que revela completamente todos los n niveles superiores y las líneas del cuerpo antes del primer encabezado.

Outline también proporciona dos comandos para cambiar la visibilidad de cada sección y de todo el buffer. Al escribir TAB (TAB, outline-cycle) en un encabezado, la sección actual se mueve entre los estados "ocultar todo" (hide all), "subencabezados" (subheading) y "mostrar todo" (show all). Si se escribe Shift-TAB (S-TAB, outline-cycle-buffer), la memoria intermedia se mueve entre los estados "sólo los títulos de nivel superior" (only top-level headings), "todos los títulos y subtítulos" (all headings and subheadings) y "mostrar todo" (show all).

Cuando la búsqueda incremental encuentra un texto que está oculto por el modo Esquema, hace visible esa parte del buffer. Si sale de la búsqueda en esa posición, el texto sigue siendo visible. Para alternar si una búsqueda incremental activa puede coincidir con el texto oculto o no, escriba Alt-s i (M-s i). Para cambiar el valor predeterminado para futuras búsquedas, personalice la opciónsearch-invisible. (Esta opción también afecta a la forma en que las funciones de query-replace (consulta-sustitución) y otras relacionadas tratan el texto oculto, véase Consulta-sustitución). También puede hacer visible automáticamente el texto a medida que navega por él utilizando el modo Revelar (Alt-x reveal-mode (M-x reveal-mode)), un modo menor del búfer.

Visualización de un esquema en varias vistas

Puede mostrar dos vistas de un mismo contorno al mismo tiempo, en ventanas diferentes. Para ello, debe crear un búfer indirecto utilizando Alt-x make-indirect-buffer (M-x make-indirect-buffer). El primer argumento de este comando es el nombre del búfer del contorno existente, y su segundo argumento es el nombre a utilizar para el nuevo búfer indirecto. Véase Bufferes indirectos.

Una vez que el buffer indirecto existe, puedes mostrarlo en una ventana de forma normal, con Ctrl-x 4 b u (C-x 4 b u) otros comandos de Emacs. Los comandos del modo Outline para mostrar y ocultar partes del texto operan en cada búfer independientemente; como resultado, cada búfer puede tener su propia vista. Si quieres más de dos vistas en el mismo esquema, crea búferes indirectos adicionales.

Edición de pliegues

El paquete Foldout amplía el modo Outline y Outline minor con comandos de plegado. La idea del plegado es que se amplía una porción anidada del esquema, mientras se ocultan sus parientes en niveles superiores.

Considere un búfer en modo Esquema con todo el texto y los subtítulos bajo los encabezados de nivel 1 ocultos. Para ver lo que está oculto bajo uno de estos encabezados, puede usar Ctrl-c Ctrl-e (C-c C-e, M-x outline-show-entry) para exponer el cuerpo, o Ctrl-c Ctrl-i(C-c C-i) para exponer los encabezados hijos (nivel 2).

Con Foldout, se utiliza Ctrl-c Ctrl-z (C-c C-z, M-x foldout-zoom-subtree). Esto expone el cuerpo y los subtítulos hijos, y reduce el búfer para que sólo sean visibles el encabezado del nivel 1, el cuerpo y los encabezados del nivel 2. Ahora, para mirar debajo de uno de los encabezados del nivel 2, sitúe el cursor sobre él y utilice Ctrl-c Ctrl-z (C-c C-z) de nuevo. De este modo, el cuerpo del nivel 2 y sus subtítulos hijos del nivel 3 quedan al descubierto y el búfer se reduce de nuevo. El zoom en los sucesivos subtítulos puede hacerse tanto como se desee. Una cadena en la línea de modo muestra la profundidad a la que se ha llegado.

Cuando se amplía un título, para ver sólo los subtítulos secundarios se especifica un argumento numérico: Ctrl-u Ctrl-c Ctrl-z (C-u C-c C-z). También se puede especificar el número de niveles de hijos (compare M-x outline-show-children), por ejemplo, Alt-2 Ctrl-c Ctrl-z (M-2 C-c C-z) expone dos niveles de subtítulos hijos. Alternativamente, se puede especificar el cuerpo con un argumento negativo: Alt--- Ctrl-c Ctrl-z (M-- C-c C-z). El subárbol completo puede ser expandido, de manera similar a Ctrl-c Ctrl-s (C-c C-s, M-x outline-show-subtree), especificando un argumento cero: Alt-0 Ctrl-c Ctrl-z (M-0 C-c C-z).

Mientras esté ampliado, podrá seguir utilizando las funciones de exposición y ocultación del modo Outline sin que le moleste el Foldout. Además, como el búfer está reducido, las acciones de edición global sólo afectarán al texto que se encuentre bajo el encabezado ampliado. Esto es útil para restringir los cambios a un capítulo o sección concreta del documento.

Para deshacer el zoom (salir) de un pliegue, utilice Ctrl-c Ctrt-x (C-c C-x, M-x foldout-exit-fold). Esto oculta todo el texto y los subtítulos bajo el título de nivel superior y le devuelve a la vista anterior del búfer. Especificando un argumento numérico se sale de ese número de niveles de pliegues. Si se especifica un argumento cero, se sale de todos los pliegues.

Para cancelar el estrechamiento de un pliegue sin ocultar el texto y los subtítulos, especifique un argumento negativo. Por ejemplo, Alt--2 Ctrl-c Ctrl-x (M--2 C-c C-x) sale de dos pliegues y deja el texto y los subtítulos expuestos.

El modo de plegado también proporciona comandos de ratón para entrar y salir de los pliegues, y para mostrar y ocultar el texto:

Ctrl- (C-Mouse-1) amplía el título sobre el que se ha hecho clic
un solo clic: expone el cuerpo.
doble clic: muestra los subtítulos.
triple clic: muestra el cuerpo y los subtítulos.
cuádruple clic: expone todo el subárbol.
Ctrl- (C-Mouse-2) expone el texto bajo el título sobre el que se ha hecho clic
un clic: expone el cuerpo.
doble clic: expone los subtítulos.
triple clic: expone el cuerpo y los subtítulos.
cuádruple clic: expone todo el subárbol.
Ctrl- (C-Mouse-3) oculta el texto bajo el título sobre el que se ha hecho clic o sale del pliegue
un clic: oculta el subárbol.
doble clic: salir del pliegue y ocultar el texto.
triple clic: salir del pliegue sin ocultar el texto.
cuádruple clic: salir de todos los pliegues y ocultar el texto.

Puedes especificar diferentes teclas modificadoras (en lugar de Ctrl-Alt- (Ctrl-Meta-)) configurando foldout-mouse-modifiers; pero si ya has cargado la biblioteca foldout.el, debes volver a cargarla para que esto tenga efecto.

Para utilizar el paquete Foldout, puedes escribir Alt-x load-library RETURN foldout RETURN (M-x load-library RET foldout RET); o puedes hacer que lo haga automáticamente poniendo lo siguiente en tu archivo de inicio:

(with-eval-after-load "outline"
  (require 'foldout))

Modo Org

El modo Org es una variante del modo Outline para usar Emacs como un organizador y/o sistema de autoría. Los archivos con nombres que terminan en la extensión .org se abren en modo Org (ver Elección de los modos de archivo). Para cambiar explícitamente al modo Org, escriba Alt-x org-mode (M-x org-mode).

En el modo Org, al igual que en el modo Outline, cada entrada tiene una línea de encabezado que comienza con uno o más caracteres ‘*’. Ver Formato de Esquemas. Además, cualquier línea que comience con el carácter ‘#’ se trata como un comentario.

Org mode proporciona comandos para ver y manipular fácilmente la estructura del esquema. El más sencillo de estos comandos es TAB (TAB, org-cycle). Si se invoca en una línea de encabezado, hace un ciclo a través de los diferentes estados de visibilidad del subárbol: (i) mostrando sólo esa línea de encabezado, (ii) mostrando sólo la línea de encabezado y las líneas de encabezado de sus hijos directos, si los hay, y (iii) mostrando todo el subárbol. Si se invoca en una línea del cuerpo, se ejecuta el enlace global para TAB.

Escribiendo Shift-TAB (S-TAB, org-shifttab) en cualquier parte de un buffer Org mode cicla la visibilidad de toda la estructura del esquema, entre (i) mostrar solo las lineas de encabezado de nivel superior, (ii) mostrar todas las lineas de encabezado pero ninguna linea de cuerpo, y (iii) mostrar todo.

Puedes mover una entrada entera hacia arriba o hacia abajo en el buffer, incluyendo sus líneas de cuerpo y subárbol (si lo hay), escribiendo Alt- (M-UP, org-metaup) o Alt- (M-DOWN, org-metadown) en la línea de encabezado. Del mismo modo, puede promover o degradar una línea de encabezado con Alt- (M-LEFT, org-metaleft) y Alt- (M-RIGHT, org-metaright). Estos comandos ejecutan sus enlaces globales si se invocan en una línea de cuerpo.

Las siguientes subsecciones dan instrucciones basicas para usar Org mode como organizador y como sistema de autor. Para detalles, ver Introducción en El Manual de Org.

Org como organizador

Puedes etiquetar una entrada de Org como un elemento TODO escribiendo Ctrl-c Ctrl-l (C-c C-l, org-todo) en cualquier parte de la entrada. Esto agrega la palabra clave ‘TODO’ a la linea de encabezado. Escribir Ctrl-c Ctrl-t (C-c C-t) de nuevo cambia la palabra clave a ‘DONE’; otro Ctrl-c Ctrl-t (C-c C-t) elimina la palabra clave por completo, y así sucesivamente. Puede personalizar las palabras clave utilizadas por Ctrl-c Ctrl-t (C-c C-t) a través de la variable org-todo-keywords.

Aparte de marcar una entrada como TODO, puede adjuntarle una fecha, escribiendo Ctrl-c Ctrl-s (C-c C-s, org-schedule) en la entrada. Esto pide una fecha haciendo aparecer el Calendario Emacs (ver El Calendario y la Agenda), y luego añade la etiqueta ‘SCHEDULED’, junto con la fecha seleccionada, debajo de la línea de encabezado. El comando Ctrl-c Ctrl-d (C-c C-d, org-deadline) tiene el mismo efecto, excepto que utiliza la etiqueta DEADLINE.

Una vez que tengas algunos elementos TODO planificados en un fichero Org, puedes añadir ese fichero a la lista de ficheros de agenda escribiendo (C-c [, org-agenda-file-to-front). El modo Org esta diseñado para permitirte mantener facilmente multiples ficheros de agenda, por ejemplo, para organizar diferentes aspectos de tu vida. La lista de archivos de agenda se almacena en la org-agenda-files.

Para ver los elementos procedentes de sus archivos de agenda, escriba Alt-x org-agenda (M-x org-agenda). Este comando le pide lo que quiere ver: una lista de cosas por hacer esta semana, una lista de items TODO con palabras clave especificas, etc. Vea Vistas de la Agenda en el Manual de Organización, para más detalles.

Org como sistema de autoría

Puedes querer formatear tus notas de Org de forma agradable y prepararlas para su exportación y publicación. Para exportar el buffer actual, escribe Ctrl-c Ctrl-e (C-c C-e, org-export) en cualquier lugar de un buffer Org. Este comando pide un formato de exportación; actualmente los formatos soportados incluyen HTML, LaTeX, Texinfo, OpenDocument (.odt), iCalendar, Markdown, man-page, y PDF. Algunos formatos, como el PDF, requieren la instalación de ciertas herramientas del sistema.

Para exportar varios archivos a la vez a un directorio específico, ya sea localmente o a través de la red, debe definir una lista de proyectos a través de la variable org-publish-project-alist. Consulte su documentación para más detalles.

Org soporta un esquema de marcado simple para aplicar formato de texto a los documentos exportados:

- Este texto está /enfatizado/
- Este texto está *en negrita*.
- Este texto está _subrayado_
- Este texto utiliza =un tipo de letra teletipo=

#+begin_quote (empezar_cita)
``Esto es una cita''.
#+end_quote

#+begin_example
Este es un ejemplo.
#+end_example

Para más detalles, Exportación en El Manual de Organización, y Publicación en El Manual de Organización.Para más detalles, Exportación en El Manual de Organización, y Publicación en El Manual de Organización.

Modo TeX

TeX es un potente formateador de texto escrito por Donald Knuth; al igual que GNU Emacs, es software libre. El formato TeX tiene varias variantes, incluyendo LaTeX, un formato de entrada simplificado para TeX; DocTeX, un formato de archivo especial en el que se escriben las fuentes de LaTeX, combinando las fuentes con la documentación; y SliTeX, una forma especial obsoleta de LaTeX (12).

Nota

(12) Se ha sustituido por la clase documental ‘slides’, que viene con LaTeX.

Emacs proporciona un modo principal de TeX para cada una de estas variantes: Modo TeX simple, modo LaTeX, modo DocTeX y modo SliTeX. Emacs selecciona el modo apropiado mirando el contenido del búfer. (Esto se hace invocando el comando tex-mode, que normalmente se llama automáticamente cuando se visita un archivo tipo TeX. Véase Elegir los modos de archivo). Si el contenido es insuficiente para determinarlo, Emacs elige el modo especificado por la variable tex-default-mode; su valor por defecto es latex-mode. Si Emacs no lo adivina, puedes seleccionar la variante correcta del modo TeX usando los comandos plain-tex-mode, latex-mode, slitex-mode, o doctex-mode.

Las siguientes secciones documentan las características del modo TeX y sus variantes. Hay otros paquetes de Emacs relacionados con TeX, que no están documentados en este manual:

  • El modo BibTeX es un modo principal para los archivos BibTeX, que se utilizan habitualmente para mantener las referencias bibliográficas de los documentos LaTeX. Para más información, consulte la cadena de documentación del comando bibtex-mode.

  • El paquete RefTeX proporciona un modo menor que puede utilizarse con el modo LaTeX para gestionar las referencias bibliográficas. Para más información, consulte el manual RefTeX Info, que se distribuye con Emacs.

  • El paquete AUCTeX proporciona características más avanzadas para la edición de TeX y sus formatos relacionados, incluyendo la capacidad de previsualizar ecuaciones TeX dentro de los buffers de Emacs. A diferencia del modo BibTeX y del paquete RefTeX, AUCTeX no se distribuye por defecto con Emacs. Puede descargarse a través del menú de paquetes (véase Emacs Lisp Packages); una vez instalado, consulte el manual de AUCTeX, que se incluye con el paquete.

Comandos de edición TeX

" (")
Inserta, según el contexto, bien ‘``’ o ‘"’ o ‘''’ (tex-insert-quote).
Ctrl-j (C-j)
Inserta un salto de párrafo (dos nuevas líneas) y comprueba que el párrafo anterior no tenga corchetes o signos de dólar (tex-terminar-párrafo).
Alt-x tex-validate-region (M-x tex-validate-region)
Comprueba cada párrafo de la región para ver si hay llaves desequilibradas o signos de dólar.
Ctrl-c { ( C-c { )
Inserta ‘{}’ y posiciona el punto entre ellos (tex-insert-braces).
Ctrl-c } ( C-c } )
Avanza más allá de la siguiente llave cerrada no emparejada (up-list).

En TeX, el carácter ‘"’ no se utiliza normalmente; en su lugar, las citas comienzan con ‘``’ y terminan con ‘''’. Por lo tanto, el modo TeX vincula la tecla " (") al comando tex-insert-quote. Esto inserta ‘``’ después de un espacio en blanco o una llave abierta, ‘"’ después de una barra invertida, y ‘''’ después de cualquier otro carácter.

Como excepción especial, si escribes " (") cuando el texto que precede al punto es ‘``’ o ‘''’, Emacs sustituye ese texto precedente por un único carácter ‘"’. Por lo tanto, puedes escribir "" ("") para insertar ‘"’, si alguna vez lo necesitas. (También puede utilizar Ctrl-q " (C-q ") para insertar este carácter).

En el modo TeX, ‘$’ tiene un código de sintaxis especial que intenta comprender la forma en que coinciden los delimitadores del modo matemático de TeX. Cuando se inserta un ‘$’ que pretende salir del modo matemático, se muestra durante un segundo la posición del ‘$’ coincidente que entró en el modo matemático. Esta es la misma función que muestra la llave abierta que coincide con una llave cerrada que se inserta. Sin embargo, no hay manera de saber si un ‘$’ entra en el modo matemático o lo abandona; así que cuando se inserta un ‘$’ que entra en el modo matemático, la posición anterior del ‘$’ se muestra como si fuera una coincidencia, aunque en realidad no estén relacionados.

TeX utiliza las llaves como delimitadores que deben coincidir. Algunos usuarios prefieren mantener las llaves equilibradas en todo momento, en lugar de insertarlas individualmente. Utilice Ctrl-c { (C-c {, tex-insert-braces) para insertar un par de llaves. Deja un punto entre las dos llaves para que puedas insertar el texto que corresponde dentro. Después, usa el comando Ctrl-c } (C-c }, up-list) para avanzar más allá de la llave de cierre. También puede invocar Ctrl-c { ( C-c { ) después de marcar algún texto: entonces el comando encierra el texto marcado entre llaves.

Hay dos comandos para comprobar la coincidencia de las llaves. Ctrl-j (C-j, tex-terminate-paragraph) comprueba el párrafo anterior al punto, e inserta dos nuevas líneas para comenzar un nuevo párrafo. Si se encuentra una falta de concordancia, se emite un mensaje en el área de eco. Alt-x tex-validate-region (M-x tex-validate-region) comprueba una región, párrafo por párrafo. Los errores se listan en un buffer *Occur*; puedes usar los comandos habituales del modo Occur en ese buffer, como Ctrl-c Ctrl-c (C-c C-c), para visitar un desajuste en particular (ver Otros comandos de búsqueda y bucle).

Tenga en cuenta que los comandos de Emacs cuentan con corchetes y paréntesis en el modo TeX, no sólo con llaves. Esto no es estrictamente correcto para el propósito de comprobar la sintaxis de TeX. Sin embargo, es probable que los paréntesis y los corchetes se utilicen en el texto como delimitadores de coincidencia, y es útil para que los diversos comandos de movimiento y la visualización automática de coincidencias trabajen con ellos.

Comandos de edición LaTeX

El modo LaTeX ofrece algunas funciones adicionales que no se aplican al TeX normal:

Ctrl-c Ctrl-o (C-c C-o)
Insertar ‘\begin’ y ‘\end’ para el bloque LaTeX y posicionar el punto en una línea entre ellos (tex-latex-block).
Ctrl-c Ctrl-e (C-c C-e)
Cerrar el bloque LaTeX más interno que aún no esté cerrado (tex-close-latex-block).

En la entrada de LaTeX, las etiquetas ‘\begin’ y ‘\end’ se utilizan para agrupar bloques de texto. Para insertar un bloque, escriba Ctrl-c Ctrl-o (C-c C-o, tex-latex-block). Esto solicita un tipo de bloque, e inserta las etiquetas ‘\begin’ y ‘\end’ correspondientes, dejando una línea en blanco entre las dos y moviendo el punto allí.

Al introducir el argumento del tipo de bloque en Ctrl-c Ctrl-o (C-c C-o), puede utilizar los comandos de finalización habituales (véase Finalización). La lista de finalización por defecto contiene los tipos de bloque estándar de LaTeX. Si desea tipos de bloque adicionales para completar, personalice la variable de lista latex-block-names.

En la entrada de LaTeX, las etiquetas ‘\begin’ y ‘\end’ deben estar en equilibrio. Puede utilizar Ctrl-c Ctrl-e (C-c C-e, tex-close-latex-block) para insertar una etiqueta ‘\end’ que coincida con el último ‘\begin’ no coincidente. También hace una sangría en la etiqueta ‘\end’ para que coincida con la correspondiente ‘\begin’, e inserta una nueva línea después de la etiqueta ‘\end’ si el punto está al principio de una línea. El modo menor latex-electric-env-pair-mode inserta automáticamente una etiqueta ‘\end’ o ‘\begin’ por usted cuando escribe la correspondiente.

Comandos de impresión de TeX

Puede invocar TeX como un subproceso de Emacs, suministrando todo el contenido del búfer o sólo una parte (por ejemplo, un capítulo de un documento mayor).

Ctrl-c Ctrl-b (C-c C-b)
Invoca a TeX en todo el buffer actual (tex-buffer).
Ctrl-c Ctrl-r (C-c C-r)
Invoca TeX en la región actual, junto con la cabecera del buffer (tex-region).
Ctrl-c Ctrl-f (C-c C-f)
Invoca TeX en el archivo actual (tex-file).
Ctrl-c Ctrl-v (C-c C-v)
Previsualiza la salida del último comando Ctrl-c Ctrl-b (C-c C-b), Ctrl-c Ctrl-r (C-c C-r), o Ctrl-c Ctrl-f (C-c C-f) (tex-view).
Ctrl-c Ctrl-p (C-c C-p)
Imprime la salida del ultimo comando C-c C-b, C-c C-r, o C-c C-f (tex-print).
Ctrl-c TAB (C-c TAB)
Invoca BibTeX en el archivo actual (tex-bibtex-file).
Ctrl-c Ctrl-l (C-c C-l)
Recentra la ventana que muestra la salida de TeX para que se pueda ver la última línea (tex-recenter-output-buffer).
Ctrl-c Ctrl-k (C-c C-k)
Mata el subproceso de TeX (tex-kill-job).
Ctrl-c Ctrl-c (C-c C-c)
Invoca algún otro comando de compilación en todo el buffer actual (tex-compile).

Para pasar el buffer actual por TeX, escriba Ctrl-c Ctrl-b (C-c C-b, tex-buffer). La salida formateada va a un archivo temporal, normalmente un archivo .dvi. Después, puede escribir Ctrl-c Ctrl-v (C-c C-v, tex-view) para lanzar un programa externo, como xdvi, para ver este archivo de salida. También puede escribir Ctrl-c Ctrl-p (C-c C-p, tex-print) para imprimir una copia del archivo de salida.

Por defecto, Ctrl-c Ctrl-b (C-c C-b) ejecuta TeX en el directorio actual. La salida de TeX también se crea en este directorio. Para ejecutar TeX en un directorio diferente, cambie la variable tex-directory al directorio deseado. Si su variable de entorno TEXINPUTS contiene nombres relativos, o si sus archivos contienen comandos ‘\input’ con nombres de archivo relativos, entonces tex-directory debe ser "." u obtendrá resultados erróneos. De lo contrario, es seguro especificar algún otro directorio, como "/tmp".

La variante TeX del buffer determina qué comando del shell se ejecuta realmente con Ctrl-c Ctrl-b (C-c C-b). En el modo TeX simple, se especifica mediante la variable tex-run-command, que por defecto es "tex". En el modo LaTeX, se especifica con la variable latex-run-command, que por defecto es "latex". El comando del shell que Ctrl-c Ctrl-v (C-c C-v) ejecuta para ver la salida .dvi está determinado por la variable tex-dvi-view-command, independientemente de la variante de TeX. El comando del shell que Ctrl-c Ctrl-p (C-c C-p) ejecuta para imprimir la salida está determinado por la variable tex-dvi-print-command. La variable tex-print-file-extension puede establecerse a la extensión de archivo requerida para ver e imprimir archivos compilados en TeX. Por ejemplo, puedes establecerla como .pdf, y actualizar tex-dvi-view-command y tex-dvi-print-command en consecuencia, así como latex-run-command o tex-run-command.

Normalmente, Emacs añade automáticamente el nombre del archivo de salida a las cadenas de comandos del shell descritas en el párrafo anterior. Por ejemplo, si tex-dvi-view-command es "xdvi", Ctrl-c Ctrl-v (C-c C-v) ejecuta xdvi output-file-name. En algunos casos, sin embargo, el nombre del archivo necesita ser incrustado en el comando, por ejemplo, si usted necesita proporcionar el nombre del archivo como un argumento a un comando cuya salida se canaliza a otro. Puede especificar dónde poner el nombre del archivo con ‘*’ en la cadena de comandos. Por ejemplo,

(setq tex-dvi-print-command "dvips -f * | lpr")

La salida de terminal de TeX, incluyendo cualquier mensaje de error, aparece en un buffer llamado *tex-shell*. Si TeX obtiene un error, puede cambiar a este búfer y alimentarlo con la entrada (esto funciona como en el modo Shell; véase Subshell interactivo). Sin cambiar a esta memoria intermedia puede desplazarla para que su última línea sea visible tecleando Ctrl-c Ctrl-l (C-c C-l).

Escriba Ctrl-c Ctrl-k (C-c C-k, tex-kill-job) para matar el proceso TeX si ve que su salida ya no es útil. Use Ctrl-c Ctrl-b (C-c C-b) o Ctrl-c Ctrl-r (C-c C-r) también mata cualquier proceso TeX que siga en marcha.

También puede pasar una región arbitraria a través de TeX escribiendo Ctrl-c Ctrl-r (C-c C-r, tex-region). Sin embargo, esto es complicado porque la mayoría de los archivos de entrada de TeX contienen comandos al principio para establecer parámetros y definir macros, sin los cuales ninguna parte posterior del archivo tendrá un formato correcto. Para resolver este problema, Ctrl-c Ctrl-r (C-c C-r) le permite designar una parte del archivo que contiene comandos esenciales; se incluye antes de la región especificada como parte de la entrada a TeX. La parte designada del archivo se denomina cabecera.

Para indicar los límites de la cabecera en el modo TeX simple, se insertan dos cadenas especiales en el archivo. Inserte ‘%**start of header’ antes del encabezado, y ‘%**end of header’ después. Cada cadena debe aparecer completamente en una línea, pero puede haber otro texto en la línea anterior o posterior. Las líneas que contienen las dos cadenas se incluyen en la cabecera. Si ‘%**start of header’ no aparece dentro de las primeras 100 líneas del buffer, Ctrl-c Ctrl-r (C-c C-r) asume que no hay cabecera.

En el modo LaTeX, la cabecera comienza con ‘\documentclass’ o ‘\documentstyle’ y termina con ‘\begin{document}’. Estos son comandos que LaTeX exige que se utilicen en cualquier caso, por lo que no es necesario hacer nada especial para identificar la cabecera.

Los comandos (tex-buffer) y (tex-region) hacen todo su trabajo en un directorio temporal, y no tienen disponible ninguno de los archivos auxiliares que necesita TeX para las referencias cruzadas; estos comandos no suelen ser adecuados para ejecutar la copia final en la que todas las referencias cruzadas deben ser correctas.

Cuando quiera los archivos auxiliares para las referencias cruzadas, utilice Ctrl-c Ctrl-f (C-c C-f, tex-file) que ejecuta TeX en el archivo del buffer actual, en el directorio de ese archivo. Antes de ejecutar TeX, ofrece guardar los búferes modificados. Generalmente, es necesario utilizar (tex-file) dos veces para que las referencias cruzadas sean correctas.

El valor de la variable tex-start-options especifica las opciones para la ejecución de TeX.

El valor de la variable tex-start-commands especifica los comandos de TeX para iniciar TeX. El valor por defecto hace que TeX se ejecute en modo sin paradas. Para ejecutar TeX de forma interactiva, establezca la variable a "".

Los documentos TeX de gran tamaño suelen estar divididos en varios archivos -un archivo principal, más subarchivos-. Ejecutar TeX en un subfichero no suele funcionar; hay que ejecutarlo en el fichero principal. Para que tex-file sea útil cuando esté editando un subfichero, puede establecer la variable tex-main-file con el nombre del fichero principal. Entonces tex-file ejecuta TeX en ese archivo.

La forma más conveniente de utilizar tex-main-file es especificarlo en una lista de variables locales en cada uno de los subficheros. Vea Variables locales en archivos.

En el caso de los archivos LaTeX, puede utilizar BibTeX para procesar el archivo auxiliar para el archivo del buffer actual. BibTeX busca las citas bibliográficas en una base de datos y prepara las referencias citadas para la sección de bibliografía. El comando Ctrl-c TAB (C-c TAB, tex-bibtex-file) ejecuta el comando del shell (tex-bibtex-command) para producir un archivo ‘.bbl’ para el archivo del buffer actual. Generalmente, necesitas hacer Ctrl-c Ctrl-f (C-c C-f, tex-file) una vez para generar el archivo ‘.aux’, luego hacer Ctrl-c TAB (C-c TAB, tex-bibtex-file), y luego repetir Ctrl-c Ctrl-f (C-c C-f, tex-file) dos veces más para obtener las referencias cruzadas correctas.

Para invocar algún otro programa de compilación en el buffer TeX actual, escriba Ctrl-c Ctrl-c (C-c C-c, tex-compile). Este comando sabe cómo pasar argumentos a muchos programas comunes, incluyendo pdflatex, yap, xdvi y dvips. Puede seleccionar el programa de compilación deseado utilizando las teclas de finalización estándar (véase Finalización).

Miscelánea del modo TeX

Al entrar en cualquier variante del modo TeX se ejecutan los ganchos text-mode-hook y tex-mode-hook. A continuación, se ejecuta el gancho plain-tex-mode-hook, doctex-mode-hook, latex-mode-hook o slitex-mode-hook, según corresponda. Al iniciar el shell de TeX se ejecuta el gancho tex-shell-hook. Ver Hooks.

Los comandos Alt-x iso-iso2tex (M-x iso-iso2tex), Atl-x iso-tex2iso (M-x iso-tex2iso), Alt-x iso-iso2gtex (M-x iso-iso2gtex) y Alt-x iso-gtex2iso (M-x iso-gtex2iso) pueden utilizarse para convertir entre archivos codificados en Latin-1 y equivalentes codificados en TeX.

Modos SGML y HTML

Los principales modos de SGML y HTML ofrecen soporte de sangría y comandos para operar con las etiquetas.

HTML consta de dos modos: uno, un modo básico llamado html-mode, es una variante ligeramente personalizada del modo SGML. El otro, que se utiliza por defecto para los archivos HTML, se llama mhtml-mode, e intenta manejar adecuadamente Javascript encerrado en un elemento <script> y CSS incrustado en un elemento <style>.

Ctrl-c Ctrl-n (C-c C-n)
Especifica interactivamente un carácter especial e inserta el comando SGML ‘&’ para ese carácter (sgml-name-char).
Ctrl-c Ctrl-f (C-c C-f)
Especifica interactivamente una etiqueta y sus atributos (sgml-tag). Este comando le pide un nombre de etiqueta y los valores de los atributos, y luego inserta la etiqueta de apertura y la de cierre, dejando un punto entre ellas.
Con un argumento de prefijo n, el comando pone la etiqueta alrededor de las n palabras ya presentes en el buffer después de punto. Siempre que una región esté activa, coloca la etiqueta alrededor de la región (cuando el modo de marca transitoria está desactivado, lo hace cuando se suministra un argumento numérico de -1).
Ctrl-c Ctrl-a (C-c C-a)
Inserta interactivamente valores de atributos para la etiqueta actual (sgml-attributes).
Ctrl-c Ctrl-f (C-c C-f)
Salta a través de un grupo de etiquetas equilibrado (que se extiende desde una etiqueta de apertura a través de su correspondiente etiqueta de cierre) (sgml-skip-tag-forward). Un argumento numérico actua como un conteo de repetición.
Ctrl-c Ctrl-b (C-c C-b)
Salta hacia atrás a través de un grupo de etiquetas equilibrado (que se extiende desde una etiqueta de apertura a través de su correspondiente etiqueta de cierre) (sgml-skip-tag-backward). Un argumento numérico actua como un conteo de repetición.
Ctrl-c Ctrl-d (C-c C-d)
Borra la etiqueta en o después del punto, y borra también la etiqueta correspondiente (sgml-delete-tag). Si la etiqueta en o después del punto es una etiqueta de apertura, borra también la etiqueta de cierre; si es una etiqueta de cierre, borra también la etiqueta de apertura.
Ctrl-c ? etiqueta RETURN (C-c ? etiqueta RET)
Muestra una descripción del significado de la etiqueta de nombre etiqueta (sgml-tag-help). Si el argumento etiqueta está vacío, describe la etiqueta en el punto.
Ctrl-c / (C-c /)
Inserta una etiqueta de cierre para la etiqueta más interna sin terminar (sgml-close-tag). Si es llamado dentro de una etiqueta o un comentario, ciérrelo en lugar de insertar una etiqueta de cierre.
Ctrl-c 8 (C-c 8)
Activa un modo menor en el que los caracteres latinos-1 insertan los comandos SGML correspondientes que los representan, en lugar de los propios caracteres (sgml-name-8bit-mode).
Ctrl-c Ctrl-v (C-c C-v)
Ejecuta un comando del shell (que debe especificar) para validar el búfer actual como SGML (sgml-validate). (En el modo HTML esta secuencia de teclas ejecuta un comando diferente).
Ctrl-c TAB (C-c TAB)
Cambia la visibilidad de las etiquetas existentes en el buffer. Esto puede usarse como una vista previa básica (sgml-tags-invisible).

El modo principal para editar documentos XML se llama modo nXML. Se trata de un potente modo principal que puede reconocer muchos esquemas XML existentes y utilizarlos para completar los elementos XML a través de Alt-TAB (M-TAB), así como la validación XML sobre la marcha con resaltado de errores. Para activar el modo nXML en un búfer existente, escriba Alt-x nxml-mode (M-x nxml-mode), o, de forma equivalente, Alt-x xml-mode (M-x xml-mode). Emacs utiliza el modo nXML para los archivos que tienen la extensión .xml. Para los archivos XHTML, que tienen la extensión .xhtml, Emacs utiliza el modo HTML por defecto; puedes hacer que utilice el modo nXML personalizando la variable auto-mode-alist (ver Elección de los modos de archivo). El modo nXML se describe en un manual de información, que se distribuye con Emacs.

Puede elegir utilizar el modo SGML, menos potente, para editar XML, ya que XML es un subconjunto estricto de SGML. Para activar el modo SGML en un búfer existente, escriba Alt-x sgml-mode (M-x sgml-mode). Al activar el modo SGML, Emacs examina el búfer para determinar si es XML; si es así, establece la variable sgml-xml-mode a un valor no nulo. Esto hace que los comandos de inserción de etiquetas del modo SGML, descritos anteriormente, inserten siempre también etiquetas de cierre explícitas.

Modo Nroff

El modo Nroff, un modo principal derivado del modo Texto, está especializado en la edición de archivos nroff (por ejemplo, las páginas man de Unix). Escriba Alt-x nroff-mode (M-x nroff-mode) para entrar en este modo. Al entrar en el modo Nroff se ejecuta el gancho text-mode-hook, y luego nroff-mode-hook (ver Hooks).

En el modo Nroff, las líneas de comandos nroff se tratan como separadores de párrafos, las páginas se separan con comandos ‘.bp8’ y los comentarios comienzan con barra invertida-doble comilla. También define estos comandos:

Alt-n (M-n)
Se mueve al principio de la siguiente línea que no es un comando nroff (nroff-forward-text-line). Un argumento es una cuenta de repetición.
Alt-p (M-p)
Como Alt-n (M-n) pero se mueve hacia arriba (nroff-backward-text-line).
Alt-? (M-?)
Muestra en el área de eco el número de líneas de texto (líneas que no son comandos nroff) en la región (nroff-count-text-lines).

El modo Electric Nroff es un modo menor local del búfer que puede utilizarse con el modo Nroff. Para activar este modo menor, escriba Alt-x nroff-electric-mode (M-x nroff-electric-mode) (véase Modos menores). Cuando el modo está activado, cada vez que escriba RETURN (RET) para terminar una línea que contenga un comando nroff que abra un tipo de agrupación, el comando nroff para cerrar esa agrupación se inserta automáticamente en la línea siguiente.

Si utiliza el modo menor Outline con el modo Nroff (véase el modo Outline), las líneas de encabezado son líneas de la forma ‘.H’ seguidas de un número (el nivel de encabezado).

Texto enriquecido

El modo enriquecido es un modo menor para la edición de archivos de texto formateados de manera WYSIWYG (What You See Is What You Get, lo que ves es lo que obtienes). Cuando el modo enriquecido está activado, puede aplicar varias propiedades de formato al texto en el búfer, como fuentes y colores; al guardar el búfer, esas propiedades se guardan junto con el texto, utilizando el formato de archivo MIME ‘text/enriched’.

El modo enriquecido se utiliza normalmente con el modo Texto (véase el modo Texto). No es compatible con el modo Font Lock, que es utilizado por muchos modos principales, incluyendo la mayoría de los modos de lenguaje de programación, para resaltar la sintaxis (ver modo Font Lock). A diferencia del modo enriquecido, el modo de bloqueo de fuente asigna las propiedades del texto automáticamente, basándose en el contenido del búfer actual; esas propiedades no se guardan en el disco.

El archivo enriched.txt en el directorio de datos de Emacs sirve como ejemplo de las características del modo Enriquecido (Enriched mode).

Modo enriquecido

El modo enriquecido (Enriched Mode) es un modo menor localizado en el búfer (ver Modos menores). Cuando visitas un archivo que ha sido guardado en el formato ‘text/enriched’, Emacs activa automáticamente el modo enriquecido, y aplica la información de formato del archivo al texto del buffer. Cuando guardas un buffer con el modo enriquecido activado, se guarda usando el formato ‘text/enriched’, incluyendo la información de formato.

Para crear un nuevo archivo de texto enriquecido, visite el archivo no existente y escriba Alt-x enriched-mode (M-x enriched-mode). Este comando realmente activa el modo enriquecido. Con un argumento de prefijo, activa el modo enriquecido si el argumento es positivo, y desactiva el modo enriquecido en caso contrario. Si desactiva el modo enriquecido, Emacs ya no guarda el búfer utilizando el formato ‘text/enriched’; cualquier propiedad de formato que se haya añadido al búfer permanece en el búfer, pero no se guarda en el disco.

El modo enriquecido no guarda todas las propiedades de texto de Emacs, sólo las especificadas en la variable enriched-translations. Estas incluyen las propiedades de las fuentes, los colores, la sangría y la justificación.

Si visitas un archivo y Emacs no reconoce que está en el formato ‘text/enriched’, escribe Alt-x format-decode-buffer (M-x format-decode-buffer). Este comando solicita un formato de archivo, y vuelve a leer el archivo en ese formato. Al especificar el formato ‘texto/enriquecido’ se activa automáticamente el modo enriquecido.

Para ver un archivo ‘text/enriched’ en forma cruda (como texto plano con etiquetas de marcado en lugar de texto formateado), utilice Alt-x find-file-literally (M-x find-file-literally) (véase Visiting Files).

Ver Conversión de Formato en el Manual de Referencia de Emacs Lisp, para detalles de cómo Emacs reconoce y convierte formatos de archivo como ‘text/enriched’. Ver Text Properties en el Manual de Referencia de Emacs Lisp, para más información sobre las propiedades del texto.

Nuevas líneas duras y suaves

En el modo enriquecido, Emacs distingue entre dos tipos diferentes de nuevas líneas, las duras (hard newline) y las suaves (soft newline). También puede activar o desactivar esta característica en otros buffers, escribiendo Alt-x use-hard-newline (M-x use-hard-newlines).

Las nuevas líneas duras se utilizan para separar párrafos, o en cualquier lugar en el que se necesite un salto de línea, independientemente de cómo se rellene el texto; las nuevas líneas suaves se utilizan para rellenar. Los comandos RETURN (RET, newline) Ctrl-o (C-o, open-line) insertan nuevas líneas duras. Los comandos de relleno, incluyendo el Relleno Automático (AutoFill) (ver Modo de Relleno Automático), insertan sólo nuevas líneas suaves y borran sólo nuevas líneas suaves, dejando sólo las líneas duras.

Por lo tanto, cuando edite con el modo enriquecido, no debe utilizar RETURN (RET) o Ctrl-o (C-o) para romper líneas en medio de los párrafos rellenados. En su lugar, utilice el modo de relleno automático o los comandos de relleno explícito (véase Comandos de relleno explícito). Utilice RETURN o Ctrl-o (C-o) cuando los saltos de línea deban permanecer siempre, como en tablas y listas. Para este tipo de líneas, es posible que también desee establecer el estilo de justificación sin relleno (unfilled) (véase Justificación en texto enriquecido).

Editar la información del formato

La forma más sencilla de modificar las propiedades es con el menú ‘Text Properties’ (Propiedades del texto). Puede acceder a este menú desde el menú ‘Edit’ (Editar) de la barra de menús (véase La barra de menús), o con (C-ratón-2) (véase Clics del ratón para los menús). A continuación se enumeran algunos de los comandos del menú ‘Text Properties’ (también puede invocarlos con Alt-x (M-x)):

Remove Face Properties (Eliminar propiedades de la cara)
Eliminar las propiedades de las caras de la región (facemenu-remove-face-props).
Remove Text Properties (Eliminar propiedades de texto)
Elimina todas las propiedades de texto de la región, incluidas las propiedades de las caras (facemenu-remove-all).
Describe Properties (Describir propiedades)
Enumera todas las propiedades de texto y otra información sobre el carácter que sigue al punto (describe-text-properties).
Display Faces (Display Colors)
Muestra una lista de las caras definidas (list-faces-display). Véase Caras de texto.
Display Colors (Mostrar colores)
Muestra una lista de colores definidos (list-colors-display). Véase Colores para las caras.

Las demás entradas del menú se describen en las siguientes secciones.

Caras en el texto enriquecido

Los siguientes comandos pueden utilizarse para añadir o eliminar caras (véase Caras del texto). Cada uno se aplica al texto de la región si la marca está activa, y al siguiente carácter autoinsertado si la marca está inactiva. Con un argumento de prefijo, cada comando se aplica al siguiente carácter de autoinserción incluso si la región está activa.

Alt-o d (M-o d)
Elimina todas las propiedades de la cara (face) (facemenu-set-default).
Alt-o b (M-o b)
Aplica la negrita (bold) (facemenu-set-bold).
Alt-o i (M-o i)
Aplica la cara en cursiva (italic) (facemenu-set-italic).
Alt-o l (M-o l)
Aplica la cara negrita-cursiva (bold-italic) (facemenu-set-bold-italic).
Alt-o u (M-o u)
Aplica la cara de subrayado (facemenu-set-underline).
Alt-o o cara RETURN (M-o o cara RET)
Aplica la cara de nombre cara (facemenu-set-face).
Alt-x facemenu-set-foreground (M-x facemenu-set-foreground)
Solicita un color (ver Colores para caras) y lo aplica como color de primer plano.
Alt-x facemenu-set-background (M-x facemenu-set-background)
Pide un color y lo aplica como color de fondo.

Estos comandos también están disponibles a través del menú Propiedades del texto.

Un carácter que se autoinserta normalmente hereda las propiedades de la cara (y la mayoría de las demás propiedades del texto) del carácter precedente en la memoria intermedia. Si utiliza uno de los comandos anteriores para especificar la cara para el siguiente carácter autoinsertado, ese carácter no heredará las propiedades de las caras del carácter precedente, pero seguirá heredando otras propiedades del texto.

El modo enriquecido define dos caras adicionales: excerpt y fixes. Éstas corresponden a los códigos utilizados en el formato de archivo de texto/enriquecido. La cara excerpt está pensada para las citas; por defecto, aparece igual que la cursiva. La cara fixed especifica el texto de ancho fijo; por defecto, aparece igual que la bold (negrita).

Sangría en el texto enriquecido

En el modo enriquecido, puede especificar diferentes cantidades de sangría para el margen derecho o izquierdo de un párrafo o de una parte del mismo. Estos márgenes también afectan a los comandos de relleno como Alt-q (M-q) (véase Texto de Relleno).

El submenú Sangría de Propiedades del texto ofrece comandos para especificar la sangría:

Sangrar más
Sangrar la región en 4 columnas (increase-left-margin). En el modo enriquecido, este comando también está disponible en Ctrl-x TAB (C-x TAB); si suministra un argumento numérico, éste indica cuántas columnas hay que añadir al margen (un argumento negativo reduce el número de columnas).
Sangrar menos
Elimina 4 columnas de sangría de la región.
Sangrar más a la derecha
Hace que el texto sea más estrecho al sangrar 4 columnas en el margen derecho.
Sangrar menos a la derecha
Eliminar 4 columnas de sangría del margen derecho.

La variable standard-indent especifica cuántas columnas deben sumar o restar estos comandos a la sangría. El valor por defecto es 4. El margen derecho por defecto para el modo enriquecido se controla con la variable fill-column, como es habitual.

También puede escribir Ctrl-c [ (C-c [, set-left-margin) y Ctrl-c ] (C-c ], set-right-margin) para establecer los márgenes izquierdo y derecho. Puede especificar el ancho del margen con un argumento numérico; de lo contrario, estos comandos solicitan un valor a través del minibuffer.

El prefijo de relleno, si lo hay, funciona además de la sangría de párrafo especificada: Ctrl-x . (C-x .) no incluye el espacio en blanco de la sangría especificada en el nuevo valor del prefijo de relleno, y los comandos de relleno buscan el prefijo de relleno después de la sangría en cada línea. Véase El prefijo de relleno.

Justificación en el texto enriquecido

En el modo enriquecido, puede utilizar los siguientes comandos para especificar varios estilos de justificación para el relleno. Estos comandos se aplican al párrafo que contiene el punto o, si la región está activa, a todos los párrafos que se superponen a la región.

Alt-j l (M-j l)
Alinea las líneas al margen izquierdo (set-justification-left).
Alt-j r (M-j r)
Alinea las líneas al margen derecho (set-justification-right).
Alt-j b (M-j b)
Alinea las líneas a ambos márgenes, insertando espacios en medio de la línea para conseguirlo (set-justification-full).
Alt-j c (M-j c)
Alt-Shift (M-S)
Centra las líneas entre los márgenes (set-justification-center).
Alt-j u (M-j u)
Desactivar el relleno por completo (set-justification-none). Los comandos de relleno no hacen nada en el texto con esta configuración. Sin embargo, puede seguir indentando el margen izquierdo.

También puede especificar estilos de justificación utilizando el submenú Justificación del menú Propiedades del texto. El estilo de justificación por defecto se especifica mediante la variable default-justification. Su valor debe ser uno de los símbolos left (izquierda), right (derecha), full (completo), center (centrado) o none (ninguno); sus significados corresponden a los comandos anteriores.

Establecer otras propiedades del texto

El submenú Propiedades especiales de las Propiedades del texto tiene entradas para añadir o eliminar otras cuatro propiedades del texto: sólo lectura (read-only, que no permite alterar el texto), invisible (que oculta el texto), intangible (que no permite mover el punto dentro del texto) y charset (que es importante para seleccionar una fuente adecuada para mostrar un carácter). La opción de menú ‘Remove Special’ elimina todas estas propiedades especiales del texto de la región.

Las propiedades invisible e intangible no se guardan.

El modo enriquecido también permite guardar y restaurar las propiedades de visualización (dislplay properties) (véase Propiedades de visualización en el Manual de referencia de Emacs Lisp), que afectan a la forma en que se muestra el texto en la pantalla, y también permiten mostrar imágenes y cadenas que provienen de fuentes distintas del texto del búfer. Las propiedades de visualización también soportan la ejecución de formas Lisp arbitrarias como parte del procesamiento de la propiedad para su visualización, proporcionando así un medio para adaptar dinámicamente la visualización a algunas condiciones que sólo pueden conocerse en el momento de la visualización. Dado que la ejecución de Lisp arbitrario abre a Emacs a potenciales ataques, especialmente cuando la fuente del texto enriquecido está fuera del Editor o incluso fuera de su sistema (por ejemplo, si fue recibido en un mensaje de correo electrónico), dicha ejecución está por defecto desactivada en el modo enriquecido. Puedes habilitarla personalizando la variable enriched-allow-eval-in-display-props a un valor no nulo.

Edición de tablas basadas en texto

El paquete de tablas proporciona comandos para editar fácilmente tablas basadas en texto. Este es un ejemplo del aspecto de una tabla de este tipo:

+--------------+-----------------------------------+--------------------------+
|   Comando    |            Descripción            |  Vinculación de teclas   |
+--------------+-----------------------------------+--------------------------+
| forward-char |Mueve el punto a la derecha N      |           C-f            |
|              |caracteres (izquierda si N es      |                          |
|              |negativo)                          |                          |
+--------------+-----------------------------------+--------------------------+
| backwar-char |Mueve el punto N caracteres a la   |           C-b            |
|              |izuierda (derecha si N es negativo)|                          |
|              |                                   |                          |
+--------------+-----------------------------------+--------------------------+

Cuando Emacs reconoce tal extensión de texto como una tabla (ver Reconocimiento de tablas), la edición del contenido de cada celda de la tabla redimensionará automáticamente la tabla, siempre que el contenido sea demasiado grande para caber en la celda. Puede utilizar los comandos definidos en las siguientes secciones para navegar y editar el diseño de la tabla.

Escriba Alt-x table-fixed-width-mode (M-x table-fixed-width-mode) para activar la función de redimensionamiento automático de la tabla.

¿Qué es una tabla basada en texto?

Una tabla consiste en un área de texto rectangular que se divide en celdas. Cada celda debe tener al menos un carácter de ancho y un carácter de alto, sin contar sus líneas de borde. Una celda puede subdividirse en más celdas, pero no pueden superponerse.

Las líneas de borde de las celdas se dibujan con tres caracteres especiales, especificados por las siguientes variables:

table-cell-vertical-char
El carácter utilizado para las líneas verticales. El valor por defecto es ‘|’.
table-cell-horizontal-chars
Los caracteres utilizados para las líneas horizontales. El valor predeterminado es ‘"-="’.
table-cell-intersection-char
El carácter utilizado para la intersección de las líneas horizontales y verticales. El valor por defecto es ‘+’.

Los siguientes son ejemplos de tablas no válidas:

   +-----+       +--+    +-++--+
   |     |       |  |    | ||  |
   |     |       |  |    | ||  |
   +--+  |    +--+--+    +-++--+
   |  |  |    |  |  |    +-++--+
   |  |  |    |  |  |    | ||  |
   +--+--+    +--+--+    +-++--+
      a          b          c

De izquierda a derecha:

  1. No se permiten celdas superpuestas o no rectangulares.
  2. El borde debe ser rectangular.
  3. Las celdas deben tener una anchura/altura mínima de un carácter.

Creación de una tabla

Para crear una tabla basada en texto desde cero, escriba Alt-x table-insert (M-x table-insert). Este comando solicita el número de columnas y el número de filas de la tabla, como así también el ancho y el alto de las celdas. La anchura y la altura de las celdas no incluyen los bordes de las mismas; cada una de ellas puede especificarse como un único número entero (lo que significa que cada celda recibe la misma anchura/altura), o como una secuencia de números enteros separados por espacios o comas (que especifican la anchura/altura de cada una de las columnas/filas de la tabla, contando de izquierda a derecha para las columnas de la tabla y de arriba abajo para las filas de la tabla). La tabla especificada se inserta entonces en el punto.

La tabla insertada por M-x table-insert contiene propiedades de texto especiales, que indican a Emacs que la trate especialmente como una tabla basada en texto. Si guardas el buffer en un archivo y lo visitas de nuevo más tarde, esas propiedades se pierden, y la tabla aparece para el Editor como un trozo de texto ordinario. Vea la siguiente sección, para saber cómo convertirla de nuevo en una tabla.

Reconocimiento de tablas

Las tablas basadas en texto existentes en un buffer, que carecen de las propiedades especiales de texto aplicadas por M-x table-insert, no son tratadas especialmente como tablas. Para aplicar esas propiedades de texto, escriba Alt-x table-recognize (M-x table-recognize). Este comando escanea el búfer actual, reconoce las celdas válidas de la tabla y aplica las propiedades de texto pertinentes. A la inversa, escriba Alt-x table-unrecognize (M-x table-unrecognize) para no reconocer todas las tablas del buffer actual, eliminando las propiedades de texto especiales y convirtiendo las tablas de nuevo en texto plano.

También puede utilizar los siguientes comandos para reconocer o no reconocer selectivamente las tablas:

Alt-x table-recognize-region (M-x table-recognize-region)
Reconoce las tablas dentro de la región actual.
Alt-x table-unrecognize-region (M-x table-unrecognize-region)
No reconocer las tablas dentro de la región actual.
Alt-x table-recognize-table (M-x table-recognize-table)
Reconocer la tabla en el punto y activarla.
Alt-x table-unrecognize-table (M-x table-unrecognize-table)
Desactivar la tabla en el punto.
Alt-x table-recognize-cell (M-x table-recognize-cell)
Reconocer la celda en el punto y activarla.
Alt-x table-unrecognize-cell (M-x table-unrecognize-cell)
Desactivar la celda en el punto.

Ver Conversión entre texto plano y tablas, para otra forma de reconocer una tabla.

Comandos para las celdas de la tabla

Los comandos Alt-x table-forward-cell (M-x table-forward-cell) y Alt-x table-backward-cell (M-x table-backward-cell) mueven el punto de la celda actual a una celda adyacente. El orden es cíclico: cuando el punto está en la última celda de una tabla, Alt-x table-forward-cell (M-x table-forward-cell) se mueve a la primera celda. Del mismo modo, cuando el punto está en la primera celda, Atl-x table-forward-cell (M-x table-forward-cell) se mueve a la última celda.

Alt-x table-span-cell (M-x table-span-cell) pide una dirección -derecha, izquierda, arriba o abajo (right, left, up, down)- y fusiona la celda actual con la celda adyacente en esa dirección. Este comando señala un error si la fusión da lugar a una distribución de celdas ilegítima.

Alt-x table-split-cell (M-x table-split-cell) divide la celda actual vertical u horizontalmente, solicitando la dirección con el minibuffer. Para dividir en una dirección específica, utilice Alt-x table-split-cell-vertically (M-x table-split-cell-vertically) y Alt-x table-split-cell-horizontally (M-x table-split-cell-horizontally). Al dividir verticalmente, el contenido de la celda antigua se divide automáticamente entre las dos celdas nuevas. Al dividir horizontalmente, se le pedirá cómo dividir el contenido de la celda, si ésta no está vacía; las opciones son ‘split’ (dividir el contenido en un punto), ‘left’ ("izquierda", poner todo el contenido en la celda de la izquierda), y ‘right’ ("derecha", poner todo el contenido en la celda de la derecha).

Los siguientes comandos amplían o reducen una celda. Por defecto, cambian el tamaño en una fila o columna; si se suministra un argumento numérico, éste especifica el número de filas o columnas por las que hay que cambiar el tamaño.

Alt-x table-heighten-cell (M-x table-heighten-cell)
Amplía verticalmente la celda actual.
Alt-x table-shorten-cell (M-x table-shorten-cell)
Reduce la celda actual verticalmente.
Alt-x table-widen-cell (M-x table-widen-cell)
Agranda la celda actual horizontalmente.
Alt-x table-narrow-cell (M-x table-narrow-cell)
Reduce la celda actual horizontalmente.

Justificación de celdas

El comando Alt-x table-justify (M-x table-justify) impone una justificación en una o más celdas de una tabla basada en texto. La justificación determina cómo se alinea el texto en la celda, en relación con los bordes de la misma. Cada celda de una tabla puede justificarse por separado.

Alt-x table-justify (M-x table-justify) primero pide lo que se debe justificar; las opciones son cell (celda, sólo la celda actual), column (columna, todas las celdas de la columna actual de la tabla) y row (fila, todas las celdas de la fila actual de la tabla). El comando pide entonces el estilo de justificación; las opciones son left (izquierda), center (centro), right (derecha), top (arriba), middle (medio), bottom (abajo) o none (ninguna) (lo que significa que no hay justificación vertical).

Los estilos de justificación horizontal y vertical se especifican de forma independiente, y ambos tipos pueden estar en vigor simultáneamente; por ejemplo, puede llamar a Alt-x table-justify (M-x table-justify) dos veces, una para especificar la justificación derecha y otra para especificar la justificación inferior, para alinear el contenido de una celda en la parte inferior derecha.

El estilo de justificación se almacena en el buffer como una propiedad de texto, y se pierde cuando se elimina el buffer o se sale de Emacs. Sin embargo, los comandos de reconocimiento de tablas, como Alt-x table-recognize (M-x table-recognize) (ver Reconocimiento de tablas), intentan determinar y volver a aplicar el estilo de justificación de cada celda, examinando su contenido. Para desactivar esta función, cambie la variable table-detect-cell-alignment a nil.

Filas y columnas de la tabla

Alt-x table-insert-row (M-x table-insert-row) inserta una fila de celdas antes de la fila actual de la tabla. La fila actual, junto con el punto, se empuja hacia abajo más allá de la nueva fila. Para insertar una fila después de la última fila en la parte inferior de una tabla, invoque este comando con punto debajo de la tabla, justo debajo del borde inferior. Puede insertar más de una fila a la vez utilizando un argumento de prefijo numérico.

Del mismo modo, Alt-x table-insert-column (M-x table-insert-column) inserta una columna de celdas a la izquierda de la columna actual de la tabla. Para insertar una columna a la derecha de la columna más a la derecha, invoque este comando con el punto a la derecha de la columna más a la derecha, fuera de la tabla. Un argumento numérico de prefijo especifica el número de columnas a insertar.

Atl-x table-delete-column (M-x table-delete-column) borra la columna de celdas en el punto. Del mismo modo, Alt-x table-delete-row (M-x table-delete-row) borra la fila de celdas en el punto. Un argumento de prefijo numérico para cualquiera de los dos comandos especifica el número de columnas o filas a eliminar.

Conversión entre texto plano y tablas

El comando Alt-x table-capture (M-x table-capture) captura texto plano en una región y lo convierte en una tabla. A diferencia de Alt-x table-recognize (M-x table-recognize) (véase Reconocimiento de tablas), no es necesario que el texto original tenga apariencia de tabla; sólo es necesario que tenga una estructura lógica similar a la de una tabla.

Por ejemplo, supongamos que tenemos los siguientes números, que están divididos en tres líneas y separados horizontalmente por comas:

1, 2, 3, 4
5, 6, 7, 8
, 9, 10

Al invocar Alt-x table-capture M-x table-capture sobre ese texto se obtiene esta tabla:

+-----+-----+-----+-----+
|1    |2    |3    |4    |
+-----+-----+-----+-----+
|5    |6    |7    |8    |
+-----+-----+-----+-----+
|     |9    |10   |     |
+-----+-----+-----+-----+

Alt-x table-release (M-x table-release) hace lo contrario: convierte una tabla de nuevo en texto plano, eliminando los bordes de sus celdas.

Una aplicación de este par de comandos es editar un texto en la maquetación. Mire los tres párrafos siguientes:

table-capture es un comando poderoso.
Estas son algunas de las cosas que puede hacer:

Analizar elementos de celda Usando regexps delimitadores de fila y columna,
                            analiza el área de texto especificada y
			    extrae los elementos de las celdas en una tabla.

Al aplicar table-capture a una región que contiene el texto anterior, con cadenas vacías para los regexps delimitadores de columna y fila, se crea una tabla con una sola celda como la siguiente.

+-----------------------------------------------------------------------------+
|table-capture es un comando poderoso.                                        |
|Estas son algunas de las cosas que puede hacer:                              |
|                                                                             |
|Analizar elementos de celda   Usando regexps delimitadores de fila y columna,|
|                   analiza el área de texto especificada y                   |
|                   extrae los elementos de las celdas en una tabla.          |
+-----------------------------------------------------------------------------+

A continuación, podemos utilizar los comandos de división de celdas (véase Comandos para celdas de tabla) para subdividir la tabla de modo que cada párrafo ocupe una celda:

+-------------------------------------------------------------------------------+
|table-capture es un comando poderoso.                                          |
|Estas son algunas de las cosas que puede hacer:                                |
+----------------------------+--------------------------------------------------+
|Analizar elementos de celda | Usando regexps delimitadores de fila y colua,    |
|                            | analiza el área de texto especificada y          |
|                            | extrae los elementos de las celdas en una tabla. |
+----------------------------+--------------------------------------------------+

Ahora cada celda puede editarse de forma independiente sin afectar a la disposición de las demás celdas. Al terminar, podemos invocar Alt-x table-release (M-x table-release) para volver a convertir la tabla en texto plano.

Miscelánea de la tabla

El comando table-query-dimension informa de la disposición de la tabla y de la celda de la tabla en el punto. He aquí un ejemplo de su salida:

Cell: (21w, 6h), Table: (67w, 16h), Dim: (2c, 3r), Total Cells: 5

Esto indica que la celda actual tiene 21 caracteres de ancho y 6 líneas de alto, la tabla tiene 67 caracteres de ancho y 16 líneas de alto con 2 columnas y 3 filas, y un total de 5 celdas.

Alt-x table-insert-sequence (M-x table-insert-sequence) recorre las celdas de una tabla insertando una secuencia de cadenas de texto en cada celda a medida que avanza. Pide la cadena base de la secuencia, y luegon produce la secuencia "incrementando" la cadena base, ya sea numéricamente (si la cadena base termina en caracteres numéricos) o en el orden ASCII. Además de la cadena base, el comando solicita el número de elementos de la secuencia, el incremento, el intervalo de celdas y la justificación del texto en cada celda.

Alt-x table-generate-source (M-x table-generate-source) genera una tabla formateada para un lenguaje de marcado específico. Pide un lenguaje (que debe ser uno de los siguientes: html, latex, cals, wiki o mediawiki), un buffer de destino en el que poner el resultado, y un título de tabla, y luego inserta la tabla generada en el buffer especificado. El búfer de destino por defecto es table.lang, donde lang es el idioma especificado.

Edición a dos columnas

El modo de dos columnas le permite editar cómodamente dos columnas de texto una al lado de la otra. Utiliza dos ventanas contiguas, cada una con su propia memoria intermedia. Hay tres maneras de entrar en el modo de dos columnas:

F22 o Ctrl-x 62 (F2 2 o C-x 6 2)
Entra en el modo de dos columnas con el búfer actual a la izquierda, y a la derecha, un búfer cuyo nombre se basa en el nombre del búfer actual (2C-two-columns). Si el búfer de la derecha no existe todavía, comienza vacío; el contenido del búfer actual no se modifica.
Este comando es apropiado cuando el búfer actual está vacío o contiene sólo una columna y se quiere añadir otra columna.
F2s o Ctrl-x 6s (F2 s o C-x 6 s)
Divide la memoria intermedia actual, que contiene texto a dos columnas, en dos memorias intermedias y las muestra una al lado de la otra (2C-split). El búfer actual se convierte en el búfer de la izquierda, pero el texto de la columna de la derecha se traslada al búfer de la derecha. La columna actual especifica el punto de división. La división comienza con la línea actual y continúa hasta el final del búfer.
Este comando es apropiado cuando se tiene un búfer que ya contiene texto en dos columnas, y se desea separar las columnas temporalmente.
F2b o buffer RETURN (F2 b buffer RET)
Ctrl-x 6 buffer RETURN (C-x 6 b buffer RET)
Entra en el modo de dos columnas utilizando el búfer actual como búfer de la izquierda, y utilizando buffer como el búfer de la derecha (2C-associate-buffer).

F2s (F2 s) o Ctrl-x 6s (C-x 6 s) busca un separador de columna, que es una cadena que aparece en cada línea entre las dos columnas. Puede especificar la anchura del separador con un argumento numérico a F2s (F2 s); ese número de caracteres, antes de punto, constituyen la cadena separadora. Por defecto, el ancho es 1, por lo que el separador de columna es el carácter anterior al punto.

Cuando una línea tiene el separador en el lugar apropiado, F2s (F2 s) pone el texto después del separador en el buffer de la derecha, y borra el separador. Las líneas que no tienen el separador de columna en el lugar adecuado permanecen sin dividir; permanecen en el buffer de la izquierda, y el buffer de la derecha obtiene una línea vacía para corresponder. (Esta es la forma de escribir una línea que abarca ambas columnas mientras se está en el modo de dos columnas: escribirla en el buffer de la izquierda, y poner una línea vacía en el buffer de la derecha).

El comando F2RETURN (F2 RET) o Ctrl-x 6RETURN (C-x 6 RET, 2C-newline) inserta una nueva línea en cada uno de los dos buffers en las posiciones correspondientes. Esta es la forma más sencilla de añadir una nueva línea al texto de dos columnas mientras se edita en los búferes divididos.

Cuando haya editado ambos búferes como desee, fúndalos con F2-1 (F2 1) o Ctrl-x 61 (C-x 6 1, 2C-merge). Esto copia el texto del búfer de la derecha como una segunda columna en el otro búfer. Para volver a la edición a dos columnas, utilice F2s (F2 s).

Utilice F2d (F2 d) o Ctrl-x 6d (C-x 6 d) para disociar los dos búferes, dejando cada uno como está (2C-dissociate). Si el otro búfer, el que no está en curso cuando se teclea F2d, está vacío, este comando (F2 d) lo elimina.



Edición de programas

Este capítulo describe las características de Emacs para facilitar la edición de programas. Algunas de las cosas que estas características pueden hacer son:

  • Encontrar o moverse sobre las definiciones de nivel superior (ver Definiciones de nivel superior, o Defuns).
  • Aplicar las convenciones de sangría habituales del lenguaje (ver Sangría para programas).
  • Equilibrar paréntesis (ver Comandos para editar con paréntesis).
  • Insertar, eliminar o alinear comentarios (ver Manipulación de comentarios).
  • Resaltar la sintaxis del programa (ver Modo de bloqueo de fuentes).

Modos principales para los lenguajes de programación

Emacs tiene modos principales especializados (ver Modos principales) para muchos lenguajes de programación. El modo de un lenguaje de programación suele especificar la sintaxis de las expresiones, las reglas habituales de sangría, cómo resaltar la sintaxis del lenguaje y cómo encontrar el principio o el final de la definición de una función. A menudo también tiene funciones para compilar y depurar programas. El modo principal para cada lenguaje se llama como el lenguaje; por ejemplo, el modo principal para el lenguaje de programación C es el modo-c (c-mode).

Emacs tiene modos de lenguaje de programación para:

LispSchemeAdaASMAWKCC++FortranIcon
IDL (CORBA)IDLWAVEJavaJavascriptM4MakefilesModula2ObjectPascal
Objetive-COctavePascalPerlPikePostScriptPrologPythonRuby
SQlVerilogVHDL
El lenguaje de expresión DSSSL basado en SchemeMetafont (compañero de TeX para la creación de fuentes)
Un modo alternativo para Perl se llama modo CPerl


También hay modos disponibles para los lenguajes de scripting de los shells comunes de GNU y Unix, y para los archivos ‘BAT’ de MS-DOS/MS-Windows, así como para los makefiles, los archivos maestros de DNS y varios tipos de archivos de configuración.

Idealmente, Emacs debería tener un modo principal para cada lenguaje de programación que quieras editar. Si no tiene un modo para su lenguaje de preferencia, el modo puede estar implementado en un paquete no distribuido con Emacs (ver Paquetes Emacs Lisp); o puedes contribuir con uno.

En la mayoría de los lenguajes de programación, la sangría debe variar de una línea a otra para ilustrar la estructura del programa. Por lo tanto, en la mayoría de los modos de los lenguajes de programación, escribir TAB actualiza la sangría de la línea actual (ver Sangría de los programas). Además, DEL suele estar vinculado a backward-delete-char-untabify, que borra hacia atrás tratando cada tabulador como si fuera el número equivalente de espacios, de modo que puede borrar una columna de sangría sin preocuparse de si el espacio en blanco está formado por espacios o tabuladores.

Al entrar en el modo de un lenguaje de programación se ejecutan las funciones Lisp personalizadas especificadas en la variable hook prog-mode-hook, seguidas de las especificadas en el propio gancho de modo (véase Modos principales). Por ejemplo, al entrar en el modo C se ejecutan los ganchos prog-mode-hook y c-mode-hook. Vea Hooks, para información sobre los hooks.

Hay manuales separados para los modos para Ada (ver Ada Mode en Ada Mode), C/C++/Objective C/Java/Corba IDL/Pike/AWK (ver CC Mode en CC Mode), Octave, VHDL, e IDLWAVE (ver IDLWAVE en IDLWAVE User Manual).

Definiciones de alto nivel, o Defuns

En Emacs, una definición mayor en el nivel superior del buffer, como una función, se llama defun. El nombre viene de Lisp, pero en Emacs lo usamos para todos los lenguajes.

Convención del margen izquierdo

Muchos modos de lenguaje de programación han asumido tradicionalmente que cualquier paréntesis o llave de apertura que se encuentre en el margen izquierdo es el comienzo de una definición de nivel superior, o defun. Así que, por defecto, los comandos que buscan el comienzo de un defun aceptan tal delimitador como significado de esa posición.

Si desea anular esta convención, puede hacerlo estableciendo la opción de usuario open-paren-in-column-0-is-defun-start a nil. Si esta opción se establece como t (el valor por defecto), los comandos que buscan el inicio de un defun se detendrán en la apertura de paréntesis o llaves en la columna cero que no estén en un comentario o cadena. Cuando es nil, los defuns se encuentran buscando paréntesis o llaves en el nivel más externo. Dado que las rutinas de bajo nivel de Emacs ya no dependen de esta convención, normalmente no necesitará cambiar open-paren-in-column-0-is-defun-start de su valor por defecto.

Desplazamiento por Defuns

Estos comandos mueven el punto o configuran la región basándose en definiciones mayores de nivel superior, también llamadas defuns.

Ctrl-Alt-a (C-M-a)
Mueve al principio del defun actual o precedente (beginning-of-defun).
Ctrl-Alt-e (C-M-e)
Mueve al final del defun actual o siguiente (end-of-defun).
Ctrl-Alt-h (C-M-h)
Pone región alrededor de todo el defun actual o siguiente (mark-defun).

Los comandos para moverse al principio y al final de la definición actual son (C-M-a, beginning-of-defun, inicio de la definición) y (C-M-e, end-of-defun, fin de la definición). Si repites uno de estos comandos, o utilizas un argumento numérico positivo, cada repetición se mueve al siguiente defun en la dirección del movimiento.

Ctrl-Alt-a (C-M-a) con un argumento negativo -n se mueve hacia adelante n veces hasta el siguiente comienzo de un defun. Este no es exactamente el mismo lugar al que se movería Ctrl-Atl-e (C-M-e) con el argumento n; el final de este defun no suele ser exactamente el mismo lugar que el comienzo del siguiente defun. (Los espacios en blanco, los comentarios y tal vez las declaraciones pueden separarlos.) Del mismo modo, Ctrl-Alt-e (C-M-e) con un argumento negativo se mueve al final de un defun, que no es exactamente el mismo que C-M-a con un argumento positivo.

Para operar sobre el defun actual, utilice Ctrl-Alt-h (C-M-h, mark-defun), que coloca la marca al final del defun actual y pone el punto al principio del mismo. Véase Comandos para marcar objetos textuales. Esta es la forma más fácil de prepararse para matar el defun con el fin de moverlo a un lugar diferente en el archivo. Si el defun está directamente precedido por comentarios (sin líneas en blanco intermedias), también se marcan. Si utiliza el comando mientras el punto está entre defuns, utiliza el siguiente defun. Si utiliza el comando mientras la marca ya está activa, extiende el final de la región para incluir un defun más. Con un argumento de prefijo, marca ese número de defuns o extiende la región en el número apropiado de defuns. Con un argumento de prefijo negativo, marca defuns en la dirección opuesta y también cambia la dirección de selección para los siguientes usos de mark-defun.

En el modo C, Ctrl-Alt-h (C-M-h) ejecuta la función c-mark-function, que es casi lo mismo que que retrocede sobre las declaraciones de argumentos, el nombre de la función y el tipo de datos devueltos para que toda la función C esté dentro de la región. Este es un ejemplo de cómo los modos principales ajustan los enlaces de las teclas estándar para que hagan su trabajo estándar de una manera que se ajuste mejor a un lenguaje particular. Otros modos principales pueden reemplazar alguna o todas estas combinaciones de teclas para ese propósito.

Imenu

La función Imenu permite encontrar las definiciones principales de un archivo por su nombre. También es útil en los modos principales del formateador de texto, donde trata cada capítulo, sección, etc., como una definición. (Véase Buscar referencias de identificadores, para una función más potente que maneja varios archivos juntos).

Si escribe Alt-x imenu (M-x imenu), lee el nombre de una definición utilizando el minibuffer, y luego mueve el punto a esa definición. Puede utilizar la finalización para especificar el nombre; el comando siempre muestra la lista completa de nombres válidos.

Alternativamente, puede vincular el comando imenu a un clic del ratón. Entonces se muestran los menús del ratón para que selecciones un nombre de definición. También puede añadir el índice del buffer a la barra de menús llamando a imenu-add-menubar-index. Si quieres que este elemento de la barra de menú esté disponible para todos los búferes en un determinado modo principal, puedes hacerlo añadiendo imenu-add-menubar-index a su gancho (hook) de modo. Pero si ha hecho eso, tendrás que esperar un poco cada vez que visites un archivo en ese modo, mientras Emacs encuentra todas las definiciones en ese buffer.

Cuando se modifica el contenido de una memoria intermedia, si se añaden o eliminan definiciones, se puede actualizar el índice de la memoria intermedia en función del nuevo contenido invocando el elemento ‘*Rescan*’ (‘*Rescaneado*’) del menú. La reexploración se realiza automáticamente si se establece en imenu-auto-rescan un valor no nulo. No es necesario volver a escanear por pequeños cambios en el texto.

imenu-auto-rescan se deshabilitará en los buffers que -en bytes- sean mayores que imenu-auto-rescan-maxout, y el escaneo se detiene si toma más de imenu-max-index-time segundos.

Puede personalizar la forma en que se ordenan los menús estableciendo la variable imenu-sort-function. Por defecto, los nombres se ordenan tal y como aparecen en el buffer; si desea una ordenación alfabética, utilice el símbolo imenu-sort-by-name como valor. También puede definir su propia función de comparación escribiendo código Lisp.

Imenu proporciona la información para guiar el modo Qué Función (ver Modo Qué Función). La barra de velocidad también puede usarla (ver Marcos de la barra de velocidad).

Modo Qué Función

El modo Cuál Función es un modo menor global (ver Modos Menores) que muestra el nombre de la función actual en la línea de modo, actualizándolo a medida que se desplaza en un buffer.

Para activar o desactivar el modo Qué función, utilice el comando Alt-x which-function-mode (M-x which-function-mode). El modo Cuál Función es un modo global menor. Por defecto, tiene efecto en todos los modos mayores que saben soportarlo (es decir, todos los modos mayores que soportan Imenu). Puede restringirlo a una lista específica de modos mayores cambiando el valor de la variable which-func-modes de t (que significa soportar todos los modos mayores disponibles) a una lista de nombres de modos mayores.

Sangría de los programas

La mejor manera de mantener un programa con la sangría adecuada es usar Emacs para re-sangrarlo a medida que lo cambias. Emacs tiene comandos para sangrar una sola línea, un número específico de líneas, o todas las líneas dentro de una agrupación parentética.

Vea Sangría, para información general sobre la sangría. Esta sección describe las características de sangría específicas de los modos de lenguaje de programación.

Emacs también proporciona un impresor bonito de Lisp en el paquete pp, que reformatea los objetos Lisp con una sangría de aspecto agradable. Vea pp en el Manual de Referencia de Emacs Lisp.

Comandos básicos de indentación del programa

TAB (TAB)
Ajusta la sangría de la línea actual (indent-for-tab-command).
RETURN (RET)
Inserta una nueva línea, luego ajustar la sangría de la línea siguiente (newline).

El comando básico de indentación es TAB (TAB, indent-for-tab-command), que fue documentado en Indentación. En los modos de lenguaje de programación, TAB indenta la línea actual, basándose en la indentación y el contenido sintáctico de las líneas precedentes; si la región está activa, TAB indenta cada línea dentro de la región, no sólo la línea actual.

El comando RETURN (RET, newline, nueva línea), que se documentó en Insertar texto, hace lo mismo que Ctrl-j (C-j) seguido de TAB (TAB): inserta una nueva línea, y luego ajusta la sangría de la línea.

Cuando se indenta una línea que comienza dentro de una agrupación parentética, Emacs suele colocar el inicio de la línea debajo de la línea precedente dentro del grupo, o debajo del texto después del paréntesis. Si le das manualmente a una de estas líneas una sangría no estándar (por ejemplo, por motivos estéticos), las líneas de abajo la seguirán.

Los comandos de sangría para la mayoría de los modos de lenguaje de programación asumen que un paréntesis abierto, un corchete abierto u otro delimitador de apertura en el margen izquierdo es el comienzo de una función. Si el código que está editando viola esta suposición -incluso si los delimitadores ocurren en cadenas o comentarios- debe establecer open-paren-in-column-0-is-defun-start a nil para que la sangría funcione correctamente. Vea la Convención del Margen Izquierdo.

Sangría de varias líneas

A veces, es posible que quieras sangrar varias líneas de código a la vez. Una forma de hacerlo es utilizar la marca; cuando la marca está activa y la región no está vacía, TAB (TAB) indenta cada línea de la región. Alternativamente, el comando Ctrl-Alt-\ (C-M-\, indent-region) indenta cada línea en la región, esté o no activa la marca (ver Comandos de indentación).

Además, Emacs proporciona los siguientes comandos para sangrar grandes trozos de código:

Ctrl-Alt-q (C-M-q)
Reindenta todas las líneas dentro de una agrupación parentética.
Ctrl-u TAB (C-u TAB)
Desplaza una agrupación parentética completa hacia un lado de forma rígida para que su primera línea tenga la sangría adecuada.
Alt-x indent-code-rigidly (M-x indent-code-rigidly)
Desplaza todas las líneas de la región rígidamente hacia un lado, pero no altera las líneas que comienzan dentro de comentarios y cadenas.

Para volver a sangrar el contenido de una agrupación parentética única, sitúe el punto antes del comienzo de la agrupación y escriba Ctrl-Alt-q (C-M-q). Esto cambia la sangría relativa dentro de la agrupación, sin afectar a su sangría general (es decir, la sangría de la línea donde comienza la agrupación). La función que ejecuta Ctrl-Alt-q (C-M-q) depende del modo principal; es indent-pp-sexp en modo Lisp, c-indent-exp en modo C, etc. Para corregir también la sangría global, escriba primero TAB.

Si le gusta la sangría relativa dentro de una agrupación pero no la sangría de su primera línea, mueva el punto a esa primera línea y escriba Ctrl-u TAB (C-u TAB). En Lisp, C y algunos otros modos principales, TAB con un argumento numérico re-sentencia la línea actual como siempre, y luego re-sentencia en la misma cantidad todas las líneas en la agrupación parentética que comienza en la línea actual. Es inteligente, sin embargo, y no altera las líneas que comienzan dentro de las cadenas. Tampoco altera las líneas del preprocesador C cuando está en modo C, pero sí reentabla las líneas de continuación que puedan estar adjuntas.

El comando Alt-x indent-code-rigidly (M-x indent-code-rigidly) desplaza lateralmente todas las líneas de la región, como hace indent-rigidly (ver Comandos de sangría). No altera la sangría de las líneas que comienzan dentro de una cadena, a menos que la región también comience dentro de esa cadena. El argumento prefijo especifica el número de columnas a sangrar.

Personalización de la sangría de Lisp

El patrón de sangría para una expresión Lisp puede depender de la función llamada por la expresión. Para cada función Lisp, puede elegir entre varios patrones de sangría predefinidos, o definir uno arbitrario con un programa Lisp.

El patrón estándar de sangría es el siguiente: la segunda línea de la expresión se sangra bajo el primer argumento, si éste se encuentra en la misma línea que el comienzo de la expresión; en caso contrario, la segunda línea se sangra bajo el nombre de la función. Cada línea siguiente se sangrará bajo la línea anterior cuya profundidad de anidamiento sea la misma.

Si la variable lisp-indent-offset no es nula, anula el patrón de sangría habitual para la segunda línea de una expresión, de modo que dichas líneas siempre tienen una sangría lisp-indent-offset de más columnas que la lista que las contiene.

Algunas funciones anulan el patrón estándar. Las funciones cuyos nombres empiezan por def tratan las segundas líneas como el inicio de un cuerpo, sangrándolo lisp-body-indent columnas adicionales más allá del paréntesis abierto que inicia la expresión.

Puede anular el patrón estándar de varias maneras para funciones individuales, según la propiedad lisp-indent-function del nombre de la función. Esto se hace normalmente para las definiciones de macros, utilizando la construcción declare. Vea Defining Macros en The Emacs Lisp Reference Manual.

En Emacs Lisp, las listas son normalmente sangradas como si fueran formas de función:

    (setq foo '(bar zot
                    gazonk))

Sin embargo, si añades un espacio después del paréntesis de apertura, esto le dice a Emacs que es una lista de datos en lugar de un trozo de código, y lo sangrará así:

    (setq foo '( bar zot
                 gazonk))

Comandos para la sangría en C

Aquí están las características especiales para la sangría en el modo C y los modos relacionados:

Ctrl-c Ctrl-q (C-c C-q)
Reencuadra la definición de la función de nivel superior actual o la declaración de tipos agregados (c-indent-defun).
Ctrl-Alt-q (C-M-q)
Reindentar cada línea de la expresión equilibrada que sigue al punto (c-indent-exp). Un argumento de prefijo inhibe los mensajes de advertencia sobre sintaxis no válida.
TAB (TAB)
Reencuadra la línea actual, y/o en algunos casos inserta un carácter de tabulación (c-indent-command).
Si c-tab-always-indent es t, este comando siempre reindenta la línea actual y no hace nada más. Este es el valor por defecto.
Si esa variable es nil, este comando reindenta la línea actual sólo si el punto está en el margen izquierdo o en la sangría de la línea; de lo contrario, inserta un tabulador (o el número equivalente de espacios, si indent-tabs-mode es nil).
Cualquier otro valor (que no sea nulo o t) significa que siempre se reentabla la línea, y también se inserta un tabulador si está dentro de un comentario o una cadena.

Para reindentar todo el búfer actual, escriba Ctrl-x h Ctrl-Alt-\ (C-x h C-M-\). Esto selecciona primero todo el búfer como región, y luego reindenta esa región.

Para reajustar el bloque actual, utilice Ctrl-Alt-u Ctrl-Alt-q (C-M-u C-M-q). Esto se desplaza al frente del bloque y luego lo reindenta todo.

Personalización de la sangría en C

El modo C y los modos relacionados utilizan un mecanismo flexible para personalizar la sangría. El modo C indenta una línea fuente en dos pasos: primero clasifica la línea sintácticamente según su contenido y contexto; segundo, determina el desplazamiento de indentación asociado por su estilo seleccionado con la construcción sintáctica y lo añade a la indentación de la sentencia de anclaje.

Ctrl-c . (C-c . estilo RET)
Selecciona un estilo predefinido (c-set-style).

Un estilo es una colección nombrada de personalizaciones que pueden ser usadas en el modo C y los modos relacionados. Vea Estilos en El manual del modo CC, para una descripción completa. Emacs viene con varios estilos predefinidos, incluyendo gnu, k&r, bsd, stroustrup, linux, linux, python, java, whitesmith, ellemtel, y awk. Algunos de estos estilos están pensados principalmente para un lenguaje, pero cualquiera de ellos puede utilizarse con cualquiera de los lenguajes soportados por estos modos. Para saber qué aspecto tiene un estilo, selecciónelo y reencienda algo de código, por ejemplo, escribiendo Ctrl-Alt-q (C-M-q) al principio de la definición de una función.

Para elegir un estilo para el búfer actual, utilice el comando Ctrl-c . (C-c .) . Especifique un nombre de estilo como argumento (las mayúsculas y minúsculas no son significativas). Este comando sólo afecta al buffer actual, y sólo afecta a las futuras invocaciones de los comandos de indentación; no reindenta el código que ya está en el buffer. Para volver a sangrar todo el búfer con el nuevo estilo, puede escribir Ctrl-x h Ctrl-Atl-\ (C-x h C-M-\).

También puede establecer la variable c-default-style para especificar el estilo por defecto para varios modos principales. Su valor debe ser el nombre del estilo (una cadena) o una lista, en la que cada elemento especifica un modo principal y el estilo de indentación que se debe utilizar. Por ejemplo:

    (setq c-default-style
          '((java-mode . "java")
            (awk-mode . "awk")
            (other . "gnu")))

Especifica opciones explícitas para los modos Java y AWK, y el estilo ‘gnu’ por defecto para los otros modos C-like. (Esta variable tiene efecto cuando se selecciona uno de los modos principales similares a C; por lo tanto, si se especifica un nuevo estilo por defecto para el modo Java, se puede hacer que tenga efecto en un búfer de modo Java existente escribiendo Alt-x java-mode (M-x java-mode) allí.

El estilo gnu especifica el formato recomendado por el Proyecto GNU para C; es el predeterminado, para fomentar el uso de nuestro estilo recomendado.

Vea Conceptos Básicos del Motor de Sangría en el Manual del Modo CC, y Personalización de la Sangría en el Manual del Modo CC, para más información sobre la personalización de la sangría para C y modos relacionados, incluyendo cómo anular partes de un estilo existente y cómo definir sus propios estilos.

Como alternativa a la especificación de un estilo, puedes decirle a Emacs que adivine un estilo escribiendo Alt-x c-guess (M-x c-guess) en un buffer de código de ejemplo. Luego puede aplicar el estilo adivinado a otros buffers con Alt-x Alt-x c-guess-install (M-x c-guess-install). Vea Adivinar el estilo en el Manual del Modo CC, para más detalles.

Comandos para editar con paréntesis

Esta sección describe los comandos y características que aprovechan la estructura de paréntesis en un programa, o le ayudan a mantenerla equilibrada.

Cuando se habla de estas facilidades, el término "paréntesis" también incluye corchetes, llaves o cualquier delimitador que se defina para que coincida en pares. El modo principal controla qué delimitadores son significativos, a través de la tabla de sintaxis (véase Tablas de sintaxis en el Manual de referencia de Emacs Lisp). En Lisp, sólo cuentan los paréntesis; en C, estos comandos se aplican también a los corchetes y llaves.

Puede usar Atl-x check-parens (M-x check-parens) para encontrar cualquier paréntesis y comillas de cadena no balanceados en el buffer.

Expresiones con paréntesis equilibrados

Cada modo de lenguaje de programación tiene su propia definición de expresión equilibrada. Las expresiones equilibradas suelen incluir símbolos individuales, números y constantes de cadena, así como trozos de código encerrados en un par de delimitadores que coinciden. Los siguientes comandos tratan con expresiones equilibradas (en Emacs, tales expresiones se denominan internamente como sexps (13)).

Nota

(13) La palabra "sexp" se utiliza para referirse a una expresión en Lisp.

Ctrl-Alt-f (C-M-f)
Avanza sobre una expresión balanceada (forward-sexp).
Ctrl-Alt-b (C-M-b)
Mueve hacia atrás sobre una expresión balanceada (backward-sexp).
Ctrl-Alt-k (C-M-k)
Mata una expresión equilibrada hacia adelante (kill-sexp).
Ctrl-Alt-t (C-M-t)
Transpone expresiones (transpose-sexps).
Ctrl-Alt-@ (C-M-@)
Ctrl-Alt-SPACE (C-M-SPC)
Pone marca después de la expresión siguiente (mark-sexp).

Para avanzar sobre una expresión equilibrada, utilice Ctrl-Alt-f (C-M-f, forward-sexp). Si el primer carácter significativo después del punto es un delimitador de apertura (por ejemplo, ‘(’, ‘[’ o ‘{’ en C), este comando se mueve por encima del delimitador de cierre correspondiente. Si el carácter comienza un símbolo, una cadena o un número, el comando se desplaza por encima de él.

El comando Ctrl-Alt-b (C-M-b, backward-sexp) se mueve hacia atrás sobre una expresión equilibrada, como Alt-Alt-f (C-M-f), pero en sentido inverso. Si la expresión va precedida de algún carácter prefijo (comillas simples, comillas inversas y coma, en Lisp), el comando también se mueve hacia atrás sobre ellos.

Ctrl-Alt-f (C-M-f) o Ctrl-Alt-b (C-M-b) con un argumento repite esa operación el número de veces especificado; con un argumento negativo significa moverse en la dirección opuesta. En la mayoría de los modos, estos dos comandos se mueven sobre los comentarios como si fueran espacios en blanco. Tenga en cuenta que las teclas, Ctrl-Alt-f (C-M-f) y Ctrl-Alt-b (C-M-b), son análogas a Ctrl-f (C-f) y Ctrl-b (C-b), que se mueven por caracteres (véase Cambiar la ubicación del punto), y Alt-f (M-f) y Alt-b (M-b), que se mueven por palabras (véase Palabras).

Para eliminar una expresión equilibrada completa, escriba Ctrl-Alt-k (C-M-k, kill-sexp). Esto mata el texto sobre el que se movería Ctrl-Alt-f (C-M-f).

Ctrl-Alt-t (C-M-t, transpose-sexps) cambia las posiciones de la expresión equilibrada anterior y la siguiente. Es análogo al comando Ctrl-t (C-t), que transpone los caracteres (véase Transponer texto). Un argumento a Ctrl-Alt-t (C-M-t) sirve como cuenta de repetición, desplazando la expresión anterior sobre las siguientes. Un argumento negativo mueve la expresión equilibrada anterior hacia atrás a través de las anteriores. Un argumento de cero, en lugar de no hacer nada, transpone las expresiones equilibradas que terminan en o después del punto y la marca.

Para operar sobre expresiones equilibradas con un comando que actúe sobre la región, escriba Ctrl-Alt-SPACE (C-M-SPC, mark-sexp). Esto establece la marca a la que se movería Ctrl-Alt-f (C-M-f). Mientras la marca está activa, cada llamada sucesiva a este comando extiende la región desplazando la marca una expresión. Los argumentos numéricos positivos o negativos desplazan la marca hacia delante o hacia atrás en el número de expresiones especificado. El alias Ctrl-Alt@ (C-M-@) es equivalente a Ctrl-Alt-SPACE (C-M-SPC). Consulte Comandos para marcar objetos textuales, para obtener más información sobre este comando y otros relacionados.

En los lenguajes que utilizan operadores infijos, como C, no es posible reconocer todas las expresiones equilibradas porque puede haber múltiples posibilidades en una posición determinada. Por ejemplo, el modo C no trata ‘foo + bar’ como una única expresión, aunque sea una expresión C; en su lugar, reconoce ‘foo’ como una expresión y ‘bar’ como otra, con el ‘+’ como signo de puntuación entre ellas. Sin embargo, el modo C reconoce ‘(foo + bar)’ como una única expresión, debido a los paréntesis.

Desplazamiento en la estructura de paréntesis

Los siguientes comandos se mueven sobre agrupaciones delimitadas por paréntesis (o cualquier otra cosa que sirva como delimitador en el lenguaje con el que esté trabajando). Ignoran las cadenas y los comentarios, incluyendo cualquier paréntesis dentro de ellos, y también ignoran los paréntesis que se citan con un carácter de escape. Estos comandos están pensados principalmente para editar programas, pero pueden ser útiles para editar cualquier texto que contenga paréntesis. Se denominan internamente "comandos de lista" porque en Lisp estas agrupaciones son listas.

Estos comandos suponen que el punto de partida no está dentro de una cadena o un comentario. Si los invoca desde dentro de una cadena o comentario, los resultados no son fiables.

Ctrl-Alt-n (C-M-n)
Avanza sobre un grupo parentético (forward-list).
Ctrl-Alt-p (C-M-p)
Desplazarse hacia atrás sobre un grupo parentético (backward-list).
Ctrl-Alt-u (C-M-u)
Mueve hacia arriba en la estructura de paréntesis (backward-up-list).
Ctrl-Alt-d (C-M-d)
Mueve hacia abajo en la estructura de paréntesis (down-list).

Los comandos de lista Ctrl-Alt-n (C-M-n, forward-list) y Ctrl-Alt-p (C-M-p, backward-list) se mueven hacia adelante o hacia atrás sobre una (o n) agrupación de paréntesis.

Ctrl-Alt-n (C-M-n) y Ctrl-Alt-p (C-M-p) intentan permanecer en el mismo nivel de la estructura de paréntesis. Para subir uno (o n) niveles, utilice Ctrl-Alt u (C-M-u, backward-up-list). Ctrl-Alt- u (C-M-u) se desplaza hacia atrás pasando por un delimitador de apertura no coincidente. Un argumento positivo sirve como cuenta de repetición; un argumento negativo invierte la dirección del movimiento, de modo que el comando se mueve hacia adelante y hacia arriba uno o más niveles.

Para desplazarse hacia abajo en la estructura de paréntesis, utilice Ctrl-Alt-d (C-M-d, down-list). En el modo Lisp, donde ‘(’ es el único delimitador de apertura, esto es casi lo mismo que buscar un ‘(’. Un argumento especifica el número de niveles a bajar.

Coincidencia de paréntesis

Emacs tiene un número de características de coincidencia de paréntesis, que hacen fácil ver cómo y si los paréntesis (u otros delimitadores) coinciden.

Cada vez que escribes un carácter autoinsertado que es un delimitador de cierre, Emacs indica brevemente la ubicación del delimitador de apertura que coincide, siempre que esté en la pantalla. Si no está en la pantalla, el Editor muestra parte del texto cerca de él en el área de eco. De cualquier manera, puedes saber qué agrupación está cerrando. Si el delimitador de apertura y el delimitador de cierre no coinciden -como en ‘[x)’- se muestra un mensaje de advertencia en el área de eco.

Tres variables controlan la visualización de los paréntesis coincidentes:

  • blinking-matching-paren activa o desactiva la función: nil la desactiva, pero el valor por defecto es t para activarla. Establézcalo en jump para que la indicación funcione moviendo momentáneamente el cursor hacia el delimitador de apertura coincidente. Si se establece como jump-offscreen, el cursor saltará incluso si el delimitador de apertura está fuera de la pantalla.

  • blink-matching-delay dice cuántos segundos hay que seguir indicando el delimitador de apertura coincidente. Puede ser un número entero o de punto flotante; el valor por defecto es 1.

  • blink-matching-paren-distance especifica cuántos caracteres hay que buscar hacia atrás para encontrar el delimitador de apertura coincidente. Si no se encuentra la coincidencia en esa distancia, Emacs deja de buscar y no se muestra nada. El valor por defecto es 102400.

El modo Show Paren es un modo menor que proporciona un tipo de concordancia automática más potente. Siempre que un punto esté antes de un delimitador de apertura o después de un delimitador de cierre, el delimitador, su delimitador coincidente y, opcionalmente, el texto entre ellos, se resaltan. Para activar el modo Show Paren globalmente, escriba Alt-x show-paren-mode (M-x show-paren-mode). Para activarlo sólo en el búfer actual, escriba Alt-x show-paren-local-mode (M-x show-paren-local-mode). Para personalizarlo, escriba Alt-x customize-group RETURN paren-showing (M-x customize-group RET paren-showing). Las opciones personalizables que controlan el funcionamiento de este modo son:

  • show-paren-highlight-openparen controla si se resalta un paréntesis abierto cuando el punto está justo antes de él, y por lo tanto su posición está marcada por el cursor de todos modos. El valor por defecto es no nulo (no-nil (yes)).

  • show-paren-style controla si sólo se resaltan los dos paréntesis, o también el texto entre ellos. Las opciones válidas aquí son parenthessis (mostrar el paréntesis correspondiente), expression (resaltar toda la expresión encerrada por los paréntesis), y mixed (resaltar el paréntesis correspondiente si es visible en la ventana, la expresión en caso contrario).

  • show-paren-when-point-inside-paren, cuando no es nil, hace que se resalte también cuando el punto está dentro del paréntesis. El valor por defecto es nulo.

  • show-paren-when-point-in-periphery, cuando no es nulo, hace que se resalte también cuando el punto está en un espacio en blanco al principio de una línea y hay un paren en la primera o última posición que no es un espacio en blanco en la línea, o cuando el punto está al final de una línea y hay un paréntesis en la última posición que no es un espacio en blanco en la línea.

El modo Par Eléctrico (Electric Pair Mode), un modo global menor, ofrece una forma de insertar fácilmente delimitadores coincidentes: paréntesis, llaves, corchetes, etc. Cada vez que se inserta un delimitador de apertura, se inserta automáticamente el delimitador de cierre correspondiente, dejando un punto entre ambos. Por el contrario, cuando se inserta un delimitador de cierre sobre uno ya existente, no se produce ninguna inserción y simplemente se salta esa posición. Si la región está activa (véase La marca y la región), la inserción de un delimitador actúa sobre la región: los caracteres de la región se encierran en un par de delimitadores que coinciden, dejando el punto después del delimitador que haya escrito.

Estas variables controlan características adicionales del modo Par Eléctrico:

  • electric-pair-preserve-balance, cuando no es nulo, hace que la lógica de emparejamiento por defecto equilibre el número de delimitadores de apertura y cierre.

  • electric-pair-delete-adjacent-pairs, cuando no es nulo, hace que el retroceso entre dos delimitadores adyacentes también elimine automáticamente el delimitador de cierre.

  • electric-pair-open-newline-between-pairs, cuando no es nulo, hace que al insertar una nueva línea entre dos pares adyacentes también se abra automáticamente una nueva línea adicional después del punto.

  • electric-pair-skip-whitespace, cuando no es nulo, hace que el modo menor se salte el espacio en blanco hacia delante antes de decidir si se salta el delimitador de cierre.

Para cambiar el modo par eléctrico, escriba Alt-x electric-pair-mode (M-x electric-pair-mode). Para cambiar el modo en un solo búfer, utilice Alt-x electric-pair-local-mode (M-x electric-pair-local-mode).

Manipulación de comentarios

Dado que los comentarios son una parte tan importante de la programación, Emacs proporciona comandos especiales para editar e insertar comentarios. También puede hacer una revisión ortográfica de los comentarios con el modo Flyspell Prog (ver Revisar y corregir la ortografía).

Algunos modos principales tienen reglas especiales para sangrar diferentes tipos de comentarios. Por ejemplo, en el código Lisp, los comentarios que comienzan con dos punto y coma se sangrarán como si fueran líneas de código, mientras que los que comienzan con tres puntos y comas se supone que se alinean al margen izquierdo y se utilizan a menudo con fines de seccionamiento. Emacs entiende estas convenciones; por ejemplo, al teclear TAB en una línea de comentario, éste se sangrará en la posición adecuada.

    ;; Esta función es sólo un ejemplo.
    ;;; Aquí son apropiados dos o tres puntos y coma.
    (defun foo (x)
    ;;; Y ahora, la primera parte de la función:
      ;; La siguiente línea añade uno.
    5  (1+ x)) ; Esta línea añade uno.

Comandos de los comentarios

Los siguientes comandos operan sobre los comentarios:

Alt-; (M-;)
Inserta o realinea el comentario en la línea actual; si la región está activa, comenta o descomenta la región en su lugar (comment-dwim).
Ctrl-x Ctrl-; (C-x C-;)
Comenta o descomenta la línea actual (comment-line). Si la región está activa, comenta o descomenta las líneas de la región en su lugar.
Ctrl-u Alt-; (C-u M-;)
Elimina el comentario de la línea actual (comment-kill).
Ctrl-x ; (C-x ;)
Establecer la columna de comentarios (comment-set-column).
Ctrl-Alt-j (M-j)
Alt-j (M-j)
Como RETURN (RET) seguido de insertar y alinear un comentario (comment-indent-new-line). Véase Líneas múltiples de comentarios.
Alt-x comment-region (M-x comment-region)
Ctrl-c Ctrl-c (C-c C-c (en modos tipo C))
Añade delimitadores de comentario a todas las líneas de la región.

El comando para crear o alinear un comentario es Alt-; (M-;, comment-dwim). La palabra "dwim" es un acrónimo de "Do What I Mean" (haz lo que quiero decir); indica que este comando puede utilizarse para muchas tareas diferentes relacionadas con los comentarios, dependiendo de la situación en la que se utilice.

Cuando una región está activa (véase La marca y la región), Alt-; añade delimitadores de comentario a la región o los elimina. Si cada línea de la región ya es un comentario, descomenta cada una de esas líneas eliminando sus delimitadores de comentario. En caso contrario, añade delimitadores de comentario para encerrar el texto en la región.

Si se suministra un argumento de prefijo a M-; (Alt-;) cuando una región está activa, éste especifica el número de delimitadores de comentario a añadir o eliminar. Un argumento positivo n añade n delimitadores, mientras que un argumento negativo -n elimina n delimitadores.

Si la región no está activa y no hay ningún comentario en la línea actual, Alt-; (M-;) añade un nuevo comentario a la línea actual. Si la línea está en blanco (es decir, vacía o que sólo contiene caracteres de espacio en blanco), el comentario se indenta a la misma posición a la que se indentaría TAB (ver Comandos de indentación de programas básicos). Si la línea no está en blanco, el comentario se coloca después del último carácter que no sea un espacio en blanco en la línea. Emacs intenta encajar el comentario entre las columnas especificadas por las variables comment-column y comment-fill-column (ver Opciones que controlan los comentarios), si es posible. De lo contrario, elegirá alguna otra posición adecuada, normalmente separada del texto no comentado por al menos un espacio. En cada caso, Emacs coloca el punto después del delimitador inicial del comentario, para que puedas empezar a escribir el texto del comentario inmediatamente.

También puedes usar Alt-; (M-;) para alinear un comentario existente. Si una línea ya contiene la cadena de inicio del comentario, Alt-; (M-;) la realinea a la alineación convencional y mueve el punto después del delimitador de inicio del comentario. Como excepción, los comentarios que comienzan en la columna 0 no se mueven. Incluso cuando un comentario existente está correctamente alineado, Alt-; (M-;) sigue siendo útil para moverse directamente al inicio del texto del comentario.

Ctrl-x Ctrl-; (C-x C-;, comment-line) comenta o descomenta líneas completas. Cuando una región está activa (véase La marca y la región), C-x C-; comenta o descomenta las líneas de la región. Si la región no está activa, este comando comenta o descomenta el punto de la línea en el que se encuentra. Con un argumento de prefijo positivo n, actúa sobre n líneas empezando por la actual; con un argumento negativo -n, afecta a n líneas anteriores. Después de invocar este comando con un argumento negativo, las sucesivas invocaciones con un argumento positivo operarán sobre las líneas precedentes como si el argumento estuviera negado.

Ctrl-u Alt-; (C-u M-; comment-dwim con un argumento prefijo) mata cualquier comentario en la línea actual, junto con el espacio en blanco que lo precede. Como el comentario se guarda en el anillo de eliminación, puede reinsertarlo en otra línea moviéndose al final de esa línea, haciendo Ctrl-y (C-y), y luego Alt-; (M-;) para realinear el comentario. Puede lograr el mismo efecto que Ctrl-u Alt-; (C-u M-;) escribiendo Alt-x comment-kill (M-x comment-kill, comment-dwim realmente llama a comment-kill como una subrutina cuando se le da un argumento de prefijo).

El comando Alt-x comment-region (M-x comment-region) es equivalente a llamar a Alt-; (M-;) sobre una región activa, excepto que siempre actúa sobre la región, incluso si la marca está inactiva. En el modo C y otros modos relacionados, este comando está ligado a Ctrl-c Ctrl-c (C-c C-c). El comando Alt-x uncomment-region (M-x uncomment-region) descomenta cada línea de la región; un argumento numérico de prefijo especifica el número de delimitadores de comentario a eliminar (los argumentos negativos especifican el número de delimitadores de comentario a añadir).

Para los modos tipo C, puede configurar el efecto exacto de Alt-; (M-;) estableciendo las variables c-indent-comment-alist y c-indent-comments-syntactically-p. Por ejemplo, en una línea que termina en una llave de cierre, Alt-; (M-;) pone el comentario un espacio después de la llave en lugar de en la columna de comentarios. Para más detalles, consulte Comandos de comentario en el Manual del modo CC.

Varias líneas de comentarios

Si está escribiendo un comentario y desea continuarlo en otra línea, escriba Alt-j (M-j) o Ctrl-Alt-j (C-M-j, comment-indent-new-line). Esto rompe la línea actual e inserta los delimitadores de comentario y la sangría necesarios para continuar el comentario.

Para los lenguajes con delimitadores de cierre de comentario (por ejemplo, ‘*/’ en C), el comportamiento exacto de Alt-j (M-j) depende del valor de la variable comment-multi-line. Si el valor es nulo, el comando cierra el comentario en la línea anterior y comienza un nuevo comentario en la nueva línea. En caso contrario, abre una nueva línea dentro de los delimitadores de comentario actuales.

Cuando el modo de Relleno Automático (Auto Fill Mode) está activado, pasar la columna de relleno mientras se escribe un comentario también continúa el comentario, de la misma manera que una invocación explícita de Alt-j (M-j).

Para convertir líneas existentes en líneas de comentario, utilice Alt-; (M-;) con la región activa, o utilice Alt-x comment-region (M-x comment-region) como se describe en la sección anterior.

Puede configurar el modo C de forma que cuando escriba un ‘/’ al principio de una línea en un comentario de bloque de varias líneas, esto cierre el comentario. Para ello, active la limpieza con comment-close-slash. Vea Limpiezas en el Manual del Modo CC.

Opciones que controlan los comentarios

Como se mencionó en Comandos de comentario, cuando el comando Alt-j (M-j) añade un comentario a una línea, intenta colocar el comentario entre las columnas especificadas por las variables locales del buffer comment-column y comment-fill-column (o si es nulo, entonces el valor de fill-column, ver Comandos de relleno explícitos). Puede establecer el valor local o el valor por defecto de estas variables locales del búfer de la forma habitual (véase Variables locales). Alternativamente, puede teclear Ctrl-x ; (C-x ;, comment-set-column) para establecer el valor de comment-column en el buffer actual a la columna donde se encuentra actualmente el punto. Ctrl-u Ctrl-x ; (C-u C-x ;) establece la columna de comentarios para que coincida con el último comentario antes del punto en el buffer, y luego hace un Alt-; (M-;) para alinear el comentario de la línea actual bajo el anterior.

Los comandos de comentario reconocen los comentarios basándose en la expresión regular que es el valor de la variable comment-start-skip. Asegúrese de que esta regexp no coincida con la cadena nula. Puede coincidir con algo más que el delimitador de inicio de comentario en el sentido más estricto de la palabra; por ejemplo, en el modo C el valor de la variable podría ser "/\\*+[ \t]*\|//+[ \t]*", que coincide con los asteriscos y espacios adicionales después del propio ‘/*’, y acepta también comentarios de estilo C++ (‘//’). (Tenga en cuenta que ‘\\\t’ es necesario en la sintaxis Lisp para incluir un ‘\t’ en la cadena, que es necesario para negar a la primera estrella su significado especial en la sintaxis regexp. Véase Barra invertida en las expresiones regulares).

Cuando un comando comment hace un nuevo comentario, inserta el valor de comment-start como delimitador de apertura del comentario. También inserta el valor de comment-end después del punto, como delimitador de cierre del comentario. Por ejemplo, en modo Lisp, comment-start es ‘";"’ y comment-end es "" (la cadena vacía). En modo C, comment-start es "/* " y comment-end es " */".

La variable comment-padding especifica una cadena que los comandos de comentario deben insertar entre el/los delimitador/es del comentario y el texto del mismo. El valor por defecto, ‘" "’, especifica un solo espacio. Alternativamente, el valor puede ser un número, que especifica ese número de espacios, o nil, que significa ningún espacio.

La variable comment-multi-line controla cómo Alt-j (M-j) y el modo Auto Fill continúan los comentarios en múltiples líneas. Ver Múltiples líneas de comentarios.

La variable comment-indent-function debe contener una función que será llamada para calcular la alineación para un comentario recién insertado o para alinear un comentario existente. Se establece de forma diferente en los distintos modos principales. La función se llama sin argumentos, pero con punto al principio del comentario, o al final de una línea si se va a insertar un nuevo comentario. Debe devolver la columna en la que debe comenzar el comentario. Por ejemplo, la función por defecto basa su decisión en cuántos caracteres de comentario comienzan un comentario existente.

Emacs también intenta alinear los comentarios en líneas adyacentes. Para anular esto, la función puede devolver una constante de dos enteros (posiblemente iguales) para indicar un rango aceptable de sangría.

Búsqueda de documentación

Emacs proporciona varias características que puedes usar para buscar la documentación de las funciones, variables y comandos que planeas usar en tu programa.

Búsqueda de documentación en Info

Para los modos principales que se aplican a los lenguajes que tienen documentación en Info, puede utilizar Ctrl-h S (C-h S, info-lookup-symbol) para ver la documentación de Info para un símbolo utilizado en el programa. Se especifica el símbolo con el minibuffer; el valor por defecto es el símbolo que aparece en el buffer en el punto. Por ejemplo, en el modo C esto busca el símbolo en el Manual de la Biblioteca C. El comando sólo funciona si los archivos Info del manual apropiado están instalados.

Emacs determina dónde buscar la documentación para el símbolo - qué archivos de información buscar, y qué índices buscar - basándose en el modo principal. También puede utilizar Alt-x info-lookup-file (M-x info-lookup-file) para buscar la documentación de un nombre de archivo.

Si utiliza Ctrl-h S (C-h S) en un modo principal que no lo soporta, le pedirá que especifique el modo de ayuda del símbolo. Deberá introducir un comando como c-mode que seleccionará un modo principal que C-h S sí soporta.

Búsqueda de la página man

En Unix, la principal forma de documentación en línea era la página de manual o página man. En el sistema operativo GNU, nuestro objetivo es reemplazar las páginas de manual con manuales mejor organizados que puede navegar con Info (ver Otros comandos de ayuda). Este proceso no está terminado, por lo que todavía es útil leer las páginas de manual.

Puede leer la página de manual de un comando del sistema operativo, una función de biblioteca o una llamada al sistema, con el comando Alt-x man (M-x man). Esto solicita un tema, con finalización (ver Finalización), y ejecuta el programa man para formatear la página man correspondiente. Si el sistema lo permite, ejecuta man de forma asíncrona, para que pueda seguir editando mientras se formatea la página. El resultado va a un buffer llamado *Man topic*. Estos búferes utilizan un modo principal especial, el modo Man, que facilita el desplazamiento y el salto a otras páginas de manual. Para más detalles, escriba Ctrl-h m (C-h m) mientras está en un búfer en modo Man.

Cada página de manual pertenece a una de las diez o más secciones, cada una de ellas nombrada por un dígito o por un dígito y una letra. A veces hay páginas man con el mismo nombre en diferentes secciones. Para leer una página man de una sección específica, escriba ‘topic(section)’ o ‘section topic’ cuando Alt-x man (M-x man) le pida el tema. Por ejemplo, la página man de la función de la biblioteca C chmod está en la sección 2, pero hay un comando del shell con el mismo nombre, cuya página man está en la sección 1; para ver la anterior, escriba Alt-x man RETURN chmod(2) RETURN (M-x man RET chmod(2) RET).

Si no se especifica una sección, Alt-x man (M-x man) normalmente muestra sólo la primera página man encontrada. En algunos sistemas, el programa man acepta una opción de línea de comandos ‘-a’, que le indica que muestre todas las páginas man del tema especificado. Para hacer uso de esto, cambie el valor de la variable Man-switches a ‘"-a"’. Entonces, en el buffer del modo Man, puede escribir Alt-n (M-n) y Alt-p (M-p) para cambiar entre las páginas de manual de las diferentes secciones. La línea de modo muestra cuántas páginas de manual están disponibles.

Una forma alternativa de leer las páginas de manual es el comando Alt-x woman (M-x woman). A diferencia de M-x man, no ejecuta ningún programa externo para formatear y mostrar las páginas de manual; el formateo lo hace Emacs, por lo que funciona en sistemas como MS-Windows donde el programa man puede no estar disponible. Pide una página man, y la muestra en un buffer llamado *WoMan section topic*.

Alt-x woman (M-x woman) calcula la lista de finalización de las páginas man la primera vez que se invoca el comando. Con un argumento numérico, vuelve a calcular esta lista; esto es útil si añade o elimina páginas de manual.

Si teclea el nombre de una página de manual y Alt-x woman (M-x woman) encuentra que existen varias páginas de manual con el mismo nombre en diferentes secciones, aparece una ventana con posibles candidatos pidiéndole que elija uno de ellos.

Tenga en cuenta que Alt-x woman (M-x woman) aún no soporta las últimas características de las páginas de manual modernas, por lo que recomendamos utilizar Alt-x man (M-x man) si está disponible en su sistema.

Para más información sobre la configuración y uso de Alt-x woman (M-x woman), vea el manual WoMan Info, que se distribuye con Emacs.

Búsqueda de documentación en Emacs Lisp

Cuando edite código Emacs Lisp, puede usar los comandos Ctrl-h f (C-h f, describe-function) y Ctrl-h v (C-h v, describe-variable) para ver la documentación incorporada para las funciones y variables Lisp que quiera usar. Consulte la ayuda por comando o nombre de variable.

ElDoc es un modo menor del buffer local que ayuda a buscar la documentación de Lisp. Cuando está activado, el área de eco muestra alguna información útil siempre que haya una función o variable Lisp en el punto; para una función, muestra la lista de argumentos, y para una variable muestra la primera línea de la cadena de documentación de la variable. Para activar el modo ElDoc, escriba Alt-x eldoc-mode (M-x eldoc-mode). También hay un modo ElDoc global, que está activado por defecto, y afecta a los buffers cuyo modo principal establece las variables descritas a continuación. Utilice Alt-x global-eldoc-mode (M-x global-eldoc-mode) para desactivarlo globalmente.

Estas variables pueden utilizarse para configurar el modo ElDoc:

eldoc-documentation-strategy
Esta variable contiene la función que se utiliza para recuperar la documentación del elemento en cuestión a partir de las funciones del gancho eldoc-documentation-functions. Por defecto, eldoc-documentation-strategy devuelve la primera cadena de documentación producida por el gancho eldoc-documentation-functions, pero puede personalizarse para componer los resultados de esas funciones de otras maneras.
eldoc-documentation-functions
Este gancho anormal contiene funciones de documentación. Actúa como una colección de backends para ElDoc. Esto es lo que los modos deben usar para registrar sus funciones de documentación con este modo.
eldoc-display-truncation-message
Si no es nil (el valor predeterminado), muestra un mensaje verboso sobre cómo ver una documentación completa (si se ha truncado en el área de eco). Si es nil, sólo marca los mensajes truncados con ‘...’.

Modo menor Hideshow

El modo Hideshow es un modo menor local del búfer que le permite mostrar selectivamente partes de un programa, que se denominan bloques. Escriba Alt-x hs-minormode (M-x hs-minor-mode) para activar este modo menor (véase Modos menores).

Cuando se utiliza el modo Hideshow para ocultar un bloque, éste desaparece de la pantalla, para ser sustituido por una elipsis (tres puntos seguidos). Lo que constituye un bloque depende del modo mayor. En el modo C y otros modos relacionados, los bloques están delimitados por llaves, mientras que en el modo Lisp están delimitados por paréntesis. Los comentarios de varias líneas también cuentan como bloques.

El modo Hideshow proporciona los siguientes comandos:

Ctrl-c @ Ctrl-h (C-c @ C-h)
Ctrl-c @ Ctrl-d (C-c @ C-d)
Oculta el bloque actual (hs-hide-block).
Ctrl-c @ Ctrl-s (C-c @ C-s)
Muestra el bloque actual (hs-show-block).
Ctrl-c @ Ctrl-c (C-c @ C-c)
Ctrl-c @ Ctrl-e (C-c @ C-e)
Oculta o muestra el bloque actual (hs-toggle-hiding).
Shift- (S-ratón-2)
Alterna el ocultamiento del bloque sobre el que se hace clic (hs-mouse-toggle-hiding).
Ctrl-c @ Ctrl-Alt-h (C-c @ C-M-h)
Ctrl-c @ Ctrl-t (C-c @ C-t)
Oculta todos los bloques de nivel superior (hs-hide-all).
Ctrl-c @ Ctrl-Alt-s (C-c @ C-M-s)
Ctrl-c @ Ctrl-a (C-c @ C-a)
Muestra todos los bloques en el buffer (hs-show-all).
Ctrl-u n Ctrl-c @ Ctrl-l (C-u n C-c @ C-l)
Oculta todos los bloques n niveles por debajo de este bloque (hs-hide-level).

Estas variables pueden utilizarse para personalizar el modo Hideshow:

hs-hide-comments-when-hiding-all
Si no es nulo, Ctrl-c @ Ctrl-Alt-h (C-c @ C-M-h, hs-hide-all) oculta también los comentarios.
hs-isearch-open
Esta variable especifica las condiciones bajo las cuales la búsqueda incremental debe desocultar un bloque oculto cuando el texto coincidente aparece dentro del bloque. Su valor debe ser:
  • code (desocultar sólo los bloques de código).
  • comment (desocultar sólo los comentarios).
  • t (desocultar tanto los bloques de código como los comentarios).
  • nil (desocultar ni los bloques de código ni los comentarios).
El valor por defecto es code.

Completar nombres de símbolos

La finalización se realiza normalmente en el minibuffer (véase Finalización), pero también puede completar los nombres de símbolos en los buffers ordinarios de Emacs.

En los modos de lenguaje de programación, escriba Ctrl-Alt-i (C-M-i) o Alt-TAB (M-TAB) para completar el símbolo parcial antes del punto. En las pantallas gráficas, la tecla Alt-TAB (M-TAB) suele estar reservada por el gestor de ventanas para cambiar de ventana gráfica, por lo que debería escribir Ctrl-Alt-i (C-M-i) o ESC TAB (ESC TAB) en su lugar.

En la mayoría de los modos del lenguaje de programación, Ctrl-Alt-i (C-M-i) o M-TAB (Alt-TAB) invoca el comando completion-at-point, que genera su lista de finalización de forma flexible. Si el modo semántico está activado, intenta utilizar los datos del analizador sintáctico semántico para la finalización (véase Semántico). Si el modo Semántico no está habilitado o falla en la finalización, intenta completar usando la tabla de etiquetas seleccionada (ver Tablas de etiquetas). Si está en modo Emacs Lisp, realiza la finalización utilizando los nombres de funciones, variables o propiedades definidos en la sesión Emacs actual.

En todos los demás aspectos, el completamiento de símbolos en el buffer se comporta como el completamiento en el minibuffer. Por ejemplo, si Emacs no puede completar un símbolo único, muestra una lista de alternativas de finalización en otra ventana. Ver Completar.

En el modo Texto y modos relacionados, Alt-TAB (M-TAB) completa las palabras basándose en el diccionario del corrector ortográfico. Véase Comprobar y corregir la ortografía.

Palabras con mayúsculas y minúsculas

Algunos estilos de programación hacen uso de símbolos con mayúsculas y minúsculas (o "CamelCase") como ‘unReadableSymbol’. (En el proyecto GNU, recomendamos usar guiones bajos para separar palabras dentro de un identificador, en lugar de usar distinciones de mayúsculas y minúsculas). Emacs tiene varias características para hacer más fácil el manejo de tales símbolos.

El modo Glasses es un modo menor del búfer que facilita la lectura de tales símbolos, alterando la forma en que se muestran. Por defecto, muestra guiones bajos adicionales entre cada letra minúscula y la siguiente mayúscula. Esto no altera el texto del búfer, sólo la forma en que se muestra.

Para activar el modo Glasses, escriba Alt-x glasses-mode (M-x glasses-mode) (véase Modos menores). Cuando este modo está activado, el indicador de modo menor ‘o^o’ aparece en la línea de modo. Para más información sobre el modo Glasses, escriba Ctrl-h P glasses RETURN (C-h P glasses RET).

El modo subword es otro modo menor local del búfer. En este modo, los comandos de palabra de Emacs reconocen las letras mayúsculas de ‘StudlyCapsIdentifiers’ como límites de palabra. Cuando el modo subword está activado, el indicador de modo menor ‘,’ aparece en la línea de modo. Véase también el modo similar superword-mode (véase Otras características útiles para la edición de programas).

Semantic

Semantic es un paquete que proporciona comandos de edición con conocimiento del lenguaje basados en analizadores de código fuente. Esta sección proporciona una breve descripción de Semantic; para más detalles, vea Semantic en Semantic.

La mayoría de las funciones de Emacs que tienen en cuenta el lenguaje, como el modo de bloqueo de fuentes (véase el modo de bloqueo de fuentes), se basan en reglas generales (14) que suelen dar buenos resultados, pero nunca son completamente exactas. En cambio, los analizadores sintácticos utilizados por Semantic comprenden exactamente la sintaxis del lenguaje de programación. Esto permite a Semantic proporcionar comandos de búsqueda, navegación y finalización que son potentes y precisos.

Nota

(14) Expresiones regulares y tablas de sintaxis.

Para empezar a utilizar Semantic, escriba Alt-x semantic-mode (M-x semantic-mode) o haga clic en el elemento de menú denominado 'Source Code Parsers (Semantic)' en el menú ‘Tools’. Esto activa el modo Semántico, un modo global menor.

Cuando el modo semántico está activado, Emacs intenta automáticamente analizar cada archivo que visita. Actualmente, Semantic entiende C, C++, HTML, Java, Javascript, Make, Python, Scheme, SRecode y Texinfo. Dentro de cada búfer analizado, están disponibles los siguientes comandos:

Ctrl-c , j (C-c , j)
Pide el nombre de una función definida en el archivo actual, y mueve el punto allí (semantic-complete-jump-local).
Ctrl-c , J (C-c , J)
Pide el nombre de una función definida en cualquier fichero que Emacs haya analizado, y mueve el punto allí (semantic-complete-jump).
Ctrl-c , SPC (C-c , SPC)
Muestra una lista de posibles terminaciones para el símbolo en el punto (semantic-complete-analyze-inline). Esto también activa un conjunto de enlaces de teclas especiales para elegir una terminación: RETURN (RET) acepta la terminación actual, Alt-n (M-n) y Alt-p (M-p) recorren un ciclo a través de las posibles terminaciones, TAB (TAB) completa hasta donde sea posible y luego hace un ciclo, y Ctrl-g (C-g) o cualquier otra tecla aborta la terminación.
Ctrl-c , l (C-c , l)
Muestra una lista de las posibles terminaciones del símbolo en el punto, en otra ventana (semantic-analyze-possible-completions).

Además de los comandos anteriores, el paquete Semantic proporciona una variedad de otras formas de hacer uso de la información del analizador. Por ejemplo, puedes usarlo para mostrar una lista de terminaciones cuando Emacs está inactivo. Ver Semantic en Semantic, para más detalles.

Otras funciones útiles para la edición de programas

Algunos comandos de Emacs que no están diseñados específicamente para la edición de programas no obstante son útiles para ello.

Los comandos de Emacs que operan sobre palabras, frases y párrafos son útiles para editar código. la mayoría de los nombres de símbolos contienen palabras (ver palabras), mientras que las sentencias pueden encontrarse en cadenas y comentarios (ver sentencias). en cuanto a los párrafos, están definidos en la mayoría de los modos del lenguaje de programación para comenzar y terminar en líneas en blanco (ver párrafos). por lo tanto, el uso juicioso de las líneas en blanco para hacer el programa más claro también proporcionará trozos de texto útiles para que los comandos de párrafo trabajen. el modo de rellenado automático, si está activado en un modo principal del lenguaje de programación, aplica una sangría a las nuevas líneas que crea.

El modo Superpalabra (superword mode) es un modo menor local del búfer que hace que los comandos de edición y movimiento traten los símbolos (por ejemplo, ‘esto_es_un_símbolo’) como palabras. Cuando el modo Superpalabra está activado, el indicador de modo menor ‘²’ aparece en la línea de modo. Véase también el modo similar de subpalabra (subword-mode) (véase Palabras mixtas).

El modo Electric Layout Alt-x electric-layout-mode (M-x electric-layout-mode) es un modo menor global que inserta automáticamente nuevas líneas cuando se escriben ciertos caracteres; por ejemplo, ‘{’, ‘}’ y ‘;’ en el modo Javascript.

Aparte del modo Hideshow (ver Modo menor Hideshow), otra forma de mostrar selectivamente partes de un programa es utilizar la función de visualización selectiva (ver Visualización selectiva). Los modos de programación suelen admitir también el modo menor Outline (véase Modo Outline), que puede utilizarse con el paquete Foldout (véase Edición de plegado).

El modo Prettify Symbols es un modo menor local del búfer que reemplaza ciertas cadenas con versiones más atractivas para su visualización. Por ejemplo, en el modo Emacs Lisp, sustituye la cadena ‘lambda’ por el carácter griego lambda ‘λ’. En un búfer TeX, sustituirá ‘\alpha‘ ... ‘\omega’ y otras macros matemáticas por sus caracteres Unicode. Es posible que desee utilizar esto en los modos de no programación también. Puede personalizar el modo añadiendo más entradas a prettify-symbols-alist. Una personalización más elaborada está disponible mediante la personalización de prettify-symbols-compose-predicate si su valor por defecto prettify-symbols-default-compose-p no es apropiado. También existe una versión global, global-prettify-symbols-mode, que activa el modo en todos los buffers que lo soportan.

El símbolo en el punto puede mostrarse en su forma original. Esto se controla con la variable prettify-symbols-unprettify-at-point: si no es nula, la forma original del símbolo en el punto se restaurará mientras el punto esté en él.

C y modos relacionados

Esta sección ofrece una breve descripción de las características especiales disponibles en los modos C, C++, Objective-C, Java, CORBA IDL, Pike y AWK. (Se denominan "modo C y modos relacionados".) Para más detalles, consulte el manual de información del modo C, que se distribuye con Emacs.

Comandos de movimiento en modo C

En esta sección se describen los comandos para mover el punto, en modo C y modos relacionados.

Ctrl-Alt-a (C-M-a)
Ctrl-Alt-e (C-M-e)
Mueve el punto al principio o al final de la función actual o de la definición de nivel superior. En lenguajes con ámbitos envolventes (como las clases de C++) la función actual es la inmediata, posiblemente dentro de un ámbito. En caso contrario, es la definida por las llaves de menor alcance. (Por el contrario, beginning-of-defun y end-of-defun buscan llaves en la columna cero). Ver Mover por Defuns.
Ctrl-c Ctrl-u (C-c C-u)
Mueve el punto de vuelta a la condicional del preprocesador que lo contiene, dejando la marca detrás. Un argumento prefijo actúa como una cuenta de repetición. Con un argumento negativo, mueve el punto hacia adelante hasta el final de la condicional del preprocesador que lo contiene.
#elif’ es equivalente a ‘#else’ seguido de ‘#if’, por lo que la función se detendrá en un ‘#elif’ cuando vaya hacia atrás, pero no cuando vaya hacia adelante.
Ctrl-c Ctrl-p (C-c C-p)
Mueve el punto hacia atrás sobre una condicional del preprocesador, dejando la marca detrás. Un argumento prefijo actúa como una cuenta de repetición. Con un argumento negativo, se mueve hacia adelante.
Ctrl-c Ctrl-n (C-c C-n)
Mover el punto hacia adelante sobre una condicional del preprocesador, dejando la marca detrás. Un argumento prefijo actúa como una cuenta de repetición. Con un argumento negativo, muévete hacia atrás.
Alt-a (M-a)
Mueve el punto al principio de la sentencia C más interna (c-beginning-of-statement). Si el punto ya está al principio de una sentencia, se mueve al principio de la sentencia anterior. Con el argumento prefijo n, retrocede n - 1 sentencias.
Alt-e (M-e)
Mueve el punto al final de la sentencia o declaración C más interna; como Alt-a (M-a) excepto que se mueve en la otra dirección (c-end-of-statement).

Caracteres C eléctricos

En el modo C y otros modos relacionados, algunos caracteres de impresión son eléctricos; además de insertarse a sí mismos, también reintroducen la línea actual y, opcionalmente, también insertan nuevas líneas. Los caracteres eléctricos son:

{}:#;,<>/,*()

Puede que la sangría eléctrica le resulte incómoda si está editando código con una sangría caótica. Si es nuevo en el modo CC, puede encontrarlo desconcertante. Puede alternar la acción eléctrica con el comando Ctrl-c Ctrl-l (C-c C-l); cuando está activado, ‘/cl’ aparece en la línea de modo después del nombre del modo (donde c, si está presente, es ‘*’ o ‘/’, dependiendo de si el estilo de comentario es de bloque o de línea). Para más información sobre los indicadores de línea de modo en el modo CC, véase Modos menores en el Manual del modo CC.

Ctrl-c Ctrl-l (C-c C-l)
Alternar la acción eléctrica (c-toggle-electric-state). Con un argumento de prefijo positivo, este comando activa la acción eléctrica, con uno negativo la desactiva.

Los caracteres eléctricos insertan nuevas líneas sólo cuando, además del estado eléctrico, está activada la función de auto-newline (indicada por '/cla' en la línea de modo después del nombre del modo). Puede activar o desactivar esta función con el comando Ctrl-c Ctrl-a (C-c C-a):

Ctrl-c Ctrl-a (C-c C-a)
Activa la función de auto-newline (c-toggle-auto-newline). Con un argumento de prefijo, este comando activa la función de auto-newline si el argumento es positivo, y la desactiva si es negativo.

Normalmente, el estilo CC Mode configura las circunstancias exactas en las que Emacs inserta las auto-newlines. También puede configurar esto directamente. Vea Auto-newlines personalizados en el Manual del Modo CC.

Función de borrado hambriento en C

Si quieres borrar un bloque entero de espacio en blanco en un punto, puedes usar el borrado hambriento. Esto borra todos los espacios en blanco contiguos antes o después del punto en una sola operación. El espacio en blanco aquí incluye tabulaciones y nuevas líneas, pero no comentarios o comandos del preprocesador.

Ctrl-c Ctrl-DEL (C-c C-DEL)
Ctrl-c DEL (C-c DEL)
Borra todo el bloque de espacio en blanco que precede al punto (c-hungry-delete-backwards).
Ctrl-c Ctrl-d (C-c C-d)
Ctrl-c Ctrl-DEL (C-c C-DEL)
Ctrl-c DEL (C-c Del)
Elimina todo el bloque de espacio en blanco posterior al punto (c-hungry-delete-forward).

Como alternativa a los comandos anteriores, puede habilitar el modo de borrado hambriento. Cuando esta función está activada (indicada por una ‘h’ después de una ‘/’ en la línea de modo después del nombre del modo), un solo DEL borra todo el espacio en blanco precedente, no sólo un espacio, y un solo Ctrl-d (C-d) (pero no un simple DEL) borra todo el espacio en blanco siguiente.

Alt-x c-toggle-hungry-state (M-x c-toggle-hungry-state)
Activa la función de supresión de espacios en blanco (c-toggle-hungry-state). Con un argumento de prefijo, este comando activa la función de borrado hambriento hambre si el argumento es positivo, y la desactiva si es negativo.

La variable c-hungry-delete-key controla si la función hungry-delete está activada.

Otros comandos para el modo C

Alt-x context-line-break (M-x context-line-break)
Este comando inserta un salto de línea y aplica una sangría a la nueva línea de forma adecuada al contexto. En el código normal, hace el trabajo de RETURN (RET, newline, nueva línea), en una línea de preprocesador C inserta adicionalmente un ‘\’ en el salto de línea, y dentro de los comentarios es como (M-j, c-indent-new-comment-line).
c-context-line-break no está vinculado a una tecla por defecto, pero necesita una vinculación para ser útil. El siguiente código lo vinculará a RETURN (RET). Usamos c-initialization-hook aquí para asegurarnos de que el mapa de teclas está cargado antes de intentar cambiarlo.
    (defun my-bind-clb ()
      (define-key c-mode-base-map "\C-m"
              'c-context-line-break))
    (add-hook 'c-initialization-hook 'my-bind-clb)
Ctrl-Alt-h (C-M-h)
Poner marca al final de la definición de una función, y poner punto al principio (c-mark-function).
Alt-q (M-q)
Rellenar un párrafo, manejando los comentarios de C y C++ (c-fill-paragraph). Si cualquier parte de la línea actual es un comentario o está dentro de un comentario, este comando rellena el comentario o el párrafo del mismo en el que se encuentra el punto, preservando la sangría y los delimitadores del comentario.
Ctrl-c Ctrl-e (C-c C-e)
Ejecuta el preprocesador C sobre el texto de la región, y muestra el resultado, que incluye la expansión de todas las llamadas a macros (c-macro-expand). El texto del buffer antes de la región también se incluye en el preprocesamiento, por las macros definidas allí, pero la salida de esta parte no se muestra.
Cuando está depurando código C que utiliza macros, a veces es difícil averiguar con precisión cómo se expanden las macros. Con este comando, no tiene que averiguarlo; puede ver las expansiones.
Ctrl-c Ctrl-\ (C-c C-\)
Inserta o alinea los caracteres ‘\’ en los extremos de las líneas de la región (c-backslash-region). Esto es útil después de escribir o editar una definición de macro C.
Si una línea ya termina en ‘\‘, este comando ajusta la cantidad de espacio en blanco antes de ella. En caso contrario, inserta un nuevo ‘\’. Sin embargo, la última línea de la región es tratada de forma especial; no se inserta ningún ‘\’ en esa línea, y cualquier ‘\’ que haya en ella se elimina.
Alt-x cpp-highlight-buffer (M-x cpp-highlight-buffer)
Resalta partes del texto según sus condicionales de preprocesador. Este comando muestra otro búfer llamado *CPP Edit*, que sirve como menú gráfico para seleccionar cómo mostrar determinados tipos de condicionales y su contenido. Después de cambiar varios ajustes, haga clic en ‘[A]pply these settings’ ([A]plicar estos ajustes) (o vaya a ese búfer y escriba a) para volver a resaltar el búfer del modo C en consecuencia.
Ctrl-c Ctrl-s (C-c C-s)
Muestra la información sintáctica de la línea fuente actual (c-show-syntactic-information). Esta información dirige cómo se sangra la línea.
Alt-x cwarn-mode (M-x cwarn-mode)
Alt-x global-cwarn-mode (M-x global-cwarn-mode)
El modo menor de CWarn resalta ciertas construcciones sospechosas de C y C++:
  • Asignaciones dentro de expresiones.
  • Punto y coma inmediatamente después de ‘if’, for’ y ‘while’ (excepto después de una sentencia ‘do ... while’);
  • Funciones C++ con parámetros de referencia.
Puede activar el modo para un búfer con el comando Alt-x cwarn-mode (M-x cwarn-mode), o para todos los búferes adecuados con el comando Alt-x global-cwarn-mode (M-x global-cwarn-mode) o personalizando la variable global-cwarn-mode. También debe activar el modo de bloqueo de fuentes para que funcione.
Alt-x hide-ifdef-mode (M-x hide-ifdef-mode)
El modo menor Hide-ifdef oculta el código seleccionado dentro de los bloques de preprocesador ‘#if’ y ‘#ifdef’. Si cambia la variable hide-ifdef-shadow a t, Hide-ifdef minor mode sombrea los bloques de preprocesador mostrándolos con una cara menos prominente, en lugar de ocultarlos por completo. Consulte la cadena de documentación de hide-ifdef-mode para obtener más información.
Alt-x ff-find-file-related (M-x ff-find-file-related)
Encuentra un archivo relacionado de manera especial con el archivo visitado por el buffer actual. Típicamente esto será el archivo de cabecera correspondiente a un archivo fuente C/C++, o viceversa. La variable ff-related-file-alist especifica cómo calcular los nombres de los archivos relacionados.

Modo Asm

El modo Asm es un modo principal para editar archivos de código ensamblador. Define estos comandos:

TAB (TAB)
tab-to-tab-stop.
Ctrl-j (C-j)
Insertar una nueva línea y luego sangrar usando tab-to-tab-stop.
: (:)
Inserte dos puntos y luego elimine la sangría de antes de la etiqueta que precede a los dos puntos. Luego haga tab-to-tab-stop.
; (;)
Insertar o alinear un comentario.

La variable asm-comment-char especifica qué carácter inicia los comentarios en la sintaxis del ensamblador.

Modo Fortran

El modo Fortran está pensado para editar código fuente de forma fija y también de formato tabulado, normalmente Fortran 77. Para editar código fuente de forma libre más moderno (Fortran 90, 95, 2003, 2008), utilice el modo F90 (f90-mode). Emacs utiliza normalmente el modo Fortran para los archivos con extensión ‘.f’, ‘.F’ o ‘.for’, y el modo F90 para las extensiones ‘.f90’, ‘.f95’, ‘.f03’ y ‘.f08’. Personalice la lista de modos automáticos para añadir más extensiones. GNU Fortran soporta tanto el modo libre como el fijo. Este manual documenta principalmente el modo Fortran, pero las características correspondientes del modo F90 se mencionan cuando son relevantes.

El modo Fortran proporciona comandos especiales de movimiento para las sentencias y subprogramas Fortran, y comandos de indentación que entienden las convenciones Fortran de anidamiento, números de línea y sentencias de continuación. El modo Fortran tiene soporte para el modo Auto Fill que rompe las líneas largas en líneas de continuación Fortran adecuadas. El modo Fortran también es compatible con el modo menor Hideshow (véase el modo menor Hideshow), y con Imenu (véase Imenu).

Se proporcionan comandos especiales para los comentarios porque los comentarios de Fortran son diferentes a los de otros lenguajes. Las abreviaturas incorporadas ahorran opcionalmente el tecleo cuando se insertan palabras clave de Fortran.

Utilice Alt-x fortran-mode (M-x fortran-mode) para cambiar a este modo principal. Este comando ejecuta el hook fortran-mode-hook. Véase Hooks.

Comandos de movimiento

Además de los comandos normales para moverse por y operar sobre defuns (subprogramas-funciones y subrutinas de Fortran, así como módulos para el modo F90, utilizando los comandos fortran-end-of-subprogram y fortran-beginning-of-subprogram), el modo Fortran proporciona comandos especiales para moverse por sentencias y otras unidades de programa.

Ctrl-c Ctrl-n (C-c C-n)
Se mueve al principio de la siguiente sentencia (fortran-next-statement/f90-next-statement).
Ctrl-c Ctrl-p (C-c C-p)
Se mueve al principio de la sentencia anterior (fortran-previous-statement/f90-previous-statement). Si no hay sentencia anterior (es decir, si se llama desde la primera sentencia en el buffer), se mueve al principio del buffer.
Ctrl-c Ctrl-e (C-c C-e)
Mueve el punto hacia adelante al inicio del siguiente bloque de código, o al final del actual, lo que ocurra primero (f90-next-block). Un bloque de código es una subrutina, una sentencia if-endif, etc. Este comando existe sólo para el modo F90, no para el modo Fortran. Con un argumento numérico, avanza ese número de bloques.
Ctrl-c Ctrl-a (C-c C-a)
Mueve el punto hacia atrás al bloque anterior (f90-previous-block). Es como f90-next-block, pero se mueve hacia atrás.
Ctrl-Alt-a (C-M-a)
Mover al final del bloque de código actual (fortran-end-of-block/f90-end-of-block). Con un argumento numérico, avanza ese número de bloques. La marca se establece antes del punto de movimiento. La versión en modo F90 de este comando comprueba la consistencia de los tipos de bloque y las etiquetas (si están presentes), pero no comprueba el bloque más externo ya que puede estar incompleto.
Ctrl-Alt-p (C-M-p)
Mover al inicio del bloque de código actual (fortran-beginning-of-block/f90-beginning-of-block). Esto es como fortran-end-of-block, pero se mueve hacia atrás.

Las órdenes fortran-beginning-of-subprogram y fortran-end-of-subprogram se desplazan al principio o al final del subprograma actual, respectivamente. Las órdenes fortran-mark-do y fortran-mark-if marcan el final del bloque do o if actual, y se desplazan al principio.

Sangría de Fortran

Se necesitan comandos y funciones especiales para sangrar el código Fortran de forma fija (o tabulada) con el fin de asegurar que varias entidades sintácticas (números de línea, indicadores de línea de comentario y banderas de línea de continuación) aparezcan en las columnas requeridas.

Ctrl-Alt-j (C-M-j)
Rompe la línea actual en un punto y establece una línea de continuación (fortran-split-line).
Alt-^ (M-^)
Une esta línea con la anterior (fortran-join-line).
Ctrl-Alt-q (C-M-q)
Sangrar todas las líneas del subprograma en el que se encuentra el punto (fortran-indent-subprogram).
Alt-q (M-q)
Rellenar un bloque de comentarios o una sentencia (utilizando fortran-fill-paragraph o fortran-fill-statement).

La tecla Ctrl-Alt-q (C-M-q) ejecuta fortran-indent-subprogram, un comando para reindentar todas las líneas del subprograma Fortran (función o subrutina) que contiene el punto.

La tecla Ctrl-Alt-j (C-M-j) ejecuta fortran-split-line, que divide una línea de la forma adecuada para Fortran. En una línea sin comentario, la segunda mitad se convierte en una línea de continuación y se sangra en consecuencia. En una línea de comentario, ambas mitades se convierten en líneas de comentario separadas.

Alt-^ (M-^) o Ctrl-c Ctrl-d (C-c C-d) ejecutan el comando fortran-join-line, que une una línea de continuación con la línea anterior, más o menos como la inversa de fortran-split-line. El punto debe estar en una línea de continuación cuando se invoca este comando.

Alt-q (M-q) en modo Fortran rellena el bloque de comentarios o la sentencia en la que se encuentra el punto. Esto elimina el exceso de continuaciones de sentencias.

Líneas de continuidad

La mayoría de los compiladores de Fortran 77 permiten dos formas de escribir líneas de continuación. Si el primer carácter no espacial de una línea está en la columna 5, entonces esa línea es una continuación de la línea anterior. A esto lo llamamos forma fija. (En GNU Emacs siempre contamos las columnas a partir de 0; pero tenga en cuenta que el estándar Fortran cuenta a partir de 1. Puede personalizar la variable column-number-indicator-zero-based para que la visualización de las columnas sea similar a la de Fortran; vea Características opcionales de la línea de modo). La variable fortran-continuation-string especifica qué carácter poner en la columna 5. Una línea que comienza con un carácter de tabulación seguido de cualquier dígito excepto ‘0’ es también una línea de continuación. Llamamos a este estilo de continuación formato tabulador. (Fortran 90 introdujo las líneas de continuación de forma libre).

El modo Fortran puede utilizar cualquier estilo de línea de continuación. Cuando se entra en el modo Fortran, éste intenta deducir el estilo de continuación adecuado automáticamente a partir del contenido del buffer. Para ello, explora hasta las líneas de profundidad de fortran (por defecto 100) desde el inicio del buffer. La primera línea que comienza con un carácter de tabulación o seis espacios determina la elección. Si el análisis falla (por ejemplo, si el búfer es nuevo y, por tanto, está vacío), se utiliza el valor de fortran-tab-mode-default (nil para la forma fija y no nil para el formato de tabulación). ‘/t’ (fortran-tab-mode-string) en la línea de modo indica que se ha seleccionado el formato tabulado. El modo Fortran establece el valor de indent-tabs-mode en consecuencia.

Si el texto de una línea comienza con el marcador de continuación de Fortran ‘$’, o si comienza con cualquier carácter que no sea un espacio en blanco en la columna 5, el modo Fortran lo trata como una línea de continuación. Cuando se hace una sangría en una línea de continuación con TAB (TAB), se convierte la línea en el estilo de continuación actual. Cuando se divide una sentencia Fortran con Ctrl-Alt-j (C-M-j), el marcador de continuación en la nueva línea se crea según el estilo de continuación.

La configuración del estilo de continuación afecta a otros aspectos de la edición en modo Fortran. En el modo de forma fija, el número mínimo de columna para el cuerpo de una sentencia es 6. Las líneas dentro de los bloques de Fortran que están sangradas a números de columna mayores deben utilizar sólo el carácter de espacio para los espacios en blanco. En el modo de formato tabulado, el número mínimo de columna para el cuerpo de la sentencia es 8, y el espacio en blanco antes de la columna 8 debe consistir en un carácter de tabulación.

Números de línea

Si un número es el primer no-espacio en la línea, la sangría de Fortran asume que es un número de línea y lo mueve a las columnas 0 a 4. (Las columnas siempre cuentan a partir de 0 en Emacst, pero establecer el indicador column-number-indicator-zero-based basado en cero a puede cambiar eso, vea Características de la línea en modo opcional).

Los números de línea de cuatro dígitos o menos tienen normalmente una sangría de un espacio. La variable fortran-line-number-indent controla esto; especifica la sangría máxima que puede tener un número de línea. El valor por defecto de la variable es 1. El modo Fortran intenta evitar que los dígitos del número de línea pasen por la columna 4, reduciendo la sangría por debajo del máximo especificado si es necesario. Si fortran-line-number-indent tiene el valor 5, los números de línea se justifican a la derecha para terminar en la columna 4.

Basta con insertar un número de línea para que la sangría se ajuste a estas reglas. A medida que se inserta cada dígito, se vuelve a calcular la sangría. Para desactivar esta función, establezca la variable fortran-electric-line-number en nil.

Convenciones sintácticas

El modo Fortran asume que usted sigue ciertas convenciones que simplifican la tarea de entender un programa Fortran lo suficientemente bien como para sangrarlo adecuadamente:

  • Dos bucles ‘do’ anidados nunca comparten una sentencia ‘continue’.
  • Las palabras clave de Fortran como ‘if’, ‘else’, then’, ‘do’ y otras se escriben sin espacios en blanco ni saltos de línea.
    Los compiladores de Fortran suelen ignorar los espacios en blanco fuera de las constantes de cadena, pero el modo Fortran no reconoce estas palabras clave si no son contiguas. Construcciones como ‘else if’ o ‘end do’ son aceptables, pero la segunda palabra debe estar en la misma línea que la primera y no en una línea de continuación.

Si no sigue estas convenciones, los comandos de indentación pueden sangrar algunas líneas de forma poco estética. Sin embargo, un programa Fortran correcto conserva su significado cuando se reentrena aunque no se sigan las convenciones.

Variables para la indentación en Fortran

Varias variables adicionales controlan el funcionamiento de la sangría en Fortran:

fortran-do-indent
Sangría adicional dentro de cada nivel de la sentencia ‘do’ (por defecto 3).
fortran-if-indent
Sangría adicional dentro de cada nivel de las sentencias ‘if’, ‘select case’, o ‘where’ (por defecto 3).
fortran-structure-indent
Sangría adicional en cada nivel de las sentencias ‘structure’, ‘union’, ‘map’ o ‘interface’ (por defecto 3).
fortran-continuation-indent
Sangría adicional para los cuerpos de las líneas de continuación (por defecto 5).
fortran-check-all-num-for-matching-do
En Fortran 77, una sentencia 'do' numerada es terminada por cualquier sentencia con un número de línea coincidente. Es común (pero no obligatorio) utilizar una sentencia ‘continue’ para este propósito. Si esta variable tiene un valor no nulo, la indentación de cualquier sentencia numerada debe comprobar la existencia de un ‘do’ que termine ahí. Si siempre termina las sentencias ‘do’ con una línea ‘continue’ (o si utiliza el más moderno ‘enddo’), puede acelerar la indentación estableciendo esta variable a nil (el valor por defecto).
fortran-blinking-matching-if
Si esto es t, la sangría de una sentencia ‘endif’ (o ‘enddo’) mueve el cursor momentáneamente a la sentencia ‘if’ (o ‘do’) correspondiente para mostrar dónde está. El valor por defecto es nulo.
fortran-minimum-statement-indent-fixed
Sangría mínima para las sentencias Fortran cuando se utiliza el estilo de línea de continuación de forma fija. Los cuerpos de las sentencias nunca tienen una sangría menor. El valor por defecto es 6.
fortran-minimum-statement-indent-tab
Indentación mínima para las sentencias Fortran cuando se utiliza el estilo de línea de continuación con formato tabulado. Los cuerpos de las sentencias nunca tienen una sangría inferior a este valor. El valor por defecto es 8.

La siguiente sección describe las variables que controlan la sangría de los comentarios.

Comentarios en Fortran

Las órdenes de comentario habituales de Emacs asumen que un comentario puede seguir a una línea de código. En Fortran 77, la sintaxis estándar de los comentarios requiere que una línea entera sea sólo un comentario. Por lo tanto, el modo Fortran reemplaza los comandos de comentario estándar de Emacs y define algunas variables nuevas.

El modo Fortran también puede manejar la sintaxis de comentarios de Fortran 90, en la que los comentarios comienzan con ‘!’ y pueden seguir a otro texto. Dado que sólo algunos compiladores de Fortran 77 aceptan esta sintaxis, el modo Fortran no insertará dichos comentarios a menos que usted haya dicho de antemano que lo haga. Para ello, establezca la variable fortran-comment-line-start en ‘"!"’. Si utiliza un valor inusual, puede que tenga que cambiar fortran-comment-line-start-skip.

Alt-; (M-;)
Alinear el comentario o insertar un nuevo comentario (comment-dwim).
Ctrl-x ; (C-x ;)
Se aplica sólo a los comentarios no estándar ‘!’ (comment-set-column).
Ctrl-c ; (C-c ;)
Convierte todas las líneas de la región en comentarios, o (con argumento) las convierte de nuevo en código real (fortran-comment-region).

Alt-; (M-;) en modo Fortran ejecuta el estándar comment-dwim. Esto reconoce cualquier tipo de comentario existente y alinea su texto adecuadamente; si no hay ningún comentario existente, se inserta un comentario y se alinea. Insertar y alinear comentarios no es lo mismo en modo Fortran que en otros modos.

Cuando hay que insertar un nuevo comentario, si la línea actual está en blanco, se inserta un comentario de línea completa. En una línea que no esté en blanco, se inserta un comentario no estándar ‘!’ si ha dicho que quiere utilizarlos. En caso contrario, se inserta un comentario de línea completa en una nueva línea antes de la línea actual.

Los comentarios ‘!’ no estándar se alinean como los comentarios en otros idiomas, pero los comentarios de línea completa son diferentes. En un comentario de línea completa estándar, el propio delimitador del comentario debe aparecer siempre en la columna cero. Lo que puede alinearse es el texto dentro del comentario. Puede elegir entre tres estilos de alineación ajustando la variable fortran-comment-indent-style a uno de estos valores:

fixe
Alinea el texto en una columna fija, que es la suma de la sangría extra de la línea de comentario de fortran y la sangría mínima de la sentencia. Este es el valor por defecto.
La sangría mínima es fortran-minimum-statement-indent-tab para el estilo de línea de continuación del formato tab y fortran-minimum-statement-indent-fixed para el estilo de forma fija.
relative
Alinea el texto como si fuera una línea de código, pero con una sangría adicional de fortran-comment-line-extra-indent.
nil
No mueve el texto automáticamente en los comentarios de línea completa .

Además, puede especificar el carácter que se utilizará para la sangría dentro de los comentarios de línea completa estableciendo la variable fortran-comment-indent-char a la cadena de un solo carácter que desee utilizar.

Las líneas de directivas del compilador, o líneas del preprocesador, tienen la misma apariencia que las líneas de comentarios. Es importante, sin embargo, que estas líneas nunca tengan sangría, sin importar el valor de fortran-comment-indent-style. La variable fortran-directive-re es una expresión regular que especifica qué líneas son directivas. Las líneas que coinciden nunca tienen sangría, y reciben un bloqueo de fuente distintivo.

El comando de comentario normal de Emacs Ctrl-x ; (C-x ;, comment-set-column) no ha sido redefinido. Si utiliza comentarios ‘!’, este comando puede utilizarse con ellos. De lo contrario, es inútil en el modo Fortran.

El comando Ctrl-c ; (C-c ;, fortran-comment-region) convierte todas las líneas de la región en comentarios insertando la cadena ‘c$$$’ al frente de cada una. Con un argumento numérico, vuelve a convertir la región en código vivo borrando ‘c$$$’ del frente de cada línea de la misma. La cadena utilizada para estos comentarios puede controlarse estableciendo la variable fortran-comment-region. Observe que aquí tenemos un ejemplo de un comando y una variable con el mismo nombre; estos dos usos del nombre nunca entran en conflicto porque en Lisp y en Emacs siempre queda claro por el contexto a cuál de ellos se refiere.

Relleno automático en modo Fortran

El modo Fortran tiene soporte especializado para el modo Auto Fill, que es un modo menor que divide automáticamente las sentencias a medida que las inserta cuando se vuelven demasiado anchas. Dividir una sentencia implica hacer líneas de continuación utilizando fortran-continuation-string (ver Líneas de Continuación). Esta división se produce cuando escribe SPACE (SPC), RETURN (RET) o TAB (TAB), y también en los comandos de sangría de Fortran. La activación de Auto Fill en el modo Fortran se realiza de forma normal. Consulte el modo de relleno automático.

Auto Fill rompe las líneas en los espacios o delimitadores cuando las líneas superan el ancho deseado (el valor de fill-column). Los delimitadores (además de los espacios en blanco) con los que puede romper Auto Fill son ‘+’, ‘-’, ‘/’, ‘*’, ‘=’, ‘<’, ‘>’ y ‘,’. El salto de línea viene después del delimitador si la variable fortran-break-before-delimiters es nula. En caso contrario (y por defecto), el salto va antes del delimitador.

Para activar el relleno automático en todos los buffers de Fortran, añada auto-fill-mode a fortran-mode-hook. Véase Hooks.

Comprobación de columnas en Fortran

En el Fortran 77 estándar, todo lo que va más allá de la columna 72 se ignora. La mayoría de los compiladores proporcionan una opción para cambiar esto (por ejemplo, ‘-ffixed-line-length-N’ en gfortran). Personalice la variable fortran-line-length para cambiar la longitud de la línea en el modo Fortran. Cualquier cosa más allá de este punto se bloquea como un comentario. (A menos que esté dentro de una cadena: las cadenas que se extienden más allá de fortran-line-length confundirán el bloqueo de fuente).

Ctrl-c Ctrl-r (C-c C-r)
Muestra una regla de columnas momentáneamente sobre la línea actual (fortran-column-ruler).
Ctrl-c Ctrl-w (C-c C-w)
Divide la ventana actual horizontalmente de forma temporal para que tenga un ancho de columnas de longitud de línea fortran (fortran-window-create-momentarily). Esto puede ayudarle a evitar hacer líneas más largas que el límite impuesto por su compilador de Fortran.
Ctrl-u Ctrl-c Ctrl-w (C-u C-c C-w)
Divide la ventana actual horizontalmente para que tenga un ancho de columnas de longitud de línea de Fortran (fortran-window-create). A continuación, puede seguir editando.
Alt-x fortran-strip-sequence-nos (M-x fortran-strip-sequence-nos)
Borra todo el texto de la columna de longitud de línea fortran y posteriores.

El comando Ctrl-c Ctrl-w (C-c C-r, fortran-column-ruler) muestra una regla de columnas momentáneamente sobre la línea actual. La regla de comentarios son dos líneas de texto que muestran las ubicaciones de las columnas con un significado especial en los programas Fortran. Los corchetes muestran los límites de las columnas para los números de línea, y los corchetes rizados muestran los límites de las columnas para el cuerpo de la sentencia. Los números de columna aparecen encima de ellos.

Tenga en cuenta que los números de columna cuentan desde cero, como siempre en GNU Emacs (pero personalizando column-number-indicator-zero-based puede cambiar la visualización de las columnas para que coincida con la de Fortran; vea Características opcionales de la línea de modo). Como resultado, los números pueden ser uno menos que aquellos con los que está familiarizado; pero las posiciones que indican en la línea son estándar para Fortran.

El texto utilizado para mostrar la regla de columnas depende del valor de la variable indent-tabs-mode. Si el valor de esta variable es nil, entonces el valor de la variable fortran-column-ruler-fixed se utiliza como regla de columna. En caso contrario, se muestra el valor de la variable fortran-column-ruler-tab. Cambiando estas variables, se puede cambiar la visualización de la regla de columna.

Ctrl-c Ctrl-w (C-c C-w, fortran-window-create-momentarily) divide temporalmente la ventana actual de forma horizontal, haciendo una ventana de columnas de longitud de línea fortran, para que pueda ver las líneas demasiado largas. Escriba un espacio para restaurar el ancho normal.

También puede dividir la ventana horizontalmente y continuar editando con la división en su lugar. Para ello, utilice Ctrl-u Ctrl-c Ctrl-w (C-u C-c C-w, M-x fortran-window-create). Editando en esta ventana puedes ver inmediatamente cuando haces una línea demasiado ancha para ser Fortran correcto.

El comando Alt-x fortran-strip-sequence-nos (M-x fortran-strip-sequence-nos) borra todo el texto de la columna fortran-length y más allá, en todas las líneas del buffer actual. Esta es la forma más fácil de deshacerse de los números de secuencia antiguos.

Abreviaturas de palabras clave en Fortran

El modo Fortran proporciona muchas abreviaturas incorporadas para palabras clave y declaraciones comunes. Son el mismo tipo de abreviatura que puede definir usted mismo. Para utilizarlas, debe activar el modo Abbrev. Véase Abreviaturas.

Las abreviaturas incorporadas son inusuales en un sentido: todas comienzan con un punto y coma. Por ejemplo, una abreviatura incorporada en Fortran es ‘;c’ para ‘continue’. Si inserta ‘;c’ y luego inserta un carácter de puntuación como un espacio o una nueva línea, la ‘;c’ se expande automáticamente a ‘continue’, siempre que el modo Abbrev esté activado.

Escriba ‘;?’ o ‘;C-h’ para mostrar una lista de todas las abreviaturas de Fortran incorporadas y lo que significan.



Compilación y prueba de programas

El capítulo anterior trata de los comandos de Emacs que son útiles para hacer cambios en los programas. Este capítulo trata de los comandos que ayudan en el proceso de compilación y prueba de programas.

Ejecución de compilaciones en Emacs

Emacs puede ejecutar compiladores para lenguajes como C y Fortran, alimentando el registro de compilación en un buffer del Editor. También puede analizar los mensajes de error y mostrarte dónde se han producido.

Alt-x compile (M-x compile)
Ejecuta un compilador de forma asíncrona bajo Emacs, con mensajes de error que van al buffer *compilation* (*compilación*).
Alt-x recompile (M-x recompile)
g (g, modo de compilación)
Invoca un compilador con el mismo comando que en la última invocación de Alt-x compile (M-x compile).
Alt-x kill-compilation (M-x kill-compilation)
Mata el subproceso de compilación en ejecución.

Para ejecutar make u otro comando de compilación, escribe Alt-x compile (M-x compile). Esto lee una línea de comandos del shell usando el minibuffer, y luego ejecuta el comando ejecutando un shell como un subproceso (o proceso inferior) de Emacs. La salida se inserta en un buffer llamado *compilation* (*compilación*). El directorio por defecto del buffer actual se utiliza como directorio de trabajo para la ejecución del comando, así que por defecto la compilación tiene lugar en ese directorio.

El comando de compilación por defecto es ‘make -k’, que suele ser correcto para los programas compilados con la utilidad make (la bandera ‘-k’ le dice a make que continúe compilando tanto como sea posible después de un error). Ver Make en el Manual de GNU Make. Si ha hecho Alt-x compile (M-x compile) antes, el comando que especificó se almacena automáticamente en la variable compile-command; esto se utiliza como el valor por defecto la próxima vez que escriba Alt-x compile (M-x compile). Un archivo también puede especificar un valor local de archivo para compile-command (ver Variables locales en archivos).

El inicio de una compilación muestra el buffer de *compilation* en otra ventana pero no lo selecciona. Mientras la compilación se está ejecutando, la palabra ‘run’ se muestra en el indicador de modo mayor para el buffer *compilation* y la palabra ‘Compiling’ ('Compilando') aparece en todas las líneas de modo. No es necesario mantener visible el búfer *compilation* mientras se ejecuta la compilación; ésta continúa en cualquier caso. Cuando la compilación termina, por la razón que sea, la línea de modo del buffer *compilation* cambia para decir ‘exit’ (seguido del código de salida: ‘[0]’ para una salida normal), o ‘signal’ (si una señal terminó el proceso).

Si quiere ver la transcripción de la compilación tal y como aparece, cambie al buffer *compilation* y mueva el punto al final del buffer. Cuando el punto está al final, la nueva salida de compilación se inserta sobre el punto, que permanece al final. En caso contrario, el punto permanece fijo mientras se añade la salida de compilación al final del buffer.

Mientras se realiza la compilación, la línea de modo muestra el número de errores, advertencias y mensajes informativos emitidos por el compilador hasta el momento.

Si cambia la variable compilation-scroll-output a un valor no nulo, el buffer *compilation* se desplaza automáticamente para seguir la salida. Si el valor es first-error, el desplazamiento se detiene cuando aparece el primer error, dejando el punto en ese error. Para cualquier otro valor no nulo, el desplazamiento continúa hasta que no haya más salida.

Para volver a ejecutar la última compilación con el mismo comando, escriba Alt-x recompile (M-x recompile). Esto reutiliza el comando de compilación de la última invocación de Alt-x compile (M-x compile). También reutiliza el buffer *compilation* e inicia la compilación en su directorio por defecto, que es el directorio en el que se inició la compilación anterior. En los búferes de *compilación* este comando está ligado a g.

El inicio de una nueva compilación también mata cualquier compilación que ya se esté ejecutando en *compilation*, ya que el buffer sólo puede manejar una compilación en cualquier momento. Sin embargo, M-x compile y M-x recompile piden confirmación antes de matar una compilación que se está ejecutando; para matar siempre la compilación automáticamente sin preguntar, cambie la variable compilation-always-kill a t. También puede matar un proceso de compilación con el comando Alt-x kill-compilation (M-x kill-compilation).

Para ejecutar dos compilaciones a la vez, inicie la primera, luego renombre el búfer de *compilación* (quizás usando rename-uniquely; vea Operaciones varias del búfer), luego cambie de búfer e inicie la otra compilación. Esto creará un nuevo búfer de *compilación*.

Puede controlar el entorno que se pasa al comando de compilación con la variable compilation-environment. Su valor es una lista de ajustes de variables de entorno; cada elemento debe ser una cadena de la forma "envvarname=value". Estas configuraciones de variables de entorno anulan las habituales.

Modo de compilación

El búfer de *compilación* utiliza un modo principal llamado modo de compilación. El modo de compilación convierte cada mensaje de error de la memoria intermedia en un hipervínculo; puede mover el punto hacia él y escribir RETURN (RET), o hacer clic en él con el ratón (véase Seguir referencias con el ratón), para visitar el locus del mensaje de error en una ventana separada. El locus es la posición específica en un archivo donde se produjo ese error.

La apariencia del búfer de *compilación* puede controlarse personalizando las caras que se utilizan para resaltar partes de este búfer, por ejemplo, compilation-error y compilation-warning, para los mensajes de error y aviso respectivamente. Tenga en cuenta que, dado que esas caras heredan de las caras de error y advertencia, también es posible personalizar directamente la cara padre.

Utilice Alt-x customize-group RETURN compilation (M-x customize-group RET compilation) para ver la lista completa de variables y caras de personalización.

Si cambias la variable compilation-auto-jump-to-first-error a un valor no nulo, Emacs visita automáticamente el lugar del primer mensaje de error que aparece en el buffer de *compilación*.

El modo de compilación proporciona los siguientes comandos adicionales. Estos comandos también pueden usarse en los buffers *grep*, donde los hipervínculos son coincidencias de búsqueda en lugar de mensajes de error (ver Buscar con Grep en Emacs).

Alt-g Alt-g (M-g M-n)
Alt-g g (M-g n)
Ctrl-x ` (C-x `)
Visita el locus del siguiente mensaje de error o coincidencia (next-error).
Alt-g Alt-p (M-g M-p)
Alt-g p (M-g p)
Visita el locus del mensaje de error o coincidencia anterior (previous-error).
Alt-n (M-n)
Mueve el punto al siguiente mensaje de error o coincidencia, sin visitar su locus (compilation-next-error).
Alt-p (M-p)
Mueve el punto al mensaje de error o coincidencia anterior, sin visitar su locus (compilation-previous-error).
Alt-] ( M-} )
Mover el punto al siguiente mensaje de error o coincidencia que se produce en un archivo diferente (compilation-next-file).
Alt-{ ( M-{ )
Mueve el punto al anterior mensaje de error o coincidencia que ocurre en un archivo diferente (compilación-previa-archivo).
Ctrl-c Ctrl-f (C-c C-f)
Conmuta el modo menor de seguimiento del siguiente error, que hace que el movimiento del cursor en el búfer de compilación produzca una visualización automática de la fuente.
g (g)
Reejecutar el último comando cuya salida se muestra en el buffer de *compilación* (*compilation*).
Alt-x next-error-select-buffer-buffer
(M-x next-error-select-buffer-buffer)
Selecciona un buffer para ser utilizado por la siguiente invocación de next-error y previous-error.

Para visitar los errores de forma secuencial, escriba Ctrl-x ` (C-x `, next-error), o de forma equivalente Alt-g Alt-n (M-g M-n) o Alt-g n (M-g n). Este comando puede invocarse desde cualquier buffer, no sólo desde un buffer en modo compilación. La primera vez que se invoca después de una compilación, visita el lugar del primer mensaje de error. Cada Alt-g Alt-n posterior visita el siguiente error, de forma similar. Si visita un error específico con RETURN o un clic del ratón en el búfer *compilation*, los siguientes comandos Alt-g Alt-n avanzan desde allí. Cuando Alt-g Alt-n no encuentra más mensajes de error para visitar, señala un error. Ctrl-u Alt-g Alt-n (C-u M-g M-n) comienza de nuevo desde el principio del buffer de compilación, y visita el primer locus.

Alt-g Alt-p o Alt-g p (M-g M-p o M-g p, previous-error) itera a través de los errores en la dirección opuesta.

Los comandos next-error y previous-error no sólo actúan sobre los errores o coincidencias listados en los buffers: *compilation* y *grep*; también saben cómo iterar a través de las listas de errores o coincidencias producidas por otros comandos, como Alt-x occur (M-x occur) (ver Otros comandos de búsqueda y bucle). Si el búfer actual contiene mensajes de error o coincidencias, estos comandos iterarán a través de ellos; de lo contrario, Emacs busca un búfer que contenga mensajes de error o coincidencias entre las ventanas del marco seleccionado (si la variable next-error-find-buffer-function está personalizada con el valor next-error-buffer-on-selected-frame), luego un búfer utilizado previamente por next-error o previous-error, y finalmente todos los demás búferes. Se mostrará cualquier búfer por el que estos comandos iteren y que no se muestre actualmente en una ventana. Puede utilizar el comando next-error-select-buffer para cambiar a un búfer diferente que será utilizado por la siguiente invocación de next-error.

Por defecto, los comandos next-error y previous-error omiten los mensajes menos importantes. La variable compilation-skip-threshold controla esto. El valor por defecto, 1, significa saltar cualquier cosa menos importante que una advertencia. Un valor de 2 significa saltar cualquier cosa menos importante que un error, mientras que 0 significa no saltar ningún mensaje.

Cuando Emacs visita el locus de un mensaje de error, resalta momentáneamente la línea fuente relevante. La duración de este resaltado está determinada por la variable next-error-highlight para el locus en el buffer seleccionado, y next-error-highlight-no-select para el locus en los buffers no seleccionados. También puede personalizar la variable next-error-message-highlight que define cómo resaltar el mensaje de error actual en el buffer que contiene mensajes.

Si el búfer de *compilación* se muestra en una ventana con una franja izquierda (ver Franjas de la ventana), los comandos de visita de locus ponen una flecha en la franja, apuntando al mensaje de error actual. Si la ventana no tiene franja izquierda, como en un terminal de texto, estos comandos desplazan la ventana para que el mensaje actual esté en la parte superior de la ventana. Si cambia la variable compilation-context-lines por t, se inserta en su lugar una flecha visible antes de la columna cero. Si cambia la variable por un valor entero n, estos comandos desplazan la ventana para que el mensaje de error actual esté a n líneas de la parte superior, haya o no flecos; el valor por defecto, nil, da el comportamiento descrito anteriormente.

Para analizar los mensajes del compilador, el modo de compilación utiliza la variable compilation-error-regexp-alist que enumera varios formatos de mensajes de error y le dice a Emacs cómo extraer el locus de cada uno. Una variable similar, grep-regexp-alist, le dice a Emacs cómo analizar la salida de un comando grep (ver Buscar con Grep en Emacs).

El modo de compilación también define las teclas SPC (SPACE) y DEL (DEL) para desplazarse por los pantallazos; Alt-n (M-n, compilation-next-error) y Alt-p (M-p, compilation-previous-error) para pasar al siguiente o anterior mensaje de error; y Alt-{ (M-{, compilation-next-file) y Alt-} (M-}, compilation-previous-file) para pasar al mensaje de error siguiente o anterior de un archivo fuente diferente.

Puede teclear Ctrl-c Ctrl-f (C-c C-f) para alternar el modo de seguimiento de errores siguientes. En este modo menor, el movimiento ordinario del cursor en el búfer de compilación actualiza automáticamente el búfer de origen, es decir, al mover el cursor sobre un mensaje de error se muestra el lugar de ese error.

Las características del modo de compilación también están disponibles en un modo menor llamado modo menor de compilación. Esto le permite analizar los mensajes de error en cualquier búfer, no sólo en un búfer de salida de compilación normal. Escriba Alt-x compilation-minor-mode (M-x compilation-minor-mode) para activar el modo menor. Por ejemplo, en un búfer Rlogin (véase Shell de host remoto), el modo menor de compilación accede automáticamente a los archivos fuente remotos por FTP (véase Nombres de archivos).

Subshells para la compilación

Esta sección incluye varias técnicas y consejos para usar un shell y sus características en buffers de compilación. Este material es específico para compilaciones locales, y muy probablemente no funcionará en (o será irrelevante para) buffers de compilación cuyo directorio por defecto está en hosts remotos.

El comando de compilación Alt-x (M-x) utiliza un shell para ejecutar el comando de compilación, pero especifica la opción de un shell no interactivo. Esto significa, en particular, que el intérprete de comandos debe iniciarse sin un indicador. Si encuentra que el prompt de su shell habitual hace una desagradable aparición en el buffer *compilation*, significa que ha cometido un error en el archivo de init de su shell al establecer el prompt incondicionalmente. (Este archivo de init puede llamarse .bashrc, .profile, .cshrc, .shrc, etc., dependiendo del shell que utilice). El archivo de init del shell debe establecer el prompt sólo si ya existe un prompt. Así es como se hace en bash:

    if [ "${PS1+set}" = set ]
    then PS1=…
    fi

Y aquí está como hacerlo en csh:

    if ($?prompt) set prompt = …

Si quieres personalizar el valor de la variable de entorno TERM que se pasa a la subshell de compilación, personaliza la variable comint-terminal (ver Opciones del modo Shell).

Emacs no espera que un proceso de compilación lance subprocesos asíncronos; si lo hace, y siguen ejecutándose después de que el proceso de compilación principal haya terminado, el Editor puede matarlos o su salida puede no llegar a Él. Para evitar este problema, haz que el proceso de compilación principal espere a que sus subprocesos terminen. En un script de shell, puedes hacer esto usando ‘$!’ y ‘wait’, así:

    (sleep 10; echo 2nd)& pid=$!  # Registra el pid del subproceso
    echo first message
    wait $pid                     # Espera al subproceso

Si el proceso en segundo plano no da salida al buffer de compilación, por lo que sólo hay que evitar que se mate cuando el proceso de compilación principal termine, es suficiente:

    nohup command; sleep 1

En MS-DOS, los subprocesos asíncronos no están soportados, por lo que Alt-x compile (M-x compile) ejecuta el comando de compilación de forma sincrónica (es decir, debes esperar a que el comando termine antes de poder hacer cualquier otra cosa en Emacs). Ver Emacs y MS-DOS.

Buscar con Grep en Emacs

Al igual que puedes ejecutar un compilador desde Emacs y luego visitar las líneas con errores de compilación, también puedes ejecutar grep y luego visitar las líneas en las que se encontraron coincidencias. Esto funciona tratando las coincidencias reportadas por grep como si fueran errores. El búfer de salida utiliza el modo Grep, que es una variante del modo de compilación (ver Modo de compilación).

Alt-x grep (M-x grep)
Alt-x lgrep (M-x lgrep)
Ejecuta grep de forma asíncrona bajo Emacs, listando las líneas coincidentes en el buffer llamado *grep*.
Alt-x grep-find (M-x grep-find)
Alt-x find-grep (M-x find-grep)
Alt-x rgrep (M-x rgrep)
Ejecuta grep a través de find, y recoge la salida en el buffer *grep*.
Alt-x zrgrep (M-x zrgrep)
Ejecuta zgrep y recoge la salida en el buffer *grep*.
Alt-x kill-grep (M-x kill-grep)
Mata el subproceso grep en ejecución.

Para ejecutar grep, escriba Alt-x grep (M-x grep) y, a continuación, introduzca una línea de comandos que especifique cómo ejecutar grep. Utilice los mismos argumentos que le daría a grep al ejecutarlo normalmente: una regexp al estilo de grep (normalmente entre comillas simples para citar los caracteres especiales del shell) seguida de los nombres de los archivos, que pueden utilizar comodines. Si se especifica un argumento de prefijo para M-x grep, éste encuentra el identificador (ver Buscar referencias de identificadores) en el buffer alrededor del punto, y lo pone en el comando grep por defecto.

No es necesario que su comando ejecute simplemente grep; puede utilizar cualquier comando del shell que produzca una salida en el mismo formato. Por ejemplo, puede encadenar comandos grep, de esta manera:

grep -nH -e foo *.el | grep bar | grep toto

La salida de grep va en el buffer *grep*. Puede encontrar las líneas correspondientes en los archivos originales usando Alt-g (M-g) Alt-n (M-n), RETURN (RET), y así sucesivamente, al igual que los errores de compilación. Ver Modo de Compilación, para una descripción detallada de los comandos y las teclas disponibles en el buffer *grep*.

Algunos programas grep aceptan la opción ‘--color’ para mostrar marcadores especiales alrededor de las coincidencias con el propósito de resaltarlas. Puede hacer uso de esta característica estableciendo grep-highlight-matches a t. Cuando se muestra una coincidencia en el buffer de origen, se resaltará la coincidencia exacta, en lugar de toda la línea de origen. El resaltado se realiza mediante la coincidencia de las secuencias de escape ANSI emitidas por grep. La coincidencia de las secuencias es controlada por grep-match-regexp, que puede ser personalizada para acomodar diferentes programas grep.

Al igual que con los comandos de compilación (véase Ejecución de compilaciones en Emacs), mientras se ejecuta el comando grep, la línea de modo muestra el número de coincidencias encontradas y resaltadas hasta el momento.

Los comandos grep ofrecerán guardar los buffers antes de ejecutarse. Esto es controlado por la variable grep-save-buffers. Los valores posibles son nil (no guardar), ask (preguntar antes de guardar), o una función que se utilizará como predicado (y se llama con el nombre del archivo como parámetro y debe devolver no nil si el búfer se va a guardar). Cualquier otro valor no nulo significa que todos los búferes deben guardarse sin preguntar. El valor por defecto es ask.

El comando Alt-x grep-find (M-x grep-find, también disponible como Alt-x find-grep (M-x find-grep)) es similar a Alt-x grep (M-x grep), pero proporciona un valor inicial diferente para el comando, uno que ejecuta tanto find como grep, para buscar en todos los archivos de un árbol de directorios. Véase también el comando find-grep-dired, en Dired y find.

Los comandos Alt-x lgrep (M-x lgrepgrep local) y Alt-x rgrep (M-x rgrep, grep recursivo) son versiones más fáciles de usar de grep y grep-find, que solicitan por separado la expresión regular a comparar, los archivos a buscar y el directorio base para la búsqueda. La sensibilidad a las mayúsculas y minúsculas de la búsqueda se controla mediante el valor actual de case-fold-search. El comando Alt-x zrgrep (M-x zrgrep) es similar a Alt-x rgrep (M-x rgrep), pero llama a zgrep en lugar de a grep para buscar en el contenido de los archivos comprimidos.

Estos comandos construyen los comandos del shell basados en las variables grep-template (para lgrep) y grep-find-template (para rgrep). Los archivos a buscar pueden utilizar alias definidos en la variable grep-files-aliases.

Los directorios listados en la variable grep-find-ignored-directories son automáticamente omitidos por M-x rgrep. El valor por defecto incluye los directorios de datos utilizados por varios sistemas de control de versiones.

Por defecto, los comandos del shell construidos para lgrep, rgrep y zgrep se abrevian para su visualización ocultando la parte que contiene una larga lista de archivos y directorios a ignorar. Puede revelar la parte oculta haciendo clic en el botón con elipsis que los representa. También puede alternar interactivamente la visualización de la parte oculta escribiendo Alt-x grep-find-toggle-abbreviation (M-x grep-find-toggle-abbreviation). Para desactivar esta abreviación de los comandos del shell, personalice la opción grep-find-abbreviate a un valor nulo.

Encontrar errores de sintaxis sobre la marcha

El modo Flymake es un modo menor que realiza una comprobación de sintaxis sobre la marcha para muchos lenguajes de programación y marcado, incluyendo C, C++, Perl, HTML y TeX/LaTeX. Es algo análogo al modo Flyspell, que realiza la comprobación ortográfica de lenguajes humanos ordinarios de forma similar (véase Comprobación y corrección ortográfica). Mientras edita un archivo, el modo Flymake ejecuta una herramienta de comprobación sintáctica apropiada en segundo plano, utilizando una copia temporal del buffer. Luego analiza los mensajes de error y advertencia, y resalta las líneas erróneas en el buffer. La herramienta de comprobación de sintaxis utilizada depende del lenguaje; por ejemplo, para los archivos C/C++ suele ser el compilador de C. Flymake también puede utilizar herramientas de construcción como make para comprobar proyectos complicados.

Para activar el modo Flymake, escriba Alt-x flymake-mode (M-x flymake-mode). Puede saltar a los errores que encuentra utilizando Alt-x flymake-goto-next-error (M-x flymake-goto-next-error) y Alt-x flymake-goto-prev-error (M-x flymake-goto-prev-error). Para mostrar cualquier mensaje de error asociado a la línea actual, escriba Alt-x flymake-display-err-menu-for-current-line (M-x flymake-display-err-menu-for-current-line).

Para más detalles sobre el uso de Flymake, vea Flymake en The Flymake Manual.

Ejecución de depuradores en Emacs

La biblioteca GUD (Grand Unified Debugger) proporciona una interfaz de Emacs para una amplia variedad de depuradores simbólicos. Puede ejecutar el depurador de GNU (GDB), así como DBX, SDB, XDB, los comandos de depuración de Guile REPL, el modo de depuración de Perl, el depurador de Python PDB y el depurador de Java JDB.

Emacs proporciona una interfaz especial para GDB, que utiliza ventanas extra del Editor para mostrar el estado del programa depurado. Ver GDB Graphical Interface.

Emacs también tiene un depurador incorporado para los programas Emacs Lisp. Ver El depurador de Lisp en el Manual de Referencia de Emacs Lisp.

Iniciar el GUD

Existen varios comandos para iniciar un subproceso de depuración, cada uno de los cuales corresponde a un programa de depuración en particular.

Alt-x gdb (M-x gdb)
Ejecuta GDB como un subproceso, e interactúa con él a través de una interfaz Emacs tipo IDE. Ver GDB Graphical Interface, para más información sobre este comando.
Alt-x gud-gdb (M-x gud-gdb)
Ejecuta GDB, usando un buffer de interacción GUD para la entrada y salida al subproceso GDB (ver Operación del depurador). Si dicho búfer ya existe, cambie a él; de lo contrario, cree el búfer y cambie a él.
Los otros comandos de esta lista hacen lo mismo, para otros programas de depuración.
Alt-x perldb (M-x perldb)
Ejecuta el intérprete de Perl en modo de depuración.
Alt-x jdb (M-x jdb)
Ejecuta el depurador de Java.
Alt-x pdb (M-x pdb)
Ejecuta el depurador de Python.
Alt-x guiler (M-x guiler)
Ejecuta el REPL de Guile para depurar programas de Guile Scheme.
Alt-x dbx (M-x dbx)
Ejecuta el depurador DBX.
Alt-x xdb (M-x xdb)
Ejecuta el depurador XDB.
Alt-x sdb (M-x sdb)
Ejecuta el depurador SDB.

Cada uno de estas instrucciones lee una línea de comando para invocar el depurador, utilizando el minibuffer. El contenido inicial del minibuffer contiene el nombre del ejecutable estándar y las opciones para el depurador, y a veces también una suposición del nombre del archivo ejecutable que se quiere depurar. Los comodines y variables de la shell no están permitidos en esta línea de comandos. Emacs asume que el primer argumento del comando que no comienza con un ‘-’ es el nombre del archivo ejecutable.

Tramp proporciona una facilidad para la depuración remota, en la que tanto el depurador como el programa que se está depurando están en el mismo host remoto. Ver Ejecutar un depurador en un host remoto en el Manual de Tramp, para más detalles. Esto es diferente a la característica de depuración remota de GDB, donde el programa y el depurador se ejecutan en diferentes máquinas (ver Depuración de programas remotos en El depurador de GNU).

Funcionamiento del depurador

El buffer de interacción de GUD es un buffer de Emacs que se utiliza para enviar comandos de texto a un subproceso del depurador, y registrar su salida. Esta es la interfaz básica para interactuar con un depurador, utilizada por Alt-x gud-gdb (M-x gud-gdb) y otros comandos listados en Starting GUD. El comando Atl-x gdb (M-x gdb) extiende esta interfaz con búferes especializados adicionales para controlar los puntos de interrupción, los marcos de la pila y otros aspectos del estado del depurador (ver Interfaz Gráfica GDB).

El buffer de interacción GUD utiliza una variante del modo Shell, por lo que los comandos de Emacs definidos por el modo Shell están disponibles (ver Modo Shell). La finalización está disponible para la mayoría de los comandos del depurador (ver Finalización), y puede utilizar los comandos habituales del historial del modo Shell para repetirlos. Vea Comandos del GUD, para conocer los comandos especiales que se pueden utilizar en el buffer de interacción del GUD.

Mientras depura un programa, Emacs muestra los archivos fuente relevantes visitándolos en sus buffers, con una flecha en la franja izquierda que indica la línea de ejecución actual. (En un terminal de texto, la flecha aparece como ‘=>’, superpuesta a las dos primeras columnas de texto). Mover el punto en un búfer de este tipo no mueve la flecha. Es libre de editar estos archivos fuente, pero tenga en cuenta que insertar o borrar líneas desviará el posicionamiento de la flecha, ya que Emacs no tiene forma de averiguar qué línea fuente editada corresponde a la línea reportada por el subproceso de depuración. Para actualizar esta información, normalmente hay que recompilar y reiniciar el programa.

El modo GUD Tooltip es un modo global menor que añade soporte de tooltip a GUD. Para activar este modo, escriba Alt-x gud-tooltip-mode (M-x gud-tooltip-mode). Está desactivado por defecto. Si está habilitado, puede mover el puntero del ratón sobre una variable, una función o una macro (colectivamente llamadas identificadores) para mostrar sus valores en la información sobre herramientas (ver Información sobre herramientas). Si el simple hecho de situar el puntero del ratón sobre una expresión no muestra el valor de la expresión que tenía en mente, puede decirle a Emacs de forma más explícita qué expresión debe evaluar arrastrando el ratón sobre la expresión y dejando el ratón dentro del área marcada. El modo GUD Tooltip tiene efecto en el buffer de interacción GUD, y en todos los buffers de origen con modos principales listados en la variable gud-tooltip-modes. Si la variable gud-tooltip-echo-area no es nula, o si ha desactivado el modo tooltip, los valores se muestran en el área de eco en lugar de un tooltip.

Cuando se utiliza el modo GUD Tooltip con Alt-x gud-gdb (M-x gud-gdb), mostrar el valor de una expresión en GDB puede a veces expandir una macro, causando potencialmente efectos secundarios en el programa depurado. Por esta razón, el uso de tooltips en gud-gdb está deshabilitado. Si se utiliza la interfaz de Alt-x gdb (M-x gdb), este problema no ocurre, ya que hay un código especial para evitar los efectos secundarios; además, se pueden mostrar las definiciones de macros asociadas a un identificador cuando el programa no se está ejecutando.

Comandos de GUD

GUD proporciona comandos para establecer y borrar puntos de interrupción, seleccionar marcos de pila y recorrer el programa.

Ctrl-x Ctrl-a Ctrl-b (C-x C-a C-b)
Establece un punto de interrupción en la línea fuente en la que se encuentra ese punto.

C-x C-a C-b (gud-break), cuando se llama en un buffer de origen, establece un punto de interrupción del depurador en la línea de origen actual. Este comando está disponible sólo después de iniciar GUD. Si lo llama en un buffer que no está asociado a ningún subproceso del depurador, señala un error.

Los siguientes comandos están disponibles tanto en el buffer de interacción de GUD como globalmente, pero con diferentes combinaciones de teclas. Las teclas que comienzan con Ctrl-c (C-c) están disponibles sólo en el buffer de interacción GUD, mientras que las que comienzan con Ctrl-x Ctrl-a (C-x C-a) están disponibles globalmente. Algunos de estos comandos también están disponibles a través de la barra de herramientas; otros no son soportados por ciertos depuradores.

Ctrl-c Ctrl-l (C-c C-l)
Ctrl-x Ctrl-a Ctrl-l (C-x C-a C-l)
Muestra, en otra ventana, la última línea fuente referida en el buffer de interacción GUD (gud-refresh).
Ctrl-c Ctrl-s (C-c C-s)
Ctrl-x Ctrl-a Ctrl-s (C-x C-a C-s)
Ejecutar la siguiente línea de código (gud-step). Si la línea contiene una llamada a una función, la ejecución se detiene después de entrar en la función llamada.
Ctrl-c Ctrl-n (C-c C-n)
Ctrl-x Ctrl-a Ctrl-n (C-x C-a C-n)
Ejecuta la siguiente línea de código, atravesando las llamadas a funciones sin detenerse dentro de ellas (gud-next).
Ctrl-c Ctrl-i (C-c C-i)
Ctrl-x Ctrl-a Ctrl-i (C-x C-a C-i)
Ejecuta una única instrucción de máquina (gud-stepi).
Ctrl-c Ctrl-p (C-c C-p)
Ctrl-x Ctrl-a Ctrl-p (C-x C-a C-p)
Evalúa la expresión en el punto (gud-print). Si Emacs no imprime la expresión exacta que desea, márquela primero como región.
Ctrl-c Ctrl-r (C-c C-r)
Ctrl-x Ctrl-a Ctrl-r (C-x C-a C-r)
Continúa la ejecución sin especificar ningún punto de parada. El programa se ejecutará hasta que llegue a un punto de interrupción, termine, o reciba una señal que el depurador esté comprobando (gud-cont).
Ctrl-c Ctrl-d (C-c C-d)
Ctrl-x Ctrl-a Ctrl-Ctrl-d (C-x C-a C-d)
Elimina los puntos de interrupción en la línea fuente actual, si los hay (gud-remove). Si usa este comando en el buffer de interacción GUD, se aplica a la línea donde el programa se detuvo por última vez.
Ctrl-c Ctrl-t (C-c C-t)
Ctrl-x Ctrl-a Ctrl-t (C-x C-a C-t)
Establece un punto de interrupción temporal en la línea fuente actual, si la hay (gud-tbreak). Si utiliza este comando en el buffer de interacción GUD, se aplica a la línea donde el programa se detuvo por última vez.
Ctrl-c < (C-c <)
Ctrl-x Ctrl-a < (C-x C-a <)
Selecciona el siguiente marco de pila adjunto (gud-up). Esto es equivalente al comando GDB ‘up’.
Ctrl-c > (C-c >)
Ctrl-x Ctrl-a > (C-x C-a >)
Selecciona el siguiente marco de pila interior (gud-down). Esto es equivalente al comando GDB ‘down’.
Ctrl-c Ctrl-u (C-c C-u)
Ctrl-x Ctrl-a Ctrl-u (C-x C-a C-u)
Continuar la ejecución hasta la línea actual (gud-until). El programa se ejecutará hasta que llegue a un punto de interrupción, termine, reciba una señal que el depurador esté comprobando o llegue a la línea en la que se encuentra el cursor actualmente.
Ctrl-c Ctrl-f (C-c C-f)
Ctrl-x Ctrl-a Ctrl-f (C-x C-a C-f)
Ejecuta el programa hasta que el marco de pila seleccionado retorna o se detiene por alguna otra razón (gud-finish).

Si está utilizando GDB, estas teclas adicionales están disponibles:

Ctrl-x Ctrl-a Ctrl-j (C-x C-a C-j)
Sólo útil en un buffer de origen, gud-jump transfiere el punto de ejecución del programa a la línea actual. En otras palabras, la siguiente línea que ejecute el programa será aquella en la que usted dio la orden. Si la nueva línea de ejecución está en una función diferente a la anterior, GDB pide confirmación ya que los resultados pueden ser extraños. Consulte la entrada del manual de GDB relativa al salto para más detalles.
TAB (TAB)
Con GDB, completa un nombre de símbolo (gud-gdb-complete-command). Esta tecla sólo está disponible en el buffer de interacción de GUD.

Estos comandos interpretan un argumento numérico como una cuenta de repetición, cuando eso tiene sentido.

Debido a que TAB (TAB) sirve como un comando de finalización, no puede usarlo para introducir un tabulador como entrada al programa que está depurando con GDB. En su lugar, escriba Ctrl-q TAB (C-q TAB) para introducir un tabulador.

Personalización de GUD

Al iniciar, GUD ejecuta uno de los siguientes ganchos (hooks): gdb-mode-hook, si está usando GDB; dbx-mode-hook, si está usando DBX; sdb-mode-hook, si está usando SDB; xdb-mode-hook, si está usando XDB; guiler-mode-hook para depuración Guile REPL; perldb-mode-hook, para modo de depuración Perl; pdb-mode-hook, para PDB; jdb-mode-hook, para JDB. Véase Hooks.

La macro Lisp gud-def (ver Definiendo Macros en el Manual de Referencia de Emacs Lisp) proporciona una forma conveniente de definir un comando Emacs que envíe una cadena de comandos particular al depurador, y establecer una unión de teclas para en el buffer de interacción GUD:

(gud-def function cmdstring binding docstring)

Esto define una función (function) con nombre de comando que envía cmdstring al proceso de depuración, y le da la cadena de documentación docstring. A continuación, puede utilizar la función de comando en cualquier búfer. Si binding no es nulo, gud-def también vincula el comando a la vinculación (al binding) Ctrl-c (C-c) en el modo del buffer GUD y a la vinculación (al binding) Ctrl-x Ctrl-a (C-x C-a) en general.

La cadena de comandos cmdstring puede contener ciertas secuencias ‘cmdstring’ que representan datos que deben ser rellenados en el momento de llamar a la función (en el momento de llamar a function):

%f (‘%f’)
El nombre del archivo fuente actual. Si el buffer actual es el buffer GUD, entonces el archivo fuente actual es el archivo en el que se detuvo el programa.
%l (‘%l’)
El número de la línea fuente actual. Si el buffer actual es el buffer GUD, entonces la línea fuente actual es la línea en la que el programa se detuvo.
%e (‘%e’)
En el modo de marca transitoria el texto de la región, si está activa. En caso contrario, el texto del valor de C o de la expresión de llamada a función en el punto o adyacente al mismo.
%a (‘%a’)
El texto de la dirección hexadecimal en o adyacente al punto.
%p (‘%p’)
El argumento numérico de la función llamada, como número decimal. Si el comando se utiliza sin un argumento numérico, ‘%p’ representa la cadena vacía. Si no se utiliza ‘%p’ en la cadena de comandos, el comando que se define ignora cualquier argumento numérico.
%d (‘%d’)
El nombre del directorio del archivo fuente actual.
%c (‘%c’)
Nombre de clase totalmente cualificado derivado de la expresión que rodea al punto (sólo jdb).

Interfaz gráfica de GDB

El comando Alt-x gdb (M-x gdb) inicia GDB en una interfaz parecida a la del IDE, con búferes especializados para controlar los puntos de interrupción, los marcos de pila y otros aspectos del estado del depurador. También proporciona formas adicionales de controlar la sesión de depuración con el ratón, como hacer clic en la franja de un búfer de origen para establecer un punto de interrupción allí.

Para ejecutar GDB usando sólo la interfaz del búfer de interacción GUD, sin estas características adicionales, use Alt-x gud-gdb (M-x gud-gdb) (vea Iniciar GUD). Debe usar esto si quiere depurar múltiples programas dentro de una sesión de Emacs, ya que actualmente no es soportado por M-x gdb.

Internamente, M-x gdb informa a GDB que el tamaño de su pantalla es ilimitado; para un correcto funcionamiento, no debe cambiar los valores de altura y anchura de la pantalla de GDB durante la sesión de depuración.

Diseño de la interfaz de usuario GDB

Si la variable gdb-many-windows es nula (por defecto), Alt-x gdb (M-x gdb) normalmente muestra sólo el buffer de interacción GUD. Sin embargo, si la variable gdb-show-main es también no nula, se inicia con dos ventanas: una mostrando el buffer de interacción GUD, y la otra mostrando el código fuente de la función principal del programa que está depurando.

Si gdb-many-windows es no-nil, entonces Alt-x gdb (M-x gdb) muestra la siguiente distribución de cuadros:

+--------------------------------+--------------------------------------------+
|   Buffer de interacción GUD    |   Buffer de Locales/Registros              |
|--------------------------------+--------------------------------------------+
|   Buffer de código primario    |   Buffer de E/S para debugger pgm          |
|--------------------------------+--------------------------------------------+
|   Buffer de pila               |   Buffer de puntos de interrupción/hilos   |
+--------------------------------+--------------------------------------------+

Puede personalizar el diseño de la ventana basado en el anterior y guardar ese diseño en un archivo usando gdb-save-window-configuration. Luego puede volver a cargar este diseño usando gdb-load-window-configuration. (Internamente, Emacs utiliza el término configuración de ventana en lugar de diseño de ventana). Puede establecer su diseño personalizado como el predeterminado utilizado por gdb-many-windows personalizando gdb-default-window-configuration-file. Si no es un nombre de archivo absoluto, GDB busca el archivo en gdb-window-configuration-directory. gdb-window-configuration-directory por defecto es user-emacs-directory (ver Cómo encuentra Emac su archivo de inicio).

Si alguna vez cambia la disposición de las ventanas, puede restaurar la disposición por defecto escribiendo Alt-x gdb-restore-windows (M-x gdb-restore-windows). Para alternar entre la disposición de muchas ventanas y una disposición simple con sólo el buffer de interacción GUD y un archivo fuente, escriba Alt-x gdb-many-windows (M-x gdb-many-windows).

Si tiene una configuración de ventanas elaborada, y no quiere que gdb-many-windows la interrumpa, es mejor invocar Alt-x gdb (M-x gdb) en un marco separado para empezar, entonces la disposición de las ventanas en su marco original no se verá afectada. Un marco separado para las sesiones de GDB puede ser especialmente útil si usted trabaja en una terminal en modo texto, donde el espacio de la pantalla para las ventanas puede ser muy importante. Si elige iniciar GDB en el mismo marco, considere establecer gdb-restore-window-configuration-after-quit a un valor no nulo. Su diseño original será entonces restaurado después de que GDB se cierre. Utilice t para restaurar siempre; utilice if-gdb-many-windows para restaurar sólo cuando gdb-many-windows sea distinto de cero; utilice if-gdb-show-main para restaurar sólo cuando gdb-show-main sea distinto de cero.

También puede especificar búferes adicionales relacionados con GDB para mostrar, ya sea en el mismo marco o en uno diferente. Seleccione los búferes que desee escribiendo Alt-x gdb-display-buffertype-buffer (M-x gdb-display-buffertype-buffer) o Alt-x gdb-frame-buffertype-buffer (M-x gdb-frame-buffertype-buffer), donde buffertype es el tipo de búfer relevante, como ‘breakpoints’. Puede hacer lo mismo con la barra de menú, con los submenús ‘GDB-Windows’ y ‘GDB-Frames’ del menú ‘GUD’.

Por defecto, GDB utiliza como máximo una ventana para mostrar el archivo fuente. Puede hacer que utilice más ventanas personalizando gdb-max-source-window-count. También puede personalizar gdb-display-source-buffer-action para controlar cómo GDB muestra los archivos fuente.

Cuando termine de depurar, elimine el buffer de interacción de GUD con Ctrl-x k (C-x k), lo que también eliminará todos los buffers asociados a la sesión. Sin embargo, no es necesario hacer esto si, después de editar y volver a compilar su código fuente dentro de Emacs, desea continuar con la depuración. Cuando reinicie la ejecución, GDB encontrará automáticamente el nuevo ejecutable. Mantener el buffer de interacción de GUD tiene la ventaja de conservar el historial del shell así como los puntos de interrupción de GDB. Es necesario comprobar que los puntos de interrupción en los archivos fuente recientemente editados siguen estando en los lugares correctos.

Buffers de fuentes

(mouse-1 ) en la franja
Establece o borra un punto de interrupción en esa línea (gdb-mouse-set-clear-breakpoint).
Ctrl- (C-mouse-1) en la franja
Activa o desactiva un punto de interrupción en esa línea (gdb-mouse-toggle-breakpoint-margin).
(mouse-3) en la franja
Continúa la ejecución en esa línea (gdb-mouse-until).
Ctrl- (C-raton-3) en la franja
Salta a esa línea (gdb-mouse-jump).

En una pantalla gráfica, puede hacer clic con (ratón-1) en la franja de un búfer fuente, para establecer un punto de interrupción en esa línea (ver Franjas de la ventana). Aparecerá un punto rojo en la franja, donde haya hecho clic. Si ya existe un punto de interrupción allí, el clic lo elimina. Un clic con Ctrl- (C-raton-1) activa o desactiva un punto de interrupción existente; un punto de interrupción desactivado, pero no desactivado, se indica con un punto gris.

En un terminal de texto, o cuando los flecos están deshabilitados, los puntos de interrupción habilitados se indican con un carácter ‘B’ en el margen izquierdo de la ventana. Los puntos de interrupción deshabilitados se indican con una ‘b‘. (El margen sólo se muestra si hay un punto de interrupción presente).

Una flecha sólida en el margen izquierdo de un búfer de origen indica la línea del marco más interno donde se ha detenido el programa depurado. Una flecha hueca indica la línea de ejecución actual de un marco superior. Si arrastra la flecha en la franja con (ratón-1), eso hace que la ejecución avance hasta la línea en la que suelta el botón. Alternativamente, puede hacer clic con (ratón-3) en la franja para avanzar a esa línea. Puede pulsar Ctrl- (C-ratón-3) en la franja para saltar a esa línea sin ejecutar las líneas intermedias. Este comando le permite ir hacia atrás, lo que puede ser útil para recorrer el código que ya se ha ejecutado, con el fin de examinar su ejecución con más detalle.

Por defecto, los nombres de los archivos fuente y las cadenas no ASCII del programa que se está depurando se decodifican utilizando el sistema de codificación por defecto. Si prefiere una decodificación diferente, tal vez porque el programa que está siendo depurado utiliza una codificación de caracteres diferente, establezca la variable gdb-mi-decode-strings al sistema de codificación apropiado, o a nil para dejar los caracteres no ASCII como escapes octales sin decodificar.

Buffer de puntos de interrupción

El buffer de puntos de interrupción del GDB muestra los puntos de interrupción, los puntos de vigilancia y los puntos de captura en la sesión del depurador. Vea Breakpoints en El depurador de GNU. Proporciona los siguientes comandos, que en su mayoría se aplican al punto de interrupción actual (el punto de interrupción en el que se encuentra):

SPACE (SPC)
Activa/desactiva el punto de ruptura actual (gdb-toggle-breakpoint). En una pantalla gráfica, esto cambia el color del punto en la franja del buffer de origen en esa línea. El punto es rojo cuando el punto de ruptura está activado, y gris cuando está desactivado.
D (D)
Borra el punto de interrupción actual (gdb-delete-breakpoint).
RETURN (RET)
Visita la línea de origen del punto de ruptura actual (gdb-goto-breakpoint).
(mouse-2)
Visita la línea de origen del punto de ruptura sobre el que se hace clic (gdb-goto-breakpoint).

Cuando gdb-many-windows es no nulo, el buffer de puntos de ruptura GDB comparte su ventana con el buffer de hilos GDB. Para pasar de uno a otro haga clic con (ratón-1) en el botón correspondiente de la línea de cabecera. Si gdb-show-threads-by-default no es nulo, el búfer GDB Threads es el que se muestra por defecto.

Buffer de hilos

El buffer de hilos del GDB muestra un resumen de los hilos en el programa depurado. Vea Depuración de programas con múltiples hilos en El depurador de GNU. Para seleccionar un hilo, mueva el punto allí y presione RETURN (RET) (gdb-select-thread), o haga clic en él con (ratón-2). Esto también muestra el buffer de origen asociado, y actualiza el contenido de los otros buffers de GDB.

Puede personalizar las variables en el grupo gdb-buffers para seleccionar los campos incluidos en el buffer GDB Threads.

gdb-thread-buffer-verbose-names
Muestra nombres de hilos largos como ‘Thread 0x4e2ab70 (LWP 1983)’.
gdb-thread-buffer-arguments
Muestra los argumentos de las tramas superiores de los hilos.
gdb-thread-buffer-locations
Muestra información de archivos o nombres de bibliotecas.
gdb-thread-buffer-addresses
Muestra las direcciones de las tramas de los hilos en el buffer de hilos.

Para ver la información de varios hilos simultáneamente, utilice los siguientes comandos desde el buffer de hilos de GDB.

d (d)
Muestra el buffer de desensamblaje para el hilo en la línea actual (gdb-display-disassembly-for-thread).
f (f)
Muestra el buffer de pila GDB para el hilo en la línea actual (gdb-display-stack-for-thread).
l (l)
Muestra el buffer de GDB Locals para el hilo en la línea actual (gdb-display-locals-for-thread).
r (r)
Muestra el buffer de registros GDB para el hilo en la línea actual (gdb-display-registers-for-thread).

Sus homólogos en mayúsculas, D, F ,L y R, muestran el buffer correspondiente en un nuevo marco.

Cuando se crea un búfer que muestra información sobre algún hilo específico, se vincula a ese hilo y sigue mostrando la información real mientras se depura el programa. El indicador de modo para cada búfer GDB muestra el número del hilo cuya información muestra ese búfer. El número de hilo también se incluye en el nombre de cada búfer vinculado.

Hay más comandos disponibles en el buffer de hilos GDB que dependen del modo de GDB que se utiliza para controlar la ejecución de su programa. Ver Depuración Multihilo.

Buffer de pila

El buffer de pila del GDB muestra una pila de llamadas, con una línea para cada una de las llamadas a subrutinas anidadas (marcos de pila) en la sesión del depurador. Vea Backtraces en The GNU debugger.

En las pantallas gráficas, el marco de pila seleccionado se indica con una flecha en la franja. En terminales de texto, o cuando los flecos están desactivados, el marco de pila seleccionado se muestra en contraste inverso. Para seleccionar un marco de pila, mueva el punto en su línea y escriba RETURN (RET, gdb-frames-select), o haga clic con (ratón-2) en él. Haciendo esto también se actualiza el buffer Locals (ver Otros buffers GDB).

Si desea que la dirección del marco se muestre en cada marco de pila, personalice la variable gdb-stack-buffer-addresses a un valor no nulo.

Otros búferes GDB

Buffer de Locales
Este buffer muestra los valores de las variables locales del marco actual para tipos de datos simples (ver Información sobre un marco en El depurador de GNU). Pulse RETURN (RET) o haga clic con (raton-2) en el valor si quiere editarlo.
Los arrays y las estructuras sólo muestran su tipo. Con GDB 6.4 o posterior, puede examinar el valor de la variable local en el punto escribiendo RETURN (RET), o con un clic del (ratón-2). Con versiones anteriores de GDB, use RETURN (RET) o (raton-2) en la descripción del tipo (‘[struct/union]’ o ‘[array]’). Ver Expresiones de Observación.
Buffer de Registros
Este buffer muestra los valores mantenidos por los registros (ver Registros en El depurador de GNU). Pulse RETURN (RET) o haga clic con (ratón-2) en un registro si quiere editar su valor. Con el GDB 6.4 o posterior, los valores de los registros recientemente cambiados se muestran con la cara de advertencia de bloqueo de fuente (font-lock-warning-face).
Buffer de ensamblador
El buffer de ensamblador muestra la trama actual como código máquina. Una flecha apunta a la instrucción actual, y puede establecer y eliminar puntos de interrupción como en un búfer de origen. Los iconos de los puntos de interrupción también aparecen en la franja o el margen.
Memoria intermedia
El búfer de memoria le permite examinar secciones de la memoria del programa (vea Examinar la memoria en El depurador de GNU). Haga clic con el ratón-1 en la parte apropiada de la línea de cabecera para cambiar la dirección de inicio o el número de elementos de datos que muestra el búfer. Alternativamente, utilice S (S) o N (N) respectivamente. Haga clic con el (ratón-3) en la línea de cabecera para seleccionar el formato de visualización o el tamaño de la unidad para estos

Cuando gdb-many-windows es no nulo, el buffer local comparte su ventana con el buffer de registros, al igual que los puntos de interrupción y los buffers de hilos. Para cambiar de uno a otro, haga clic con el (ratón-1) en el botón correspondiente de la línea de cabecera.

Observar expresiones

Si quiere ver cómo cambia una variable cada vez que su programa se detiene, mueva el punto en el nombre de la variable y haga clic en el icono de vigilancia en la barra de herramientas (gud-watch) o escriba Ctrl-x Ctrl-a Ctrl-w (C-x C-a C-w). Si especifica un argumento prefijo, puede introducir el nombre de la variable en el minibuffer.

Cada expresión del reloj se muestra en la barra de velocidad (véase Marcos de la barra de velocidad). Los tipos de datos complejos, como las matrices, las estructuras y las uniones, se representan en formato de árbol. Las hojas y los tipos de datos simples muestran el nombre de la expresión y su valor y, cuando se selecciona el marco de la barra de velocidad, muestran el tipo como un tooltip. Los niveles superiores muestran el nombre, el tipo y el valor de la dirección para los punteros y sólo el nombre y el tipo en caso contrario. Las expresiones raíz también muestran la dirección del fotograma como información sobre herramientas para ayudar a identificar el fotograma en el que se definieron.

Para expandir o contraer un tipo de dato complejo, haga clic con (ratón-2) o pulse SPACE (SPC) en la etiqueta a la izquierda de la expresión. Emacs pide confirmación antes de expandir la expresión si su número de hijos inmediatos excede el valor de la variable gdb-max-children.

Para borrar una expresión de reloj compleja, mueva el punto a la expresión raíz en la barra de velocidad y escriba D (D, gdb-var-delete).

Para editar una variable con un tipo de datos simple, o un elemento simple de un tipo de datos complejo, mueva el punto allí en la barra speedbar y escriba (RET, gdb-edit-value). O puede hacer clic con (ratón-2) en un valor para editarlo. De cualquier manera, esto lee el nuevo valor usando el minibuffer.

Si estableces la variable gdb-show-changed-values a un valor distinto de cero (el valor por defecto), Emacs utiliza font-lock-warning-face para resaltar los valores que han cambiado recientemente y shadow face para hacer que las variables que han salido del ámbito sean menos perceptibles. Cuando una variable sale del ámbito no se puede editar su valor.

Si la variable gdb-delete-out-of-scope no es nula (el valor por defecto), Emacs borra automáticamente las expresiones de reloj que salen del ámbito. A veces, cuando su programa vuelve a entrar en la misma función muchas veces, puede ser útil establecer este valor a nil para no tener que volver a crear la expresión de vigilancia.

Si la variable gdb-use-colon-notation es no nula, Emacs utiliza el formato ‘function::variable’. Esto permite al usuario mostrar las expresiones de vigilancia que comparten el mismo nombre de variable. El valor por defecto es nil.

Para elevar automáticamente la barra de velocidad cada vez que se actualiza la visualización de las expresiones de vigilancia, establezca gdb-speedbar-auto-raise como no-nil . Esto puede ser útil si está depurando con un marco Emacs a pantalla completa.

Depuración multihilo

En el modo all-stop de GDB, cada vez que su programa se detiene, todos los hilos de ejecución se detienen. Igualmente, cada vez que se reinicia el programa, todos los hilos de ejecución comienzan a ejecutarse. Vea Modo All-Stop en El depurador de GNU. Para algunos objetivos multihilo, GDB soporta un modo de operación adicional, llamado modo no-stop, en el que puede examinar hilos de programa detenidos en el depurador mientras otros hilos continúan ejecutándose libremente. Vea Modo Non-Stop en El depurador de GNU. Las versiones de GDB anteriores a la 7.0 no soportan el modo non-stop, y no funciona en todos los objetivos.

La variable gdb-non-stop-setting determina si Emacs ejecuta GDB en modo all-stop o en modo non-stop. El valor por defecto es t, lo que significa que intenta usar el modo no-parada (non-stop mode) si está disponible. Si cambias el valor a nil, o si el modo non-stop no está disponible, Emacs ejecuta GDB en modo all-stop. La variable tiene efecto cuando ek Editor comienza una sesión de depuración; si cambias su valor, debes reiniciar cualquier sesión de depuración activa.

Cuando un hilo se detiene en modo sin paradas, Emacs normalmente cambia a ese hilo. Si no quieres que el Editor haga este cambio si otro hilo detenido ya está seleccionado, cambia la variable gdb-switch-when-another-stopped a nil.

Emacs puede decidir si cambiar al hilo detenido o no dependiendo de la razón que causó la parada. Personalice la variable gdb-switch-reasons para seleccionar las razones de parada que causarán un cambio de hilo.

La variable gdb-stopped-functions le permite ejecutar sus funciones siempre que algún hilo se detenga.

En el modo sin parada (non-stop mode), puede cambiar entre diferentes modos para los comandos de control de ejecución de GUD.

Non-stop/A
Cuando gdb-gud-control-all-threads es t (el valor por defecto), los comandos de interrupción y continuación se aplican a todos los hilos, por lo que puede detener o continuar todos sus hilos con un solo comando usando gud-stop-subjob y gud-cont, respectivamente. El botón ‘Go’ se muestra en la barra de herramientas cuando al menos un hilo está detenido, mientras que el botón ‘Stop’ se muestra cuando al menos un hilo está en ejecución.
Non-stop/T
Cuando gdb-gud-control-all-threads es nil, sólo se detiene/continúa el hilo actual. Los botones ‘Go’ y ‘Stop’ de la barra de herramientas de GUD se muestran dependiendo del estado del hilo actual.

Puede cambiar el valor actual de gdb-gud-control-all-threads desde la barra de herramientas o desde el menú ‘GUD->GDB-MI’.

Los comandos de paso siempre se aplican al hilo actual.

En el modo sin paradas, puede interrumpir/continuar los hilos sin seleccionarlos. Pulsando i (i) en el buffer de hilos se interrumpe el hilo en cuestión, c (c) lo continúa, s (s) lo atraviesa. Es posible que en el futuro se añadan más comandos de este tipo.

Tenga en cuenta que cuando interrumpe un hilo, éste se detiene con la razón signal-received (señal recibida). Si esa razón está incluida en su gdb-switch-reasons (lo está por defecto), Emacs cambiará a ese hilo.

Ejecución de expresiones Lisp

Emacs tiene modos principales para varias variantes de Lisp. Utilizan los mismos comandos de edición que otros modos de lenguaje de programación (véase Editar programas). Además, proporcionan comandos especiales para ejecutar expresiones Lisp.

Modo Emacs Lisp
El modo para editar los archivos fuente de Emacs Lisp. Define Ctrl-Alt-x (C-M-x) para evaluar la expresión Lisp de nivel superior actual. Véase Evaluación de expresiones Emacs Lisp.
Modo de interacción Lisp
El modo para una sesión interactiva de Emacs Lisp. Define Ctrl-j (C-j) para evaluar la expresión antes del punto e insertar su valor en el buffer. Véase Bufferes de interacción Lisp.
Modo Lisp
El modo para editar archivos fuente de programas que se ejecutan en Lisps distintos de Emacs Lisp. Define Ctrl-Alt-x (C-M-x) para evaluar la expresión actual de nivel superior en un Lisp externo. Véase Ejecutar un Lisp externo.
Modo Lisp inferior
El modo para una sesión interactiva con un Lisp externo que se está ejecutando como un subproceso (o proceso inferior) de Emacs. Véase Ejecutar un Lisp externo.
Modo Scheme
Como el modo Lisp, pero para programas Scheme.
Modo Scheme inferior
Como el modo Lisp inferior, pero para Scheme.

Bibliotecas de código Lisp para Emacs

El código Lisp de Emacs se almacena en archivos cuyos nombres terminan convencionalmente en .el. Estos archivos se visitan automáticamente en el modo Emacs Lisp.

El código Emacs Lisp puede compilarse en código de bytes, que se carga más rápido, ocupa menos espacio y se ejecuta más rápido. Por convención, el código Emacs Lisp compilado va en un archivo separado cuyo nombre termina en ‘.elc’. Por ejemplo, el código compilado para foo.el va en foo.elc. Vea Compilación de Bytes en el Manual de Referencia de Emacs Lisp.

El código Emacs Lisp también puede ser compilado en código nativo: código máquina no muy diferente al producido por un compilador C o Fortran. El código nativo se ejecuta incluso más rápido que el código de bytes. El código Emacs Lisp compilado nativamente se almacena en archivos cuyos nombres terminan en ‘.eln’. Ver Compilación Nativa en el Manual de Referencia de Emacs Lisp.

Para cargar un archivo Emacs Lisp, escriba Alt-x load-file (M-x load-file). Este comando lee un nombre de archivo usando el minibuffer, y ejecuta el contenido de ese archivo como código Emacs Lisp. No es necesario visitar el archivo primero; este comando lee el archivo directamente del disco, no de un buffer Emacs existente.

Si un archivo Emacs Lisp está instalado en la ruta de carga de Emacs Lisp (definida más abajo), puede cargarlo escribiendo Alt-x load-library (M-x load-library), en lugar de usar Alt-x load-file (M-x load-file). El comando M-x load-library pide un nombre de librería en lugar de un nombre de archivo; busca en cada directorio de la ruta de carga de Emacs Lisp, intentando encontrar un archivo que coincida con ese nombre de biblioteca. Si el nombre de la biblioteca es ‘foo’, intenta buscar archivos llamados foo.elc, foo.el, y foo. El comportamiento por defecto es cargar el primer archivo encontrado. Este comando prefiere los archivos .elc sobre los archivos .el porque los archivos compilados se cargan y ejecutan más rápido. Si encuentra que lib.el es más reciente que lib.elc, emite una advertencia, en caso de que alguien haya hecho cambios en el archivo .el y haya olvidado recompilarlo, pero carga el archivo .elc de todos modos. (Debido a este comportamiento, puede guardar las ediciones inacabadas de los archivos fuente de Emacs Lisp, y no recompilar hasta que tus cambios estén listos para su uso). Sin embargo, si establece la opción load-prefer-newer a un valor no nulo, entonces en lugar del procedimiento descrito anteriormente, Emacs carga cualquier versión del archivo que sea más reciente.

Los programas Emacs Lisp suelen cargar archivos Emacs Lisp utilizando la función load. Es similar a load-library, pero es de nivel inferior y acepta argumentos adicionales. Vea Cómo cargan los programas en el Manual de Referencia de Emacs Lisp.

La ruta de carga de Emacs Lisp se especifica mediante la variable load-path. Su valor debe ser una lista de directorios (cadenas). Estos directorios son buscados, en el orden especificado, por el comando Alt-x load-library (M-x load-library), la función de carga de nivel inferior, y otras funciones de Emacs que encuentran bibliotecas Emacs Lisp. Una entrada en load-path también puede tener el valor especial nil, que representa el directorio actual por defecto, pero casi siempre es una mala idea utilizarlo, porque su significado dependerá del buffer que esté en curso cuando load-path sea utilizado por Emacs. (Si se encuentra deseando que nil esté en la lista, lo más probable es que lo que realmente quiera sea usar Alt-x load-file (M-x load-file)).

El valor por defecto de load-path es una lista de directorios donde se almacena el código Lisp del propio Emacs. Si tiene bibliotecas propias en otro directorio, puede añadir ese directorio a la ruta de carga. A diferencia de la mayoría de las otras variables descritas en este manual, load-path no puede ser cambiada a través de la interfaz de personalización (ver Interfaz de personalización fácil), pero puede añadir un directorio a ella poniendo una línea como esta en su fichero de inicialización (ver El fichero de inicialización de Emacs):

(add-to-list 'load-path "/ruta/a/mi/biblioteca/lisp")

Es habitual poner las bibliotecas instaladas localmente en el directorio site-lisp que ya está en el valor por defecto de load-path, o en algún subdirectorio de site-lisp. De esta manera, no es necesario modificar el valor por defecto de load-path.

Algunos comandos son autocargados; cuando el Usuario los ejecuta, Emacs carga automáticamente la biblioteca asociada primero. Por ejemplo, el comando Alt-x compile (M-x compile) (ver Ejecutar compilaciones en el Editor) es autocargado; si lo llama, Emacs carga automáticamente la biblioteca de compilación primero. Por el contrario, el comando Alt-x recompile (M-x recompile) no se carga automáticamente, por lo que no está disponible hasta que se cargue la biblioteca de compilación.

La carga automática también puede ocurrir cuando busca la documentación de un comando autocargado (ver Ayuda por Nombre de Comando o Variable), si la documentación se refiere a otras funciones y variables en su biblioteca (cargar la biblioteca permite a Emacs configurar correctamente los hipervínculos en el buffer *Help* (*Ayuda*)). Para desactivar esta función, cambie la variable help-enable-autoload a nil.

La carga automática también ocurre cuando se completan los nombres para describe-variable y describe-function, basándose en el prefijo que se está completando. Para desactivar esta función, cambie la variable help-enable-completion-autoload a nil.

Una vez que ponga su biblioteca en un directorio donde Emacs pueda encontrarla y cargarla, puede querer hacerla disponible al inicio. Esto es útil cuando la biblioteca define características que deberían estar disponibles automáticamente bajo demanda, y la carga manual de la biblioteca es por lo tanto inconveniente. En estos casos, asegúrese de que la biblioteca se cargará añadiendo formas adecuadas a su fichero init: bien load o bien require (si siempre necesita cargar la biblioteca al inicio), o bien autoload si necesita que Emacs cargue la biblioteca cuando se invoque algún comando o función. Por ejemplo:

     ;; Carga mi-paquete-brillante.elc incondicionalmente.
     (require 'mi-paquete-brillante)
     ;; Cargará mi-paquete-brillante.elc cuando se invoque mi-func.
     (autoload 'mi-func "mi-paquete-brillante")

Tenga en cuenta que la instalación de un paquete mediante package-install (véase Instalación de paquetes) se encarga de colocar los archivos Lisp del paquete en un directorio en el que Emacs los encuentre, y también escribe el código de inicialización necesario en sus archivos init, haciendo innecesarias las personalizaciones manuales anteriores.

Evaluación de expresiones Emacs Lisp

El modo Emacs Lisp es el modo principal para editar Emacs Lisp. Su comando de modo es Alt-x emacs-lisp-mode (M-x emacs-lisp-mode).

Emacs proporciona varios comandos para evaluar expresiones Emacs Lisp. Puede usar estos comandos en el modo Emacs Lisp, para probar su código Emacs Lisp mientras se escribe. Por ejemplo, después de reescribir una función, puede evaluar la definición de la función para que tenga efecto en las siguientes llamadas a la función. Estos comandos también están disponibles globalmente, y pueden utilizarse fuera del modo Emacs Lisp.

Alt-: (M-:)
Lee una única expresión de Emacs Lisp en el minibuffer, la evalúa e imprime el valor en el área de eco (expresión eval).
Ctrl-x Ctrl-e (C-x C-e)
Evalúa la expresión Emacs Lisp anterior al punto, e imprime el valor en el área de eco (eval-expresión).
Ctrl-Alt-x (C-M-x (en modo Emacs Lisp))
Alt-x eval-defun (M-x eval-defun)
Evalúa el defun que contiene o está después del punto, e imprime el valor en el área de eco (eval-defun).
Alt-x eval-region (M-x eval-región)
Evalúa todas las expresiones Emacs Lisp de la región.
Alt-x eval-buffer (M-x eval-buffer)
Evalúa todas las expresiones Emacs Lisp en el buffer.

Alt-: (M-:, eval-expression) lee una expresión utilizando el minibuffer, y la evalúa. (Antes de evaluar la expresión, el búfer actual cambia al búfer que era actual cuando se tecleó Alt-: (M-:), no al minibúfer en el que se tecleó la expresión).

El comando Ctrl-x Ctrl-e (C-x C-e, eval-last-sexp) evalúa la expresión Emacs Lisp que precede al punto en el buffer, y muestra el valor en el área de eco. Cuando el resultado de una evaluación es un entero, se muestra junto con el valor en otros formatos (octal, hexadecimal y carácter si eval-expression-print-maximum-character, descrito más adelante, lo permite).

Si a Alt- (M-:) o Ctrl-x Ctrl-e (C-x C-e) se le da un argumento de prefijo, inserta el valor en el buffer actual en el punto, en lugar de mostrarlo en el área de eco. Si el argumento de prefijo es cero, cualquier salida entera se inserta junto con su valor en otros formatos (octal, hexadecimal y carácter). Este argumento de prefijo también evita la abreviación de la salida según las variables eval-expression-print-level y eval-expression-print-length (véase más adelante). Del mismo modo, un argumento prefijo de -1 anula el efecto de eval-expression-print-length.

Ctrl-x Ctrl-e (C-x C-e, eval-last-sexp) trata las expresiones defvar de forma especial. Normalmente, la evaluación de una expresión defvar no hace nada si la variable que define ya tiene un valor. Pero este comando restablece incondicionalmente la variable al valor inicial especificado por defvar; esto es conveniente para depurar programas Emacs Lisp. Las expresiones defcustom y defface se tratan de forma similar. Tenga en cuenta que los otros comandos documentados en esta sección, excepto eval-defun, no tienen esta característica especial.

El comando eval-defun está vinculado a Ctrl-Alt-x (C-M-x) en el modo Emacs Lisp. Evalúa la expresión Lisp de nivel superior que contiene o sigue el punto, e imprime el valor en el área de eco. En este contexto, una expresión de nivel superior se denomina "defun", pero no es necesario que sea un defun actual (definición de función).

Este comando maneja las formas defvar/defcustom/defface del mismo modo que eval-last-sexp.

Con un argumento de prefijo, Ctrl-Alt-x (C-M-x) instruye la definición de función para Edebug, el depurador de Emacs Lisp. Vea Instrumentación para Edebug en el Manual de Referencia de Emacs Lisp.

El comando Alt-x eval-region (M-x eval-region) analiza el texto de la región como una o más expresiones Lisp, evaluándolas una por una. Alt-x eval-buffer (M-x eval-buffer) es similar pero evalúa todo el buffer.

Las opciones eval-expression-print-level y eval-expression-print-length controlan la profundidad y longitud máximas de las listas que se imprimirán en el resultado de los comandos de evaluación antes de abreviarlos. Suministrar un argumento de prefijo cero a eval-expression o eval-last-sexp hace que las listas se impriman en su totalidad. eval-expression-debug-on-error controla si los errores de evaluación invocan el depurador cuando se utilizan estos comandos; su valor predeterminado es t. eval-expression-print-maximum-character evita que los enteros que son mayores que él se muestren como caracteres.

Bufferes de interacción de Lisp

Cuando Emacs se inicia, contiene un buffer llamado *scratch*, que se proporciona para evaluar las expresiones de Emacs Lisp de forma interactiva. Su modo principal es el modo de Interacción Lisp. También puede activar el modo de interacción Lisp escribiendo Alt-x lisp-interaction-mode (M-x lisp-interaction-mode).

En el búfer *scratch*, y en otros búferes del modo de interacción Lisp, Ctrl-j (C-j, eval-print-last-sexp) evalúa la expresión Lisp antes del punto, e inserta el valor en el punto. Así, a medida que se escriben expresiones en el búfer seguidas por Ctrl-j (C-j) después de cada expresión, el búfer registra una transcripción de las expresiones evaluadas y sus valores. Todos los demás comandos en el modo Lisp Interaction son los mismos que en el modo Emacs Lisp.

Al inicio, el búfer *scratch* contiene un breve mensaje, en forma de comentario Lisp, que explica para qué sirve. Este mensaje está controlado por la variable initial-scratch-message, que debe ser una cadena de documentación, o nil (que significa suprimir el mensaje).

Una forma alternativa de evaluar las expresiones Emacs Lisp de forma interactiva es utilizar el modo Emacs Lisp Inferior, que proporciona una interfaz bastante parecida al modo Shell (ver Modo Shell) para evaluar las expresiones Emacs Lisp. Escriba Alt-x ielm (M-x ielm) para crear un buffer *ielm* que utilice este modo. Para más información, consulte la documentación de este comando.

Ejecución de un Lisp externo

El modo Lisp es el principal modo para editar programas escritos en dialectos de Lisp de propósito general, como por ejemplo Common Lisp. Su comando de modo es Alt-x lisp-mode (M-x lisp-mode). Emacs utiliza el modo Lisp automáticamente para los archivos cuyos nombres terminan en .l, .lsp, o .lisp.

Puede ejecutar una sesión de Lisp externo como un subproceso o proceso inferior de Emacs, y pasarle expresiones para que sean evaluadas. Para iniciar una sesión de Lisp externo, escriba Alt-x run-lisp (M-x run-lisp). Esto ejecuta el programa llamado lisp, y lo configura para que tanto la entrada como la salida pasen por un buffer de Emacs llamado *inferior-lisp*. Para cambiar el nombre del programa Lisp ejecutado por Alt-x run-lisp (M-x run-lisp), cambie la variable inferior-lisp-program.

El modo principal para el buffer *lisp* es el modo Lisp inferior, que combina las características del modo Lisp y del modo Shell (ver Modo Shell). Para enviar una entrada a la sesión Lisp, vaya al final del búfer *lisp* y escriba la entrada, seguida de RETURN (RET). La salida del terminal de la sesión Lisp se inserta automáticamente en el búfer.

Cuando edite un programa Lisp en modo Lisp, puede escribir Ctrl-Alt-x (C-M-x, lisp-eval-defun) para enviar una expresión del búfer del modo Lisp a una sesión Lisp que haya iniciado con Alt-x run-lisp (M-x run-lisp). La expresión enviada es la expresión Lisp de nivel superior en o siguiente punto. El valor resultante va como siempre al buffer *inferior-lisp*. Tenga en cuenta que el efecto de Ctrl-Alt-x (C-M-x) en modo Lisp es, por tanto, muy similar a su efecto en modo Emacs Lisp (véase Evaluación de expresiones Emacs Lisp), salvo que la expresión se envía a un entorno Lisp diferente en lugar de evaluarse en Emacs.

Las facilidades para editar código Scheme, y para enviar expresiones a un subproceso Scheme, son muy similares. Los archivos fuente de Scheme se editan en modo Scheme, que puede activarse explícitamente con Alt-x scheme-mode (M-x scheme-mode). Puede iniciar una sesión de Scheme escribiendo Alt-x run-scheme (M-x run-scheme) (el buffer para interactuar con Scheme se llama *scheme*), y enviar expresiones a él escribiendo Ctrl-Alt-x (C-M-x).



Mantenimiendo de Programas Grandes

Este capítulo describe las características de Emacs para mantener programas y paquetes de tamaño medio y grande. Estas características incluyen:

  • Interfaz unificada para el soporte de sistemas de control de versiones (VCS) que registran el historial de cambios en los archivos fuente.
  • Comandos para el manejo de proyectos de programación.
  • Un modo especializado para mantener archivos ChangeLog que proporcionan un registro cronológico de los cambios del programa.
  • Xref, un conjunto de comandos para mostrar definiciones de símbolos (también conocidos como "identificadores") y sus referencias.
  • EDE, el IDE propio de Emacs.
  • Un modo para fusionar los cambios en las fuentes del programa realizados en ramas de desarrollo separadas.
  • Un modo menor para resaltar las referencias a errores y visitar los informes de errores referenciados en su rastreador de problemas.

Si está manteniendo un programa Lisp grande, además de las características descritas aquí, puede encontrar útil la biblioteca Emacs Lisp Regression Testing (ERT) (vea ERT en Emacs Lisp Regression Testing).

Control de Versiones

Un sistema de control de versiones es un programa que puede registrar múltiples versiones de un archivo fuente, almacenando información como la hora de creación de cada versión, quién la hizo y una descripción de lo que se cambió.

La interfaz de control de versiones de Emacs se llama VC. Los comandos de VC funcionan con varios sistemas de control de versiones diferentes; actualmente, soporta Bazaar, CVS, Git, Mercurial, Monotone, RCS, SRC, SCCS/CSSC y Subversion. De estos, el proyecto GNU distribuye CVS, RCS y Bazaar.

VC se activa automáticamente cada vez que se visita un archivo gobernado por un sistema de control de versiones. Para deshabilitar VC por completo, establezca la variable personalizable vc-handled-backends a nil (ver Personalización de VC).

Para actualizar la información de estado de VC para el archivo visitado en el buffer actual, utilice el comando vc-refresh-state. Este comando es útil cuando realiza comandos de control de versiones fuera de Emacs (por ejemplo, desde el prompt del shell), o si pone el archivo del buffer bajo un sistema de control de versiones diferente, o lo elimina del control de versiones por completo.

Introducción al control de versiones

VC le permite utilizar un sistema de control de versiones desde Emacs, integrando estas operaciones sin problemas con la edición. Proporciona una interfaz uniforme para las operaciones comunes de este sistema.

Algunas operaciones de control de versiones poco comunes o intrincadas, como la alteración de la configuración del repositorio, no están soportadas en VC. Deberá realizar estas tareas fuera de VC, por ejemplo, a través de la línea de comandos.

Esta sección proporciona una visión general del control de versiones y describe los sistemas de control de versiones que soporta VC. Puede saltarse esta sección si ya está familiarizado con el sistema de control de versiones que desea utilizar.

Comprender los problemas que aborda

Los sistemas de control de versiones le proporcionan tres capacidades importantes:

  • Reversibilidad: la capacidad de volver a un estado anterior si se descubre que alguna modificación realizada fue un error o una mala idea.

  • Concurrencia: la capacidad de que muchas personas modifiquen la misma colección de archivos sabiendo que las modificaciones conflictivas pueden ser detectadas y resueltas.

  • Historial: la capacidad de adjuntar datos históricos a tus datos, como comentarios explicativos sobre la intención de cada cambio. Incluso para un programador que trabaja en solitario, los historiales de cambios son una importante ayuda para la memoria; para un proyecto de varias personas, son una forma de comunicación entre desarrolladores de vital importancia.

Sistemas de control de versiones compatibles

Actualmente VC trabaja con muchos sistemas de control de versiones diferentes, a los que se refiere como back ends:

  • Git es un sistema de control de versiones descentralizado inventado originalmente por Linus Torvalds para apoyar el desarrollo de Linux (su núcleo). VC soporta muchas operaciones comunes de Git, pero otras, como la sincronización de repositorios, deben hacerse desde la línea de comandos.

  • CVS es el sistema de control de versiones libre que fue, hasta alrededor de 2008, utilizado por la mayoría de los proyectos de software libre. Desde entonces, ha sido sustituido por sistemas más nuevos. CVS permite el desarrollo concurrente de múltiples usuarios, ya sea localmente o a través de la red. A diferencia de los sistemas más recientes, carece de soporte para las confirmaciones atómicas y el movimiento/renombrado de archivos. VC soporta todas las operaciones básicas de edición bajo CVS.

  • Subversion (svn) es un sistema libre de control de versiones diseñado para ser similar a CVS pero sin sus problemas (por ejemplo, soporta commits atómicos de conjuntos de archivos, y versionado de directorios, enlaces simbólicos, metadatos, renombrados, copias y borrados).

  • SCCS fue el primer sistema de control de versiones que se construyó, y hace tiempo que fue sustituido por otros más avanzados. VC compensa ciertas características que faltan en SCCS (por ejemplo, los nombres de las etiquetas para las versiones) implementándolas él mismo. Otras características de VC, como las ramas múltiples, simplemente no están disponibles. Dado que SCCS no es libre, recomendamos evitarlo.

  • CSSC es un sustituto gratuito de SCCS. Debería usar CSSC sólo si, por alguna razón, no puede usar un sistema de control de versiones más reciente y mejor diseñado.

  • RCS es el sistema de control de versiones libre alrededor del cual se construyó inicialmente VC. Es relativamente primitivo: no puede usarse a través de la red, y funciona a nivel de archivos individuales. Casi todo lo que se puede hacer con RCS se puede hacer a través de VC.

  • Mercurial (hg) es un sistema de control de versiones descentralizado que se parece mucho a Git. VC soporta la mayoría de los comandos de Mercurial, con la excepción de las operaciones de sincronización de repositorios.

  • Bazaar (bzr) es un sistema de control de versiones descentralizado que soporta tanto el versionado basado en repositorios como el descentralizado. VC soporta la mayoría de las operaciones básicas de edición bajo Bazaar.

  • SRC (src) es RCS recargado, un sistema de control de versiones especializado diseñado para proyectos de un solo archivo en los que trabaja una sola persona. Permite que existan múltiples archivos con historiales de control de versiones independientes en un mismo directorio, por lo que es especialmente adecuado para mantener pequeños documentos, scripts y archivos de puntos. Aunque utiliza RCS para el almacenamiento de las revisiones, presenta una moderna interfaz de usuario que ofrece un funcionamiento sin bloqueo y números de versión secuenciales enteros. VC soporta casi todas las operaciones SRC.

Conceptos de control de versiones

Cuando un archivo está bajo control de versiones, decimos que está registrado en el sistema de control de versiones. El sistema tiene un repositorio que almacena tanto el estado actual del archivo como su historial de cambios, lo suficiente como para reconstruir la versión actual o cualquier versión anterior. El repositorio también contiene otra información, como las entradas de registro que describen los cambios realizados en cada archivo.

La copia de un archivo controlado por versiones que realmente se edita se llama archivo de trabajo. Puede cambiar cada archivo de trabajo como lo haría con un archivo ordinario. Cuando haya terminado con un conjunto de cambios, puede confirmar (o registrar) los cambios (commit); esto registra los cambios en el repositorio, junto con una entrada de registro descriptiva.

Un árbol de directorios conteniendo archivos de trabajo se llama árbol de trabajo.

Cada confirmación crea una nueva revisión en el repositorio. El sistema de control de versiones mantiene un registro de todas las revisiones pasadas y de los cambios que se hicieron en cada revisión. Cada revisión es nombrada por un ID de revisión, cuyo formato depende del sistema de control de versiones; en el caso más simple, es sólo un número entero.

Para ir más allá de estos conceptos básicos, tendrá que entender tres aspectos en los que difieren los sistemas de control de versiones. Como se explica en las tres secciones siguientes, pueden estar basados en bloqueos o en fusiones; basados en archivos o en conjuntos de cambios; y centralizados o descentralizados. VC maneja todos estos modos de funcionamiento, pero no puede ocultar las diferencias.

Control de versiones basado en la fusión y en el bloqueo

Un sistema de control de versiones suele tener algún mecanismo para coordinar a los usuarios que quieren cambiar el mismo archivo. Hay dos formas de hacerlo: la fusión y el bloqueo.

En un sistema de control de versiones que utiliza la fusión (merge), cada usuario puede modificar un archivo de trabajo en cualquier momento. El sistema le permite fusionar su archivo de trabajo, que puede contener cambios que no han sido confirmados, con los últimos cambios que otros han confirmado.

Los sistemas de control de versiones más antiguos utilizan un esquema de bloqueo. Aquí, los archivos de trabajo son normalmente de sólo lectura. Para editar un archivo, se pide al sistema de control de versiones que lo haga escribible para usted, bloqueándolo; sólo un usuario puede bloquear un archivo determinado en un momento dado. Este procedimiento es análogo, pero diferente, al bloqueo que Emacs utiliza para detectar la edición simultánea de archivos ordinarios (ver Protección contra la edición simultánea). Cuando usted confirma sus cambios, esto desbloquea el archivo, y el archivo de trabajo vuelve a ser de sólo lectura. Otros usuarios pueden entonces bloquear el archivo para hacer sus propios cambios.

Tanto los sistemas de bloqueo como los de fusión pueden tener problemas cuando varios usuarios intentan modificar el mismo archivo al mismo tiempo. Los sistemas de bloqueo tienen conflictos de bloqueo; un usuario puede intentar sacar un archivo y no poder hacerlo porque está bloqueado. En los sistemas de fusión, los conflictos de fusión se producen cuando se confirma un cambio en un archivo que entra en conflicto con un cambio confirmado por otra persona después de su comprobación. Ambos tipos de conflictos tienen que resolverse mediante el juicio humano y la comunicación. La experiencia ha demostrado que la fusión es superior al bloqueo, tanto por la comodidad para los desarrolladores como por la minimización del número y la gravedad de los conflictos que realmente se producen.

SCCS siempre utiliza el bloqueo. RCS se basa en el bloqueo por defecto, pero se le puede indicar que opere en un estilo de fusión. CVS y Subversion están basados en la fusión por defecto, pero se les puede indicar que operen en modo de bloqueo. Los sistemas de control de versiones descentralizados, como Git y Mercurial, se basan exclusivamente en la fusión.

El modo VC soporta tanto el control de versiones de bloqueo como el de fusión. Los términos "commit" (confirmación) y "update" (actualización) se utilizan en los sistemas de control de versiones más recientes; los sistemas más antiguos basados en el bloqueo utilizan los términos "check in" (registro) y "check out" (salida). VC oculta las diferencias entre ellos tanto como sea posible.

Control de versiones basado en conjuntos de cambios o en archivos

En SCCS, RCS, CVS y otros sistemas de control de versiones (y también en SRC), las operaciones de control de versiones se basan en ficheros: cada fichero tiene su propio comentario e historial de revisiones separado del resto de ficheros. Los sistemas más recientes, empezando por Subversion, se basan en conjuntos de cambios: una confirmación puede incluir cambios en varios archivos, y todo el conjunto de cambios se maneja como una unidad. Cualquier comentario asociado con el cambio no pertenece a un solo archivo, sino al propio conjunto de cambios.

El control de versiones basado en conjuntos de cambios es más flexible y potente que el control de versiones basado en archivos; normalmente, cuando hay que revertir un cambio en varios archivos, es bueno poder identificar y eliminar todo fácilmente.

Repositorios descentralizados vs. centralizados

Los primeros sistemas de control de versiones se diseñaron en torno a un modelo centralizado en el que cada proyecto tiene un único repositorio utilizado por todos los desarrolladores. SCCS, RCS, CVS, Subversion y SRC comparten este tipo de modelo. Uno de sus inconvenientes es que el repositorio es un punto de estrangulamiento para la fiabilidad y la eficiencia.

GNU Arch fue pionero en el concepto de control de versiones distribuido o descentralizado, posteriormente implementado en Git, Mercurial y Bazaar. Un proyecto puede tener varios repositorios diferentes, y estos sistemas soportan una especie de superfusión entre repositorios que intenta reconciliar su historial de cambios. En efecto, hay un repositorio para cada desarrollador, y las fusiones de repositorios sustituyen a las operaciones de confirmación.

VC le ayuda a gestionar el tráfico entre sus archivos de trabajo personales y un repositorio. Si el repositorio es un único maestro, o uno de una red de repositorios pares, no es algo de lo que VC tenga que preocuparse.

Tipos de archivos de registro

Los proyectos que utilizan un sistema de control de versiones pueden tener dos tipos de registro de cambios. Uno es el registro mantenido por el sistema de control de versiones: cada vez que se confirma un cambio, se rellena una entrada de registro para el cambio (ver Características del búfer de entrada de registro). Esto se llama registro de control de versiones.

El otro tipo de registro es el archivo ChangeLog (véase Registros de cambios). Proporciona un registro cronológico de todos los cambios en una gran parte de un programa, normalmente un directorio y sus subdirectorios. Un programa pequeño utilizaría un archivo ChangeLog; un programa grande puede tener un archivo ChangeLog en cada directorio principal. Véase Registros de cambios. Los programadores han utilizado los registros de cambios desde mucho antes de los sistemas de control de versiones.

Los sistemas de versiones basados en conjuntos de cambios suelen mantener un registro de modificaciones basado en conjuntos de cambios para todo el sistema, lo que hace que los archivos de registro de cambios sean algo redundantes. Una ventaja que conservan es que a veces es útil poder ver el historial de transacciones de un solo directorio por separado de los de otros directorios. Otra ventaja es que los registros de commit no pueden ser fijados en muchos sistemas de control de versiones.

Un proyecto mantenido con control de versiones puede utilizar sólo el registro de control de versiones, o puede utilizar ambos tipos de registros. Puede manejar algunos archivos de una manera y otros de la otra. Cada proyecto tiene su política, que debe seguir.

Cuando la política es usar ambos, normalmente querrá escribir una entrada para cada cambio sólo una vez, y luego ponerla en ambos registros. Puede escribir la entrada en ChangeLog, y luego copiarla en el buffer de registro con Ctrl-c Ctrl-a (C-c C-a) al confirmar el cambio (ver Características del buffer de entrada de registro). O puede escribir la entrada en el buffer de registro mientras confirma el cambio (con la ayuda de Ctrl-c Ctrl-w (C-c C-w)), y más tarde utilizar el comando Ctrl-x v a (C-x v a) para copiarlo en ChangeLo (ver Registros de cambios y VC).

Control de versiones y la línea de modo

Cuando visitas un archivo que está bajo control de versiones, Emacs lo indica en la línea de modo. Por ejemplo, ‘Bzr-1223’ dice que se utiliza Bazaar para ese fichero, y el ID de revisión actual es 1223.

El carácter entre el nombre del back-end y el ID de revisión indica el estado del control de versiones del fichero de trabajo. En un sistema de control de versiones basado en la fusión, un carácter ‘-’ indica que el fichero de trabajo no ha sido modificado, y ‘:’ indica que ha sido modificado. El carácter ‘!’ indica que el fichero contiene conflictos como resultado de una operación de fusión reciente (ver Fusión de ramas), o que el fichero ha sido eliminado del control de versiones. Finalmente, ‘?’ significa que el fichero está bajo el control de versiones, pero no está en el árbol de trabajo.

En un sistema basado en bloqueos, ‘-’ indica un archivo desbloqueado, y ‘:’ un archivo bloqueado; si el archivo está bloqueado por otro usuario (por ejemplo, ‘jim’), se muestra como ‘RCS:jim:1.3’. ‘@’ significa que el fichero se ha añadido localmente, pero aún no se ha confirmado en el repositorio maestro.

En una pantalla gráfica, puede mover el ratón sobre este indicador de línea de modo para que aparezca un tool-tip (un rectángulo con información sobre la herramienta), que muestra una descripción más detallada del estado del control de versiones. Pulsando (ratón-1) sobre el indicador aparece un menú de comandos de control de versiones, idéntico al de ‘Tools / Version Control’ (Herramientas / Control de versiones) de la barra de menús.

Cuando el modo de Reversión Automática (ver Revertir un Buffer) revierte un buffer que está bajo control de versiones, actualiza la información de control de versiones en la línea de modo. Sin embargo, el modo de Reversión Automática puede no actualizar correctamente esta información si el estado del control de versiones cambia sin cambios en el fichero de trabajo, desde fuera de la sesión actual de Emacs. Si estableces auto-revert-check-vc-info a t, el modo Auto Revert actualiza la información del estado del control de versiones cada auto-revert-intervalo de segundos, incluso si el propio fichero de trabajo no ha cambiado. El uso resultante de la CPU depende del sistema de control de versiones, pero normalmente no es excesivo.

Edición básica bajo el control de versiones

La mayoría de los comandos VC operan sobre conjuntos de archivos VC. Un conjunto de archivos VC es una colección de uno o más archivos sobre los que actúa una operación VC. Cuando se escriben comandos VC en un buffer que visita un archivo con control de versiones, el conjunto de archivos VC es simplemente ese archivo. Cuando los escribes en un buffer de Directorio VC, y algunos archivos en él están marcados, el conjunto de archivos VC consiste en los archivos marcados (ver Modo de Directorio VC).

En los sistemas modernos de control de versiones basados en conjuntos de cambios (vea Control de versiones basado en conjuntos de cambios vs. basado en archivos), los comandos VC manejan conjuntos de archivos VC de varios archivos como un grupo. Por ejemplo, al confirmar un conjunto de ficheros VC de varios archivos se genera una única revisión, que contiene los cambios de todos esos archivos. En los antiguos sistemas de control de versiones basados en archivos, como CVS, cada archivo de un conjunto de archivos CV de varios archivos se maneja individualmente; por ejemplo, una confirmación genera una revisión para cada archivo cambiado.

Ctrl-x v v (C-x v v)
Realiza la siguiente operación de control de versiones apropiada en el conjunto de archivos VC actual.

El principal comando VC es un comando multipropósito, Ctrl-x v v (C-x v v, vc-next-action), que realiza la acción más apropiada en el conjunto de archivos VC actual: ya sea registrarlo en un sistema de control de versiones, o confirmarlo, o desbloquearlo, o fusionar cambios en él. Las acciones precisas se describen en detalle en las siguientes subsecciones. Se puede utilizar C-x v tanto en un buffer de visita de archivos, como en un buffer Dired, o en un buffer de directorio VC.

Tenga en cuenta que los conjuntos de archivos VC son distintos de los conjuntos de archivos con nombre utilizados para ver y visitar archivos en grupos funcionales (véase Conjuntos de archivos). A diferencia de los conjuntos de archivos con nombre, los conjuntos de archivos VC no tienen nombre y no persisten entre sesiones.

Control de versiones básico con fusión

En un sistema de control de versiones basado en la fusión (es decir, la mayoría de los modernos; véase Control de versiones basado en la fusión vs. Control de versiones basado en el bloqueo), Ctrl-x v v (C-x v v) hace lo siguiente:

  • Si hay más de un fichero en el conjunto de ficheros VC y los ficheros tienen estados de control de versiones inconsistentes, señala un error. (Tenga en cuenta, sin embargo, que un conjunto de archivos puede incluir tanto archivos recién añadidos como archivos modificados; consulte Registro de un archivo para el control de versiones).

  • Si ninguno de los archivos del conjunto de archivos VC está registrado en un sistema de control de versiones, registre el conjunto de archivos VC, es decir, póngalo bajo control de versiones. Ver Registrar un archivo para el control de versiones. Si Emacs no puede encontrar un sistema bajo el que registrarse, pide un tipo de repositorio, crea un nuevo repositorio y registra el conjunto de archivos VC en él.

  • Si todos los ficheros de trabajo en el conjunto de ficheros VC no se modifican, no haga nada.

  • Si todos los archivos de trabajo en el conjunto de archivos VC han sido modificados, confirme los cambios. Para hacer esto, Emacs abre un búfer *vc-log*; escriba la entrada de registro deseada para la nueva revisión, seguida de Ctrl-c Ctrl-c (C-c C-c) para confirmar. Vea Características del buffer de entradas de registro.

    Si confirma un repositorio compartido, la confirmación puede fallar si el repositorio ha sido modificado desde su última actualización. En ese caso, debe realizar una actualización antes de volver a intentarlo. En un sistema de control de versiones descentralizado, utilice C-x v + (vea Tirando/empujando cambios en/desde una rama) o Ctrl-x v m (C-x v m) (vea Fusionando ramas). En un sistema de control de versiones centralizado, escriba Ctrl-x v v (C-x v v) de nuevo para fusionar los cambios del repositorio.

  • Finalmente, si está utilizando un sistema de control de versiones centralizado, compruebe si cada fichero de trabajo en el conjunto de ficheros VC está actualizado. Si algún archivo ha sido modificado en el repositorio, ofrézcase a actualizarlo.

Estas reglas también se aplican cuando utiliza RCS en su modo sin bloqueo, excepto que los cambios no se fusionan automáticamente desde el repositorio. Nada le informa si otro usuario ha confirmado cambios en el mismo fichero desde que usted empezó a editarlo; cuando usted confirma su revisión, los cambios de ese otro usuario se eliminan (sin embargo, permanecen en el repositorio y por tanto no se pierden irrevocablemente). Por lo tanto, debe verificar que la revisión actual no ha cambiado antes de confirmar sus cambios. Además, el bloqueo es posible con RCS incluso en este modo: Ctrl-x v v (C-x v v) con un fichero no modificado bloquea el fichero, igual que lo hace con RCS en su modo de bloqueo normal (vea Control de versiones básico con bloqueo

Control de versiones básico con bloqueo

En un sistema de control de versiones basado en el bloqueo (como SCCS, y RCS en su modo por defecto), Ctrl-x v v (C-x v v) hace lo siguiente:

  • Si hay más de un archivo en el conjunto de archivos VC y los archivos tienen estados de control de versiones inconsistentes, señala un error.

  • Si cada archivo del conjunto de archivos VC no está registrado en un sistema de control de versiones, registre el conjunto de archivos VC. Véase Registrar un fichero para el control de versiones. Si Emacs no puede encontrar un sistema en el que registrarse, pide un tipo de repositorio, crea un nuevo repositorio y registra el conjunto de archivos VC en él.

  • Si cada fichero está registrado y desbloqueado, lo bloquea y lo hace escribible, para que pueda empezar a editarlo.

  • Si cada archivo está bloqueado por usted y contiene cambios, confirme los cambios. Para hacer esto, Emacs abre un búfer *vc-log*; escriba la entrada de registro deseada para la nueva revisión, seguida de Ctrl-c Ctrl-c (C-c C-c) para confirmar (ver Características del búfer de entrada de registro).

  • Si cada archivo está bloqueado por usted, pero no lo ha cambiado, libere el bloqueo y haga que el archivo sea de sólo lectura de nuevo.

  • Si cada archivo está bloqueado por otro usuario, pregunte si quiere robar el bloqueo. Si dice que sí, el archivo pasa a estar bloqueado por usted, y se envía un mensaje de advertencia al usuario que había bloqueado el archivo anteriormente.

Estas reglas también se aplican cuando se utiliza CVS en modo de bloqueo, excepto que CVS no soporta el robo de bloqueos.

Control avanzado en C-x v v

Cuando se da un argumento de prefijo a vc-next-action (Ctrl- u Ctrl-x v v (C-u C-x v v)), éste sigue realizando la siguiente operación lógica de control de versiones, pero acepta argumentos adicionales para especificar con precisión cómo realizar la operación.

  • Puede especificar el nombre de un sistema de control de versiones. Esto es útil si el conjunto de archivos puede ser gestionado por más de un sistema de control de versiones, y Emacs no detecta el correcto.

  • En caso contrario, si se utiliza CVS, RCS o SRC, se puede especificar un ID de revisión.

  • Si el conjunto de archivos es modificado (o bloqueado), esto hace que Emacs haga un commit con ese ID de revisión. Puede crear una nueva rama proporcionando un ID de revisión apropiado (vea Ramas de Control de Versiones).

    Si el conjunto de ficheros no ha sido modificado (y está desbloqueado), esto comprueba la revisión especificada en el árbol de trabajo. También puede especificar una revisión en otra rama dando su ID de revisión o de rama (vea Cambiar de rama). Un argumento vacío (es decir, Ctrl-u Ctrl-x v v RETURN (C-u C-x v v RET)) comprueba la última revisión (head) en la rama actual.

    Esto se ignora silenciosamente en un sistema de control de versiones descentralizado. Estos sistemas no le permiten especificar sus propios IDs de revisión, ni utilizan el concepto de comprobación de ficheros individuales.

Características del búfer de entrada de registros

Cuando le dice a VC que confirme un cambio, aparece un búfer llamado *vc-log*. En este búfer, debe escribir una entrada de registro que describa los cambios que ha realizado (véase Comprender los problemas que aborda). Cuando haya terminado, escriba Ctrl-c Ctrl-c (C-c C-c, log-edit-done) para salir del buffer y confirmar el cambio, junto con su entrada de registro.

El modo principal para el buffer *vc-log* es el modo Log Edit, una variante del modo Texto (ver Modo Texto). Al entrar en el modo Log Edit, Emacs ejecuta los hooks text-mode-hook y vc-log-mode-hook (ver Hooks).

En el buffer *vc-log*, puedes escribir una o más líneas de cabecera, especificando información adicional que debe ser suministrada al sistema de control de versiones. Cada línea de cabecera debe ocupar una sola línea en la parte superior del búfer; la primera línea que no sea una línea de cabecera se trata como el inicio de la entrada del registro. Por ejemplo, la siguiente línea de cabecera indica que el presente cambio no fue escrito por usted, sino por otro desarrollador:

Author: J. R. Hacker <jrh@ejemplo.com>

Aparte de la cabecera ‘Author‘ (‘Autor’), Emacs reconoce las cabeceras ‘Summary’ (‘Resumen’, un resumen de una línea del conjunto de cambios), ‘Date’ (‘Fecha’, una hora de confirmación especificada manualmente), y ‘Fixes’ (‘Correcciones’, una referencia a un error corregido por el cambio). No todos los sistemas de control de versiones reconocen todas las cabeceras. Si especifica una cabecera para un sistema que no la soporta, la cabecera se trata como parte de la entrada del registro.

Mientras que en el buffer *vc-log*, el conjunto de archivos VC actual se considera el conjunto de archivos que se confirmará si se escribe Ctrl-c Ctrl-c (C-c C-c). Para ver una lista de los archivos en el conjunto de archivos VC, escriba Ctrl-c Ctrl-f (C-c C-f, log-edit-show-files). Para ver una diferencia de cambios entre el conjunto de archivos VC y la versión desde la que empezó a editar (vea Examinar y comparar revisiones antiguas), escriba Ctrl-c Ctrl-d (C-c C-d, log-edit-show-diff).

Para ayudar a generar entradas de ChangeLog, escriba Ctrl-c Ctrl-w (C-c C-w, log-edit-generate-changelog-from-diff), para generar entradas con esqueléto de ChangeLog, listando todos los nombres de archivos y funciones cambiados basados en el diff del conjunto de archivos VC. Las entradas consecutivas que queden vacías se combinarán con Ctrl-q (C-q, fill-paragraph).

Si el conjunto de archivos VC incluye uno o más archivos ChangeLog (ver Registros de cambios), escriba Ctrl-c Ctrl-a (C-c C-a, log-edit-insert-changelog) para extraer las entradas relevantes en el buffer *vc-log*. Si el elemento superior de cada ChangeLog se hizo bajo su nombre de usuario en la fecha actual, este comando busca en ese elemento las entradas que coinciden con el archivo(s) a confirmar, y las inserta. Si está usando CVS o RCS, vea Registros de Cambios y VC, para la forma opuesta de trabajar generando entradas de Registro de Cambios desde el buffer de Edición de Registros.

Para abortar una confirmación, simplemente no escriba Ctrl-c Ctrl-c (C-c C-c) en ese buffer. Puede cambiar de búfer y hacer otras ediciones. Mientras no intente hacer otra confirmación, la entrada que estaba editando permanece en el buffer *vc-log*, y puede volver a ese buffer en cualquier momento para completar la confirmación.

También puedes navegar por el historial de entradas de registro anteriores para duplicar un comentario de confirmación. Esto puede ser útil cuando quiera hacer varias confirmaciones con comentarios similares. Los comandos Alt-p (M-p), Alt-s (M-s) y Alt-r (M-r) para hacer esto funcionan igual que los comandos del historial del minibuffer (ver Historial del minibuffer), excepto que se usan fuera del minibuffer.

Registro de un archivo para el control de versiones

Ctrl-x v i (C-x v i)
Registra el archivo visitado para el control de versiones.

El comando Ctrl-x v i (C-x v i, vc-register) registra cada archivo en el conjunto de archivos VC actual, poniéndolo bajo control de versiones. Esto es esencialmente equivalente a la acción de Ctrl-x v v (C-x v v) en un conjunto de archivos VC no registrado (véase Edición básica en Control de versiones), excepto que si el conjunto de archivos VC ya está registrado, Ctrl-x v i (C-x v i) señala un error mientras que Ctrl-x v v (C-x v v) realiza alguna otra acción .

Para registrar un archivo, Emacs debe elegir un sistema de control de versiones. Para un conjunto de ficheros VC de varios archivos, el búfer de directorio VC especifica el sistema a utilizar (ver Modo de directorio VC). Para un conjunto de archivos VC de un solo archivo, si el directorio del archivo ya contiene archivos registrados en un sistema de control de versiones, o si el directorio es parte de un árbol de directorios controlado por un sistema de control de versiones, elige ese sistema. En el caso de que sea aplicable más de un sistema de control de versiones, Emacs utiliza el que aparezca primero en la variable vc-handled-backends (ver Personalización de VC). Si el Editor no puede encontrar un sistema de control de versiones en el que registrar el fichero, pide un tipo de repositorio, crea un nuevo repositorio y registra el fichero en ese repositorio.

En la mayoría de los sistemas de control de versiones, registrar un fichero con Ctrl-x v i (C-x v i) o Ctrl-x v v (C-x v v) lo añade al árbol de trabajo pero no al repositorio. Tales ficheros se etiquetan como ‘added’ (añadidos) en el buffer del Directorio VC, y muestran un ID de revisión de ‘@@’ en la línea de modo. Para que el registro tenga efecto en el repositorio, debe realizar una confirmación (vea Edición básica en Control de versiones). Tenga en cuenta que una única confirmación puede incluir tanto adiciones de ficheros como ediciones de ficheros existentes.

En un sistema de control de versiones basado en el bloqueo (vea Control de versiones basado en la fusión vs. en el bloqueo), el registro de un fichero lo deja desbloqueado y de sólo lectura. Escriba Ctrl-x v v (C-x v v) para empezar a editarlo.

Examen y comparación de las antiguas revisiones

Ctrl-x v = (C-x v =)
Compara los archivos de trabajo del conjunto de archivos VC actual con las versiones de las que partió (vc-diff). Con un argumento de prefijo, pide dos revisiones del conjunto de archivos VC actual y las compara. También puede llamar a este comando desde un buffer de Dired (ver Dired, el editor de directorios).
Alt-x vc-ediff (M-x vc-ediff)
Como C-x v =, pero utilizando Ediff. Vea Ediff en el Manual de Ediff.
Ctrl-x v D (C-x v D)
Compara todo el árbol de trabajo con la revisión de la que partió (vc-root-diff). Con un argumento de prefijo, pide dos revisiones y compara sus árboles.
Ctrl-x v ~ (C-x v ~)
Pide una revisión del fichero actual, y la visita en un buffer separado (vc-revision-other-window).
Ctrl-x v g (C-x v g)
Mostrar una versión anotada del fichero actual: para cada línea, mostrar la última revisión en la que fue modificada (vc-annotate).

Ctrl-x v = (C-x v =, vc-diff) muestra un diff que compara cada archivo de trabajo en el conjunto de archivos VC actual con la(s) versión(es) desde la(s) que comenzó a editar. El diff se muestra en otra ventana, en un buffer de modo Diff (ver Modo Diff) llamado *vc-diff*. Los comandos habituales del modo Diff están disponibles en este buffer. En particular, el comando g (revert-buffer) realiza la comparación de archivos de nuevo, generando un nuevo diff.

Para comparar dos revisiones arbitrarias del conjunto de archivos VC actual, llame a vc-diff con un argumento de prefijo: Ctrl-u Ctrl-x v = (C-u C-x v =). Esto solicita dos IDs de revisión (ver Conceptos de Control de Versiones), y muestra una diferencia entre esas versiones del conjunto de archivos. Esto no funcionará de forma fiable para conjuntos de ficheros VC de varios archivos, si el sistema de control de versiones está basado en ficheros en lugar de en conjuntos de cambios (por ejemplo, CVS), ya que entonces los IDs de revisión para diferentes ficheros no estarían relacionados de forma significativa.

En lugar del ID de revisión, algunos sistemas de control de versiones le permiten especificar las revisiones en otros formatos. Por ejemplo, en Bazaar puede introducir ‘date:yesterday’ como argumento de Ctrl-u Ctrl-x v = (C-u C-x v =, y comandos relacionados) para especificar la primera revisión confirmada después de ayer. Consulte la documentación del sistema de control de versiones para más detalles.

Si invoca Ctrl-x v = (C-x v =) o Ctrl-u Ctrl-x v = (C-u C-x v =) desde un buffer de Dired (ver Dired, el editor de directorios), el fichero listado en la línea actual es tratado como el conjunto de ficheros VC actual.

Alt-x vc-ediff (M-x vc-ediff) funciona como Ctrl-x v = (C-x v =), excepto que utiliza una sesión de Ediff. Véase Ediff en el Manual de Ediff.

Ctrl-x v D (C-x v D, vc-root-diff) es similar a Ctrl-x v = (C-x v =), pero muestra los cambios en todo el árbol de trabajo actual (es decir, el árbol de trabajo que contiene el conjunto de archivos VC actual). Si invoca este comando desde un buffer Dired, se aplica al árbol de trabajo que contiene el directorio.

Para comparar dos revisiones arbitrarias de los árboles completos, llame a vc-root-diff con un argumento de prefijo: Ctrl-u Ctrl-x v D (C-u C-x v D). Esto pide dos IDs de revisión (ver Conceptos de Control de Versiones), y muestra una diferencia entre esas versiones de los árboles de directorios completos controlados por versiones (RCS, SCCS, CVS y SRC no soportan esta característica).

Puede personalizar las opciones de diff que Ctrl-x v (C-x v =) y Ctrl-x v D (C-x v D) utilizan para generar diffs. Las opciones utilizadas se toman del primer valor no nulo entre las variables vc-backend-diff-switches, vc-diff-switches y diff-switches (ver Comparación de archivos), en ese orden. Aquí, backend significa el sistema de control de versiones relevante, por ejemplo, bzr para Bazaar. Dado que nil significa comprobar la siguiente variable en la secuencia, cualquiera de las dos primeras puede usar el valor t para significar que no hay cambios en absoluto. La mayoría de las variables de vc-backend-diff-switches tienen por defecto el valor nil, pero algunas tienen por defecto el valor t; éstas son para sistemas de control de versiones cuyas implementaciones de diff no aceptan opciones comunes de diff, como Subversion.

Para examinar directamente una versión más antigua de un archivo, visite el archivo de trabajo y escriba Ctrl-x v ~ revision RETURN (C-x v ~ revision RET, vc-revision-other-window). Esto recupera la versión del archivo correspondiente a la revisión, la guarda en filename.~revision~, y la visita en una ventana separada.

Muchos sistemas de control de versiones le permiten ver archivos anotados con información de revisión por línea, escribiendo Ctrl-x v g (C-x v g, vc-annotate). Esto crea un nuevo búfer de "anotaciones" (annotate buffer) que muestra el texto del archivo, con cada línea coloreada para mostrar su antigüedad. El texto rojo es nuevo, el azul es viejo, y los colores intermedios indican edades intermedias. Por defecto, el color se escala sobre toda la gama de edades, de manera que los cambios más antiguos son azules y los más recientes son rojos. Si la variable vc-annotate-background-mode no es nula, los colores que expresan la edad de cada línea se aplican al color de fondo, dejando el primer plano en su color por defecto.

Cuando se da un argumento de prefijo a este comando, Emacs lee dos argumentos utilizando el minibuffer: la revisión a mostrar y anotar (en lugar del contenido actual del archivo), y el lapso de tiempo en días que debe cubrir la gama de colores.

Desde el búfer "annotate", estas y otras opciones de escalado de color están disponibles en el menú ‘VC-Annotate’. En este búfer, también puede utilizar las siguientes teclas para navegar por las anotaciones de revisiones anteriores, ver los diffs, o ver las entradas de registro:

p (p)
Anota la revisión anterior, es decir, la revisión anterior a la que se anota actualmente. Un argumento de prefijo numérico es un recuento de repeticiones, por lo que Ctrl-u 10 p (C-u 10 p) le llevaría hacia atrás 10 revisiones.
n (n)
Anota la siguiente revisión, es decir, la revisión posterior a la actual. Un argumento de prefijo numérico es una cuenta de repetición.
j (j)
Anota la revisión indicada por la línea actual.
a (a)
Anota la revisión anterior a la indicada por la línea actual. Esto es útil para ver el estado en el que se encontraba el fichero antes de que se realizara el cambio en la línea actual.
f (f)
Mostra en un buffer la revisión del fichero indicada por la línea actual.
d (d)
Muestra la diferencia entre la revisión de la línea actual y la revisión anterior. Esto es útil para ver lo que la revisión de la línea actual ha cambiado realmente en el fichero.
D (D)
Muestra la diferencia entre la revisión de la línea actual y la revisión anterior para todos los ficheros en el conjunto de cambios (para sistemas VC que soportan conjuntos de cambios). Esto es útil para ver lo que la revisión de la línea actual ha cambiado en el árbol.
l (l)
Muestra el registro de la revisión de la línea actual. Esto es útil para ver la descripción del autor de los cambios en la revisión de la línea actual.
w (w)
Anota la revisión de trabajo -la que está editando-. Si utilizó p y n para navegar a otras revisiones, utilice esta tecla para volver a su revisión de trabajo.
v (v)
Cambia la visibilidad de las anotaciones. Esto es útil para ver sólo el contenido del archivo sin distraerse de las anotaciones.

Registro de cambios de la CV

Ctrl-x v l (C-x v l)
Muestra el historial de cambios del conjunto de archivos actual (vc-print-log).
Ctrl-x v L (C-x v L)
Muestra el historial de cambios del repositorio actual (vc-print-root-log).
Ctrl-x v I (C-x v I)
Muestra los cambios que una operación "pull" recuperará (vc-log-incoming).
Ctrl-x v O (C-x v O)
Muestra los cambios que serán enviados por la siguiente operación "push" (vc-log-outgoing).
Ctrl-x v h (C-x v h)
Muestra el historial de cambios realizados en la región del archivo visitada por el buffer actual (vc-region-history).
Alt-x vc-log-search RETURN (M-x vc-log-search RET)
Busca en el historial de cambios un patrón especificado.

Ctrl-x v l (C-x v l, vc-print-log) muestra un buffer llamado *vc-change-log*, mostrando el historial de cambios realizados en el archivo actual, incluyendo quién hizo los cambios, las fechas y la entrada de registro para cada cambio (estas son las mismas entradas de registro que introduciría a través del buffer *vc-log*; ver Características del buffer de entrada de registro). El punto se centra en la revisión del fichero que se está visitando actualmente. Con un argumento de prefijo, el comando pide la revisión a centrar, y el número máximo de revisiones a mostrar.

Si llama a Ctrl-x v l (C-x v l) desde un búfer de directorio VC (ver Modo de directorio VC) o un búfer Dired (ver Dired, el editor de directorios), se aplica al archivo listado en la línea actual.

Ctrl-x v L (C-x v L, vc-print-root-log) muestra un buffer *vc-change-log* que muestra el historial de todo el árbol de directorios controlado por versiones (RCS, SCCS, CVS y SRC no soportan esta característica). Con un argumento de prefijo, el comando solicita el número máximo de revisiones a mostrar. Un argumento de prefijo numérico especifica el número máximo de revisiones sin preguntar. Cuando el argumento del prefijo numérico es 1, como en Ctrl-1 Ctrl-x v L (C-1 C-x v L) o Ctrl-u 1 Ctrl-x v L (C-u 1 C-x v L), el comando pide el ID de la revisión, y muestra la entrada del registro de esa revisión junto con los cambios (diffs) que introdujo. (Algunos sistemas de control de versiones menos capaces, como RCS y CVS, no tienen comandos para mostrar un registro de revisión con sus diffs; para ellos el comando muestra sólo la entrada del registro, y puede solicitar que se muestren los diffs escribiendo d o D, ver más abajo).

El historial Ctrl-x v L (C-x v L) se muestra de forma compacta, normalmente mostrando sólo la primera línea de cada entrada de registro. Sin embargo, puede teclear RETURN (RET, log-view-toggle-entry-display) en el buffer *vc-change-log* para revelar toda la entrada de registro de la revisión en cuestión. Un segundo RETURN (RET) la vuelve a ocultar.

En un sistema de control de versiones descentralizado, el comando Ctrl-x v I (C-x v I, vc-log-incoming) muestra un búfer de registro que muestra los cambios que se aplicarán, la próxima vez que ejecute el comando pull del sistema de control de versiones para obtener nuevas revisiones de otro repositorio (vea Tirando/empujando cambios en/desde una rama). Este otro repositorio es el que por defecto se extrae de los cambios, según lo definido por el sistema de control de versiones; con un argumento de prefijo, vc-log-incoming pide un repositorio específico. De forma similar, Ctrl-x v O (C-x v O, vc-log-outgoing) muestra los cambios que se enviarán a otro repositorio, la próxima vez que ejecute el comando push; con un argumento de prefijo, pide un repositorio de destino específico.

En el buffer *vc-change-log*, puede utilizar las siguientes teclas para moverse entre los registros de revisiones y de ficheros, y para examinar y comparar revisiones pasadas (ver Examinar y comparar revisiones antiguas):

p (p)
Se mueve a la entrada de revisión anterior. (Las entradas de revisión en el buffer de registro suelen estar en orden cronológico inverso, por lo que el elemento de revisión anterior suele corresponder a una revisión más reciente). Un argumento de prefijo numérico es una cuenta de repetición.
n (n)
Pasa a la siguiente entrada de revisión. Un argumento de prefijo numérico es una cuenta de repetición.
P (P)
Se mueve al registro del archivo anterior, si se muestran los registros de un conjunto de archivos VC de varios archivos. De lo contrario, sólo se mueve al principio del registro. Un argumento de prefijo numérico es una cuenta de repetición.
N (N)
Pasa al registro del siguiente archivo, si se muestran los registros de un conjunto de archivos VC de varios archivos. Un argumento de prefijo numérico es una cuenta de repetición.
a (a)
Anota la revisión en la línea actual (ver Examinar y comparar revisiones antiguas).
e (e)
Modifica el comentario de cambio mostrado en el punto. Tenga en cuenta que no todos los sistemas de CV soportan la modificación de los comentarios de cambio.
f (f)
Visita la revisión indicada en la línea actual.
d (d)
Muestra una diferencia entre la revisión en el punto y la siguiente revisión anterior, para el archivo específico.
D (D)
Muestra la diferencia de conjuntos de cambios entre la revisión en el punto y la siguiente revisión anterior. Esto muestra los cambios en todos los ficheros realizados en esa revisión.
RETURN (RET)
En un búfer de registro de estilo compacto (por ejemplo, el creado por C-x v L), alternar entre mostrar y ocultar la entrada de registro completa para la revisión en el punto.

Dado que la obtención de muchas entradas de registro puede ser lenta, el búfer *vc-change-log* no muestra más de 2000 revisiones por defecto. La variable vc-log-show-limit especifica este límite; si establece el valor a cero, se elimina el límite. También puedes aumentar el número de revisiones que se muestran en un búfer *vc-change-log* existente haciendo clic en los botones ‘Show 2X entries’ o ‘Show unlimited entries’ al final del búfer. Sin embargo, RCS, SCCS, CVS y SRC no soportan esta característica.

Una variante útil de examinar el historial de cambios es proporcionada por el comando vc-region-history (por defecto ligado a Ctrl-x v h (C-x v h)), que muestra un buffer *VC-history* con el historial de cambios realizados en la región del archivo del buffer actual entre el punto y la marca (ver La marca y la región). El historial de cambios incluye los mensajes del registro de confirmación y también los propios cambios en el formato Diff.

Invoca este comando después de marcar en el buffer actual la región en cuyos cambios estás interesado. En el buffer *VC-history* que aparece, puede utilizar todos los comandos disponibles en el buffer *vc-change-log* descrito anteriormente, y también los comandos definidos por el modo Diff (ver Modo Diff).

Este comando está actualmente disponible sólo con Git y Mercurial (hg).

El comando vc-log-search permite buscar un patrón en el registro de cambios. Solicita un patrón (una expresión regular), y muestra todas las entradas del historial de cambios cuyos mensajes de registro coinciden con el patrón. Cuando se invoca con un argumento de prefijo, el comando también pedirá un comando de shell VCS específico para ejecutar con este propósito.

Deshacer acciones de control de versiones

Ctrl-x vu (C-x v u)
Revierte el/los archivos de trabajo en el conjunto de archivos VC actual a la última revisión (vc-revert).

Si desea descartar todos los cambios que ha realizado en el conjunto de archivos VC actual, escriba Ctrl-x vu (C-x v u, vc-revert). Esto le pedirá confirmación antes de descartar los cambios. Si está de acuerdo, el conjunto de archivos se revierte.

Si vc-revert-show-diff no es nulo, este comando le mostrará una diferencia entre el archivo(s) de trabajo y la revisión desde la que empezó a editar. Después, el buffer de diferencias será eliminado (si esta variable es kill), o el buffer será enterrado (cualquier otro valor no nulo). Si no quiere que Ctrl-x vu (C-x v u) muestre una diferencia, establezca esta variable a nil (aún puede ver la diferencia directamente con Ctrl-x v= (C-x v =); vea Examinar y comparar revisiones antiguas).

En los sistemas de control de versiones basados en el bloqueo, Ctrl-x vu (C-x v u) deja los archivos desbloqueados; debe bloquearlos de nuevo para reanudar la edición. También puede usar Ctrl-x vu (C-x v u) para desbloquear un archivo si lo bloquea y luego decide no cambiarlo.

Ignorar los archivos de control de versiones

Ctrl-x vG (C-x v G)
Ignorar un archivo bajo el sistema de control de versiones actual. (vc-ignorar).

Muchos árboles de fuentes contienen algunos archivos que no necesitan ser versionados, como las copias de seguridad del editor, los archivos de objetos o bytecode, y los programas construidos. Puede simplemente no añadirlos, pero entonces siempre aparecerán como archivos desconocidos. También puede decirle al sistema de control de versiones que ignore estos archivos añadiéndolos al archivo de ignorar en la parte superior del árbol. Ctrl-x vG (C-x v G, vc-ignore) puede ayudarle a hacer esto. Cuando se llama con un argumento de prefijo, puede eliminar un archivo de la lista de archivos ignorados.

Modo de directorio VC

El búfer del Directorio VC es un búfer especializado para ver los estados de control de versiones de los archivos en un árbol de directorios, y realizar operaciones de control de versiones en esos archivos. En particular, se utiliza para especificar conjuntos de archivos VC de varios archivos para que los comandos como Ctrl-x vv (C-x v v) actúen sobre ellos (ver Comandos de Directorio VC).

Para utilizar la memoria intermedia del directorio VC, escriba Ctrl-x vd (C-x v d, vc-dir). Esto lee el nombre de un directorio usando el minibuffer, y cambia a un buffer de Directorio VC para ese directorio. Por defecto, el buffer se llama *vc-dir*. Su contenido se describe en El búfer del directorio VC.

El comando vc-dir detecta automáticamente el sistema de control de versiones que se utilizará en el directorio especificado. En el caso de que se esté utilizando más de un sistema en el directorio, debe invocar el comando con un argumento de prefijo, Ctrl-u Ctrl-x vd (C-u C-x v d); esto solicita el sistema de control de versiones que debe utilizar el buffer de VC Directory.

Además del buffer del Directorio VC, Emacs tiene una facilidad similar llamada PCL-CVS que está especializada en CVS. Ver Acerca de PCL-CVS en PCL-CVS-The Emacs Front-End to CVS.

El Bufer de Directorios VC

El buffer del Directorio VC contiene una lista de archivos controlados por versiones y sus estados de control de versiones. Enumera los archivos en el directorio actual (el especificado cuando llamó a Ctrl-x vd (C-x v d)) y sus subdirectorios, pero sólo aquellos con un estado digno de mención. Los ficheros que están al día (es decir, los mismos que en el repositorio) se omiten. Si todos los ficheros de un subdirectorio están actualizados, el subdirectorio tampoco se lista. Como excepción, si un archivo se ha actualizado como resultado directo de un comando VC, se incluye en la lista.

A continuación se muestra un ejemplo de listado de la memoria intermedia del directorio VC:

                         ./
        edited           configure.ac
    *   added            README
        unregistered     temp.txt
                         src/
    *   edited           src/main.c

Dos archivos de trabajo han sido modificados pero no confirmados: configure.ac en el directorio actual, y main.c en el subdirectorio src/. El archivo llamado README ha sido añadido pero aún no ha sido confirmado, mientras que temp.txt no está bajo control de versiones (ver Registrar un archivo para el control de versiones).

Los caracteres ‘*’ junto a las entradas de README y src/main.c indican que el usuario ha marcado estos archivos como el conjunto de archivos VC actual (ver Comandos de directorio VC).

El ejemplo anterior es típico de un sistema de control de versiones descentralizado como Bazaar, Git o Mercurial. Otros sistemas pueden mostrar otros estados. Por ejemplo, CVS muestra el estado ‘need-update’ (‘necesita-actualización’) si el repositorio tiene cambios que no se han aplicado al fichero de trabajo. RCS y SCCS muestran el nombre del usuario que bloquea un fichero como su estado.

En CVS, el comando vc-dir normalmente contacta con el repositorio, que puede estar en una máquina remota, para comprobar si hay actualizaciones. Si cambias la variable vc-cvs-stay-local a nil (ver Opciones específicas para CVS), entonces Emacs evita contactar con un repositorio remoto cuando genera el buffer de VC Directory (seguirá contactando con él cuando sea necesario, por ejemplo, al hacer un commit). Esto puede ser deseable si estás trabajando sin conexión o la red es lenta.

El buffer de VC Directory omite los subdirectorios listados en la variable vc-directory-exclusion-list. Su valor por defecto contiene directorios que son utilizados internamente por los sistemas de control de versiones.

Comandos del Directorio VC

Emacs proporciona varios comandos para navegar por el buffer del Directorio VC, y para marcar archivos como pertenecientes al conjunto de archivos VC actual.

n (n)
SPACE(SPC)
Mueve el punto a la siguiente entrada (vc-dir-next-line).
p (p)
Mueve el punto a la entrada anterior (vc-dir-previous-line).
TAB (TAB)
Mover a la siguiente entrada del directorio (vc-dir-next-directory).
Shift-TAB (S-TAB)
Mover a la entrada del directorio anterior (vc-dir-previous-directory).
RETURN (RET)
f (f)
Visitar el archivo o directorio listado en la línea actual (vc-dir-find-file).
o (o)
Visitar el archivo o directorio en la línea actual, en una ventana separada (vc-dir-find-file-other-window).
m (m)
Marcar el archivo o directorio en la línea actual (vc-dir-mark), poniéndolo en el conjunto de archivos VC actual. Si la región está activa, marca todos los archivos de la región.
Un archivo no puede ser marcado con este comando si ya se encuentra en un directorio marcado, o en uno de sus subdirectorios. Del mismo modo, un directorio no puede ser marcado con este comando si cualquier archivo en su árbol está marcado.
M (M)
Si el punto está en una entrada de archivo, marca todos los archivos con el mismo estado; si el punto está en una entrada de directorio, marca todos los archivos en ese árbol de directorios (vc-dir-mark-all-files). Con un argumento de prefijo, marca todos los archivos y directorios de la lista.
G (G)
Añade el archivo bajo punto a la lista de archivos que la CV debe ignorar (vc-dir-ignore). Por ejemplo, si el CV es Git, añadirá este archivo al archivo .gitignore. Si se le da un prefijo, hace esto con todos los archivos marcados.
q (q)
Salir del buffer del directorio VC, y enterrarlo (quit-window).
u (u)
Desmarca el archivo o directorio en la línea actual. Si la región está activa, desmarcar todos los archivos de la región (vc-dir-unmark).
U (U)
Si el punto está en una entrada de archivo, desmarca todos los archivos con el mismo estado; si el punto está en una entrada de directorio, desmarca todos los archivos de ese árbol de directorios (vc-dir-unmark-all-files). Con un argumento de prefijo, desmarca todos los archivos y directorios.
x (x)
Ocultar los archivos con estado up-to-date (actualizado) o ignored (ignorado) (vc-dir-hide-up-to-date). Con un argumento de prefijo, ocultar los elementos cuyo estado es el del elemento en cuestión.

En la memoria intermedia del directorio VC, todos los archivos que marque con m (m, vc-dir-mark) o M (M, vc-dir-mark-all-files) están en el conjunto de archivos VC actual. Si marcas una entrada de directorio con m, todos los archivos listados en ese árbol de directorios están en el conjunto de archivos VC actual. Los archivos y directorios que pertenecen al conjunto de archivos VC actual se indican con un carácter ‘*’ en el búfer de directorios VC, junto a su estado VC. De este modo, puede configurar un conjunto de archivos VC de varios ficheros para que actúen sobre él comandos VC como Ctrl-x vv (C-x v v) (ver Edición básica bajo el control de versiones), Ctrl-x v= (C-x v =) (ver Examinar y comparar revisiones antiguas), y Ctrl-x vu (C-x v u) (ver Deshacer acciones de control de versiones).

El buffer del Directorio VC también define algunos atajos de teclado para los comandos VC Ctrl-x v (C-x v) con el prefijo: =, +, l, i, D, L, G, I, O, y v.

Por ejemplo, puede confirmar un conjunto de archivos editados abriendo un búfer de VC Directory, donde los archivos aparecen con el estado ‘edited’ (editado); marcando los archivos; y escribiendo v (v) o Ctrl-x vv (C-x v v, vc-next-action). Si el sistema de control de versiones está basado en el conjunto de cambios, Emacs confirmará los archivos en una única revisión.

Mientras está en el buffer del directorio VC, también puede realizar búsquedas y reemplazos en el conjunto de archivos VC actual, con los siguientes comandos:

S (S)
Buscar en el conjunto de archivos (vc-dir-search).
Q (Q)
Hacer una consulta de reemplazo de expresión regular en el conjunto de archivos (vc-dir-query-replace-regexp).
Alt-s a Ctrl-s (M-s a C-s)
Realizar una búsqueda incremental en el conjunto de archivos (vc-dir-isearch).
Alt-s a Ctrl-Alt-s (M-s a C-M-s)
Realizar una búsqueda incremental de expresiones regulares en el conjunto de archivos (vc-dir-isearch-regexp).

Aparte de actuar sobre varios archivos, estos comandos se comportan de forma muy parecida a sus homólogos de un solo búfer (véase Búsqueda y sustitución).

El buffer VC Directory define además algunos comandos relacionados con la rama que comienzan con el prefijo B:

Bc (B c)
Crear una nueva rama (vc-create-tag).
Bl (C l)
Solicitar el nombre de una rama y mostrar el historial de cambios de esa rama (vc-print-branch-log).
Bs (B s)
Cambiar a una rama (vc-retrieve-tag). Véase Cambio de rama.
d (d)
Eliminar los archivos marcados, o el archivo actual si no hay marcas (vc-dir-clean-delete). Los ficheros no se marcarán como borrados en el sistema de control de versiones, por lo que esta función es principalmente útil para los ficheros no registrados.

Los comandos anteriores también están disponibles a través de la barra de menú, y a través de un menú contextual invocado por (ratón-2). Además, algunos backends de la CV utilizan el menú para proporcionar comandos adicionales específicos del backend. Por ejemplo, Git y Bazaar te permiten manipular stashes y shelves (que son una forma de apartar temporalmente los cambios no comprometidos, y traerlos de vuelta en un momento posterior).

Ramas de Control de versiones

Uno de los usos del control de versiones es dar soporte a múltiples líneas de desarrollo independientes, que se denominan ramas. Entre otras cosas, las ramas pueden utilizarse para mantener versiones estables y de desarrollo separadas de un programa, y para desarrollar características no relacionadas entre sí.

El soporte de VC para las operaciones de rama es actualmente bastante limitado. Para los sistemas de control de versiones descentralizados, proporciona comandos para actualizar una rama con el contenido de otra, y para fusionar los cambios realizados en dos ramas diferentes (ver Fusión de ramas). Para sistemas de control de versiones centralizados, soporta la comprobación de diferentes ramas y la confirmación en ramas nuevas o diferentes.

Cambiando entre Ramas

Los distintos sistemas de control de versiones difieren en la forma en que se implementan las ramas, y estas diferencias no pueden ser totalmente ocultadas por VC.

En algunos sistemas de control de versiones descentralizados, incluyendo Bazaar y Mercurial en su modo normal de funcionamiento, cada rama tiene su propio árbol de directorios de trabajo, por lo que cambiar entre ramas sólo implica cambiar de directorio. En Git, las ramas normalmente están ubicadas en el mismo directorio, y el cambio entre ramas se realiza mediante el comando git checkout, que cambia el contenido del árbol de trabajo para que coincida con la rama a la que se cambia. Bazaar también soporta ramas co-localizadas, en cuyo caso el comando bzr switch cambiará de rama en el directorio actual. Con Subversion, se cambia a otra rama utilizando el comando svn switch. Con Mercurial, el comando hg update se utiliza para cambiar a otra rama.

El comando VC para cambiar a otra rama en el directorio actual es Ctrl-x vr branch-name (C-x v r branch-name RET, vc-retrieve-tag).

En los sistemas de control de versiones centralizados, también se puede cambiar de rama escribiendo Ctrl-u Ctrl-x vv (C-u C-x v v) en un fichero de trabajo actualizado (ver Control Avanzado en Ctrl-x vv (C-x v v)), e introduciendo el ID de revisión para una revisión en otra rama. En CVS, por ejemplo, las revisiones en el tronco (la línea principal de desarrollo) normalmente tienen IDs de la forma 1.1, 1.2, 1.3, ..., mientras que la primera rama creada desde (digamos) la revisión 1.2 tiene IDs de revisión 1.2.1.1, 1.2.1.2, ..., la segunda rama creada desde la revisión 1.2 tiene IDs de revisión 1.2.2.1, 1.2.2.2, ..., y así sucesivamente. También puede especificar el ID de la rama, que es un ID de revisión de la rama omitiendo su componente final (por ejemplo, 1.2.1), para cambiar a la última revisión de esa rama.

En un sistema basado en el bloqueo, el cambio a una rama diferente también desbloquea (protege contra escritura) el árbol de trabajo.

Una vez que haya cambiado a una rama, los comandos de la CV se aplicarán a esa rama hasta que la abandone; por ejemplo, cualquier conjunto de archivos de la CV que envíe se enviará a esa rama específica.

Cómo introducir/extraer cambios en/desde una rama

Ctrl-x vP (C-x v P)
En un sistema de control de versiones descentralizado, actualiza otra ubicación con los cambios de la rama actual (también conocido como cambios "push"). Este concepto no existe en los sistemas de control de versiones centralizados
Ctrl-x v+ (C-x v +)
En un sistema de control de versiones descentralizado, se actualiza la rama actual "introduciendo" los cambios desde otra ubicación.
En un sistema de control de versiones centralizado, actualiza el conjunto de archivos VC actual.

En un sistema de control de versiones descentralizado, el comando Ctrl-x vP (C-x v P, vc-push) actualiza otra ubicación con los cambios de la rama actual. Con un argumento prefijo, pide el comando exacto de control de versiones a ejecutar, lo que le permite especificar dónde empujar los cambios; por defecto es bzr push con Bazaar, git push con Git, y hg push con Mercurial. Los comandos por defecto siempre empujan a una ubicación predeterminada determinada por el sistema de control de versiones de la configuración de su rama.

Antes de enviar, puede utilizar Ctrl-x vO (C-x v O, vc-log-outgoing) para ver un búfer de registro de los cambios que se van a enviar. Véase VC Change Log.

Este comando sólo está soportado actualmente por Bazaar, Git y Mercurial. El concepto de "empujar" (pushing) no existe para los sistemas de control de versiones centralizados, donde esta operación es una parte de la confirmación de un conjunto de cambios, por lo que invocar este comando en un VCS centralizado indica un error. Este comando también indica un error cuando se intenta en una rama vinculada a Bazaar, donde la confirmación de un conjunto de cambios automáticamente empuja los cambios al repositorio remoto al que está vinculada la rama local.

En un sistema de control de versiones descentralizado, el comando Ctrl-x v+ (C-x v +, vc-pull) actualiza la rama actual y el árbol de trabajo. Normalmente se utiliza para actualizar una copia de una rama remota. Si proporciona un argumento prefijo, el comando le preguntará por el comando exacto de control de versiones a utilizar, lo que le permitirá especificar de dónde extraer los cambios. De lo contrario, se extraen de una ubicación predeterminada determinada por el sistema de control de versiones.

Antes de la extracción, puede utilizar Ctrl-x vI (C-x v I, vc-log-incoming) para ver un búfer de registro de los cambios que se van a aplicar. Véase VC Change Log.

En un sistema de control de versiones centralizado como CVS, Ctrl-x v+ (C-x v +) actualiza el conjunto de archivos VC actual del repositorio.

Fusión de ramas

Ctrl-x vm (C-x v m)
En un sistema de control de versiones descentralizado, fusiona los cambios de otra rama en la actual.
En un sistema de control de versiones centralizado, fusiona los cambios de otra rama en el conjunto de archivos VC actual.

Durante el desarrollo de una rama, a veces puede ser necesario fusionar cambios que ya se han realizado en otra rama. No se trata de una operación trivial, ya que es posible que se hayan realizado cambios superpuestos en las dos ramas.

En un sistema de control de versiones descentralizado, la fusión se realiza con el comando Ctrl-x vm (C-x v m, vc-merge). En Bazaar, esto pregunta por los argumentos exactos a pasar a bzr merge, ofreciendo un valor por defecto razonable si es posible. En Git, esto pide el nombre de una rama desde la que fusionar, con finalización (basada en los nombres de rama conocidos en el repositorio actual). Con Mercurial, esto pregunta por el argumento a pasar a hg merge. La salida de ejecutar el comando merge se muestra en un buffer separado.

En un sistema de control de versiones centralizado como CVS, Ctrl-x vm (C-x v m) pide un ID de rama, o un par de IDs de revisión (ver Cambiar de rama); entonces encuentra los cambios de esa rama, o los cambios entre las dos revisiones que especificó, y fusiona esos cambios en el conjunto de ficheros CVS actual. Si sólo teclea RETURN (RET), Emacs simplemente fusiona cualquier cambio que se haya hecho en la misma rama desde que Ud. sacó el fichero.

Inmediatamente después de realizar una fusión, sólo se modifica el árbol de trabajo, y puede revisar los cambios producidos por la fusión con Ctrl-x vD (C-x v D) y comandos relacionados (véase Revisiones antiguas). Si las dos ramas contienen cambios superpuestos, la fusión produce un conflicto; aparece una advertencia en la salida del comando de fusión, y se insertan marcadores de conflicto en cada fichero de trabajo afectado, rodeando los dos conjuntos de cambios en conflicto. A continuación, debe resolver el conflicto editando los archivos en conflicto. Una vez que haya terminado, los archivos modificados deben ser confirmados de la forma habitual para que la fusión tenga efecto (ver Edición básica de CV).

Creación de nuevas ramas

En sistemas de control de versiones centralizados como CVS, Emacs soporta la creación de nuevas ramas como parte de una operación de commit. Al confirmar un conjunto de archivos CV modificado, escriba Ctrl-u Ctrl-x vv (C-u C-x v v, vc-next-action con un argumento de prefijo; vea Control avanzado en Ctrl-x vv (C-x v v)). Entonces Emacs pide un ID de revisión para la nueva revisión. Debería especificar un ID de rama adecuado para una rama que comience en la revisión actual. Por ejemplo, si la revisión actual es 2.5, el ID de la rama debería ser 2.5.1, 2.5.2, y así sucesivamente, dependiendo del número de ramas existentes en ese punto.

Este procedimiento no funcionará para sistemas de control de versiones distribuidos como git o Mercurial. Para esos sistemas debes usar el argumento prefijo de vc-create-tag (Ctrl-u Ctrl-x vs (C-u C-x v s)) en su lugar.

Para crear una nueva rama en una revisión más antigua (una que ya no es la cabeza de una rama), primero seleccione esa revisión (vea Cambiar de rama). Su procedimiento será diferente dependiendo de si está utilizando un VCS basado en el bloqueo o en la fusión.

En un VCS de bloqueo, tendrá que bloquear la rama de la revisión antigua con Ctrl-x vv (C-x v v). Se le pedirá que confirme, cuando bloquee la revisión antigua, que realmente quiere crear una nueva rama, si dice que no, se le ofrecerá la oportunidad de bloquear la última revisión. En un VCS basado en la fusión, se saltará este paso.

Entonces haga sus cambios y escriba Ctrl-x vv (C-x v v) de nuevo para confirmar una nueva revisión. Esto crea una nueva rama a partir de la revisión seleccionada.

Una vez creada la rama, las confirmaciones posteriores crean nuevas revisiones en esa rama. Para abandonar la rama, debe seleccionar explícitamente una revisión diferente con Ctrl-u Ctrl-x vv (C-u C-x v v).

Comandos y características diversas de VC

En esta sección se explican las funciones de VC que se utilizan con menos frecuencia.

Registros de cambios y CVS

Si utiliza RCS o CVS para un programa con un archivo ChangeLog (véase Registros de cambios), puede generar entradas de registro de cambios a partir de las entradas de registro de control de versiones de confirmaciones anteriores.

Tenga en cuenta que esto sólo funciona con RCS o CVS. Este procedimiento sería particularmente incorrecto en un sistema de control de versiones moderno basado en conjuntos de cambios, donde los cambios en el archivo ChangeLog normalmente se confirmarían como parte de un conjunto de cambios. En ese caso, debería escribir las entradas del registro de cambios primero, y luego tirar de ellas en el buffer ‘*vc-log*’ cuando confirme (ver Características del buffer de entradas del registro).

Ctrl-x va (C-x v a)
Visita el archivo ChangeLog del directorio actual y, para los archivos registrados en ese directorio, crea nuevas entradas para las versiones confirmadas desde la entrada más reciente del registro de cambios (vc-update-change-log).
Ctrl-u Ctrl-x va (C-u C-x v a)
Como en el caso anterior, pero sólo encuentra entradas para el archivo del buffer actual.

Por ejemplo, suponga que la primera línea de ChangeLog está fechada en 1999-04-10, y que la única entrada desde entonces fue hecha por Nathaniel Bowditch a rcs2log en 1999-05-22 con la entrada de registro ‘Ignore los mensajes de registro que comienzan con '#'.’. Entonces Ctrl-x v (C-x v) a inserta esta entrada del ChangeLog:

1999-05-22  Nathaniel Bowditch  <nat@apn.org>
    
    * rcs2log: Ignore los mensajes de registro que comienzan con '#'.

Si la entrada del registro de control de versiones especifica un nombre de función (entre paréntesis al principio de una línea), eso se refleja en la entrada de ChangeLog. Por ejemplo, si una entrada de registro para vc.el es ‘(vc-do-command): Comprobar el estado del proceso de llamada’, la entrada del ChangeLog es:

1999-05-06  Nathaniel Bowditch  <nat@apn.org>
    
    * vc.el (vc-do-command): Comprobar el estado del proceso de llamada.

Cuando Ctrl-x va (C-x v a) añade varias entradas de registro de cambios a la vez, agrupa las entradas de registro relacionadas si todas son registradas por el mismo autor casi al mismo tiempo. Si las entradas de registro de varios archivos de este tipo tienen el mismo texto, las agrupa en una sola entrada.

Borrar y cambiar nombre de archivos bajo control de versiones

Alt-x vc-delete-files (M-x vc-delete-files)
Solicita un nombre de archivo, elimina el archivo del árbol de trabajo y programa la eliminación para su confirmación.
Alt-x vc-rename-file (M-x vc-rename-file)
Solicita dos nombres de archivo, el antiguo y el nuevo, los renombra en el árbol de trabajo y programa el cambio de nombre para su confirmación. El archivo antiguo tiene por defecto el nombre del archivo del buffer actual si está bajo VC.

Si desea eliminar un archivo controlado por versión, utilice el comando Alt-x vc-delete-file (M-x vc-delete-file). Esto solicita el nombre del archivo, y lo elimina a través del sistema de control de versiones. El archivo se elimina del árbol de trabajo, y en el buffer del Directorio VC (ver Modo de Directorio VC), se muestra con el estado ‘removed’ (eliminado). Al confirmarlo, la eliminación tiene efecto en el repositorio.

Para renombrar un archivo controlado por versión, escriba Alt-x vc-rename-file (M-x vc-rename-file). Esto pide dos argumentos: el nombre del archivo que desea renombrar, y el nuevo nombre; luego realiza el renombramiento a través del sistema de control de versiones. El renombramiento tiene efecto inmediatamente en el árbol de trabajo, y tiene efecto en el repositorio cuando confirma el archivo renombrado.

En los sistemas de control de versiones modernos que tienen soporte incorporado para el renombrado, el archivo renombrado retiene el historial de cambios completo del archivo original. En CVS y sistemas de control de versiones más antiguos, el comando vc-rename-file funciona creando una copia del fichero antiguo con el nuevo nombre, registrándolo y borrando el fichero antiguo. En este caso, el historial de cambios no se conserva.

Etiquetas de revisión

La mayoría de los sistemas de control de versiones permiten aplicar una etiqueta de revisión a una versión específica de un árbol controlado por versiones. En los sistemas modernos de control de versiones basados en conjuntos de cambios, una etiqueta de revisión es simplemente un nombre simbólico para una revisión concreta. En los sistemas más antiguos basados en ficheros, como CVS, cada etiqueta se añade a todo el conjunto de ficheros controlados por versiones, lo que permite manejarlos como una unidad. Las etiquetas de revisión se utilizan habitualmente para identificar las versiones que se distribuyen a los usuarios.

Hay dos comandos básicos para las etiquetas; uno crea una etiqueta con un nombre determinado, el otro recupera una etiqueta con nombre.

Ctrl-x vs nombre RETURN (C-x v s nombre RET)
Define la revisión de trabajo de cada archivo registrado en o bajo el directorio actual como una etiqueta con nombre (vc-create-tag).
Ctrl-x vr nombre RETURN (C-x v r nombre RET)
Para todos los ficheros registrados en o por debajo del nivel del directorio actual, recuperar el nombre de la revisión etiquetada. Este comando cambiará a una rama si nombre es un nombre de rama y su VCS distingue las ramas de las etiquetas. (vc-retrieve-tag).

Puede dar una etiqueta o un nombre de rama como argumento a Ctrl-x v= (C-x v =) o Ctrl-x v~ (C-x v ~) (véase Examinar y comparar revisiones antiguas). Así, puede utilizarlo para comparar una versión etiquetada con los archivos actuales, o dos versiones etiquetadas entre sí.

En SCCS, VC implementa las etiquetas por sí mismo; estas etiquetas son visibles sólo a través de VC. La mayoría de los sistemas posteriores (incluyendo CVS, Subversion, bzr, git, y hg) tienen una facilidad nativa de etiquetado, y VC la utiliza cuando está disponible; esas etiquetas serán visibles incluso cuando se omita VC.

En los sistemas de control de versiones basados en archivos, cuando se renombra un archivo registrado es necesario renombrar su maestro junto con él; el comando vc-rename-file lo hará automáticamente (ver Borrar y renombrar archivos controlados por versiones). Si está utilizando SCCS, también debe actualizar los registros de la etiqueta, para mencionar el archivo por su nuevo nombre (vc-rename-file también lo hace). Una etiqueta antigua que hace referencia a un archivo maestro que ya no existe con el nombre registrado no es válida; VC ya no puede recuperarla. Estaría más allá del alcance de este manual explicar lo suficiente sobre RCS y SCCS para explicar cómo actualizar las etiquetas a mano. El uso de vc-rename-file hace que la etiqueta siga siendo válida para su recuperación, pero no resuelve todos los problemas. Por ejemplo, algunos de los archivos de su programa probablemente hacen referencia a otros por su nombre. Por lo menos, el makefile probablemente menciona el archivo que usted renombró. Si recuperas una etiqueta antigua, el archivo renombrado se recupera con su nuevo nombre, que no es el nombre que el makefile espera. Así que el programa no funcionará realmente como se ha recuperado.

Insertar cabeceras de control de versiones

En Subversion, CVS, RCS y SCCS, puede poner ciertas cadenas especiales llamadas cabeceras de versión en un fichero de trabajo. Cuando el fichero se confirma, el sistema de control de versiones pone automáticamente el número de revisión, el nombre del usuario que ha hecho la confirmación y otra información relevante en la cabecera de la versión.

Normalmente, VC no utiliza la información de las cabeceras de la versión. Como excepción, cuando se utiliza RCS, Emacs utiliza la cabecera de la versión, si hay una, para determinar la versión del archivo, ya que a menudo es más fiable que el archivo maestro de RCS. Para inhibir el uso de la cabecera de la versión de esta manera, cambie la variable vc-consult-headers a nil. Entonces VC siempre utiliza los permisos del archivo (si se supone que debe confiar en ellos), o bien comprueba el archivo maestro.

Para insertar una cadena de cabecera adecuada en el buffer actual, utilice el comando Alt-x vc-insert-headers (M-x vc-insert-headers). Este comando sólo funciona en Subversion, CVS, RCS y SCCS. La variable vc-backend-header contiene la lista de palabras clave a insertar en la cabecera de la versión; por ejemplo, CVS utiliza vc-cvs-header, cuyo valor por defecto es '("\$Id\$"). (Las barras invertidas adicionales evitan que la constante de la cadena sea interpretada como una cabecera, si el archivo Emacs Lisp que la define se mantiene con el control de versiones). El comando vc-insert-headers inserta cada palabra clave de la lista en una nueva línea en el punto, rodeada de tabuladores, y dentro de delimitadores de comentario si es necesario.

La variable vc-static-header-alist especifica otras cadenas a añadir en función del nombre del buffer. Su valor debe ser una lista de elementos de la forma (regexp . format). Siempre que regexp coincida con el nombre del búfer, el formato también se inserta como parte de la cabecera de la versión. Un ‘%s’ en el formato se sustituye por el tipo de control de versión del archivo.

Personalización de VC

La variable vc-handled-backends determina qué sistemas de control de versiones debe manejar VC. El valor por defecto es (RCS CVS SVN SCCS SRC Bzr Git Hg Mtn), por lo que contiene todos los sistemas de versiones soportados actualmente. Si quiere que VC ignore uno o más de estos sistemas, excluya su nombre de la lista. Para desactivar VC por completo, establezca esta variable como nula.

El orden de los sistemas en la lista es significativo: cuando se visita un archivo registrado en más de un sistema, VC utiliza el sistema que aparece primero en vc-handled-backends por defecto. El orden también es significativo cuando se registra un archivo por primera vez (véase Registrar un archivo para el control de versiones).

Opciones generales

Emacs normalmente no guarda archivos de copia de seguridad para los archivos fuente que se mantienen con control de versiones. Si desea hacer archivos de copia de seguridad incluso para los archivos que utilizan el control de versiones, establezca la variable vc-make-backup-files a un valor no nulo.

La edición de un archivo con control de versiones a través de un enlace simbólico puede causar resultados inesperados, si no se sabe que el archivo subyacente tiene control de versiones. La variable vc-follow-symlinks controla lo que Emacs hace si intenta visitar un enlace simbólico que apunta a un fichero de versión controlada. Si el valor es ask (por defecto), Emacs pide confirmación. Si es nil, el sólo muestra un mensaje de advertencia. Si es t, sigue automáticamente el enlace y visita el fichero real en su lugar.

Si vc-suppress-confirm es no nil, entonces Ctrl-x vv (C-x v v) y Ctrl-x vi (C-x v i) pueden guardar el buffer actual sin preguntar, y Ctrl-x vu (C-x v u) también funciona sin pedir confirmación.

El modo VC hace gran parte de su trabajo ejecutando los comandos del shell para el sistema de control de versiones apropiado. Si vc-command-messages no es nulo, VC muestra mensajes para indicar qué comandos del shell ejecuta, y mensajes adicionales cuando los comandos terminan.

Opciones para RCS y SCCS

Por defecto, RCS utiliza el bloqueo para coordinar las actividades de varios usuarios, pero hay un modo llamado bloqueo no estricto en el que puede registrar los cambios sin bloquear el archivo primero. Use ‘rcs -U’ para cambiar a bloqueo no estricto para un archivo en particular, vea la página del manual de rcs para más detalles.

Cuando se deduce el estado de control de versiones de un archivo RCS, VC busca primero una cadena de cabecera de versión RCS en el archivo (ver Inserción de cabeceras de control de versiones). Si no hay una cadena de cabecera, VC normalmente mira los permisos del archivo de trabajo; esto es rápido. Pero puede haber situaciones en las que no se pueda confiar en los permisos del archivo. En este caso hay que consultar el fichero maestro, lo que es bastante costoso. Además, el archivo maestro sólo puede decirle si hay algún bloqueo en el archivo, pero no si su archivo de trabajo realmente contiene esa versión bloqueada.

Puedes decirle a VC que no utilice las cabeceras de versión para determinar el estado del archivo poniendo vc-consult-headers a nil. Entonces VC siempre utiliza los permisos del archivo (si se supone que debe confiar en ellos), o bien comprueba el archivo maestro.

VC determina el estado de control de versiones de los archivos bajo SCCS de forma muy parecida a como lo hace con RCS. Sin embargo, no considera las cabeceras de versión de SCCS. Así, la variable vc-consult-headers no afecta al uso de SCCS.

Opciones específicas para CVS

Puede especificar opciones de línea de comandos adicionales para pasar a todas las operaciones CVS en la variable vc-cvs-global-switches. Estos interruptores se insertan inmediatamente después del comando cvs, antes del nombre de la operación a invocar.

Cuando se utiliza un repositorio CVS en una máquina remota, VC puede intentar mantener las interacciones de red al mínimo. Esto se controla con la variable vc-cvs-stay-local. Si vc-cvs-stay-local es only-file (el valor por defecto), VC determina el estado de control de la versión de cada archivo utilizando sólo la entrada en el subdirectorio CVS local y la información devuelta por los comandos CVS anteriores. Como consecuencia, si ha modificado un archivo y otra persona ha registrado otros cambios, no se le notificará el conflicto hasta que intente confirmarlo.

Si cambia vc-cvs-stay-local a nil, VC consulta el repositorio remoto antes de decidir qué hacer en vc-next-action (Ctrl-x vv (C-x v v)), igual que hace con los repositorios locales.

También puede establecer vc-cvs-stay-local a una expresión regular que se compara con el nombre de host del repositorio; VC entonces permanece local sólo para los repositorios de hosts que coinciden con el patrón.

Cuando se utiliza un repositorio remoto, Emacs normalmente hace copias de seguridad automáticas de las versiones originales de cada archivo editado. Estas copias de seguridad locales se hacen cada vez que se guardan los primeros cambios en un fichero, y se eliminan después de confirmar los cambios en el repositorio. (Tenga en cuenta que no son lo mismo que los archivos de copia de seguridad ordinarios de Emacs; vea Archivos de copia de seguridad). Comandos como Ctrl-x v= (C-x v =) y Ctrl-x vu (C-x v u) hacen uso de las copias de seguridad automáticas de versiones, si es posible, para evitar tener que acceder a la red.

Al establecer vc-cvs-stay-local a nil se desactiva la realización de copias de seguridad automáticas de versiones.

Las copias de seguridad automáticas de versiones tienen nombres de la forma archivo.~versión.~. Esto es similar al nombre con el que Ctrl-x v~ (C-x v ~) guarda las versiones antiguas (véase Examinar y comparar revisiones antiguas), excepto por el punto adicional (‘.’) después de la versión. Los comandos pertinentes de VC pueden utilizar ambos tipos de copias de seguridad de versiones. La principal diferencia es que las copias de seguridad de versiones manuales hechas por Ctrl-x v~ (C-x v ~) no se borran automáticamente cuando se confirma.

CVS no utiliza el bloqueo por defecto, pero hay formas de habilitar un comportamiento similar al bloqueo utilizando su función CVSREAD o función de vigilancia; consulte la documentación de CVS para más detalles. En ese caso, puede utilizar Ctrl-x vv (C-x v v) en Emacs para activar el bloqueo, como lo haría en un sistema de control de versiones basado en el bloqueo (vea Control de versiones básico con bloqueo).

Trabajar con proyectos

Un proyecto es una colección de archivos utilizados para producir uno o más programas. Los archivos que pertenecen a un proyecto suelen almacenarse en una jerarquía de directorios; el directorio de nivel superior de la jerarquía se conoce como raíz del proyecto.

El hecho de que un directorio dado sea la raíz de algún proyecto viene determinado por la infraestructura específica del proyecto, conocida como back-end del proyecto. Emacs actualmente soporta dos de estos back-ends: VC (véase Control de versiones), en el que un repositorio VCS se considera un proyecto; y EDE (véase Entorno de desarrollo Emacs). Se espera que esto se amplíe en el futuro para soportar otros tipos de proyectos.

Los archivos que pertenecen o no a un proyecto también están determinados por el back-end del proyecto. Por ejemplo, el back-end VC no considera que los archivos "ignorados" (véase Ignorar archivos de control de versiones) formen parte del proyecto.

Comandos de proyecto que operan con archivos

Ctrl-x pf (C-x p f)
Visita un archivo que pertenece al proyecto actual (project-find-file).
Ctrl-x pg (C-x p g)
Busca coincidencias para una expresión regular en todos los archivos que pertenecen al proyecto actual (project-find-regexp).
Alt-x project-search (M-x project-search)
Busca interactivamente coincidencias de regexp en todos los archivos que pertenecen al proyecto actual.
Ctrl-x pr (C-x p r)
Realiza una consulta-reemplazo de una regexp en todos los archivos que pertenecen al proyecto actual (project-query-replace-regexp).
Ctrl-x pd (C-x p d)
Ejecuta Dired en el directorio raíz del proyecto actual (project-dired).
Ctrl-x pv (C-x p v)
Ejecuta vc-dir en el directorio raíz del proyecto actual (project-vc-dir).
Ctrl-x ps (C-x p s)
Inicia un shell inferior en el directorio raíz del proyecto actual (project-shell).
Ctrl-x pe (C-x p e)
Inicia Eshell en el directorio raíz del proyecto actual (project-eshell).
Ctrl-x pc (C-x p c)
Ejecuta la compilación en el directorio raíz del proyecto actual (project-compile).
Ctrl-x p! (C-x p !)
Ejecuta el comando shell en el directorio raíz del proyecto actual (project-shell-command).
Ctrl-x p& (C-x p &)
Ejecuta el comando shell de forma asíncrona en el directorio raíz del proyecto actual (project-async-shell-command).

Emacs proporciona comandos para manejar los archivos del proyecto convenientemente. Esta subsección describe estos comandos.

Todos los comandos descritos aquí comparten la noción del proyecto actual. El proyecto actual está determinado por el directorio por defecto (ver Nombres de archivos) del buffer que es el actual cuando se invoca el comando. Si ese directorio no parece pertenecer a un proyecto reconocible, estos comandos le piden el directorio del proyecto.

El comando Ctrl-x pf (C-x p f, project-find-file) es una forma conveniente de visitar archivos (ver Visitando Archivos) que pertenecen al proyecto actual. A diferencia de Ctrl-x Ctrl-f (C-x C-f), este comando no requiere teclear el nombre completo del archivo a visitar, puede teclear sólo el nombre base del archivo (es decir, omitir los directorios iniciales). Además, los candidatos a la finalización considerados por el comando incluyen sólo los archivos pertenecientes al proyecto actual, y nada más. Si hay un nombre de archivo en el punto, este comando ofrece ese archivo como primer elemento del "historial futuro".

El comando Ctrl-x pg (C-x p g, project-find-regexp) es similar a rgrep (ver Buscar con Grep en Emacs), pero busca sólo los archivos que pertenecen al proyecto actual. El comando solicita la expresión regular a buscar, y muestra un búfer en modo Xref con los resultados de la búsqueda, donde puede seleccionar una coincidencia usando los comandos en modo Xref (ver Comandos disponibles en el búfer *xref*). Cuando se invoca con un argumento de prefijo, este comando solicita adicionalmente el directorio base desde el que iniciar la búsqueda; esto permite, por ejemplo, limitar la búsqueda sólo a los archivos de proyecto bajo un determinado subdirectorio de la raíz del proyecto. La forma en que este comando muestra las coincidencias se ve afectada por el valor de xref-auto-jump-to-first-xref (véase Buscar y reemplazar con identificadores).

Alt-x project-search (M-x project-search) es una variante secuencial de project-find-regexp. Solicita una expresión regular para buscar en los archivos del proyecto actual, pero en lugar de encontrar todas las coincidencias y mostrarlas, se detiene cuando encuentra una coincidencia y visita el archivo coincidente en el lugar de la coincidencia, permitiéndole editar el archivo coincidente. Para encontrar el resto de las coincidencias, escriba Alt-x fileloop-continue RETURN (M-x fileloop-continue RET).

Ctrl-x pr (C-x p r, project-query-replace-regexp) es similar a project-search, pero le pregunta si quiere reemplazar cada coincidencia que encuentra, como hace query-replace (ver Query Replace), y continúa con la siguiente coincidencia después de que respondas. Si su respuesta hace que Emacs salga del bucle query-replace, puede continuar más tarde con Alt-x fileloop-continue RETURN (M-x fileloop-continue RET).

El comando Ctrl-x pd (C-x p d, project-find-dir) le pide que elija un directorio dentro del proyecto actual, con finalización. Y abre un buffer de Dired (ver Dired, el editor de directorios) con una lista de los archivos que hay en él.

El comando Ctrl-x pD (C-x p D, project-dired) abre un buffer Dired (ver Dired, el Editor de Directorios) listando los archivos en el directorio raíz del proyecto actual.

El comando Ctrl-x p-v (C-x p v, project-vc-dir) abre un buffer de VC Directory (ver VC Directory Mode) que lista los estados de control de versiones de los archivos en un árbol de directorios bajo el directorio raíz del proyecto actual.

El comando Ctrl-x ps (C-x p s, project-shell) inicia una sesión de shell (ver Ejecutar comandos de shell desde Emacs) en un nuevo buffer con la raíz del proyecto actual como directorio de trabajo.

El comando Ctrl-x pe (C-x p e, project-eshell) inicia una sesión de Eshell en un nuevo buffer con la raíz del proyecto actual como directorio de trabajo. Ver Eshell en Eshell: The Emacs Shell.

El comando Ctrl-x pc (C-x p c, project-compile) ejecuta la compilación (ver Ejecutar compilaciones en Emacs) en el directorio raíz del proyecto actual.

El comando Ctrl-x p! (C-x p !, project-shell-command) ejecuta shell-command en el directorio raíz del proyecto actual.

El comando Ctrl-x p& (C-x p &, project-async-shell-command) ejecuta async-shell-command en el directorio raíz del proyecto actual.

Comandos de proyecto que operan con buffers

Ctrl-x pb (C-x p b)
Cambia a otro buffer perteneciente al proyecto actual (project-switch-to-buffer).
Ctrl-x pk (C-x p k)
Mata todos los búferes vivos que pertenecen al proyecto actual (project-kill-buffers).

Trabajar en un proyecto puede implicar potencialmente tener muchos buffers visitando archivos que pertenecen al proyecto, y también buffers que pertenecen al proyecto, pero que no visitan ningún archivo (como el buffer *compilation* (*compilación*) creado por project-compile). El comando Ctrl-x pb (C-x p b, project-switch-to-buffer) le ayuda a cambiar entre los buffers que pertenecen al proyecto actual, solicitando un buffer para cambiar y considerando sólo los buffers del proyecto actual como candidatos a ser completados.

Cuando termina de trabajar en el proyecto, puede desear matar todos los buffers que pertenecen a dicho proyecto para mantener su sesión de Emacs más pequeña. El comando Ctrl-x pk (C-x p k, project-kill-buffers) lo consigue: mata todos los buffers que pertenecen al proyecto actual y que satisfacen cualquiera de las condiciones de project-kill-buffer-conditions.

Conmutación de Proyectos

Ctrl-x pp (C-x p p)
Ejecuta un comando Emacs para otro proyecto (project-switch-project).

Los comandos que operan sobre archivos de proyecto (ver Comandos de proyecto que operan sobre archivos) le pedirán convenientemente un directorio de proyecto cuando no haya ningún proyecto en curso. Cuando esté dentro de algún proyecto, pero quiera operar en un proyecto diferente, utilice el comando Ctrl-x pp (C-x p p, project-switch-project). Este comando le pide que elija un directorio entre las raíces de los proyectos conocidos, y luego muestra el menú de comandos disponibles para operar en el proyecto que elija. La variable project-switch-commands controla qué comandos están disponibles en el menú, y qué tecla invoca cada comando.

La variable project-list-file nombra el archivo en el que Emacs registra la lista de proyectos conocidos. Por defecto es el archivo projects en user-emacs-directory (ver Cómo Emacs encuentra su archivo de inicio).

Gestión del archivo de la lista de proyectos

Alt-x project-forget-project (M-x project-forget-project)
Elimina un proyecto conocido del archivo project-list-file.

Normalmente Emacs añade y elimina automáticamente proyectos del fichero de lista de proyectos, pero a veces puede querer editar manualmente los proyectos disponibles. Alt-x project-forget-project (M-x project-forget-project) le pide que elija uno de los proyectos disponibles, y luego lo elimina del archivo.

Registros de cambios

Muchos proyectos de software mantienen un registro de cambios. Se trata de un archivo, normalmente llamado ChangeLog, que contiene un registro cronológico de cuándo y cómo se ha modificado el programa. A veces, estos archivos se generan automáticamente a partir de las entradas del registro de cambios almacenadas en los sistemas de control de versiones, o se utilizan para generar estas entradas del registro de cambios. A veces, hay varios archivos de registro de cambios, cada uno de los cuales registra los cambios en un directorio o árbol de directorios.

Comandos del registro de cambios

El comando Ctrl-x 4a (C-x 4 a) de Emacs añade una nueva entrada al archivo de registro de cambios para el archivo que está editando (add-change-log-entry-other-window). Si ese archivo es en realidad un archivo de copia de seguridad, hace una entrada apropiada para el padre del archivo, lo que es útil para hacer entradas de registro para las funciones que se han eliminado en la versión actual.

Ctrl-x 4a (C-x 4 a) visita el archivo de registro de cambios y crea una nueva entrada a menos que la entrada más reciente sea para la fecha de hoy y su nombre. También crea una nueva entrada para el archivo actual. Para muchos idiomas, puede incluso adivinar el nombre de la función u otro objeto que se ha modificado.

Para encontrar el archivo de registro de cambios, Emacs busca en el árbol de directorios desde el archivo que está editando. Por defecto, se detiene si encuentra un directorio que parece ser la raíz de un repositorio de control de versiones. Para cambiar esto, personalice change-log-directory-files.

Cuando la variable add-log-keep-changes-together es no nula, Ctrl-x 4a (C-x 4 a) añade a cualquier elemento existente para el archivo, en lugar de iniciar un nuevo elemento.

Puede combinar varios cambios de la misma naturaleza. Si no introduce ningún texto después de la Ctrl-x 4a (C-x 4 a) inicial, cualquier Ctrl-x 4a posterior añade otro símbolo a la entrada del registro de cambios.

Si add-log-always-start-new-record es distinto de cero, Ctrl-x 4a (C-x 4 a) siempre hace una nueva entrada, incluso si la última entrada fue hecha por Usted y en la misma fecha.

Si el valor de la variable change-log-version-info-enabled es no-nil, Ctrl-x 4a (C-x 4 a) añade el número de versión del archivo a la entrada del registro de cambios. Encuentra el número de versión buscando en el primer diez por ciento del archivo, utilizando expresiones regulares de la variable change-log-version-number-regexp-list.

El archivo de registro de cambios se visita en el modo de registro de cambios. En este modo principal, cada grupo de elementos agrupados cuenta como un párrafo, y cada entrada se considera una página. Esto facilita la edición de las entradas. Ctrl-j (C-j) y el autocompletado sangran cada nueva línea como la anterior; esto es conveniente para introducir el contenido de una entrada.

Puede utilizar el comando change-log-goto-source (por defecto vinculado a Ctrl-c Ctrl-c (C-c C-c)) para ir a la ubicación de origen de la entrada del registro de cambios cerca del punto, cuando el modo de registro de cambios está activado. Entonces, las siguientes invocaciones del comando next-error (por defecto ligado a Alt-g Alt-n (M-g M-n) y Ctrl-x ` (C-x `)) se moverán entre las entradas del registro de cambios. Saltará al sitio real del archivo que fue cambiado, no sólo a la siguiente entrada del registro de cambios. También puede usar previous-error para moverse hacia atrás en las entradas del registro de cambios.

Puede utilizar el comando Alt-x change-log-merge (M-x change-log-merge) para fusionar otros archivos de registro en un buffer en el modo de registro de cambios, preservando el orden de las fechas de las entradas.

Los sistemas de control de versiones son otra forma de mantener un seguimiento de los cambios en su programa y mantener un registro de cambios. Muchos proyectos que utilizan un VCS no mantienen un archivo de registro de cambios versionado por separado hoy en día, por lo que puede desear evitar tener dicho archivo en el repositorio. Si el valor de add-log-dont-create-changelog-file es distinto de cero, comandos como Ctrl-x 4a (C-x 4 a, add-change-log-entry-other-window) registrarán los cambios en un buffer temporal con el nombre adecuado en lugar de en un fichero, si dicho fichero no existe ya.

Tanto si tienes un archivo de registro de cambios como si utilizas un buffer temporal para los registros de cambios, puedes escribir Ctrl-c Ctrl-a (C-c C-a, log-edit-insert-changelog) en el buffer de registro de VC para insertar las entradas de registro de cambios relevantes, si existen. Ver Características del Buffer de Entradas de Registro.

Formato de ChangeLog

Una entrada del registro de cambios comienza con una línea de cabecera que contiene la fecha actual, su nombre (tomado de la variable add-log-full-name) y su dirección de correo electrónico (tomada de la variable add-log-mailing-address). Aparte de estas líneas de cabecera, todas las líneas del registro de cambios comienzan con un espacio o un tabulador. El grueso de la entrada consiste en elementos, cada uno de los cuales comienza con una línea que empieza con un espacio en blanco y una estrella. Aquí hay dos entradas, ambas fechadas en mayo de 1993, con dos elementos y un elemento respectivamente.

 1993-05-25  Richard Stallman  <rms@gnu.org>
 
         * man.el: Rename symbols 'man-*' to 'Man-*'.
         (manual-entry): Make prompt string clearer.
 
         * simple.el (blink-matching-paren-distance):
         Change default to 12,000.
 
 1993-05-24  Richard Stallman  <rms@gnu.org>
 
         * vc.el (minor-mode-map-alist): Don't use it if it's void.
         (vc-cancel-version): Doc fix.

Una entrada puede describir varios cambios; cada cambio debe tener su propio artículo, o su propia línea en un artículo. Normalmente debe haber una línea en blanco entre los elementos. Cuando los elementos estén relacionados (partes del mismo cambio, en diferentes lugares), agrúpelos sin dejar una línea en blanco entre ellos.

Debe poner un aviso de copyright y un aviso de permiso al final del archivo de registro de cambios. He aquí un ejemplo:

  Copyright 1997, 1998 Free Software Foundation, Inc.
  Copying and distribution of this file, with or without modification, are
  permitted provided the copyright notice and this notice are preserved.

Por supuesto, debe sustituir los años adecuados y el titular de los derechos de autor.

Buscar referencias de identificadores

Un identificador es el nombre de una subunidad sintáctica del programa: una función, una subrutina, un método, una clase, un tipo de datos, una macro, etc. En un lenguaje de programación, cada identificador es un símbolo de la sintaxis del lenguaje. Los identificadores también se conocen como etiquetas.

El desarrollo y el mantenimiento de los programas requieren capacidades para encontrar rápidamente dónde se ha definido y referenciado cada identificador, para renombrar identificadores en todo el proyecto, etc. Estas capacidades también son útiles para encontrar referencias en modos principales distintos a los definidos para soportar los lenguajes de programación. Por ejemplo, los capítulos, las secciones, los apéndices, etc. de un texto o de un documento TeX pueden tratarse también como subunidades, y sus nombres pueden utilizarse como identificadores. En este capítulo, utilizamos el término "identificadores" para referirnos colectivamente a los nombres de cualquier tipo de subunidades, tanto en el código fuente del programa como en otros tipos de texto.

Emacs proporciona una interfaz unificada para estas capacidades, llamada ‘xref’.

Para hacer su trabajo, xref necesita hacer uso de información y emplear métodos específicos del modo principal. Qué archivos buscar para los identificadores, cómo encontrar referencias a los identificadores, cómo completar los identificadores, todo esto y más es conocimiento específico del modo. xref delega las partes específicas del modo de su trabajo a un backend proporcionado por el modo; también incluye valores por defecto para algunos de sus comandos, para aquellos modos que no proporcionan los suyos propios.

Un backend puede implementar sus capacidades de diversas maneras. He aquí algunos ejemplos:

  1. Algunos modos principales proporcionan medios incorporados para buscar los símbolos del lenguaje. Por ejemplo, los símbolos de Emacs Lisp pueden identificarse buscando en el historial de carga de paquetes, mantenido por el intérprete de Emacs Lisp, y consultando las cadenas de documentación incorporadas; el modo Emacs Lisp utiliza estas facilidades en su backend para permitir encontrar definiciones de símbolos. (Una desventaja de este tipo de backend es que sólo conoce las subunidades que fueron cargadas en el intérprete).

  2. Un programa externo puede extraer referencias escaneando los archivos relevantes, y construir una base de datos de estas referencias. Un backend puede entonces acceder a esta base de datos cuando necesite listar o buscar referencias. La distribución de Emacs incluye etags, un comando para etiquetar definiciones de identificadores en los programas, que soporta muchos lenguajes de programación y otros modos principales, como HTML, extrayendo referencias en tablas de etiquetas. Véase Creación de tablas de etiquetas. Los modos principales para los lenguajes soportados por etags pueden utilizar las tablas de tags como base para su backend. (Una desventaja de este tipo de backend es que las tablas de tags deben mantenerse razonablemente actualizadas, reconstruyéndolas de vez en cuando).

Buscar identificadores

Esta subsección describe los comandos que encuentran referencias a los identificadores y realizan varias consultas sobre los mismos. Cada una de estas referencias puede definir un identificador, por ejemplo, proporcionar la implementación de una subunidad del programa o el texto de una sección del documento; o puede utilizar el identificador, por ejemplo, llamar a una función o a un método, asignar un valor a una variable, mencionar un capítulo en una referencia cruzada, etc.

Búsqueda de identificadores

Lo más importante que permite hacer xref es encontrar la definición de un identificador específico.

Alt-. (M-.)
Busca definiciones de un identificador (xref-find-definitions).
Ctrl-Alt-. patrón RETURN (C-M-. patrón RET)
Encuentra todos los identificadores cuyo nombre coincide con el patrón (xref-find-apropos).
Ctrl-x 4. RETURN (C-x 4 . RET)
Encuentra las definiciones de un identificador, pero las muestra en otra ventana (xref-find-definitions-other-window).
Ctrl-x 5 . RETURN (C-x 5 . RET)
Encuentra la definición del identificador, y la muestra en un nuevo marco (xref-find-definitions-other-frame).
Alt-x xref-find-definitions-at-mouse (M-x xref-find-definitions-at-mouse)
Busca la definición del identificador al hacer clic con el ratón.
Alt-, (M-,)
Vuelve al lugar donde se invocó previamente Alt-. (M-.) y amigos (xref-pop-marker-stack).
Alt-x xref-etags-mode (M-x xref-etags-mode)
Cambia xref para usar el backend de etags.

Alt-. (M-., xref-find-definitions) muestra la definición del identificador en el punto. Con un argumento de prefijo, o si no hay un identificador en el punto, pregunta por el identificador. (Si quiere que siempre pregunte, personalice xref-prompt-for-identifier a t.)

Al introducir el argumento del identificador en Alt-. (M-.), puede utilizar los comandos habituales de finalización del minibuffer (véase Finalización), siendo los nombres de los identificadores conocidos los candidatos a la finalización.

Como la mayoría de los comandos que pueden cambiar de búfer, xref-find-definitions tiene una variante que muestra el nuevo búfer en otra ventana, y otra que hace un nuevo marco para él. La primera es Ctrl-x 4. (C-x 4 ., xref-find-definitions-other-window), y la segunda es Ctrl-x 5. (C-x 5 ., xref-find-definitions-other-frame).

El comando xref-find-definitions-at-mouse funciona como xref-find-definitions, pero busca el nombre del identificador en o alrededor del lugar de un evento del ratón. Este comando está pensado para ser vinculado a un evento del ratón, como Ctrl-Alt- (C-M-ratón-1), por ejemplo.

El comando Ctrl-Alt-. (C-M-., xref-find-apropos) es como apropos para las etiquetas (ver Apropos). Muestra una lista de en la tabla de etiquetas seleccionadas cuyos nombres coinciden con la regexp especificada. Es igual que Alt-. (M-.), salvo que hace una coincidencia de regexp de los identificadores en lugar de coincidir con los nombres de los símbolos como cadenas fijas. Por defecto, el comando muestra el búfer *xref*, como M-., pero puede mostrar una salida adicional personalizando la variable tags-apropos-additional-actions; consulte su documentación para más detalles.

Si cualquiera de los comandos anteriores encuentra más de una definición que coincida, por defecto se abre el búfer *xref* mostrando los candidatos que coinciden. (Ctrl-Alt-. (C-M-.) siempre abre el búfer *xref* si encuentra al menos una coincidencia.) Los candidatos se muestran normalmente en ese búfer como el nombre de un archivo y el/los identificador/es coincidentes en ese archivo. En ese búfer, puede seleccionar cualquiera de los candidatos para su visualización, y dispone de varios comandos adicionales, descritos en Comandos disponibles en el búfer *xref*. Sin embargo, si el valor de la variable xref-auto-jump-to-first-definition es move, el primero de estos candidatos se selecciona automáticamente en el buffer *xref*, y si es t o show, el primer candidato se muestra automáticamente en su propia ventana; t también selecciona la ventana que muestra el primer candidato. El valor por defecto es nil, que sólo muestra los candidatos en el buffer *xref*, pero no selecciona ninguno de ellos.

Para volver a los lugares desde donde se ha mostrado la definición, utilice Alt-, (M-,, xref-pop-marker-stack). Salta hacia atrás al punto de la última invocación de Alt-. (M-.) De este modo, puede encontrar y examinar la definición de algo con Alt-. y luego volver a donde estaba con Alt-, (M-,). M-, le permite volver sobre sus pasos hasta una profundidad determinada por la variable xref-marker-ring-length, que por defecto es 16.

Algunos modos principales instalan facilidades de soporte de xref que a veces pueden fallar en encontrar ciertos identificadores. Por ejemplo, en el modo Emacs Lisp (ver Evaluando Expresiones Emacs Lisp) Alt-. (M-.) encontrará por defecto sólo funciones y variables de paquetes Lisp que estén cargados en la sesión actual de Emacs o que estén autocargados (ver Autoload en The Emacs Lisp Reference Manual). Si M-. no encuentra algunos identificadores, puede intentar forzar a xref a usar el backend de etags (ver Find Identifier References). Para ello, active el modo menor Xref Etags con Alt-x xref-etags-mode (M-x xref-etags-mode), y luego invoque Alt-. (M-.) de nuevo. (Para que esto funcione, asegúrese de ejecutar etags para crear la tabla de etiquetas en el árbol de directorios de los archivos fuente, véase Creación de tablas de etiquetas).

Comandos disponibles en el búfer *xref*

Los siguientes comandos están disponibles en el búfer *xref* por el modo especial XREF:

RETURN (RET)
(ratón-1)
Muestra la referencia en la línea actual (xref-goto-xref). Con el argumento del prefijo, también entierra el buffer *xref*.
(ratón-2)
Lo mismo que (ratón-1), pero hace que la ventana que muestra el buffer *xref* sea la ventana seleccionada (xref-select-and-show-xref).
n (n)
. (.)
Pasa a la siguiente referencia y la muetsra en la otra ventana (xref-next-line).
N (N)
Se desplaza a la primera referencia del siguiente grupo de referencias y la muestra en la otra ventana (xref-next-group).
p (p)
()
Pasa a la referencia anterior y la muestra en la otra ventana (xref-prev-line).
P (P)
Se desplaza a la primera referencia del grupo de referencias anterior y la muestra en la otra ventana (xref-prev-group).
Ctrl-o (C-o)
Muestra la referencia en la línea actual en la otra ventana (xref-show-location-at-point).
r patrón RETURN reemplazo RETURN (r patrón RET reemplazo RET)
Realiza una consulta-reemplazo (query-replace) interactiva en las referencias que coinciden con patrón (xref-query-replace-in-results), reemplazando la coincidencia con reemplazo. Véase Buscar y reemplazar con identificadores.
g (g)
Refresca el contenido del buffer *xref* (xref-revert-buffer).
Alt-, (M-,)
Sale de la ventana que muestra el buffer *xref*, y luego salta a la ubicación anterior de la pila Xref (xref-quit-and-pop-marker-stack).
q (q)
Sale de la ventana que muestra el buffer *xref* (xref-quit).

Además, los comandos de navegación habituales, como las teclas de flecha, Ctrl-n (C-n) y Ctrl-p (C-p) están disponibles para moverse por el buffer sin mostrar las referencias.

Buscar y reemplazar con identificadores

Los comandos de esta sección realizan varias operaciones de búsqueda y reemplazo en los propios identificadores o en los archivos que hacen referencia a ellos.

Alt-? (M-?)
Busca todas las referencias del identificador en el punto.
Alt-x xref-query-replace-in-results RETURN expreg RETURN reemplazo RETURN
(M-x xref-query-replace-in-results RET expreg RET reemplazo RET)
Reemplaza interactivamente expreg con reemplazo en los nombres de todos los identificadores mostrados en el buffer *xref*.
Alt-x tags-search RETURN expreg RETURN
(M-x tags-search RET expreg RET)
Busca expreg en los archivos de la tabla de etiquetas seleccionada.
Alt-x tags-query-replace RETURN expreg RETURN reemplazo RETURN
(M-x tags-query-replace RET expreg RET reemplazo RET)
Realiza una consulta-reemplazo de expresiones regulares (query-replace-regexp) en cada archivo de la tabla de etiquetas seleccionada.
Alt-x fileloop-continue (M-x fileloop-continue)
Reinicia uno de los 2 últimos comandos anteriores, desde la ubicación actual del punto.

Alt-? (M-?) encuentra todas las referencias para el identificador en el punto, solicitando el identificador según sea necesario, con la finalización. Dependiendo del backend actual (ver Buscar referencias de identificadores), el comando puede preguntar incluso si encuentra un identificador válido en el punto. Cuando se invoca con un argumento de prefijo, siempre pide el identificador. (Si quiere que pregunte siempre, personalice el valor de la variable xref-prompt-for-identifier a t; o póngalo a nil para preguntar sólo si no hay un identificador utilizable en el punto). El comando presenta entonces el buffer *xref* con todas las referencias al identificador, mostrando el nombre del archivo y la línea donde se hace referencia al identificador. Los comandos del modo XREF están disponibles en este búfer, véase Comandos disponibles en el búfer *xref*.

Si el valor de la variable xref-auto-jump-to-first-xref es t, xref-find-references salta automáticamente al primer resultado y selecciona la ventana donde se muestra. Si el valor es show, se muestra el primer resultado, pero se deja seleccionada la ventana que muestra el buffer *xref*. Si el valor es move, el primer resultado se selecciona en el buffer *xref*, pero no se muestra. El valor por defecto es nil, que sólo muestra los resultados en el buffer *xref*, pero no selecciona ninguno de ellos.

Alt-x xref-query-replace-in-results (M-x xref-query-replace-in-results) lee una regexp para que coincida con los nombres de los identificadores y una cadena de reemplazo, igual que la Alt-x query-replace-regexp (M-x query-replace-regexp) ordinaria. A continuación, realiza el reemplazo especificado en los nombres de los identificadores que coinciden en todos los lugares de todos los archivos en los que se hace referencia a estos identificadores. Esto es útil cuando se cambia el nombre de los identificadores como parte de la refactorización. Este comando debe ser invocado en el buffer *xref* generado por Alt-? (M-?)

Alt-x tags-search (M-x tags-search) lee una regexp usando el minibuffer, luego busca coincidencias en todos los archivos de la tabla de etiquetas seleccionada, un archivo a la vez. Muestra el nombre del archivo que se está buscando para que puedas seguir su progreso. En cuanto tags-search encuentra una coincidencia, devuelve el resultado de la búsqueda. Este comando requiere que las tablas de etiquetas estén disponibles (véase Tablas de etiquetas).

Tras encontrar una coincidencia con tags-search, probablemente quiera encontrar todas las demás. Alt-x fileloop-continue (M-x fileloop-continue) reanuda la búsqueda de etiquetas, encontrando una coincidencia más. Esto busca el resto del buffer actual, seguido por los archivos restantes de la tabla de etiquetas.

Alt-x tags-query-replace (M-x tags-query-replace) realiza una única query-replace-regexp a través de todos los archivos de la tabla de etiquetas. Lee una regexp para buscar y una cadena con la que reemplazar, igual que el Alt-x query-replace-regexp (M-x query-replace-regexp) ordinario. Busca como Alt-x tags-search (M-x tags-search), pero repetidamente, procesando las coincidencias de acuerdo a su entrada. Ver Query Replace, para más información sobre query replace.

Puede controlar la sensibilidad a las mayúsculas y minúsculas de los comandos de búsqueda de etiquetas personalizando el valor de la variable tags-case-fold-search. El valor por defecto es el mismo que el de case-fold-search (ver Lax Matching During Searching).

Es posible recorrer todos los archivos de la tabla de etiquetas con una sola invocación de Alt-x tags-query-replace (M-x tags-query-replace). Pero a menudo es útil salir temporalmente, lo que se puede hacer con cualquier evento de entrada que no tenga un significado especial de query replace. Puede reanudar el reemplazo de la consulta posteriormente escribiendo Alt-x fileloop-continue (M-x fileloop-continue); este comando reanuda el último comando de búsqueda o reemplazo de etiquetas que haya realizado. Por ejemplo, para saltar el resto del archivo actual, puede escribir Alt-> Alt-x fileloop-continue (M-> M-x fileloop-continue) .

Tenga en cuenta que los comandos descritos anteriormente realizan búsquedas mucho más amplias que la familia xref-find-definitions. Los comandos xref-find-definitions sólo buscan definiciones de identificadores que coincidan con su cadena o regexp. Los comandos xref-find-references, tags-search, y tags-query-replace encuentran cada ocurrencia del identificador o regexp, como lo hacen los comandos ordinarios de búsqueda y reemplazo en el buffer actual.

Como alternativa a xref-find-references y tags-search, puedes ejecutar grep como un subproceso y hacer que Emacs te muestre las líneas coincidentes una por una. Ver Buscar con Grep en Emacs.

Consultas sobre identificadores

Ctrl-Alt-i (C-M-i)
Alt-TAB (M-TAB)
Realiza la finalización del texto alrededor del punto, posiblemente utilizando la tabla de etiquetas seleccionada si se carga una (completion-at-point).
Alt-x list-tags RETURN archivo RETURN (M-x list-tags RET archivo RET)
Mostrar una lista de los identificadores definidos en el archivo del programa.
Ctrl-Alt-. expreg (C-M-. expreg RET)
Muestra una lista de todos los identificadores que coinciden con regexp (xref-find-apropos). Véase Búsqueda de identificadores.
Alt-x tags-next-file (M-x tags-next-file)
Visitar los archivos registrados en la tabla de etiquetas seleccionadas.

En la mayoría de los modos del lenguaje de programación, puede escribir Ctrl-Alt-i (C-M-i) o Alt-TAB (M-TAB, completion-at-point) para completar el símbolo en el punto. Algunos modos proporcionan una finalización especializada para este comando adaptada al modo; para aquellos que no lo hacen, si hay una tabla de etiquetas cargada, este comando puede utilizarla para generar candidatos a la finalización. Véase Completar los nombres de los símbolos.

Alt-x list-tags (M-x list-tags) lee el nombre de uno de los archivos cubiertos por la tabla de etiquetas seleccionada, y muestra una lista de etiquetas definidas en ese archivo. No incluya un directorio como parte del nombre del archivo, a menos que el nombre del archivo registrado en la tabla de etiquetas incluya un directorio. Este comando sólo funciona con el backend etags, y requiere que haya una tabla de etiquetas para el proyecto. Véase Tablas de etiquetas. Si se utiliza de forma interactiva, la etiqueta por defecto es el nombre de archivo de la memoria intermedia actual.

Alt-x tags-next-file (M-x tags-next-file) visita los archivos cubiertos por la tabla de etiquetas seleccionada. La primera vez que se llama, visita el primer archivo cubierto por la tabla. Cada vez que se llama, visita el siguiente archivo cubierto, a menos que se proporcione un argumento de prefijo, en cuyo caso vuelve al primer archivo. Este comando requiere que se seleccione una tabla de etiquetas.

Tablas de etiquetas

Una tabla de etiquetas registra las etiquetas (15) extraídas al escanear el código fuente de un determinado programa o un determinado documento. Las etiquetas extraídas de archivos generados hacen referencia a los archivos originales, en lugar de a los archivos generados que fueron escaneados durante la extracción de etiquetas. Ejemplos de archivos generados son los archivos C generados a partir de archivos fuente Cweb, de un analizador Yacc o de definiciones de escáner Lex; archivos C preprocesados .i y archivos Fortran producidos mediante el preprocesamiento de archivos fuente .fpp.

Nota

(15) Una etiqueta es un sinónimo de identificador de referencia. Los comandos y funciones basados en el paquete etags utilizan tradicionalmente "etiqueta" con este significado, y esta subsección sigue esa tradición.

Para producir una tabla de etiquetas, se ejecuta el comando de shell etags en un documento o en el archivo de código fuente. El programa ‘etags’ escribe las etiquetas en un archivo de tabla de etiquetas, o archivo de etiquetas en definitiva. El nombre convencional de un archivo de etiquetas es TAGS. Véase Creación de tablas de etiquetas. (También es posible crear una tabla de tags usando uno de los comandos de otros paquetes que pueden producir tales tablas en el mismo formato).

Emacs utiliza las tablas de tags a través del paquete etags como uno de los backends soportados por xref. Debido a que las tablas de etiquetas son producidas por el comando etags que es parte de una distribución de Emacs, describimos las tablas de etiquetas en más detalle aquí.

La facilidad Ebrowse es similar a etags pero específicamente adaptada a C++. Vea Ebrowse en el Manual del usuario de Ebrowse. El paquete Semantic proporciona otra forma de generar y 8utilizar etiquetas, aparte de la facilidad etags. Ver Semantic.

Sintaxis de las etiquetas de los archivos fuente

Así es como se define la sintaxis de las etiquetas en los lenguajes más populares:

  • En el código C, cualquier función C o typedef es una etiqueta, así como las definiciones de struct, union y enum. Las definiciones de macros #define. #undef y las constantes enum también son etiquetas, a menos que se especifique ‘--no-defines’ al hacer la tabla de etiquetas. Del mismo modo, las variables globales son etiquetas, a menos que especifique ‘--no-globals’, y también lo son los miembros de struct, a menos que especifique ‘--no-members’. El uso de ‘--no-globals’, ‘--no-defines’ y ‘--no-members’ puede hacer que el archivo de la tabla de etiquetas sea mucho más pequeño.

    Puede etiquetar declaraciones de funciones y variables externas además de definiciones de funciones dando la opción ‘--declarations’ a etags.

  • En el código C++, además de todas las construcciones de etiquetas del código C, también se reconocen las funciones miembro; también se reconocen las variables miembro, a menos que utilice la opción ‘--no-members’. las definiciones de operadores tienen nombres de etiquetas como ‘operator+’. Si se especifica la opción ‘--class-qualify’, las etiquetas de las variables y funciones de las clases se denominan ‘class::variable’ y ‘class::function’. Por defecto, los métodos y miembros de las clases no están calificados por la clase, lo que permite identificar sus nombres en las fuentes con mayor precisión.

  • En el código Java, las etiquetas incluyen todas las construcciones reconocidas en C++, además de las construcciones interface, extends e implements. Las etiquetas para las variables y funciones de las clases se denominan ‘class.variable’ y 'class.function'.

  • En los documentos LaTeX, los argumentos para \chapter, \section, \subsection, \subsubsection, \eqno, \label, \ref, \cite, \bibitem, \part, \appendix, \entry, \index, \def, \newcommand, \renewcommand, \newenvironment y \renewenvironment son etiquetas.

    Otros comandos pueden hacer etiquetas también, si los especifica en la variable de entorno TEXTAGS antes de invocar etags. El valor de esta variable de entorno debe ser una lista de nombres de comandos separada por dos puntos. Por ejemplo,
    TEXTAGS="micomando:miotrocomando"
    export TEXTAGS
    	
    especifica (utilizando la sintaxis del shell Bourne) que los comandos ‘\micomando’ y ‘\miotrocomando’ también definen etiquetas.

  • En el código Lisp, cualquier función definida con defun, cualquier variable definida con defvar o defconst, y en general el primer argumento de cualquier expresión que comience con ‘(def’ en la columna cero es una etiqueta. Como excepción, las expresiones de la forma (defvar foo) se tratan como declaraciones, y sólo se etiquetan si se da la opción ‘--declarations’.

  • En el código de Scheme, las etiquetas incluyen cualquier cosa definida con def o con una construcción cuyo nombre comienza con ‘def’. También incluyen las variables definidas con set! en el nivel superior del archivo.

También se admiten otros lenguajes:

  • En el código Ada, las funciones, procedimientos, paquetes, tareas y tipos son etiquetas. Utilice la opción ‘--packages-only’ para crear etiquetas sólo para paquetes. En Ada, se puede utilizar el mismo nombre para diferentes tipos de entidades (por ejemplo, para un procedimiento y para una función). Además, para cosas como paquetes, procedimientos y funciones, existe la especificación (es decir, la interfaz) y el cuerpo (es decir, la implementación). Para facilitar la elección de la definición que se desea, los nombres de las etiquetas de Ada tienen sufijos que indican el tipo de entidad:
    /b (‘/b’)
    Cuerpo del paquete.
    /f (‘/f’)
    Función.
    /k (‘/k’)
    Tarea.
    /p (‘/p’)
    Procedimiento.
    /s (‘/s’)
    Paquete de especificaciones.
    /t (‘/t’)
    Tipo.
    Así, Alt-x find-tag RETURN bidule/b RETURN (M-x find-tag RET bidule/b RET) irá directamente al cuerpo del paquete bidule, mientras que Alt-x find-tag RETURN bidule RETURN (M-x find-tag RET bidule RET) sólo buscará cualquier etiqueta bidule.
  • En los archivos de entrada Bison o Yacc, cada regla define como etiqueta el no terminal que construye. Las partes del archivo que contienen código C se analizan como código C.
  • En el código Cobol, las etiquetas son nombres de párrafos; es decir, cualquier palabra que comience en la columna 8 y vaya seguida de un punto.
  • En el código Erlang, las etiquetas son las funciones, registros y macros definidos en el archivo.
  • En el código Fortran, las funciones, subrutinas y datos de bloque son etiquetas.
  • En el código Go, los paquetes, las funciones y los tipos son etiquetas.
  • En los archivos de entrada HTML, las etiquetas son el título y las cabeceras h1, h2, h3. Además, las etiquetas son name= en los anclajes y todas las apariciones de id=.
  • En los archivos de entrada de Lua, todas las funciones son etiquetas.
  • En los archivos makefiles, los objetivos son etiquetas; además, las variables son etiquetas a menos que se especifique ‘--no-globals‘.
  • En el código de Objective C, las etiquetas incluyen definiciones de Objective C para clases, categorías de clases, métodos y protocolos. Las etiquetas para variables y funciones en las clases se denominan ‘class::variable’ y ‘class::function’.
  • En el código Pascal, las etiquetas son las funciones y procedimientos definidos en el archivo.
  • En código Perl, las etiquetas son los paquetes, subrutinas y variables definidas por las palabras clave package, sub, use, constant, my y local. Utilice ‘--globals’ si quiere etiquetar variables globales. Las etiquetas para las subrutinas se denominan ‘package::sub’. El nombre para las subrutinas definidas en el paquete por defecto es ‘main::sub’.
  • En el código PHP, las etiquetas son funciones, clases y defines. Los vars también son etiquetas, a menos que se utilice la opción ‘--no-members’.
  • En código PostScript, las etiquetas son las funciones.
  • En código Prolog, las etiquetas son predicados y reglas al principio de la línea.
  • En código Python, def o class al principio de una línea generan una etiqueta.
  • En código Ruby, def o class o module al principio de una línea generan una etiqueta. Las constantes también generan etiquetas.
  • ¡En el código de Rust, las etiquetas cualquier cosa definida con fn, enum, struct o macro_rules!.

También puede generar etiquetas basadas en coincidencias regexp (véase Etags Regexps) para manejar otros formatos e idiomas.

Creación de tablas de etiquetas

El programa etags se utiliza para crear un archivo de tabla de etiquetas. Conoce la sintaxis de varios lenguajes, como se describe en Sintaxis de etiquetas de archivos fuente. A continuación se explica cómo ejecutar etags:

etags inputfiles…

El programa etags lee los archivos especificados y escribe una tabla de etiquetas llamada TAGS en el directorio de trabajo actual. Puede especificar opcionalmente un nombre de archivo diferente para la tabla de etiquetas utilizando la opción ‘--output=file’; especificando, como nombre de archivo imprime la tabla de etiquetas en la salida estándar. También puede añadir la tabla de etiquetas recién creada a un archivo existente utilizando la opción ‘--append’.

Si los archivos especificados no existen, etags busca versiones comprimidas de los mismos y los descomprime para leerlos. Bajo MS-DOS, etags también busca nombres de archivos como micodigo.cgz si se le da 'micodigo.c' en la línea de comandos y micodigo.c no existe.

Si la tabla de etiquetas queda obsoleta debido a cambios en los archivos descritos en ella, puede actualizarla ejecutando de nuevo el programa etags. Si la tabla de etiquetas no registra una etiqueta, o la registra para el archivo equivocado, entonces Emacs no podrá encontrar esa definición hasta que actualices la tabla de etiquetas. Pero si la posición registrada en la tabla de etiquetas se equivoca un poco (debido a otra edición), Emacs seguirá siendo capaz de encontrar la posición correcta, con un ligero retraso.

Por lo tanto, no hay necesidad de actualizar la tabla de etiquetas después de cada edición. Debe actualizar una tabla de etiquetas cuando defina nuevas etiquetas que quiera tener listadas, o cuando mueva las definiciones de etiquetas de un archivo a otro, o cuando los cambios sean sustanciales.

Puede hacer que una tabla de etiquetas incluya otra tabla de etiquetas, pasando la opción '--include=file' a etags. Entonces cubre todos los archivos cubiertos por el archivo de etiquetas incluido, así como el suyo propio.

Si se especifican los archivos fuente con nombres de archivo relativos cuando se ejecuta etags, el archivo de etiquetas contendrá nombres de archivo relativos al directorio donde se escribió inicialmente el archivo de etiquetas. De este modo, puede mover un árbol de directorios completo que contenga tanto el archivo de etiquetas como los archivos fuente, y el archivo de etiquetas seguirá refiriéndose correctamente a los archivos fuente. Sin embargo, si el archivo de etiquetas es, o está en el directorio /dev, los nombres de los archivos se hacen relativos al directorio de trabajo actual. Esto es útil, por ejemplo, cuando se escriben las etiquetas en la salida estándar.

Cuando se utiliza un nombre de archivo relativo, no debe ser un enlace simbólico que apunte a un archivo de etiquetas en un directorio diferente, porque esto generalmente haría que los nombres de archivo no fueran válidos.

Si especifica nombres de archivo absolutos como argumentos de etags, el archivo de etiquetas contendrá nombres de archivo absolutos. De este modo, el archivo de etiquetas seguirá haciendo referencia a los mismos archivos aunque lo mueva, siempre que los archivos fuente permanezcan en el mismo lugar. Los nombres de archivo absolutos comienzan con ‘/’, o con ‘device:/’ en MS-DOS y MS-Windows.

Cuando quiera hacer una tabla de etiquetas a partir de un gran número de archivos, puede tener problemas para listarlos en la línea de comandos, porque algunos sistemas tienen un límite en su longitud. Puede eludir este límite diciéndole a etags que lea los nombres de los archivos desde su entrada estándar, escribiendo un guión en lugar de los nombres de los archivos, así:

find . -name "*.[chCH]" -print | etags -

etags reconoce el idioma utilizado en un archivo de entrada basándose en su nombre y contenido. En primer lugar, intenta hacer coincidir el nombre y la extensión del archivo con los que se utilizan habitualmente con determinados lenguajes. Algunos lenguajes tienen intérpretes con nombres conocidos (por ejemplo, perl para Perl o pl para Prolog), así que etags busca una especificación de intérprete de la forma ‘#!interp’ en la primera línea de un archivo de entrada, y la compara con los intérpretes conocidos. Si nada de esto funciona, o si quiere anular la detección automática del lenguaje, puede especificar el lenguaje explícitamente con la opción '--language=name'. Puede entremezclar estas opciones con los nombres de los archivos; cada una se aplica a los nombres de los archivos que le siguen. Especifique ‘--language=auto’ para indicar a etags que vuelva a adivinar el idioma a partir de los nombres de los archivos y su contenido. Especifique ‘--language=none’ para desactivar por completo el procesamiento específico del idioma; entonces etags reconoce las etiquetas sólo por coincidencia de expresiones regulares (véase Etags Regexps). Esto es muy útil cuando un fichero de entrada utiliza un lenguaje no soportado por etags, y se quiere evitar que etags recurra a Fortran y C como lenguajes por defecto.

La opción ‘--parse-stdin=archivo’ es principalmente útil cuando se llama a etags desde los programas. Se puede utilizar (sólo una vez) en lugar de un nombre de archivo en la línea de comandos. etags leerá de la entrada estándar y marcará las etiquetas producidas como pertenecientes al archivo.

etags --help’ produce la lista de los idiomas que etags conoce, y las reglas del nombre del archivo para adivinar el idioma. También imprime una lista de todas las opciones disponibles de etags, junto con una breve explicación. Si va seguido de una o más opciones ‘--language=lang’, muestra información detallada sobre cómo se generan las etiquetas para lang.

Expresiones regulares en etiquetas (etags)

La opción ‘--regex’ de etags permite que las etiquetas sean reconocidas por coincidencias de expresiones regulares. Puede intercalar esta opción con los nombres de los archivos; cada una se aplica a los archivos fuente que le siguen. Si especifica varias opciones ‘--regex’, todas ellas se utilizan en paralelo. La sintaxis es:

--regex=[{language}]/tagregexp/[nameregexp/]modifiers

La parte esencial del valor de la opción es tagregexp, la regexp para coincidir con las etiquetas. Se utiliza siempre anclada, es decir, sólo coincide con el principio de una línea. Si quiere permitir etiquetas indentadas, utilice una regexp que coincida con el espacio en blanco inicial; comience con ‘[ \t]*’.

En estas expresiones regulares, ‘\t’ entrecomilla el siguiente carácter, y todas las secuencias de escape de caracteres C son compatibles: ‘\a’ para campana, ‘\b’ para espacio posterior, ‘\e’ para escape, ‘\f’ para salto de página, ‘\n’ para nueva línea, ‘\r’ para retorno de carro, ‘\t' para tabulación, y ‘\v’ para tabulación vertical. Además, ‘\d’ representa el carácter DELETE (DEL).

Idealmente, tagregexp no debería coincidir con más caracteres de los necesarios para reconocer lo que se quiere etiquetar. Si la sintaxis requiere que escriba tagregexp para que coincida con más caracteres además de la propia etiqueta, debería añadir una nameregexp, para escoger sólo la etiqueta. Esto permitirá a Emacs encontrar las etiquetas con mayor precisión y completar los nombres de las etiquetas con mayor fiabilidad. En nameregexp, a menudo es conveniente utilizar "referencias posteriores" (ver Barra invertida en expresiones regulares) a las agrupaciones entre paréntesis ‘\( ... \)’ en tagregexp. Por ejemplo, ‘\1‘ se refiere a la primera agrupación entre paréntesis. Puede encontrar algunos ejemplos de esto a continuación.

Los modificadores son una secuencia de cero o más caracteres que modifican la forma en que hace la coincidencia. Una regexp sin modificadores se aplica secuencialmente a cada línea del archivo de entrada, distinguiendo entre mayúsculas y minúsculas. Los modificadores y sus significados son:

i (‘i’)
Ignora las mayúsculas y minúsculas cuando coincide con esta regexp.
m (‘m’)
Compara esta expresión regular con todo el archivo, de modo que es posible obtener coincidencias de varias líneas.
s (‘s’)
Compara esta expresión regular con todo el archivo, y permite que ‘.’ en tagregexp coincida con nuevas líneas.

La opción ‘-R’ anula todas las expresiones regulares definidas por las opciones ‘--regex’ precedentes. También se aplica a los nombres de archivo que le siguen. He aquí un ejemplo:

etags --regex=/reg1/i voo.doo --regex=/reg2/m \
    bar.ber -R --lang=lisp los.er

Aquí etags elige el lenguaje de análisis para voo.doo y bar.ber según su contenido. también utiliza reg1 para reconocer etiquetas adicionales en voo.doo, y tanto reg1 como reg2 para reconocer etiquetas adicionales en bar.ber. reg1 se comprueba con cada línea de voo. doo y bar.ber, sin distinguir entre mayúsculas y minúsculas, mientras que reg2 se comprueba con todo el archivo bar.ber, permitiendo coincidencias de varias líneas, sin distinguir entre mayúsculas y minúsculas. etags sólo utiliza las reglas de etiquetas de Lisp, sin coincidencias de regexp especificadas por el usuario, para reconocer las etiquetas de los.er.

Puede restringir la opción ‘--regex’ para que coincida sólo con archivos de un idioma determinado utilizando el prefijo opcional {language}. (‘etags --help’ imprime la lista de idiomas reconocidos por etags.) Esto es particularmente útil cuando se almacenan muchas expresiones regulares predefinidas para etags en un archivo. El siguiente ejemplo etiqueta las macros DEFVAR en los archivos fuente de Emacs, sólo para el lenguaje C:

--regex='{c}/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/\1/'

Cuando se tienen expresiones regulares complejas, se puede almacenar la lista de las mismas en un archivo. La siguiente sintaxis de opción indica a etags que lea dos archivos de expresiones regulares. Las expresiones regulares contenidas en el segundo archivo se comparan sin tener en cuenta las mayúsculas y minúsculas.

--regex=@case-sensitive-file --ignore-case-regex=@ignore-case-file

Un archivo regex para etags contiene una expresión regular por línea. Las líneas vacías y las que comienzan con un espacio o un tabulador se ignoran. Cuando el primer carácter de una línea es ‘@’, etags asume que el resto de la línea es el nombre de otro archivo de expresiones regulares; así, un archivo de este tipo puede incluir otro archivo. Todas las demás líneas se consideran expresiones regulares. Si el primer texto sin espacio en blanco de la línea es ‘--’, esa línea es un comentario.

Por ejemplo, podemos crear un archivo llamado ‘emacs.tags’ con el siguiente contenido:

        -- Esto es para archivos fuente C de GNU Emacs
{c}/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/\1/

y luego usarlo así:

etags --regex=@emacs.tags *.[ch] */*.[ch]

Aquí hay algunos ejemplos más. Los regexps están entrecomillados para protegerlos de la interpretación del shell.

  • Etiqueta los archivos de Octave:
    etags --language=none \
          --regex='/[ \t]*function.*=[ \t]*\([^ \t]*\)[ \t]*(/\1/' \
          --regex='/###key \(.*\)/\1/' \
          --regex='/[ \t]*global[ \t].*/' \
          *.m
    	
    Tenga en cuenta que las etiquetas no se generan para los scripts, por lo que tiene que añadir una línea por sí mismo de la forma ‘###key scriptname’ si quiere saltar a él.

  • Etiqueta archivos Tcl:
    etags --language=none --regex='/proc[ \t]+\([^ \t]+\)/\1/' *.tcl
    	
  • Etiqueta archivos VHDL:
    etags --language=none \
      --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ ]* +OF/' \
      --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\
      \( BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'
    	

Selección de una tabla de etiquetas

Emacs tiene en todo momento como máximo una tabla de etiquetas seleccionada. Todos los comandos para trabajar con tablas de etiquetas utilizan la seleccionada en primer lugar. Para seleccionar una tabla de etiquetas, escriba Alt-x visit-tags-table (M-x visit-tags-table), que lee el nombre del archivo de la tabla de etiquetas como argumento, con TAGS por defecto en el primer directorio que contiene un archivo llamado TAGS encontrado al buscar recursivamente hacia arriba desde el directorio por defecto.

Emacs no lee realmente el contenido de la tabla de etiquetas hasta que se intenta utilizarlo; todo lo que hace visit-tags-table es almacenar el nombre del archivo en la variable tags-file-name, y no mucho más. El valor inicial de la variable es nil; ese valor indica a todos los comandos para trabajar con tablas de etiquetas que deben pedir un nombre de archivo de tabla de etiquetas para utilizar.

Además de la tabla de etiquetas seleccionada, Emacs mantiene la lista de varias tablas de etiquetas que se utilizan conjuntamente. Por ejemplo, si está trabajando en un programa que utiliza una biblioteca, puede que quiera tener disponibles las tablas de etiquetas tanto del programa como de la biblioteca, para que Emacs pueda encontrar fácilmente los identificadores de ambos. Si la tabla de etiquetas seleccionada no tiene el identificador o no menciona el archivo fuente que un comando de etiquetas necesita, el comando intentará usar todas las demás tablas de etiquetas en la lista actual de tablas de etiquetas.

El uso de visit-tags-table para cargar una nueva tabla de etiquetas cuando otra tabla de etiquetas ya está cargada le da una opción: puede añadir la nueva tabla de etiquetas a la lista actual de tablas de etiquetas, o descartar la lista actual y comenzar una nueva lista. Si inicia una nueva lista, se utilizará la nueva tabla de etiquetas en lugar de otras. Si añade la nueva tabla a la lista actual, ésta se utiliza al igual que las demás.

Puede especificar una lista precisa de tablas de etiquetas estableciendo la variable tags-table-list a una lista de nombres de directorios, como esto

(setq tags-table-list
      '("~/.emacs.d" "/usr/local/lib/emacs/src"))

Esto le dice a los comandos de etiquetas que busquen en los archivos TAGS en tu directorio ~/.config/emacs y en el directorio /usr/local/lib/emacs/src. El orden depende del archivo en el que te encuentres y de la tabla de etiquetas que mencione ese archivo.

No ponga tanto tags-file-name como tags-table-list.

Entorno de Desarrollo Emacs

EDE (Emacs Development Environment, Entorno de Desarrollo de Emacs ) es un paquete que simplifica la tarea de crear, construir y depurar grandes programas con <tt>Emacs. Proporciona algunas de las características de un IDE, o Entorno de Desarrollo Integrado, en Emacs.

Esta sección proporciona una breve descripción del uso de EDE. Para detalles completos, ver EDE en Emacs Development Environment.

EDE está implementado como un modo menor global (ver Modos menores). Para activarlo, escriba Alt-x global-ede-mode (M-x global-ede-mode) o haga clic en el elemento ‘Project Support (EDE)’ (‘Soporte de proyectos’) del menú ‘Tools’ (‘Herramientas’). También puede habilitar EDE cada vez que inicie Emacs, añadiendo la siguiente línea a su archivo de inicialización:

(global-ede-mode t)

La activación de EDE añade un menú llamado ‘Development’ (‘Desarrollo’) a la barra de menús. Desde este menú se pueden invocar muchos comandos de EDE, incluidos los que se describen a continuación.

EDE organiza los archivos en proyectos, que corresponden a árboles de directorios. La raíz del proyecto es el directorio superior de un proyecto. Para definir un nuevo proyecto, visite un archivo en la raíz del proyecto deseado y escriba Alt-x ede-new (M-x ede-new). Este comando pide un tipo de proyecto, que se refiere al método subyacente que EDE utilizará para gestionar el proyecto (ver EDE en el Entorno de Desarrollo Emacs). Los tipos de proyecto más comunes son ‘Make’, que utiliza Makefiles, y ‘Automake’, que utiliza GNU Automake (ver Automake en Automake). En ambos casos, EDE también crea un archivo llamado Project.ede, que almacena información sobre el proyecto.

Un proyecto puede contener uno o más objetivos. Un objetivo puede ser un archivo de objetos, un programa ejecutable, o algún otro tipo de archivo, que se construye a partir de uno o más de los archivos en el proyecto.

Para añadir un nuevo objetivo a un proyecto, escriba Ctrl-c . t (C-c . t, M-x ede-new-target). Este comando también le pregunta si desea añadir el archivo actual a ese objetivo, lo que significa que el objetivo se construirá a partir de ese archivo. Después de definir un objetivo, puede añadir más archivos a él escribiendo Ctrl-c .a (C-c . a, ede-add-file).

Para construir un objetivo, escriba Ctrl-c .c (C-c . c, ede-compile-target). Para construir todos los objetivos del proyecto, escriba Ctrl-c . C (C-c . C, ede-compile-project). EDE utiliza los tipos de archivo para adivinar cómo debe construirse el objetivo.

Fusión de archivos con Emerge

No es raro que los programadores se crucen y modifiquen el mismo programa en dos direcciones diferentes. Para recuperarse de esta confusión, es necesario fusionar las dos versiones. Emerge hace esto más fácil. Para otras formas de comparar archivos, vea Comparación de Archivos, y Ediff en El Manual de Ediff.

Visión general de Emerge

Para iniciar Emerge, ejecute uno de estos cuatro comandos:

Alt-x emerge-file (M-x emerge-files)
Combinar dos archivos especificados.
Alt-x emerge-files-with-ancestor (M-x emerge-files-with-ancestor)
Combina dos archivos especificados, con referencia a un ancestro común.
Alt-x emerge-buffers (M-x emerge-buffers)
Combina dos buffers.
Alt-x emerge-buffers-with-ancestor (M-x emerge-buffers-with-ancestor)
Combina dos buffers con referencia a un ancestro común en un tercer buffer.

Los comandos de Emerge comparan dos archivos o búferes, y muestran la comparación en tres búferes: uno para cada texto de entrada (el búfer A y el búfer B), y uno (el búfer de fusión o merge buffer) donde se realiza la fusión. El búfer de fusión muestra todo el texto fusionado, no sólo las diferencias. Siempre que los dos textos de entrada difieran, puede elegir cuál de ellos incluir en la memoria intermedia de fusión.

Los comandos de Emerge que toman la entrada de las memorias intermedias existentes utilizan sólo las partes accesibles de esas memorias intermedias, si están reducidas. Véase Reducción.

Si se dispone de una versión antecesora común, de la que se derivaron los dos textos que se van a fusionar, Emerge puede utilizarla para adivinar qué alternativa es la correcta. Cuando una de las versiones actuales coincide con el ancestro, Emerge presume que la otra versión actual es un cambio deliberado que debe mantenerse en la versión fusionada. Utilice los comandos ‘with-ancestor’ si desea especificar un texto antecesor común. Estos comandos leen tres nombres de archivo o de búfer: la variante A, la variante B y el ancestro común.

Una vez realizada la comparación y preparadas las memorias intermedias, se inicia la fusión interactiva. Usted controla la fusión escribiendo comandos especiales de fusión en la memoria intermedia de fusión (véase Comandos de fusión). Para cada serie de diferencias entre los textos de entrada, puede elegir cuál de ellos conservar, o editar ambos juntos.

El búfer de fusión utiliza un modo principal especial, el modo Emerge, con comandos para hacer estas elecciones. Pero también puedes editar el buffer con comandos ordinarios de Emacs.

En cualquier momento, la atención de Emerge se centra en una diferencia particular, llamada diferencia seleccionada. Esta diferencia está marcada en los tres buffers de esta forma:

vvvvvvvvvvvvvvvvv
texto que difiere
^^^^^^^^^^^^^^^^^

Emerge numera todas las diferencias secuencialmente y la línea de modo siempre muestra el número de la diferencia seleccionada.

Normalmente, la memoria intermedia de fusión comienza con la versión A del texto. Pero cuando la versión A de una diferencia coincide con el ancestro común, se prefiere inicialmente la versión B para esa diferencia.

Emerge deja el texto fusionado en la memoria intermedia de fusión cuando usted sale. En ese momento, puede guardarlo en un archivo con Ctrl-c Ctrl-w (C-x C-w). Si da un argumento numérico a emerge-files o emerge-files-with-ancestor, lee el nombre del archivo de salida usando el minibuffer. (Este es el último nombre de archivo que leen esos comandos.) Luego, al salir de Emerge se guarda el texto fusionado en el archivo de salida.

Normalmente, los comandos de Emerge guardan el buffer de salida en su archivo cuando usted sale. Si aborta Emerge con Ctrl-] (C-]), el comando Emerge no guarda el buffer de salida, pero puede 8guardarlo usted mismo si lo desea.

Submodos de Emerge

Puede elegir entre dos modos para dar órdenes de fusión: El modo rápido y el modo de edición. En el modo Rápido, los comandos de fusión básicos son de un solo carácter, pero los comandos ordinarios de Emacs están desactivados. Esto es conveniente si sólo utilizas comandos de fusión. En el modo de edición, todos los comandos de fusión comienzan con la tecla de prefijo Ctrl-c Ctrl-c (C-c C-c), y los comandos normales de Emacs también están disponibles. Esto permite editar el buffer de fusión, pero ralentiza las operaciones de Emerge.

Utilice e para cambiar al modo Edición, y Ctrl-c Ctrl-f (C-c C-c f) para cambiar al modo Rápido. La línea de modo indica los modos Edit y Fast con ‘E’ y ‘F’.

Emerge tiene dos submodos adicionales que afectan al funcionamiento de determinados comandos de fusión: El modo de avance automático y el modo de omisión de prefijos.

Si el modo de Avance Automático está en efecto, los comandos a y b avanzan a la siguiente diferencia. Esto le permite avanzar más rápido en la fusión siempre y cuando se limite a elegir una de las alternativas de la entrada. La línea de modo indica el modo de avance automático con ‘A’.

Si el modo Saltar Prefiere está en efecto, los comandos n y p saltan las diferencias en los estados "prefer-A" y "prefer-B" ("prefiero-A" y "prefiero-B"), (ver Estado de una diferencia). Por lo tanto, sólo se ven las diferencias para las que ninguna de las dos versiones se presume correcta. La línea de modo indica el modo Omitir prefiere con ‘S’. Este modo sólo es relevante cuando hay un antecesor.

Utilice el comando s a (emerge-auto-advance) para establecer o borrar el modo de avance automático. Utilice ss (s s, emerge-skip-prefers) para activar o desactivar el modo Skip Prefers. Estos comandos activan el modo con un argumento positivo, lo desactivan con un argumento negativo o cero, y conmutan el modo sin argumento.

Estado de una diferencia

En la memoria intermedia de fusión, una diferencia se marca con líneas de caracteres ‘v’ y ‘^’. Cada diferencia tiene uno de estos siete estados:

A
La diferencia muestra la versión A. El comando a (a) siempre produce este estado; la línea de modo lo indica con ‘A’.
B
La diferencia muestra la versión B. El comando b (b) siempre produce este estado; la línea de modo lo indica con ‘B
default-A
default-B
La diferencia muestra el estado A o el B por defecto, porque no ha hecho una elección. Todas las diferencias comienzan en el estado A por defecto (y, por tanto, la memoria intermedia de fusión es una copia de la memoria intermedia A), excepto aquellas para las que se prefiere una alternativa (véase más adelante).
Cuando se selecciona una diferencia, su estado cambia de por defecto-A o por defecto-B a simplemente A o B. Así, la diferencia seleccionada nunca tiene el estado por defecto-A o por defecto-B, y estos estados nunca se muestran en la línea de modo.
El comando da (d a) elige el estado por defecto-A, y db (d b) elige el estado por defecto-B. Esta elección por defecto se aplica a todas las diferencias que nunca ha seleccionado y para las que no se prefiere ninguna alternativa. Si se mueve por la fusión secuencialmente, las diferencias que no ha seleccionado son las que siguen a la seleccionada. Así, mientras se mueve secuencialmente, puede hacer que la versión A sea la predeterminada para algunas secciones del buffer de fusión y la versión B la predeterminada para otras, utilizando da (d a) y dd (d b) entre secciones.
prefer-A
prefer-B
La diferencia es mostrar el estado A o B porque es preferible. Esto significa que no se ha hecho una elección explícita, pero una alternativa parece ser la correcta porque la otra alternativa está de acuerdo con el ancestro común. Así, cuando la memoria intermedia A concuerda con el ancestro común, se prefiere la versión B, porque lo más probable es que sea la que realmente se modificó.
Estos dos estados se muestran en la línea de modo como ‘A*’ y ‘B*’.
combined
La diferencia está mostrando una combinación de los estados A y B, como resultado de los comandos xc (x c) o xC (x C).
Una vez que la diferencia está en este estado, los comandos a (a) y b (b) no hacen nada con ella a menos que le de un argumento numérico.
La línea de modo muestra este estado como ‘comb’.

Comandos de fusión

Estos son los comandos de fusión para el modo rápido; en el modo de edición, precedidos por C-c C-c:

p (p)
Selecciona la diferencia anterior.
n (n)
Selecciona la siguiente diferencia.
s (s)
Seleccione la versión A de esta diferencia.
b (b)
Elija la versión B de esta diferencia.
Ctrl-u nj (C-u n j)
Seleccione el número de diferencia n.
. (.)
Seleccione el punto que contiene la diferencia.
q (q)
Salir-acabar la fusión.
Ctrl-] (C-])
Abortar-salir de la fusión y no guardar el resultado.
f (f)
Pasa al modo rápido. (En el modo de edición, esto es en realidad Ctrl-c Ctrl-f (C-c C-c f))
e (e)
Pase al modo de edición.
l (l)
Recentra (como Ctrl-l (C-l)) las tres ventanas. Con un argumento, restablece la visualización por defecto de las tres ventanas.
- (-)
Especificar parte de un argumento numérico prefijado.
digit
Especifica también parte de un argumento numérico prefijado.
da (d a)
Elige la versión A por defecto de aquí para abajo en el buffer de fusión.
db (d b)
Elija la versión B por defecto de aquí hacia abajo en la memoria intermedia de fusión.
ca (c a)
Copia la versión A de esta diferencia en el anillo de eliminación.
cb (c b)
Copie la versión B de esta diferencia en el anillo de eliminación.
ia (i a)
Inserta la versión A de esta diferencia en el punto.
ib (i b)
Inserta la versión B de esta diferencia en el punto.
m (m)
Pone punto y marca alrededor de la diferencia.
^ (^)
Desplaza las tres ventanas hacia abajo (como Alt-v (M-v)).
v (v)
Desplaza las tres ventanas hacia arriba (como Ctrl-v (C-v)).
< (<)
Desplazar las tres ventanas hacia la izquierda (como Ctrl-x < (C-x <)).
> (>)
Desplazar las tres ventanas hacia la derecha (como Ctrl-x > (C-x >)).
| (|)
Restablece el desplazamiento horizontal en las tres ventanas.
x1 (x 1)
Reduce la ventana de fusión a una línea. (Utilice Ctrl-u l (C-u l) para restaurar su tamaño completo).
xc (x c)
Combina las dos versiones de esta diferencia (vea Combinar las dos versiones).
xf (x f)
Muestra los nombres de los archivos/buffers en los que está operando Emerge, en una ventana de ayuda. (Utilice Ctrl-u l (C-u l) para restaurar las ventanas).
xj (x j)
Une esta diferencia con la siguiente. (Ctrl-u xj (C-u x j) une esta diferencia con la anterior).
xs (x s)
Divide esta diferencia en dos diferencias. Antes de utilizar este comando, sitúe el punto en cada uno de los tres buffers en el lugar donde quiere dividir la diferencia.
xt (x t)
Recorte las líneas idénticas de la parte superior e inferior de la diferencia. Estas líneas se producen cuando las versiones A y B son idénticas pero difieren de la versión anterior.

Salir de Emerge

El comando q (q, emerge-quit) finaliza la fusión, almacenando los resultados en el archivo de salida si se ha especificado uno. Restaura los búferes A y B a su contenido apropiado, o los mata si fueron creados por Emerge y Usted no los ha cambiado. También desactiva los comandos de Emerge en el búfer de fusión, ya que su ejecución posterior podría dañar el contenido de los distintos búferes.

Ctrl-] (C-]) aborta la fusión. Esto significa salir sin escribir el archivo de salida. Si no ha especificado un archivo de salida, no hay ninguna diferencia real entre abortar y terminar la fusión.

Si el comando Emerge fue llamado desde otro programa Lisp, entonces su valor de retorno es t para la finalización exitosa, o nil si se aborta.

Combinar las dos versiones

A veces se quiere mantener las dos alternativas para una diferencia concreta. Para ello, utilice xc (x c), que edita el búfer de fusión de esta manera:

#ifdef NEW
version from B buffer
#else /* not NEW */
version from A buffer
#endif /* not NEW */

Aunque este ejemplo muestra los condicionales del preprocesador C delimitando las dos versiones alternativas, puede especificar las cadenas a utilizar estableciendo la variable emerge-combine-versions-template a una cadena de su elección. En la cadena, ‘%a‘ dice dónde poner la versión A, y ‘%b’ dice dónde poner la versión B. La configuración por defecto, que produce los resultados mostrados arriba, tiene este aspecto:

"#ifdef NEW\n%b#else /* not NEW */\n%a#endif /* not NEW */\n"

Puntos finos de la fusión

Durante la fusión, no debe intentar editar los búferes A y B Usted mismo. Emerge los modifica temporalmente, pero al final los devuelve como estaban.

Puede tener cualquier número de fusiones a la vez, pero no utilice ningún búfer como entrada para más de una fusión a la vez, ya que los cambios temporales realizados en estos búferes se interpondrían entre sí.

Iniciar Emerge puede llevar mucho tiempo porque necesita comparar los archivos completamente. Emacs no puede hacer nada más hasta que diff termine. Quizás en el futuro alguien cambie Emerge para que haga la comparación en segundo plano cuando los archivos de entrada sean grandes, entonces podría seguir haciendo otras cosas con Emacs hasta que Emerge esté listo para aceptar comandos.

Después de configurar la fusión, Emerge ejecuta el hook emerge-startup-hook. Ver Hooks.

Referencia de errores

La mayoría de los proyectos con un cierto número de usuarios hacen un seguimiento de los informes de errores en algún software de seguimiento de problemas que asigna a cada informe un número o identificador único y corto. Éstos se utilizan para hacer referencia a un fallo determinado, por ejemplo, en un comentario del código fuente sobre el código que corrige algún fallo, en archivos de documentación o en discusiones en alguna lista de correo o canal de IRC.

Los modos menores bug-reference-mode y bug-reference-prog-mode resaltan estas referencias a los fallos y hacen posible seguirlas hasta el correspondiente informe de fallo en el gestor de incidencias del proyecto. bug-reference-prog-mode es una variante de bug-reference-mode que resalta las referencias a los fallos sólo dentro de los comentarios y cadenas del código fuente.

Para su funcionamiento, el modo de referencia de fallos necesita conocer la sintaxis de las referencias de fallos (bug-reference-bug-regexp), y la URL del rastreador donde se pueden buscar los informes de fallos (bug-reference-url-format). Dado que estos son típicamente diferentes de un proyecto a otro, tiene sentido especificarlos en ver Variables locales por directorio o ver Variables locales en archivos.

Por ejemplo, supongamos que en nuestro proyecto solemos escribir las referencias a los informes de fallos como bug#1234, o Bug-1234 y que la página de este fallo en el rastreador de problemas es https://project.org/issues/1234, entonces esta sección de variables locales serviría.

;; Variables Locales:
;; bug-reference-bug-regexp: "\\([Bb]ug[#-]\\([0-9]+\\)\\)"
;; bug-reference-url-format: "https://project.org/issues/%s"
;; End:

La cadena capturada por el primer grupo regexp define los límites de la superposición que crea bug-reference, es decir, la parte que se resalta y sobre la que se puede hacer clic.

La cadena capturada por el segundo grupo regexp en bug-reference-bug-regexp se utiliza para reemplazar la plantilla %s en bug-reference-url-format.

Tenga en cuenta que bug-reference-url-format también puede ser una función con el fin de atender a escenarios más complejos, por ejemplo, cuando las diferentes partes de la referencia del fallo tienen que ser utilizadas para distinguir entre cuestiones y solicitudes de fusión que resultan en diferentes URLs.

Configuración automática

Si el modo bug-reference está activado, el gancho bug-reference-mode se ha ejecutado y todavía bug-reference-bug-regexp y bug-reference-url-format no están establecidos, se intentará establecer los valores adecuados para estas dos variables por sí mismo llamando a las funciones en bug-reference-auto-setup-functions una tras otra hasta que se puedan establecer las variables.

Ahora mismo, hay tres tipos de funciones de configuración.

  1. La configuración para archivos de versión controlada se puede configurar mediante las variables bug-reference-forge-alist, y bug-reference-setup-from-vc-alist. Los valores por defecto son capaces de configurar proyectos GNU donde se usa https://debbugs.gnu.org como rastreador de problemas y los problemas se referencian normalmente como bug#13 (pero también se consideran muchas notaciones diferentes), y varios tipos de forjas de software modernas como GitLab, Gitea, SourceHut, o GitHub. Si despliega una instancia auto-alojada de tal forja, la forma más fácil de decirle a bug-reference sobre ella es a través de bug-reference-forge-alist.

  2. La configuración para el correo electrónico se adivina a partir de los nombres de las carpetas/buzones de correo, y los valores de las cabeceras de correo se pueden configurar mediante la variable bug-reference-setup-from-mail-alist. El lector de noticias y de correo integrado Email and Usenet News with Gnus y Reading Mail with Rmail son compatibles.

  3. Configuración de canales IRC configurable por la variable bug-reference-setup-from-irc-alist. Los clientes de IRC incorporados Rcirc, Ver Rcirc en El Manual de Rcirc, y ERC, Ver ERC en El Manual de ERC, están soportados.

Para casi todos esos modos, es suficiente con activar el modo de referencia de fallos (bug-reference-mode), sólo Rmail requiere una configuración ligeramente diferente.

;; Utilizar la configuración basada en VC si el archivo está bajo control de versiones..
(add-hook 'prog-mode-hook #'bug-reference-prog-mode)

;; Gnus (resúmen y bufferes de artículos)
(add-hook 'gnus-mode-hook #'bug-reference-mode)

;; Rmail
(add-hook 'rmail-show-message-hook #'bug-reference-mode-force-auto-setup)

;; Rcirc
(add-hook 'rcirc-mode-hook #'bug-reference-mode)

;; ERC
(add-hook 'erc-mode-hook #'bug-reference-mode)

En el caso de Rmail, en lugar del gancho de modo, hay que utilizar el gancho rmail-show-message-hook en combinación con la función bug-reference-mode-force-auto-setup que activa el modo bug-reference-mode y fuerza la configuración automática. La razón es que con Rmail todos los mensajes residen en el mismo búfer pero la configuración debe realizarse cada vez que se muestre otro mensaje.

Añadir soporte para paquetes de terceros

Añadir soporte para la autoconfiguración de bug-reference suele ser bastante sencillo: escriba una función de configuración de cero argumentos que recoja la información necesaria (por ejemplo, los valores de la cabecera de correo List-Id/To/From/Cc en el caso de un MUA), y luego llame a una de las siguientes funciones de ayuda:

  • bug-reference-maybe-setup-from-vc que realiza la configuración según bug-reference-setup-from-vc-alist,

  • bug-reference-maybe-setup-from-mail que hace la configuración según bug-reference-setup-from-mail-alist,

  • y bug-reference-maybe-setup-from-irc que hace la configuración según bug-reference-setup-from-irc-alist.

Una función de configuración debe devolver un valor no nulo si puede configurar el modo de referencia de fallos, lo que ocurre si lo último que hace la función es llamar a una de las funciones de ayuda anteriores.

Finalmente, la función de configuración debe añadirse a bug-reference-auto-setup-functions.

Tenga en cuenta que estas funciones de configuración automática deberían comprobar como primer paso si son aplicables, por ejemplo, comprobando el valor de major-mode.

Integración con el paquete debbugs

Si las incidencias de su proyecto se rastrean en el servidor https://debbugs.gnu.org, puede examinar y responder a los informes directamente en Emacs utilizando el paquete debbugs, que puede descargarse a través del menú de paquetes (véase Paquetes de Emacs Lisp). Este paquete añade el modo menor debbugs-browse-mode, que puede activarse sobre bug-reference-mode y bug-reference-prog-mode como sigue:

add-hook 'bug-reference-mode-hook 'debbugs-browse-mode)
add-hook 'bug-reference-prog-mode-hook 'debbugs-browse-mode)


Abreviaturas

Una abreviatura definida es una palabra que se expande, si se inserta, en un texto diferente. Los abreviaturas son definidas por el usuario para que se expandan de forma específica. Por ejemplo, puede definir ‘foo’ como una abreviatura que se expande a ‘find outer otter’. Entonces podría insertar ‘find outer otter’ en el buffer escribiendo fooSPCACE (f o o SPC).

Un segundo tipo de facilidad de abreviación se llama expansión dinámica de abreviaturas. Se utiliza la expansión dinámica de abreviaturas con un comando explícito para expandir las letras en el búfer antes del punto buscando otras palabras en el búfer que empiecen con esas letras. Véase Expansión abreviada dinámica.

Un tercer tipo, la expansión hippie, generaliza la expansión de abreviaturas. Véase Expansión hippie en Características para la escritura automática.

Conceptos de abreviatura

Una abreviatura es una palabra que ha sido definida para expandirse en una expansión específica. Cuando se inserta un carácter separador de palabras después de la abreviatura, ésta se expande, sustituyendo la abreviatura por su expansión. Por ejemplo, si ‘foo’ se define como una abreviatura que se expande a ’find outer otter’, al escribir foo (f o o) . se insertará ‘find outer otter’.

Las abreviaturas sólo se expanden cuando está activado el modo Abbrev, un modo menor en el búfer. Desactivar el modo Abbrev no hace que se olviden las definiciones de abbrev, pero no se expanden hasta que se vuelve a activar dicho modo. El comando Alt-x abbrev-mode (M-x abbrev-mode) activa el modo Abbrev; con un argumento numérico, activa el modo Abbrev si el argumento es positivo, y lo desactiva en caso contrario. Véase Modos menores.

Los Abbrev pueden tener definiciones específicas de modo, activas sólo en un modo mayor. Las abreviaturas también pueden tener definiciones globales que se activan en todos los modos principales. La misma abreviatura puede tener una definición global y varias definiciones específicas de modo para diferentes modos principales. Una definición específica para el modo principal actual anula la definición global.

Puede definir abreviaturas de forma interactiva durante la sesión de edición, independientemente de si el modo abreviado está activado. También puede guardar listas de definiciones de abreviaturas en archivos, que puede volver a cargar para utilizarlas en sesiones posteriores.

Definición de las abreviaturas

Ctrl-x ag (C-x a g)
Define una abreviatura, usando una o más palabras antes del punto como su expansión (add-global-abbrev).
Ctrl-x al (C-x a l)
Similar, pero definiendo una abreviatura específica para el modo principal actual (add-mode-abbrev).
Ctrl-x aig (C-x a i g)
Define una palabra del buffer como abreviatura (inverse-add-global-abbrev).
Ctrl-x ail (C-x a i l)
Define una palabra en la memoria intermedia como una abreviatura específica del modo (inversa-add-mode-abbrev).
Alt-x define-global-abbrev RETURN abbrev RETURN exp RETURN
(M-x define-global-abbrev RET abbrev RET exp RET)
Define abbrev como una abreviatura que se expande en exp.
Alt-x define-mode-abbrev RETURN abbrev RETURN exp RETURN
(M-x define-mode-abbrev RET abbrev RET exp RET)
Define abbrev como un modo específico de abreviación que se expande en exp.
Alt-x kill-all-abbrevs (M-x kill-all-abbrevs)
Descarta todas las definiciones de abreviatura, dejando una pizarra en blanco.

La forma habitual de definir una abreviatura es introducir el texto que desea que se expanda, colocar el punto después de él y escribir Ctrl-x ag (C-x a g, add-global-abbrev). Esto lee la propia abreviatura utilizando el minibuffer, y luego la define como una abreviatura para una o más palabras antes de punto. Utiliza un argumento numérico para decir cuántas palabras antes del punto deben tomarse como expansión. Por ejemplo, para definir la abreviatura ‘foo’ como se mencionó anteriormente, inserte el texto 'encontrar la nutria exteriorfind outer otter' y luego escriba Ctrl-u 3 Ctrl-x agfoo RETURN (C-u 3 C-x a g f o o RET

Un argumento de cero para Ctrl-x ag (C-x a g) significa utilizar el contenido de la región como expansión del abreviado que se está definiendo.

El comando Ctrl-x al (C-x a l, add-mode-abbrev) es similar, pero define una abreviatura específica para el modo principal actual. Los argumentos son los mismos que para Ctrl-x ag (C-x a g).

Ctrl-x aig (C-x a i g, inverse-add-global-abbrev) y Ctrl-x ail (C-x a i l, inverse-add-mode-abbrev) realizan la tarea contraria: si el texto del abbrev ya está en el buffer, se utilizan estos comandos para definir un abbrev especificando la expansión en el minibuffer. Estos comandos expandirán el texto del abbrev utilizado para la definición.

Puedes definir un abbrev sin insertar la abreviación o su expansión en el buffer usando el comando define-global-abbrev. Este comando lee dos argumentos: la abreviatura y su expansión. El comando define-modo-abbrev hace lo mismo para un abbrev específico del modo.

Para cambiar la definición de una abreviación, basta con hacer una nueva definición. Cuando esta tiene una definición anterior, los comandos de definición de abbrev piden confirmación antes de reemplazarlo.

Para eliminar la definición de una abreviación, dé un argumento negativo al comando de definición de la abreviación: Ctrl-u - Ctrl-x ag (C-u - C-x a g) o Ctrl-u - Ctrl-x al (C-u - C-x a l). El primero elimina una definición global, mientras que el segundo elimina una definición específica del modo. Alt-x kill-all-abbrevs (M-x kill-all-abbrevs) elimina todas las definiciones de abreviatura, tanto globales como locales.

Control de la expansión de las abreviaturas

Cuando el modo Abbrev está activado, un abbrev se expande siempre que esté presente en la memoria intermedia justo antes del punto y se escriba un espacio en blanco o un carácter de puntuación (SPC, coma, etc.) que se autoinserte. Más concretamente, cualquier carácter que no sea un constituyente de palabra expande un abbrev, y cualquier carácter constituyente de palabra puede formar parte de un abbrev. La forma más común de utilizar una abreviatura es insertarla y luego insertar un carácter de puntuación o de espacio en blanco para expandirla.

La expansión de la abreviatura conserva las mayúsculas y minúsculas: ‘foo’ se expande a ‘find outer otter’, y 'Foo' a ‘Find outer otter’. ‘FOO’ se expande a ‘Find Outer Otter’ por defecto, pero si cambias la variable abbrev-all-caps a un valor no nulo, se expande a ‘FIND OUTER OTTER’.

Estos comandos se utilizan para controlar la expansión de las abreviaturas:

Alt-' (M-')
Separa un prefijo de una abreviatura siguiente a expandir (abbrev-prefix-mark).
Ctrl-x ae (C-x a e)
Expande la abreviatura antes del punto (expand-abbrev). Esto es efectivo incluso cuando el modo Abbrev no está activado.
Alt-x unexpand-abbrev (M-x unexpand-abbrev)
Deshace la expansión de la última abreviatura expandida.
Alt-x expand-region-abbrevs (M-x expand-region-abbrevs)
Expande algunas o todas las abreviaturas encontrados en la región.

Es posible que desee expandir una abreviatura y adjuntar un prefijo a la expansión; por ejemplo, si ‘cnst’ se expande en ‘construcción’, es posible que desee utilizarla para introducir ‘reconstrucción’. No funciona escribir recnst, porque no es necesariamente una abreviatura definida. Lo que puede hacer es utilizar el comando Alt-' (M-', abbrev-prefix-mark) entre el prefijo ‘re’ y la abreviatura ‘cnst’. Primero, inserte ‘re’. A continuación, escriba Alt-' (M-'); esto inserta un guión en el búfer para indicar que ha hecho su trabajo. A continuación, inserte la abreviatura ‘cnst’; la memoria intermedia contiene ahora ‘re-cnst’. Ahora inserte un carácter que no sea una palabra para expandir la abreviatura 'cnst' en 'construction'. Este paso de expansión también elimina el guión que indicaba que se había utilizado Alt-' (M-'). El resultado es la ‘reconstrucción’ deseada.

Si realmente se quiere el texto del abreviado en la memoria intermedia, en lugar de su expansión, se puede conseguir insertando la siguiente puntuación con Ctrl-q (C-q) Así, foo Ctrl-q (foo C-q) , deja ‘foo, ’ en el buffer, sin expandirlo.

Si expande una abreviatura por error, puede deshacer la expansión escribiendo Ctrl-/ (C-/, undo). Véase Deshacer. Esto deshace la inserción de la expansión del abreviado y devuelve el texto del abreviado. Si el resultado que desea es el carácter no-palabra de terminación más la abreviatura sin expandir, debe volver a insertar el carácter de terminación, citándolo con Ctrl-q (C-q). También puede utilizar el comando Alt-x unexpand-abbrev (M-x unexpand-abbrev) para cancelar la última expansión sin borrar el carácter de terminación.

Alt-x expand-region-abbrevs (M-x expand-region-abbrevs) busca en la región las abreviaturas definidas y, para cada una de ellas, ofrece sustituirla por su expansión. Este comando es útil si ha escrito un texto utilizando abreviaturas pero ha olvidado activar primero el modo Abbrev. También puede ser útil junto con un conjunto especial de definiciones de abreviaturas para realizar varias sustituciones globales a la vez. Este comando es efectivo incluso si el modo Abbrev no está activado.

La función expand-abbrev realiza la expansión llamando a la función que abbrev-expand-function especifica. Cambiando esta función se pueden hacer cambios arbitrarios en la expansión abbrev. Ver Expansión Abbrev en el Manual de Referencia de Emacs Lisp.

Sugerencias de abreviaturas

Puede obtener sugerencias de abreviaturas cuando escribe manualmente un texto para el que hay una abreviatura definida activa. Por ejemplo, si hay una abreviatura ‘foo’ con la expansión ‘find outer otter’, y escribe manualmente ‘find outer otter’, Emacs puede notarlo y mostrar una sugerencia en el área de eco cuando haya dejado de escribir.

Para activar la función de sugerencia de abreviatura, personaliza la opción abbrev-suggest a un valor no nulo.

La variable abbrev-suggest-hint-threshold controla cuándo sugerir una abreviatura al usuario. Esta variable define el ahorro mínimo (en términos del número de caracteres que el usuario no tendrá que escribir) requerido para que Emacs sugiera el uso de una abreviatura. Por ejemplo, si el usuario escribe ‘foo bar’ (siete caracteres) y hay un abbrev ‘fubar’ definido (cinco caracteres), el Usuario no obtendrá ninguna sugerencia a menos que el umbral se establezca en el número 2 o inferior. Con el valor por defecto 3, el Usuario no obtendría ninguna sugerencia en este ejemplo, porque el ahorro en el uso del abbrev está por debajo del umbral. Si quiere obtener siempre sugerencias de la abreviatura, establezca el valor de esta variable en cero.

El comando abbrev-suggest-show-report muestra un buffer con todas las sugerencias abbrev mostradas durante la sesión de edición actual. Esto puede ser útil si obtienes varias sugerencias de abreviaturas y no las recuerdas todas.

Examen y edición de abreviaturas

Alt-x list-abbrevs (M-x list-abbrevs)
Muestra una lista de todas las definiciones de abreviaturas. Con un argumento numérico, muestra sólo las abreviaturas locales.
Alt-x edit-abbrevs (M-x edit-abbrevs)
Edita una lista de abreviaturas; puede añadir, modificar o eliminar definiciones.

La salida de Alt-x list-abbrevs (M-x list-abbrevs) tiene el siguiente aspecto:

varias otras tablas...
(lisp-mode-abbrev-table)
"dk"          0    "define-key"
(global-abbrev-table)
"dfn"         0    "definition"

(Se han omitido algunas líneas en blanco sin importancia semántica y algunas otras tablas de abreviaturas).

Una línea que contenga un nombre entre paréntesis es la cabecera de las abreviaturas de una tabla de abreviaturas en particular; global-abbrev-table contiene todas las abreviaturas globales, y las otras tablas de abreviaturas que llevan el nombre de los modos principales contienen las abreviaturas específicas de los modos.

Dentro de cada tabla de abreviaturas, cada línea que no esté en blanco define una abreviatura. La palabra al principio de la línea es la abreviatura. El número que sigue es el número de veces que la abreviatura ha sido expandida. Emacs lleva la cuenta de esto para ayudarte a ver qué abreviaturas utilizas realmente, de modo que puedas eliminar las que no utilizas a menudo. La cadena al final de la línea es la expansión.

Algunas abreviaturas están marcadas con ‘(sys)’. Estas abreviaturas del sistema (ver Abreviaturas en el Manual de Referencia de Emacs Lisp) están predefinidas por varios modos, y no se guardan en su archivo de abreviaturas. Para desactivar una abreviatura del sistema, defina una abreviatura del mismo nombre que se expanda a sí mismo, y guárdelo en su archivo abbrev.

Alt-x edit-abbrevs (M-x edit-abbrevs) le permite añadir, cambiar o eliminar definiciones de abbrev editando una lista de ellas en un buffer de Emacs. La lista tiene el mismo formato descrito anteriormente. El buffer de abreviaturas se llama *Abbrevs*, y está en modo Edit-Abbrevs. Escriba Ctrl-c Ctrl-c (C-c C-c) en este buffer para instalar las definiciones de abbrev como se especifica en el buffer-y borrar cualquier definición de abbrev que no esté en la lista.

El comando edit-abbrevs es en realidad el mismo que list-abbrevs, excepto que selecciona el buffer *Abbrevs* mientras que list-abbrevs simplemente lo muestra en otra ventana.

Guardar abreviaturas

Estos comandos le permiten guardar las definiciones de abreviaturas entre sesiones de edición.

Alt-x write-abbrev RETURN archivo RETURN
(M-x write-abbrev-file RET archivo RET)
Escribe un archivo que describe todas las abreviaturas definidas.
Alt-x read-abbrev RETURN archivo RETURN
(M-x read-abbrev-file RET archivo RET)
Leer el archivo y definir los abreviaturas según lo especificado en él.
Alt-x define-abbrevs (M-x define-abbrevs)
Definir abreviaturas a partir de las definiciones del búfer actual.
Alt-x insert-abbrevs (M-x insert-abbrevs)
Insertar todas las abreviaturas y sus expansiones en la memoria intermedia actual.

Alt-x write-abbrev-file (M-x write-abbrev-file) lee un nombre de archivo utilizando el minibuffer y luego escribe una descripción de todas las definiciones de abreviaturas actuales en ese archivo. Esto se utiliza para guardar estas definiciones para su uso en una sesión posterior. El texto almacenado en el archivo es una serie de expresiones Lisp que, cuando se ejecutan, definan las mismas abreviaciones que tiene actualmente.

Alt-x read-abbrev-file (M-x read-abbrev-file) lee un nombre de archivo utilizando el minibuffer y luego lee el archivo, definiendo abreviaturas de acuerdo con el contenido del archivo. La función quietly-read-abbrev-file es similar, excepto que no muestra un mensaje en el área de eco; no se puede invocar de forma interactiva, y se utiliza principalmente en el fichero init (ver El fichero de inicialización de Emacs). Si cualquiera de estas funciones es llamada con nil como argumento, utiliza el archivo dado por la variable abbrev-file-name, que es ~/.config/emacs/abbrev_defs por defecto. Este es tu archivo de definición de abreviaturas estándar, y Emacs carga las abreviaturas desde él automáticamente cuando se inicia. (Como excepción, Emacs no carga el archivo abbrev cuando se inicia en modo batch. Ver Opciones iniciales, para una descripción del modo por lotes).

Emacs ofrecerá guardar los abbrevs automáticamente si has cambiado alguno de ellos, siempre que ofrezca guardar todos los archivos (para Ctrl-x s (C-x s) o Ctrl-x Ctrl-c (C-x C-c)). Los guarda en el archivo especificado por abbrev-file-name. Esta función puede inhibirse estableciendo la variable save-abbrevs en nil; si se establece en silently se guardarán los abbrevs automáticamente sin preguntar.

Los comandos Alt-x insert-abbrevs (M-x insert-abbrevs) y Alt-x define-abbrevs (M-x define-abbrevs) son similares a los comandos anteriores, pero trabajan sobre el texto en un buffer de Emacs. Alt-x insert-abbrevs (M-x insert-abbrevs) inserta texto en el buffer actual después del punto, describiendo todas las definiciones de abreviaturas actuales; Alt-x define-abbrevs (M-x define-abbrevs) analiza todo el buffer actual y define las abreviaturas en consecuencia.

Expansión dinámica de abreviaturas

La función de abreviatura descrita anteriormente funciona automáticamente a medida que se inserta el texto, pero todas las abreviaturas deben definirse explícitamente. En cambio, las abreviaturas dinámicas permiten determinar automáticamente el significado de las abreviaturas a partir del contenido de la memoria intermedia, pero la expansión dinámica de las abreviaturas sólo se produce cuando se solicita explícitamente.

Alt-/ (M-/)
Expande la palabra en el buffer antes del punto como una abreviatura dinámica, buscando palabras que empiecen con esa abreviatura (dabbrev-expand).
Ctrl-Alt-/ (C-M-/)
Completa la palabra antes del punto como una abreviatura dinámica (dabbrev-completion).

Por ejemplo, si el búfer contiene ‘does this follow’ y se escribe f (f) o Alt-/ (M-/), el efecto es insertar ‘follow’ porque es la última palabra del búfer que empieza por ‘fo’. Un argumento numérico a M-/ dice que se tome la segunda, tercera, etc. expansión distinta encontrada mirando hacia atrás desde el punto. Repitiendo Alt-/ (M-/) se busca una expansión alternativa mirando más atrás. Después de escanear todo el texto antes del punto, busca el texto después del punto. La variable dabbrev-limit, si no es nula, especifica a qué distancia del búfer se debe buscar una expansión.

Después de buscar en el buffer actual, Alt-/ M-/ normalmente busca en otros buffers. Las variables dabbrev-check-all-buffers y dabbrev-check-other-buffers pueden utilizarse para determinar en qué otros buffers, si los hay, se busca.

Para un control más fino sobre los búferes a escanear, personalice las variables dabbrev-ignored-buffer-names y dabbrev-ignored-buffer-regexps. El valor de la primera es una lista de nombres de búferes a omitir. El valor de la segunda es una lista de expresiones regulares; si el nombre de un búfer coincide con alguna de estas expresiones regulares, la expansión dinámica de abbrev se salta ese búfer.

Un argumento negativo a Alt-/ (M-/), como en Ctrl-u-Alt-/ (C-u - M-/), dice que se busquen primero las expansiones después del punto, luego otros búferes, y se consideren las expansiones antes del punto sólo como último recurso. Si se repite Alt-/ (M-/) para buscar otra expansión, no se debe especificar un argumento. La repetición de M-/ recorre todas las expansiones después del punto y luego las expansiones antes del punto.

Después de haber expandido una abreviatura dinámica, puede copiar las palabras adicionales que siguen a la expansión en su contexto original. Simplemente escriba SPC M-/ para cada palabra adicional que desee copiar. El espaciado y la puntuación entre las palabras se copian junto con las palabras.

Puede controlar la forma en que Alt-/ (M-/) determina la palabra que se expande y cómo se expande, véase Personalización de la abreviatura dinámica.

El comando Ctrl-Alt-/ (C-M-/, dabbrev-completion) realiza la finalización de una abreviatura dinámica. En lugar de probar las posibles expansiones una por una, las encuentra todas y luego inserta el texto que tienen en común. Si no tienen nada en común, Ctrl-Alt-/ (C-M-/) muestra una lista de terminaciones, de la que puede seleccionar una opción de la manera habitual. Véase Completar.

La expansión dinámica de abreviaturas es completamente independiente del modo Abbrev; la expansión de una palabra con Alt-/ (M-/) es completamente independiente de si tiene una definición como abreviatura ordinaria.

Personalización de la abreviatura dinámica

Normalmente, la expansión dinámica de abreviaturas ignora las mayúsculas y minúsculas al buscar expansiones. Es decir, no es necesario que la expansión coincida en mayúsculas y minúsculas con la palabra que se está expandiendo.

Esta característica se controla con la variable dabbrev-case-fold-search. Si es t, se ignoran las mayúsculas y minúsculas en esta búsqueda; si es nil, la palabra y la expansión deben coincidir en mayúsculas y minúsculas. Si el valor es case-fold-search (por defecto), la variable case-fold-search controla si se ignoran las mayúsculas y minúsculas en la búsqueda de expansiones (ver Lax Matching During Searching).

Normalmente, la expansión dinámica de abreviaturas conserva el patrón de mayúsculas y minúsculas de la abreviatura dinámica que se está expandiendo, convirtiendo la expansión a ese patrón de mayúsculas y minúsculas.

La variable dabbrev-case-replace controla si se preserva el patrón de mayúsculas y minúsculas del abreviatura dinámico. Si es t, el patrón de mayúsculas y minúsculas del abreviatura dinámico se conserva en la mayoría de los casos; si es nil, la expansión siempre se copia literalmente. Si el valor es case-replace (el valor predeterminado), la variable case-replace controla si se copia la expansión literalmente (véase Comandos de reemplazo y coincidencias laxas).

Sin embargo, si la expansión contiene un patrón complejo de mayúsculas y minúsculas, y la abreviatura dinámica coincide con este patrón hasta el final, entonces la expansión siempre Alt-/ (M-/), se copia la expansión literalmente incluyendo su patrón de mayúsculas y minúsculas.

La variable dabbrev-abbrev-char-regexp, si no es nula, controla qué caracteres se consideran parte de una palabra, a efectos de expansión dinámica. La expresión regular debe coincidir con un solo carácter, nunca con dos o más. La misma expresión regular también determina qué caracteres forman parte de una expansión. El valor (por defecto) tiene un significado especial: las abreviaturas dinámicas (es decir, la palabra en el punto) están formadas por caracteres de palabra, pero sus expansiones se buscan como secuencias de caracteres de palabra y símbolo. Esto es generalmente apropiado para expandir símbolos en el código fuente de un programa y también para texto legible por humanos en muchos idiomas, pero puede no ser lo que se desea en un buffer de texto que incluya caracteres de puntuación inusuales; en ese caso, el valor ‘\\sw’ podría producir mejores resultados.

En los scripts de la shell y en los makefiles, el nombre de una variable a veces lleva el prefijo ‘$’ y a veces no. Los modos principales para este tipo de texto pueden personalizar la expansión dinámica de abreviaturas para manejar los prefijos opcionales estableciendo la variable dabbrev-abbrev-skip-leading-regexp. Su valor debe ser una expresión regular que coincida con el prefijo opcional que la expresión abreviada dinámica debe ignorar. El valor por defecto es nil, lo que significa que no se debe omitir ningún carácter.



Dired, el editor de directorios

Dired crea un buffer de Emacs que contiene un listado de un directorio, y opcionalmente algunos de sus subdirectorios. Puede usar los comandos normales del Editor para moverse en este buffer, y comandos especiales de Dired para operar en los archivos listados. Dired funciona tanto con directorios locales como remotos.

El buffer Dired es normalmente de sólo lectura, y no se permite insertar texto en él (sin embargo, el modo Wdired lo permite, ver Editar el Buffer Dired). Los caracteres de impresión ordinarios, como la d (d) y la x (x), se redefinen para los comandos especiales de Dired. Algunos comandos de Dired marcan (mark) o señalan (flag) el archivo actual (es decir, el archivo de la línea actual); otros comandos operan sobre los archivos marcados o sobre los archivos marcados. Primero se marcan ciertos archivos para poder operar sobre todos ellos con un solo comando.

El paquete Dired-X proporciona varias funciones adicionales para el modo Dired. Vea Dired-X en el Manual de Usuario de Dired Extra.

También puede ver una lista de archivos en un directorio con Ctrl-x Ctrl-d (C-x C-d, list-directory). A diferencia de Dired, este comando no permite operar con los archivos de la lista. Véase Directorios de archivos.

Cómo acceder a Dired

Para invocar Dired, escriba Ctrl-x d (C-x d, dired). Esto lee el nombre de un directorio usando el minibuffer, y abre un buffer Dired que lista los archivos en ese directorio. También puede suministrar un patrón de nombre de archivo comodín como argumento del minibuffer, en cuyo caso el buffer Dired lista todos los archivos que coinciden con ese patrón. El comodín también puede aparecer en la parte del directorio. Por ejemplo,

C-x d  ~/foo/*.el  RET
C-x d  ~/foo/*/*.el  RET

La primera lista todos los archivos con extensión ‘.el’ en el directorio ’foo‘. La segunda lista los archivos con extensión ‘.el’ en todos los subdirectorios de ‘foo’.

En los sistemas Posix, cuando el shell del sistema soporta globstar, una característica de globbing recursivo, y ese soporte está habilitado, puedes usar globbing recursivo en Dired:

C-x d  ~/foo/**/*.el  RET

Este comando produce un listado de directorios con todos los archivos con extensión ‘.el’, descendiendo recursivamente en todos los subdirectorios de ‘foo’. Tenga en cuenta que hay pequeñas diferencias en la implementación de globstar entre los diferentes shells. Consulte el manual de su shell para conocer el comportamiento esperado.

Si el intérprete de comandos soporta globstar, pero ese soporte está deshabilitado por defecto, aún puede permitir que Dired use esta característica personalizando dired-maybe-use-globstar a un valor no nulo; entonces Dired habilitará globstar para aquellos intérpretes de comandos para los que sabe cómo hacerlo (vea dired-enable-globstar-in-shell para la lista de esos intérpretes).

Los comandos habituales de historial y finalización pueden utilizarse en el minibuffer; en particular, Alt-n (M-n) pone el nombre del archivo visitado (si lo hay) en el minibuffer (ver Historial del minibuffer).

También puede invocar Dired dando a Ctrl-x Ctrl-f (C-x C-f, find-file) el nombre de un directorio.

Puedes pedirle a Emacs que invoque a Dired en el directorio por defecto (ver directorio por defecto) de cualquier buffer, escribiendo Ctrl-x Ctrl-j (C-x C-j, dired-jump). Si el buffer visita un archivo, este comando moverá el punto a la línea de ese archivo en el buffer Dired que muestra; de lo contrario, el punto terminará en el primer archivo del listado de directorios. Como excepción, si escribes Ctrl-x Ctrl-j (C-x C-j) en un buffer Dired, Emacs muestra el listado de directorios del directorio padre y coloca el punto en la línea que corresponde al directorio donde invocó dired-jump. Escribir Ctrl-x 4 Ctrl-j (C-x 4 C-j, dired-jump-other-window tiene el mismo efecto, pero muestra el buffer Dired en una nueva ventana.

La variable dired-listing-switches especifica las opciones a dar a ls para listar el directorio; esta cadena debe contener ‘-l’. Si utiliza un argumento de prefijo con el comando dired, puede especificar los interruptores de ls con el minibuffer antes de introducir la especificación del directorio. Independientemente de cómo se especifiquen,los interruptores ls pueden incluir opciones cortas (es decir, de un solo carácter) que no requieren argumentos, y opciones largas (que comienzan con ‘--' cuyos argumentos se especifican con ‘=’.

Dired no maneja bien los archivos que tienen nombres con caracteres de nueva línea incrustados. Si tiene muchos archivos de este tipo, puede considerar añadir ‘-b’ a los interruptores de dired-listing. Esto citará todos los caracteres especiales y permitirá a Dired manejarlos mejor. (También puede utilizar el comando Ctrl-u Ctrl-x d (C-u C-x d) para añadir ‘-b’ temporalmente).

Dired muestra en la línea de modo una indicación de cuáles fueron los interruptores utilizados para invocar ls. Por defecto, Dired intentará determinar si los interruptores indican la ordenación por nombre o por fecha, y lo dirá en la línea de modo. Si la variable dired-switches-in-mode-line es tal cual, los interruptores se mostrarán textualmente. Si el valor de esta variable es un número entero, la visualización de los interruptores se truncará a esa longitud. Esta variable también puede ser una función, que será llamada con dired-actual-switches como único parámetro, y debería devolver una cadena para mostrar en la línea de modo.

Si su programa ls soporta la opción ‘--dired’, Dired le pasa automáticamente esa opción; esto hace que ls emita secuencias de escape especiales para ciertos nombres de archivo inusuales, sin los cuales Dired no será capaz de analizar esos nombres. La primera vez que se ejecuta Dired en una sesión de Emacs, se comprueba si ls soporta la comprobación personalizando la variable dired-use-ls-dired. El valor no especificado (por defecto) significa realizar la comprobación; cualquier otro valor no nulo significa utilizar la opción ‘--dired’; y nil significa no utilizar la opción ‘--dired’.

En los sistemas MS-Windows y MS-DOS, y también en algunos sistemas remotos, Emacs emula ls. Ver Emulación de ls en MS-Windows, para las opciones y peculiaridades de esta emulación.

Para mostrar el buffer de Dired en otra ventana, use Ctrl-x 4d (C-x 4 d, dired-other-window). Ctrl-x 5d (C-x 5 d, dired-other-frame) muestra el buffer Dired en un marco separado.

Al escribir q (q, quit-window) se entierra el buffer Dired, y se borra su ventana si la ventana se creó sólo para ese buffer.

Todos los comandos habituales de movimiento del cursor de Emacs están disponibles en los buffers Dired. Las teclas Ctrl-n (C-n) y Ctrl-p (C-p) se redefinen para ejecutar dired-next-line y dired-previous-line, respectivamente, y ponen el cursor al principio del nombre del archivo en la línea, en lugar de al principio de la línea.

Para mayor comodidad, SPACE (SPC) y n (n) en Dired son equivalentes a Ctrl-n (C-n). p (p) es equivalente a Ctrl-p (C-p). (Mover por líneas es tan común en Dired que merece ser fácil de teclear). DEL (DEL, mover hacia arriba y desmarcarse) también es a menudo útil simplemente para mover hacia arriba (ver Borrar archivos con Dired).

j (j, dired-goto-file) pide un nombre de archivo usando el minibuffer, y mueve el punto a la línea del buffer de Dired que describe ese archivo.

Alt-s f Ctrl-s (M-s f C-s, dired-isearch-filenames) realiza una búsqueda incremental hacia adelante en el buffer Dired, buscando coincidencias sólo entre los nombres de archivo e ignorando el resto del texto en el buffer. Alt-s f Alt-Ctrl-s (M-s f M-C-s, dired-isearch-filenames-regexp) hace lo mismo, utilizando una búsqueda por expresión regular. Si cambia la variable dired-isearch-filenames por t, los comandos de búsqueda habituales también se limitan a los nombres de los archivos; por ejemplo, Ctrl-s (C-s) se comporta como Alt-s f Ctrl-s (M-s f C-s). Si el valor es dwim, entonces los comandos de búsqueda coinciden con los nombres de archivo sólo cuando el punto estaba en un nombre de archivo inicialmente. Consulte Búsqueda y sustitución, para obtener información sobre la búsqueda incremental.

Algunos comandos de navegación adicionales están disponibles cuando el buffer Dired incluye varios directorios. Véase Mover sobre subdirectorios.

Borrar archivos con Dired

Uno de los usos más frecuentes de Dired es marcar primero los archivos para su eliminación y luego borrar los archivos marcados.

d (d)
Marca este archivo para su eliminación (dired-flag-file-deletion).
u (u)
Elimina la bandera de borrado (dired-unmark).
DEL (DEL)
Mueve el punto a la línea anterior y elimina la bandera de borrado en esa línea (dired-unmark-backward).
x (x)
Elimina los archivos con bandera de borrado (dired-do-flagged-delete).

Puede marcar un archivo para su eliminación pasando a la línea que describe el archivo y escribiendo d (d, dired-flag-file-deletion). La bandera de borrado es visible como una ‘D’ al principio de la línea. Este comando desplaza el punto a la siguiente línea, de modo que los comandos d (d) repetidos marcan archivos sucesivos. Un argumento numérico en forma de prefijo sirve como recuento de repeticiones; un recuento negativo significa marcar los archivos precedentes.

Si la región está activa, el comando d marca todos los archivos de la región para su eliminación; en este caso, el comando no mueve el punto e ignora cualquier argumento de prefijo.

La razón por la que se marcan los archivos para su eliminación, en lugar de borrarlos inmediatamente, es para reducir el peligro de borrar un archivo accidentalmente. Hasta que le indique a Dired que borre los archivos marcados, puede eliminar las banderas de borrado utilizando los comandos u (u) y DEL (DEL). u (u, dired-unmark) funciona igual que d (d), pero elimina las banderas en lugar de hacerlas. DEL (DEL, dired-unmark-backward) se mueve hacia arriba, eliminando banderas; es como u u con el argumento -1. Un argumento numérico en el prefijo de cualquiera de los comandos sirve como cuenta de repetición, con una cuenta negativa que significa desmarcarse en la dirección opuesta. Si la región está activa, estos comandos desmarcan todos los archivos de la región, sin mover el punto.

Para eliminar los archivos marcados, escriba x (x, dired-do-flagged-delete). Este comando muestra una lista de todos los nombres de archivos marcados para ser borrados, y pide confirmación con un sí. Si confirma, Dired borra los archivos marcados, y luego borra sus líneas del texto del buffer de Dired. El buffer Dired, con algo menos de líneas, permanece seleccionado.

Si responde que no o sale con Ctrl-g (C-g) cuando se le pide que confirme, vuelve inmediatamente a Dired, con las banderas de borrado aún presentes en el buffer, y sin ningún archivo realmente borrado.

Puede borrar directorios vacíos al igual que otros archivos, pero normalmente Dired no puede borrar directorios que no estén vacíos. Sin embargo, si la variable dired-recursive-deletes es no nil, entonces Dired puede borrar directorios no vacíos incluyendo todo su contenido. Esto puede ser algo arriesgado. Si el valor de la variable es always, Dired borrará los directorios no vacíos de forma recursiva, lo que es aún más arriesgado.

Incluso si ha establecido dired-recursive-deletes a nil, puede querer a veces borrar directorios recursivamente sin que se le pida confirmación para todos ellos. Por ejemplo, puede querer eso cuando ha marcado muchos directorios para ser borrados y está muy seguro de que todos ellos pueden ser borrados con seguridad. Para cada directorio no vacío se le pide confirmación para borrarlo, si responde a todos, entonces todos los directorios restantes se borrarán sin más preguntas.

Si cambia la variable delete-by-moving-to-trash a t, los comandos de borrado anteriores moverán los archivos o directorios afectados a la Papelera del sistema operativo, en lugar de borrarlos directamente. Véase Operaciones de archivo diversas.

Una forma alternativa de borrar archivos es marcarlos con m (m) y borrarlos con D (D), véase Operar con archivos.

Marcar varios archivos a la vez

Los comandos # (#), ~ (~), . (.), %& (% &), y %d (% d) marcan varios archivos para su eliminación, basándose en sus nombres:

# (#)
Marca todos los archivos de auto-guardado (archivos cuyos nombres comienzan y terminan con ‘#’) para su eliminación (ver Auto-guardado: Protección contra desastres).
~ (~)
Marca todos los archivos de copia de seguridad (archivos cuyos nombres terminan con ‘~’) para su eliminación (véase Archivos de copia de seguridad).
. (. (el punto))
Marca el exceso de archivos de copia de seguridad numéricos para su eliminación. Los archivos de copia de seguridad más antiguos y los más nuevos de cualquier archivo están exentos; los del medio se marcan.
%& (% &)
Marca para su eliminación todos los archivos con ciertos tipos de nombres que sugieren que podría crear fácilmente esos archivos de nuevo.
%d expreg RETURN (% d expreg RET)
Marca para su eliminación todos los archivos cuyos nombres coinciden con la expresión regular expreg.

# (#, dired-flag-auto-save-files) marca todos los archivos cuyos nombres parecen archivos de auto-guardado-es decir, archivos cuyos nombres empiezan y terminan con ‘#’. Véase Autoguardado: Protección contra desastres.

~ (~, dired-flag-backup-files) marca todos los archivos cuyos nombres dicen que son archivos de respaldo, es decir, archivos cuyos nombres terminan en ‘~’. Véase Archivos de copia de seguridad.

. (., es el punto, dired-clean-directory) marca sólo algunos de los archivos de copia de seguridad para su eliminación: todos menos las pocas copias de seguridad más antiguas y las más nuevas de cualquier archivo. Normalmente, el número de versiones más nuevas que se conservan para cada archivo viene dado por la variable dired-kept-versions (no kept-new-versions; eso sólo se aplica al guardar). El número de versiones más antiguas a conservar viene dado por la variable kept-old-versions.

Punto (., .) con un argumento numérico positivo, como por ejemplo Ctrl-u 3. (C-u 3 .), especifica el número de versiones más nuevas a conservar, anulando dired-kept-versions. Un argumento numérico negativo anula las versiones antiguas conservadas, utilizando el signo de suma negativa menos (-) el valor del argumento para especificar el número de versiones más antiguas de cada archivo que se deben conservar.

%& (% &, dired-flag-garbage-files) marca los archivos cuyos nombres coinciden con la expresión regular especificada por la variable dired-garbage-files-regexp. Por defecto, esto coincide con ciertos archivos producidos por TeX, archivos ‘.bak’, y los archivos ‘.orig’ y ‘.rej’ producidos por patch.

%d (% d, dired-flag-files-regexp) marca todos los archivos cuyos nombres coinciden con una expresión regular especificada . Sólo se utiliza la parte del nombre del archivo que no es de directorio para realizar la comparación. Puede utilizar ‘^’ y ‘$’ para anclar las coincidencias. Puede excluir ciertos subdirectorios del marcado ocultándolos mientras utiliza %d (% d). Consulte Ocultar subdirectorios.

Visitar archivos en Dired

Hay varios comandos de Dired para visitar o examinar los ficheros listados en el buffer de Dired. Todos ellos se aplican al archivo de la línea actual; si ese archivo es realmente un directorio, estos comandos invocan a Dired en ese subdirectorio (haciendo un buffer Dired separado).

f (f)
Visita el archivo descrito en la línea actual, como si escribiera Ctrl-x Ctrl-f (C-x C-f) y suministrara ese nombre de archivo (dired-find-file). Ver Visitar archivos.
RETURN (RET)
e (e)
Equivale a f (f).
o (o)
Como f (f), pero utiliza otra ventana para mostrar el buffer del archivo (dired-find-file-other-window). El buffer de Dired permanece visible en la primera ventana. Esto es como usar Ctrl-x 4 Ctrl-f (C-x 4 C-f) para visitar el archivo. Ver Ventanas múltiples.
Ctrl-o (C-o)
Visita el archivo descrito en la línea actual, y muestra el buffer en otra ventana, pero no selecciona esa ventana (dired-display-file).
(ratón-1)
(ratón-2)
Visita el archivo cuyo nombre se ha pulsado (dired-mouse-find-file-other-window). Esto utiliza otra ventana para mostrar el archivo, como el comando o (o).
v (v)
Permite ver el archivo descrito en la línea actual, con el modo Ver (dired-view-file, mode View). El modo view (view-mode) proporciona comandos convenientes para navegar por el buffer pero prohíbe cambiarlo; Ver Modo de vista.
^ (^)
Visita el directorio padre del directorio actual (dired-up-directory). Esto equivale a desplazarse a la línea .. y ahí escribir f (f) .
Opción del usuario: dired-kill-when-opening-new-dired-buffer
Cuando se visita un nuevo sub-directorio en Dired, Emacs abrirá (por defecto) un nuevo buffer para mostrar este nuevo directorio, y dejará el buffer anterior de Dired como está. Si esta opción de Usuario no es nula, el antiguo buffer de Dired será eliminado después de seleccionar el nuevo directorio. Esto significa que si está recorriendo una estructura de directorios en Dired, no terminará con más de un buffer Dired.

Marcas de Dired vs. Banderas

En lugar de marcar un fichero con ‘D’, puede marcar el fichero con algún otro carácter (normalmente ‘*’). La mayoría de los comandos de Dired para operar sobre los archivos utilizan los archivos marcados con ‘*’. El único comando que opera sobre los ficheros marcados es el comando x (x), que los borra.

Estos son algunos comandos para marcar con ‘*’, para desmarcar y para operar sobre las marcas. (Vea Borrar archivos con Dired, para los comandos para marcar y desmarcar archivos).

m (m)
*m (* m)
Marca el archivo actual con ‘*’ (dired-mark). Si la región está activa, marca todos los archivos en la región; de lo contrario, si se suministra un argumento numérico n, marca los siguientes n archivos en su lugar, empezando por el archivo actual (si n es negativo, marca los archivos -n anteriores). Si se invoca en la línea de cabecera de un subdirectorio (véase Subdirectorios en Dired), este comando marca todos los archivos de ese subdirectorio.
*N (* N)
Informa del número y tamaño de los ficheros marcados (dired-number-of-marked-files).
** (* *)
Marca todos los archivos ejecutables con ‘*’ (dired-mark-executables). Con un argumento numérico, desmarca todos esos archivos.
*@ (* @)
Marca todos los enlaces simbólicos con ‘*’ (dired-mark-symlinks). Con un argumento numérico, desmarca todos esos archivos.
*/ (* /)
Marca con ‘*’ todos los ficheros que sean directorios, excepto . y .. (dired-mark-directories). Con un argumento numérico, desmarca todos esos archivos.
*s (* s)
Marca con ‘*’ todos los ficheros del subdirectorio actual, a excepción de . y .. (dired-mark-subdir-files).
u (u)
*u (* u)
Elimina cualquier marca en esta línea (dired-unmark). Si la región está activa, se desmarcan todos los archivos de la región; en caso contrario, si se proporciona un argumento numérico n, se desmarcan los siguientes n archivos, empezando por el actual (si n es negativo, se desmarcan los archivos -n anteriores).
DEL (DEL)
*DEL(* DEL)
Mueve el punto a la línea anterior y elimina cualquier marca en esa línea (dired-unmark-backward). Si la región está activa, se desmarcan todos los archivos de la región; en caso contrario, si se proporciona un argumento numérico n, se desmarcan los n archivos anteriores, empezando por el archivo actual (si n es negativo, se desmarcan los siguientes -n archivos).
*! (* !)
U (U)
Elimina todas las marcas de todos los archivos de este buffer Dired (dired-unmark-all-marks).
*? carmarc (* ? carmarc)
Elimina todas las marcas que utilizan el carácter carmarc (caracter de marca, dired-unmark-all-files). Si se invoca con Alt-DEL (M-DEL), el comando solicita carmarc. Ese caracter de marca es un solo carácter, no use RETURN (RET) para terminarlo. Consulte la descripción del comando c* (* c) más adelante, que le permite reemplazar un carácter de marca por otro.
Con un argumento numérico, este comando consulta sobre cada archivo marcado, preguntando si se debe eliminar su marca. Puede responder ‘y’ que significa sí, ‘n’ que significa no, o ‘!’ para eliminar las marcas de los archivos restantes sin preguntar por ellos.
* Ctrl-n (* C-n)
Alt-} (Alt-} )
Pasa al siguiente archivo marcado (dired-next-marked-file). Un fichero está "marcado" si tiene algún tipo de marca.
* Ctrl-p (* C-p)
Alt-{ (Alt-{ )
Sube al archivo marcado anterior (dired-prev-marked-file).
t (t)
*t (* t)
Alterna todas las marcas (dired-toggle-marks): los archivos marcados con ‘*’ se desmarcan, y los archivos no marcados se marcan con ‘*’. Los archivos marcados de cualquier otra forma no se ven afectados.
*c carmarc-actual nuevo-carmarc (* c carmarc-actual nuevo-carmarc)
Reemplaza todas las marcas que utilizan el carácter de marca: carmarc-actual por marcas que utilizan el carácter de marca: nuevo-carmarc (dired-change-marks). Este comando es la principal forma de crear o utilizar marcas distintas de ‘*’ o ‘D’. Los argumentos son caracteres simples, no utilice RETURN (RET) para terminarlos.
Puede utilizar casi cualquier carácter como marca por medio de este comando, para distinguir varias clases de archivos. Si carmarc-actual es un espacio (‘ ’), el comando opera sobre todos los archivos no marcados; si nuevo-carmarc es un espacio, el comando desmarca los archivos sobre los que actúa.
Para ilustrar el poder de este comando, aquí se muestra cómo poner banderas ‘D’ en todos los archivos que no tienen marcas, mientras se desmarcan todos los que ya tienen banderas ‘D’:
* c D t  * c SPC D  * c t SPC
	
Esto supone que no hay archivos marcados con ‘t’.
%m expreg RETURN (% m expreg RET)
*% expreg RETURN (* % expreg RET)
Marca (con ‘*’) todos los archivos cuyos nombres coinciden con la expresión regular expreg (dired-mark-files-regexp). Este comando es como %d (% d), excepto que marca los archivos con ‘*’ en lugar de marcarlos con ‘D’.
Sólo se utiliza la parte del nombre del archivo que no es de directorio para realizar la comparación. Utilice ‘^’ y ‘$’ para anclar las coincidencias. Puede excluir los subdirectorios ocultándolos temporalmente (véase Ocultar subdirectorios).
%g expreg (% g expreg)
Marca (con ‘*’) todos los archivos cuyo contenido tenga una coincidencia con la expresión regular expreg (dired-mark-files-containing-regexp). Este comando es como %m (% m), excepto que busca el contenido del archivo en lugar del nombre del mismo. Tenga en cuenta que si un archivo es visitado en un buffer de Emacs, y dired-always-read-filesystem es nil (el valor por defecto), este comando buscará en el buffer sin volver a visitar el archivo, por lo que los resultados podrían ser inconsistentes con el archivo en el disco si su contenido ha cambiado desde la última vez que fue visitado. Si no quiere que esto ocurra, es posible que desee revertir los archivos que ha visitado en sus búferes, o activar el modo de revertir automáticamente en esos búferes, antes de invocar este comando. Vea Revertir un Buffer. Si prefiere que este comando siempre vuelva a visitar el archivo, sin que tenga que revertir el archivo o activar el modo Auto-Revert, podría querer establecer dired-always-read-filesystem en un valor no nulo.
Ctrl-/ (C-/)
Ctrl-x u (C-x u)
Ctrl-_ (C-_)
Deshace los cambios en el buffer Dired, como añadir o eliminar marcas (dired-undo). ¡Este comando no revierte las operaciones de archivo reales, ni recupera los archivos perdidos!. Sólo deshace los cambios en el propio buffer.
En algunos casos, usar esto después de comandos que operan sobre archivos puede causar problemas. Por ejemplo, después de renombrar uno o más archivos, dired-undo restaura los originales en el buffer de Dired, lo que hace que el buffer de Dired no esté sincronizado con el contenido real del directorio.

Operar con archivos

Esta sección describe los comandos básicos de Dired para operar sobre uno o varios archivos. Todos estos comandos:

  • Están en mayúsculas.
  • Utilizan el minibuffer, ya sea para leer un argumento o para pedir confirmación, antes de actuar.
  • Permiten especificar los ficheros a manipular de esta forma:

    • Si le da al comando un argumento numérico n de prefijo, opera en los n siguientes archivos, empezando por el archivo actual. (Si n es negativo, el comando opera sobre los -n archivos que preceden a la línea actual).
    • De lo contrario, si algunos archivos están marcados con ‘*’, el comando opera en todos esos archivos.
    • En caso contrario, el comando opera sólo en el archivo actual.

Algunos otros comandos de Dired, como ! (!) y % (%), utilizan las mismas convenciones para decidir sobre qué archivos trabajar.

Los comandos que piden un directorio de destino, como los que copian y renombran archivos o crean enlaces para ellos, intentan adivinar el directorio de destino por defecto para la operación. Normalmente, sugieren el directorio por defecto del buffer de Dired, pero si la opción dired-dwim-target es no nula, y si hay otro buffer de Dired mostrado en alguna ventana, se sugiere el directorio de ese otro buffer en su lugar. Puede personalizar dired-dwim-target para que prefiera la siguiente ventana con un búfer Dired, o la última ventana utilizada con un búfer Dired, o para que utilice cualquier otra función. Cuando el valor es una función, se llamará sin argumentos y se espera que devuelva una lista de directorios que se utilizarán por defecto (es decir, el objetivo por defecto y el "historial futuro").

Aquí están los comandos de Dired que manipulan archivos y que operan sobre ellos.

Ctrl nuevo RETURN (C nuevo RET)
Copia los archivos especificados (dired-do-copy). El argumento nuevo es el directorio en el que se va a copiar, o (si se copia un solo archivo) el nuevo nombre. Esto es como el comando de shell cp.
La opción dired-create-destination-dirs controla si Dired debe crear directorios inexistentes en el destino al copiar/renombrar archivos. El valor por defecto nil significa que Dired nunca crea dichos directorios inexistentes; el valor always, significa que Dired los crea automáticamente; el valor ask significa que Dired le pide confirmación antes de crearlos.
Si dired-copy-preserve-time es no nil, la copia con este comando preserva el tiempo de modificación del archivo antiguo en la copia, como ‘cp -p’.
La variable dired-recursive-copies controla si se copian los directorios recursivamente (como ‘cp -r’). El valor por defecto es top, lo que significa preguntar antes de copiar recursivamente un directorio.
La variable dired-copy-dereference controla si se copian los enlaces simbólicos como enlaces o después de la desreferencia (como ‘cp -L’). El valor por defecto es nil, lo que significa que los enlaces simbólicos se copian creando otros nuevos.
D (D)
Borra los archivos especificados (dired-do-delete). Es como el comando rm del shell.
Al igual que los otros comandos de esta sección, este comando opera sobre los archivos marcados, o los siguientes n archivos. Por el contrario, x (x, dired-do-flagged-delete) borra todos los archivos marcados.
R nuevo RETURN (R nuevo RET)
Renombra los archivos especificados (dired-do-rename). Si renombra un solo archivo, el argumento nuevo es el nuevo nombre del archivo. Si cambia el nombre de varios archivos, el argumento nuevo es el directorio al que se moverán los archivos (es como el comando mv del shell).
La opción dired-create-destination-dirs controla si Dired debe crear directorios inexistentes en nuevo.
Dired cambia automáticamente el nombre de archivo visitado de los buffers asociados a los archivos renombrados para que hagan referencia a los nuevos nombres.
Si el valor de la variable dired-vc-rename-file es no nulo, los ficheros se renombran utilizando los comandos del VCS subyacente, a través de vc-rename-file (ver Borrar y renombrar ficheros de versión controlada).
H nuevo RETURN (H nuevo RET)
Hace enlaces duros a los archivos especificados (dired-do-hardlink). Es como el comando de shell ln. El argumento nuevo es el directorio en el que se harán los enlaces, o, si se hace un solo enlace, el nombre que se le dará al enlace.
S nuevo RETURN (S nuevo RET)
Hace enlaces simbólicos a los archivos especificados (dired-do-symlink). Esto es como ‘ln -s’. El argumento nuevo es el directorio en el que se harán los enlaces, o, si sólo se hace un enlace, el nombre que se le dará al enlace.
Alt modespec RETURN (M modespec RET)
Cambia el modo (también llamado bits de permiso) de los archivos especificados (dired-do-chmod). modespec puede estar en notación octal o simbólica, como los argumentos manejados por el programa chmod. Este comando no sigue los enlaces simbólicos, por lo que informa de un error si se intenta cambiar el modo de un enlace simbólico en una plataforma en la que dichos modos son inmutables.
G nuevogrupo RETURN (G nuevogrupo RET)
Cambia el grupo de los archivos especificados a nuevogrupo (dired-do-chgrp).
O nuevodueño RETURN (O nuevodueño RET)
Cambia el propietario de los archivos especificados a nuevodueño (dired-do-chown). (En la mayoría de los sistemas, sólo el superusuario puede hacer esto).
La variable dired-chown-program especifica el nombre del programa a utilizar para realizar el trabajo. (Esta variable es necesaria porque diferentes sistemas ponen chown en diferentes lugares).
T marcadetiempo RETURN (T marcadetiempo RET)
Toca los archivos especificados (dired-do-touch). Esto significa actualizar sus tiempos de modificación a marcadetiempo, que por defecto es la hora actual. Esto es como el comando del shell touch.
P comando (P comando RET)
Imprime los archivos especificados (dired-do-print). Debe especificar el comando con el que se imprimirán, pero el minibuffer comienza con una suposición adecuada hecha con las variables lpr-command y lpr-switches (las mismas variables que usa lpr-buffer; vea Impresión de copias duras).
Z (Z)
Comprime los archivos especificados (dired-do-compress). Si el archivo parece ser ya un archivo comprimido, lo descomprime en su lugar. Cada archivo marcado se comprime en su propio archivo; esto utiliza el programa gzip si está disponible, de lo contrario utiliza compress.
En un nombre de directorio, este comando produce un archivo comprimido dependiendo de la opción de usuario dired-compress-directory-default-suffix. El valor predeterminado es un archivo .tar.gz que contiene todos los archivos del directorio, ejecutando el comando tar con la salida canalizada a gzip. Para permitir la descompresión de los directorios comprimidos, al escribir Z (Z) en un archivo .tar.gz o .tgz se descomprimen todos los ficheros del archivo en un directorio cuyo nombre es el nombre del archivo sin la extensión.
c (c)
Comprime los archivos especificados (dired-do-compress-to) en un único archivo en cualquier lugar del sistema de archivos. El archivo por defecto está controlado por la opción de Usuario dired-compress-directory-default-suffix. Véase también dired-compress-files-alist.
:d (:d)
Desencripta los archivos especificados (epa-dired-do-decrypt). Vea la integración de Dired en el Manual de Usuario del Asistente EasyPG.
:v (:v)
Verifica las firmas digitales de los archivos especificados (epa-dired-do-verify). Vea la integración de Dired en el Manual de Usuario del Asistente EasyPG.
:s (:s)
Firma digitalmente los archivos especificados (epa-dired-do-sign). Consulte la integración de Dired en el Manual de usuario del Asistente EasyPG.
:e (:e)
Cifra los archivos especificados (epa-dired-do-encrypt). Consulte la integración de Dired en el Manual de usuario del Asistente EasyPG.
L (L)
Carga los archivos Emacs Lisp especificados (dired-do-load). Ver Bibliotecas de código Lisp para Emacs.
B (B)
Compila por bytes los archivos Emacs Lisp especificados (dired-do-byte-compile). Véase Compilación de bytes en el Manual de referencia de Emacs Lisp.
A expreg RETURN (A expreg RET)
Busca en todos los archivos especificados la expresión regular expreg (dired-do-find-regexp).
Este comando es una variante de xref-find-references (ver Buscar y reemplazar con identificadores), muestra el buffer *xref*, donde puede navegar entre las coincidencias y mostrarlas según sea necesario usando los comandos descritos en Comandos disponibles en el buffer *xref*.
Si alguno de los archivos marcados son directorios, entonces este comando busca todos los archivos en esos directorios, y cualquiera de sus subdirectorios, recursivamente, excepto los archivos cuyos nombres coinciden con grep-find-ignored-files y los subdirectorios cuyos nombres coinciden con grep-find-ignored-directories.
Q expreg RETURN a RETURN (Q expreg RET a RET)
Ejecuta query-replace-regexp en cada uno de los archivos especificados, reemplazando las coincidencias de expreg con la cadena a (dired-do-find-expreg-and-replace).
Este comando es una variante de xref-query-replace-in-results. Presenta un búfer *xref* que enumera todas las coincidencias de expreg, y puede utilizar los comandos especiales de ese búfer (véase Comandos disponibles en el búfer *xref*). En particular, si sale del bucle de reemplazo de la consulta, puede utilizar r (r) en ese búfer para reemplazar más coincidencias. Véase Buscar y reemplazar con identificadores.
Al igual que con dired-do-find-regexp, si alguno de los archivos marcados son directorios, este comando realiza reemplazos en todos los archivos de esos directorios, y en cualquiera de sus subdirectorios, recursivamente, excepto para los archivos cuyos nombres coinciden con grep-find-ignored-files y los subdirectorios cuyos nombres coinciden con grep-find-ignored-directories.

Comandos de Shell en Dired

El comando Dired ! (!, dired-do-shell-command) lee una cadena de comandos shell en el minibuffer, y ejecuta ese comando shell en uno o más archivos. Los archivos sobre los que opera el comando shell se determinan de la forma habitual para los comandos Dired (ver Operar sobre archivos). El comando X (X) es un sinónimo de ! (!).

El comando & (&, dired-do-async-shell-command) hace lo mismo, excepto que ejecuta el comando shell de forma asíncrona. (También se puede hacer esto con ! (!), añadiendo un carácter ‘&’ al final del comando shell). Cuando el comando opera en más de un archivo, ejecuta múltiples copias paralelas del comando shell especificado, una para cada archivo. Como excepción, si el comando shell especificado termina en ‘;’ o ‘;&’, el comando shell se ejecuta en segundo plano en cada archivo de forma secuencial; Emacs espera a que cada comando shell invocado termine antes de ejecutar el siguiente.

Tanto para ! (!) como para & (&), el directorio de trabajo para el comando shell es el directorio de nivel superior del buffer Dired.

Si le dices a ! (!) o a & (&) que operen en más de un archivo, la cadena del comando shell determina cómo se pasan esos archivos al comando shell:

  • Si utiliza ’*’ rodeado de espacios en blanco en la cadena de comandos, el comando se ejecuta sólo una vez, con la lista de nombres de archivos sustituida por el ‘*’. El orden de los nombres de los archivos es el orden de aparición en el buffer de Dired.

    Así, ! tar cf foo.bar * RETURN (! tar cf foo.tar * RET) ejecuta tar en toda la lista de nombres de archivos, poniéndolos en un archivo foo.tar.

    Si desea utilizar ‘*’ como un comodín del shell con espacios en blanco alrededor, escriba ‘*""’. En el shell, esto es equivalente a ‘*’; pero como el ‘*’ no está rodeado de espacios en blanco, Dired no lo trata especialmente.

  • Si la cadena de comandos no contiene ni ‘*’ ni ‘?’ ni ‘?’, Emacs ejecuta el comando del shell una vez por cada archivo, añadiendo el nombre del archivo al final. Por ejemplo, ! uudecode RETURN (! uudecode RET) ejecuta uudecode en cada archivo.

Para iterar sobre los nombres de los archivos de una manera más complicada, es posible que prefiera utilizar un bucle de shell explícito. Por ejemplo, así es como se hace uuencode en cada archivo, haciendo el nombre del archivo de salida añadiendo ‘.uu’ al nombre del archivo de entrada:

for file in * ; do uuencode "$file" "$file" >"$file".uu; done

El mismo ejemplo con la notación ‘?’:

uuencode ? ? > `?`.uu

Los comandos ! (!) y & (&) no intentan actualizar el buffer de Dired para mostrar los archivos nuevos o modificados, porque no saben qué archivos serán cambiados. Utilice el comando g (g) para actualizar el buffer de Dired (vea Actualizar el buffer de Dired).

Transformación de nombres de archivos en Dired

Esta sección describe los comandos de Dired que modifican los nombres de los archivos de forma sistemática. Cada comando opera sobre algunos o todos los archivos marcados, utilizando un nuevo nombre hecho mediante la transformación del nombre existente.

Al igual que los comandos básicos de Dired para la manipulación de archivos (ver Operar con archivos), los comandos descritos aquí operan bien en los siguientes n archivos, o en todos los archivos marcados con ‘*', o en el archivo actual. (Para marcar archivos, utilice los comandos descritos en Marcas y banderas).

Todos los comandos descritos en esta sección funcionan de forma interactiva: le piden que confirme la operación para cada archivo candidato. Por lo tanto, puede seleccionar más archivos de los que realmente necesita operar (por ejemplo, con una expresión regular que coincida con muchos archivos), y luego filtrar los nombres seleccionados escribiendo y (y) o n (n) cuando el comando pida confirmación.

%u (% u)
Cambia el nombre de cada uno de los archivos seleccionados a un nombre en mayúsculas (dired-upcase). Si los antiguos nombres de archivo son foo y bar, los nuevos nombres son FOO y BAR.
%l (% l)
Cambia el nombre de cada uno de los archivos seleccionados a un nombre en minúsculas (dired-downcase). Si los antiguos nombres de archivo son foo y Bar, los nuevos nombres son foo y bar.
%R desde RETURN a RETURN (% R desde RET a RET)
%C desde RETURN a RETURN (% C desde RET a RET)
%H desde RETURN a RETURN (% H desde RET a RET)
%S desde RETURN a RETURN (% S desde RET a RET)
Estos cuatro comandos renombran, copian, hacen enlaces duros y blandos, calculando en cada caso el nuevo nombre por sustitución de expresiones regulares a partir del nombre del archivo antiguo.

Los cuatro comandos de sustitución de expresiones regulares realizan efectivamente una búsqueda y sustitución de los nombres de archivo seleccionados. Leen dos argumentos: una expresión regular desde y un patrón de sustitución a; comparan cada nombre de archivo antiguo con desde y luego reemplazan la parte que coincide con a. Puede usar ’\&’ y ‘\digit’ en a para referirse a todo o parte de lo que el patrón coincida en el nombre de archivo antiguo, como en replace-regexp (ver Reemplazo de Regexp). Si la expresión regular coincide más de una vez en un nombre de archivo, sólo se sustituye la primera coincidencia.

Por ejemplo, %R^.*$ RETURN x-\& RETURN (% R ^.*$ RET x-\& RET) renombra cada archivo seleccionado añadiendo ‘x-’ a su nombre. También es posible la operación inversa, es decir, eliminar la ‘x-’ de cada nombre de archivo: un método es %R^x-\(.*\)$ RETURN \1 RETURN (% R ^x-\(.*\)$ RET \1 RET); otro es %R^x- RETURN RETURN (% R ^x- RET RET). (Use ‘^’ y ‘$’ para anclar las coincidencias que deben abarcar todo el nombre del archivo).

Normalmente, el proceso de sustitución no tiene en cuenta los nombres de directorio de los archivos; opera sobre el nombre del archivo dentro del directorio. Si se especifica un argumento numérico de cero, el reemplazo afecta a todo el nombre de archivo absoluto, incluyendo el nombre del directorio. (Un argumento distinto de cero especifica el número de archivos sobre los que se va a operar).

Es posible que desee seleccionar el conjunto de ficheros sobre los que operar utilizando la misma expresión regular desde la que se utilizará para operar sobre ellos. Para ello, marque esos archivos con %m desde RETURN (% m desde RET), y luego utilice la misma expresión regular en el comando para operar sobre los archivos. Para hacer esto más conveniente, los comandos % (%) para operar sobre los archivos usan la última expresión regular especificada en cualquier comando % (%) como valor por defecto.

Comparación de archivos con Dired

El comando = (=, dired-diff) compara el archivo actual (el archivo en el punto) con otro archivo (leído mediante el minibuffer) utilizando el programa diff. El archivo especificado con el minibuffer es el primer argumento de diff, y el archivo en el punto es el segundo argumento. La salida del programa diff se muestra en un buffer utilizando el modo Diff (ver Comparación de archivos).

Si la región está activa, el valor por defecto para el archivo leído usando el minibuffer es el archivo en la marca (es decir, la marca ordinaria de Emacs, no una marca de Dired; ver Establecer la marca). De otra manera, si el archivo en el punto tiene un archivo de respaldo (ver Archivos de Respaldo), ese es el predeterminado.

También puede comparar archivos usando ediff-files, vea Puntos de Entrada Principales en el Manual de Usuario de Ediff.

Subdirectorios en Dired

Un buffer de Dired suele mostrar sólo un directorio, pero opcionalmente puedes incluir también sus subdirectorios.

La forma más sencilla de incluir múltiples directorios en un buffer de Dired es especificar las opciones ‘-lR’ para ejecutar ls. (Si das un argumento numérico cuando ejecutas Dired, entonces puedes especificar estas opciones en el minibuffer). Esto produce un listado de directorios recursivo que muestra todos los subdirectorios en todos

Más a menudo, querrá mostrar sólo subdirectorios específicos. Puede hacerlo con:

i (i)
Inserta el contenido de un subdirectorio más adelante en el buffer (dired-maybe-insert-subdir).

Si usa este comando en una línea que describe un archivo que es un directorio, inserta el contenido de ese directorio en el mismo buffer de Dired, y se mueve allí. El contenido del subdirectorio insertado sigue al directorio de nivel superior del buffer Dired, al igual que en la salida de ‘ls -lR’.

Si el contenido del subdirectorio ya está presente en el buffer, el comando i (i) simplemente se mueve hacia él.

En cualquier caso, i (i) establece la marca Emacs antes de moverse, por lo que Ctrl-u Ctrl-SPACE (C-u C-SPC) vuelve a su posición anterior en el buffer Dired (ver Estableciendo la marca). También puedes usar ‘^’ para volver al directorio padre en el mismo buffer Dired (ver Visitando archivos en Dired).

Use el comando l (l, dired-do-redisplay) para actualizar el contenido del subdirectorio, y utilice Ctrl-u k (C-u k) en la línea de la cabecera del subdirectorio para eliminar el listado del subdirectorio (véase Actualización del buffer Dired). También puede ocultar y mostrar los subdirectorios insertados (ver Ocultación de subdirectorios).

Interruptores de subdirectorios en Dired

Puede insertar subdirectorios con interruptores ls especificados en los buffers de Dired usando Ctrl-u i (C-u i). Puede cambiar los interruptores ls de un subdirectorio ya insertado en el punto usando Ctrl-u l (C-u l).

Dired conserva los interruptores si revierte el buffer. Al borrar un subdirectorio se olvidan sus interruptores.

El uso de dired-undo (ver Dired Marks vs. Flags) para reinsertar o borrar subdirectorios que fueron insertados con switches explícitos puede evitar la maquinaria de Dired para recordar (u olvidar) los switches. Borrar un subdirectorio usando dired-undo no olvida sus interruptores. Cuando se reinserta más tarde usando i (i), se reinserta usando sus antiguos interruptores. El uso de dired-undo para reinsertar un subdirectorio que fue borrado usando los comandos regulares de Dired (no dired-undo) lo insertará originalmente con sus antiguos interruptores. Sin embargo, si se revierte el buffer, se volverá a listar utilizando los interruptores por defecto del buffer. Si algo de esto da problemas, puede corregir fácilmente la situación usando Ctrl-u i (C-u i) o Ctrl-u l (C-u l).

Dired no recuerda el interruptor R (R). Insertar un subdirectorio con interruptores que incluyan a este interruptor es equivalente a insertar cada uno de sus subdirectorios utilizando todos los interruptores restantes. Por ejemplo, si se actualiza o se elimina un subdirectorio insertado con el modificador ‘R’, no se actualizarán ni eliminarán sus subdirectorios.

Los interruptores por defecto del buffer no afectan a los subdirectorios que fueron insertados usando interruptores explícitamente especificados. En particular, los comandos como s que cambian los interruptores del búfer no afectan a dichos subdirectorios. (Sin embargo, sí afectan a los subdirectorios sin interruptores asignados explícitamente).

Puedes hacer que Dired se olvide de todos los interruptores de los subdirectorios y vuelva a listar todos los subdirectorios con los interruptores por defecto del buffer usando Alt-x dired-reset-subdir-switches (M-x dired-reset-subdir-switches). Esto también revierte el buffer de Dired.

Desplazamiento por subdirectorios

Cuando un búfer Dired enumera subdirectorios, puede utilizar los comandos de movimiento de página Ctrl-x [ (C-x [) y Ctrl-x ] (C-x ]) para moverse por directorios enteros (ver Páginas).

Los siguientes comandos se mueven a través, hacia arriba y hacia abajo en el árbol de directorios dentro de un buffer Dired. Se mueven a las líneas de cabecera del directorio, que son las líneas que dan el nombre de un directorio, al principio del contenido del directorio.

Ctrl-Alt-n (C-M-n)
Va a la siguiente línea de cabecera del subdirectorio, independientemente del nivel (dired-next-subdir).
Ctrl-Alt-p (C-M-p)
Va a la línea de cabecera del subdirectorio anterior, independientemente del nivel (dired-prev-subdir).
Ctrl-Alt-u (C-M-u)
Sube a la línea de cabecera del directorio padre (dired-tree-up).
Ctrl-Alt-d (C-M-d)
Baja en el árbol de directorios, hasta la línea de cabecera del primer subdirectorio (dired-tree-down).
< (<)
Sube a la línea anterior del archivo de directorio (dired-prev-dirline). Estas líneas son las que describen un directorio como un archivo en su directorio padre.
> (>)
Baja a la siguiente línea de archivo de directorio (dired-next-dirline).

Ocultación de subdirectorios

Ocultar un subdirectorio significa hacerlo invisible, excepto por su línea de cabecera.

$ ($)
Oculta o muestra el subdirectorio en el que se encuentra el punto, y mueve el punto al siguiente subdirectorio (dired-hide-subdir). Esto es una conmutación. Un argumento numérico sirve como cuenta de repetición.
Alt-$ (M-$)
Oculta todos los subdirectorios en este buffer Dired, dejando sólo sus líneas de cabecera (dired-hide-all). O, si algún subdirectorio está actualmente oculto, hacer visibles todos los subdirectorios de nuevo. Puede utilizar este comando para obtener una visión general en árboles de directorios muy profundos o para desplazarse rápidamente a subdirectorios lejanos.

Los comandos ordinarios de Dired nunca tienen en cuenta los archivos dentro de un subdirectorio oculto. Por ejemplo, los comandos para operar sobre archivos marcados ignoran los archivos en directorios ocultos aunque estén marcados. Por lo tanto, puede utilizar la ocultación para excluir temporalmente los subdirectorios de las operaciones sin tener que eliminar las marcas de Dired en los archivos de esos subdirectorios.

Vea Subdirectorios en Dired, para saber cómo insertar un listado de subdirectorios, y vea Actualización del Buffer de Dired, para saber cómo eliminarlo.

Actualización del buffer de Dired

Esta sección describe los comandos para actualizar el buffer Dired para reflejar los cambios externos (no-Dired) en los directorios y archivos, y para eliminar parte del buffer Dired.

g (g)
Actualiza todo el contenido del buffer Dired (revert-buffer).
l (l)
Actualiza los archivos especificados (dired-do-redisplay). Los archivos se especifican para l de la misma manera que para las operaciones de archivo.
k (k)
Elimina las líneas de los archivos especificados -no los archivos, sólo las líneas (dired-do-kill-lines).
s (s)
Alterna entre el orden alfabético y el orden fecha/hora (dired-sort-toggle-or-edit).
Ctrl-x u (C-u s interruptores RET)
Refresca el buffer de Dired utilizando los interruptores como dired-listing-switches.

Escriba g (g, revert-buffer) para actualizar el contenido del buffer Dired, basándose en los cambios en los archivos y directorios listados. Esto preserva todas las marcas excepto las de los archivos que han desaparecido. Los subdirectorios ocultos se actualizan pero permanecen ocultos.

Para actualizar sólo algunos de los archivos, escriba l (l, dired-do-redisplay). Al igual que los comandos de operación de archivos de Dired, este comando opera sobre los siguientes n archivos (o archivos anteriores -n), o sobre los archivos marcados si los hay, o sobre el archivo actual. Actualizar los archivos significa leer su estado actual, y luego actualizar sus líneas en el buffer para indicar ese estado.

Si se utiliza l en una línea de cabecera de un subdirectorio, se actualiza el contenido del subdirectorio correspondiente.

Si usa Ctrl-x d (C-x d) o algún otro comando de Dired para visitar un directorio que ya está siendo mostrado en un buffer de Dired, Dired cambia a ese buffer pero no lo actualiza. Si el buffer no está actualizado, Dired muestra una advertencia diciéndole que escriba g (g) para actualizarlo. También puede decirle a Emacs que revierta cada buffer Dired automáticamente cuando lo vuelva a visitar, estableciendo la variable dired-auto-revert-buffer a un valor no nulo.

Para borrar las líneas de los archivos del buffer -sin llegar a borrar los archivos- escriba k (k, dired-do-kill-lines). Al igual que los comandos de operación de archivos, este comando opera sobre los siguientes n archivos, o sobre los archivos marcados si los hay. Sin embargo, no opera sobre el archivo actual, ya que de lo contrario escribir mal k (k) podría ser molesto.

Si utiliza k (k) para matar la línea de un fichero de directorio que había insertado en el buffer de Dired como subdirectorio (ver Subdirectorios en Dired), elimina también el listado de subdirectorios. Escribir Ctrl-u k (C-u k) en la línea de cabecera de un subdirectorio también elimina la línea del subdirectorio del buffer de Dired.

El comando g (g) devuelve cualquier línea individual que haya eliminado de esta manera, pero no los subdirectorios, debe usar i (i) para reinsertar un subdirectorio.

Los archivos de un buffer Dired se listan normalmente en orden alfabético por nombres de archivo. Alternativamente Dired puede ordenarlos por fecha/hora. El comando Dired s (s, dired-sort-toggle-or-edit) cambia entre estos dos modos de ordenación. La línea de modo en un búfer Dired indica de qué manera está actualmente ordenado por nombre, o por fecha.

Ctrl-u s cambia RETURN (C-u s cambia RET) permite especificar un nuevo valor para dired-listing-switches.

Dired y find

Puede seleccionar un conjunto de archivos para su visualización en un búfer Dired de forma más flexible utilizando la utilidad find para elegir los archivos.

Para buscar archivos con nombres que coincidan con un patrón comodín, utilice Alt-x find-name-dired (M-x find-name-dired). Lee los argumentos directorio y patrón, y elige todos los archivos del directorio o sus subdirectorios cuyos nombres individuales coincidan con el patrón.

Los archivos así elegidos se muestran en un buffer de Dired, en el que están disponibles los comandos ordinarios de Dired.

Si desea comprobar el contenido de los archivos, en lugar de sus nombres, utilice Alt-x find-grep-dired (M-x find-grep-dired). Este comando lee dos argumentos del minibuffer, directorio y expreg; elige todos los archivos en el directorio o sus subdirectorios que contienen una coincidencia para expreg. Funciona ejecutando los programas find y grep. Véase también M-x grep-find, en Searching with Grep under Emacs. Recuerde escribir la expresión regular para grep, no para Emacs. (Un método alternativo para mostrar los archivos cuyo contenido coincide con una expreg dada es el comando %g expreg (% g expreg), ver Marcas Directo vs. Banderas).

El comando más general de esta serie es Alt-x find-dired (M-x find-dired), que permite especificar cualquier condición que find pueda probar. Toma dos argumentos del minibuffer, directorio y find-args; ejecuta find en el directorio, pasando find-args para decirle a find qué condición debe probar. Para usar este comando, necesita saber cómo usar find.

El formato del listado producido por estos comandos es controlado por la variable find-ls-option. Se trata de un par de opciones; la primera especifica cómo llamar a find para producir el listado de archivos, y la segunda le dice a Dired que analice la salida.

El comando Alt-x locate (M-x locate) proporciona una interfaz similar al programa locate. Alt-x locate-with-filter (M-x locate-with-filter) es similar, pero mantiene sólo los archivos cuyos nombres coinciden con una expresión regular dada.

Estos búferes no funcionan del todo como los búferes ordinarios de Dired: las operaciones con archivos funcionan, pero no siempreq actualizan automáticamente el búfer. Al revertir el buffer con g (g) se borran todos los subdirectorios insertados, y se borran todas las banderas y marcas.

Editar el buffer Dired

Wdired es un modo especial que le permite realizar operaciones de archivo editando directamente el buffer Dired (la "W" de "Wdired" significa "escribible"). Para entrar en el modo Wdired, escribe Ctrl-x Ctrl-q (C-x C-q, dired-toggle-read-only) mientras estás en un buffer Dired. También puede utilizar la opción de menú ‘Inmediate / Edit Files Names’ ("Inmediato / Editar nombres de archivos").

En el modo Wdired, puedes renombrar archivos editando los nombres de los archivos que aparecen en el buffer Dired. Todos los comandos ordinarios de edición de Emacs, incluyendo las operaciones de rectángulo y query-replace, están disponibles para esto. Una vez que haya terminado de editar, escriba (C-c C-c, wdired-finish-edit). Esto aplica los cambios y vuelve al modo ordinario de Dired.

Además de cambiar el nombre de los archivos, puedes mover un archivo a otro directorio escribiendo el nuevo nombre del archivo (ya sea absoluto o relativo). Para marcar un archivo para su eliminación, borre todo el nombre del archivo. Para cambiar el destino de un enlace simbólico, edite el nombre de destino del enlace que aparece junto al nombre del enlace.

Si edita los nombres de archivo para crear un nuevo subdirectorio, Wdired creará automáticamente estos nuevos directorios. Para inhibir este comportamiento, establezca wdired-create-parent-directories a nil.

El resto del texto en el buffer, como los tamaños de los archivos y las fechas de modificación, está marcado como de sólo lectura, por lo que no se puede editar. Sin embargo, si establece wdired-allow-to-change-permissions como t, puede editar los permisos de los archivos. Por ejemplo, puede cambiar ‘-rw-r--r--’ a ‘-rw-rw-’ para hacer que un archivo sea de escritura global. Estos cambios también tienen efecto cuando se escribe Ctrl-c Ctrl-c (C-c C-c).

Visualización de miniaturas de imágenes en Dired

Image-Dired es una herramienta para navegar por archivos de imagen. Ofrece la posibilidad de ver las imágenes como miniaturas o en tamaño completo, ya sea dentro de Emacs o a través de un visor externo. Esto es diferente del modo Imagen (ver Ver Archivos de Imagen) para visitar un archivo de imagen en el buffer de Emacs.

Para entrar en Image-Dired, marque los archivos de imagen que quiera ver en el buffer de Dired, usando m como de costumbre. Luego escriba Ctrl-t d (C-t d, image-dired-display-thumbs). Esto crea y cambia a un buffer que contiene imagen-dired, correspondiente a los archivos marcados.

También puede entrar directamente en Image-Dired escribiendo Alt-x image-dired (M-x image-dired). Esto pide un directorio; especifique uno que tenga archivos de imagen. Esto crea miniaturas para todas las imágenes en ese directorio, y las muestra todas en el buffer de miniaturas. Las miniaturas se generan en segundo plano y se cargan a medida que están disponibles. Este comando pide confirmación si el número de archivos de imagen excede image-dired-show-all-from-dir-max-files.

Con un punto en el buffer de imágenes en miniatura, puede escribir RETURN (RET, image-dired-display-thumbnail-original-image) para mostrar una versión de tamaño reducido de la misma en otra ventana. Esto hace que la imagen se ajuste a la ventana. Use las teclas de flecha para desplazarse por la memoria intermedia. Para facilitar la navegación, utilice SPACE (SPC, image-dired-display-next-thumbnail-original) para avanzar y mostrar la siguiente imagen. Si se escribe DEL (DEL, image-dired-display-previous-thumbnail-original) se retrocede a la miniatura anterior y se muestra ésta.

Para ver la imagen en su tamaño original, proporcione un argumento de prefijo Ctrl-u (C-u) antes de pulsar RETURN (RET), o escriba Ctrl-RETURN (C-RET, image-dired-thumbnail-display-external) para mostrar la imagen en un visor externo. Primero debe configurar image-dired-external-viewer.

También puede borrar imágenes a través de Image-Dired. Escriba d (d, image-dired-flag-thumb-original-file) para marcar el archivo de imagen para su eliminación en el buffer Dired. También puede eliminar la imagen en miniatura del búfer de miniaturas con Ctrl-d (C-d, image-dired-delete-char).

Entre las funciones más avanzadas se encuentran las etiquetas de imagen, que son metadatos utilizados para categorizar los archivos de imagen. Las etiquetas se almacenan en un archivo de texto plano configurado por image-dired-db-file.

Para etiquetar archivos de imagen, márquelos en el búfer de Dired (también puede marcar archivos en Dired desde el búfer de miniaturas escribiendo m (m)) y escriba Ctrl-t t (C-t t, image-dired-tag-files). Esto lee el nombre de la etiqueta en el minibuffer. Para marcar archivos con una determinada etiqueta, escriba Ctrl-t f (C-t f, image-dired-mark-tagged-files). Después de marcar los archivos de imagen con una determinada etiqueta, puede utilizar Ctrl-t d (C-t d) para verlos.

También puede marcar un archivo directamente desde el buffer de miniaturas escribiendo tt (t t) y puede eliminar una etiqueta escribiendo tr (t r). También hay una etiqueta especial llamada "comment" ("comentario") para cada archivo (no es una etiqueta en el mismo sentido que las otras etiquetas, se maneja de forma ligeramente diferente). Se utiliza para introducir un comentario o descripción sobre la imagen. Para comentar un archivo desde el búfer de miniaturas, escriba c (c). Se le pedirá un comentario. Escriba Ctrl-t c (C-t c, image-dired-comment-files) para añadir un comentario desde Dired.

Los archivos marcados en Dired también se marcarán en Image-Dired si image-dired-thumb-visible-marks no es nulo (que es el valor por defecto).

Image-Dired también proporciona una manipulación sencilla de las imágenes. En el búfer de miniaturas, escriba L (L) para girar la imagen original 90 grados en el sentido contrario a las agujas del reloj, y R (R) para girarla 90 grados en el sentido de las agujas del reloj. Esta rotación no tiene pérdidas y utiliza una utilidad externa llamada jpegtran, que debe instalarse primero.

Otras funciones de Dired

El comando + (+, dired-create-directory) lee el nombre de un directorio y lo crea. Señala un error si el directorio ya existe.

El comando dired-create-empty-file lee el nombre de un archivo y lo crea. Señala un error si el archivo ya existe.

El comando Alt-s a Ctrl-s (M-s a C-s, dired-do-isearch) comienza una búsqueda incremental de varios archivos en los archivos marcados. Si la búsqueda falla al final de un fichero, al teclear Ctrl-s (C-s) se avanza al siguiente fichero marcado y se repite la búsqueda; al final del último fichero marcado, la búsqueda vuelve al primer fichero marcado. El comando Alt-s a Alt-Ctrl-s (M-s a M-C-s, dired-do-isearch-regexp) hace lo mismo con una búsqueda de expresión regular. Véase Repetición de la búsqueda incremental, para obtener información sobre la repetición de la búsqueda.

El comando w (w, dired-copy-filename-as-kill) pone los nombres de los archivos marcados (o los n siguientes) en el anillo de muerte, como si los hubiera matado con Ctrl-w (C-w). Los nombres están separados por un espacio.

Con un argumento de prefijo cero, esto utiliza el nombre absoluto de cada archivo marcado. Con sólo Ctrl-u (C-u) como argumento de prefijo, utiliza nombres de archivo relativos al directorio por defecto del buffer Dired. (Este puede seguir conteniendo barras si está en un subdirectorio.) Como caso especial, si el punto está en una línea de cabecera de directorio, w (w) le da el nombre absoluto de ese directorio. Cualquier argumento de prefijo o archivos marcados se ignoran en este caso.

El propósito principal de este comando es que Usted pueda tirar los nombres de los archivos en argumentos para otros comandos de Emacs. También muestra lo que ha añadido al anillo de la muerte, por lo que puede utilizarlo para mostrar la lista de archivos marcados actualmente en el área de eco.

Si tiene un archivo HTML en el listado de archivos, puede ser útil para ver ese archivo con un navegador. El comando W (W, browse-url-of-dired-file) utilizará el navegador estándar configurado para ver ese archivo.

El comando ( ((, dired-hide-details-mode) activa si los detalles, como la propiedad o los permisos de los archivos, son visibles en el buffer actual de Dired. Por defecto, también oculta los destinos de los enlaces simbólicos, y todas las líneas que no sean la línea de cabecera y los listados de archivos/directorios. Para cambiar esto, personalice las opciones dired-hide-details-hide-symlink-targets y dired-hide-details-hide-information-lines, respectivamente.

Si el directorio que está visitando está bajo control de versiones (ver Control de versiones), entonces los comandos normales de VC diff y log operarán en los archivos seleccionados.

El comando Alt-x dired-compare-directories (M-x dired-compare-directories) se utiliza para comparar el buffer actual de Dired con otro directorio. Marca todos los archivos que difieren entre los dos directorios. Pone estas marcas en todos los buffers de Dired en los que aparecen estos archivos, lo que incluye, por supuesto, el buffer actual.

El método de comparación por defecto (utilizado si se escribe RETURN (RET) en el prompt) es comparar sólo los nombres de los ficheros, los nombres de los ficheros difieren si no aparecen en el otro directorio. Puede especificar comparaciones más estrictas introduciendo una expresión Lisp, que puede referirse a las variables size1 y size2, los tamaños respectivos de los archivos; mtime1 y mtime2, los tiempos de la última modificación en segundos, como números de punto flotante; y fa1 y fa2, las listas respectivas de atributos de los archivos (devueltas por la función file-attributes). Esta expresión se evalúa para cada par de archivos con nombres similares, y los archivos difieren si el valor de la expresión no es nulo.

Por ejemplo, la secuencia Alt-x dired-compare-directories RETURN (> mtime1 mtime2) RETURN (M-x dired-compare-directories RET (> mtime1 mtime2) RET) marca los archivos más nuevos en este directorio que en el otro, y marca los archivos más antiguos en el otro directorio que en éste. También marca los ficheros sin contrapartida, en ambos directorios, como siempre.

En el sistema X Window, Emacs soporta el protocolo de arrastrar y soltar. Puedes arrastrar un objeto de archivo desde otro programa, y soltarlo en un buffer de Dired; esto mueve, copia o crea un enlace al archivo en ese directorio. El programa de origen determina exactamente qué acción se lleva a cabo. Arrastrar archivos fuera de un buffer Dired no está soportado actualmente.



El calendario y la agenda

Emacs ofrece las funciones de un calendario de escritorio, con una agenda de eventos planificados o pasados. También tiene facilidades para gestionar sus citas, y llevar la cuenta del tiempo que pasa trabajando en determinados proyectos.

Para entrar en el calendario, escriba Alt-x calendar (M-x calendar). Esto muestra un calendario de tres meses centrado en el mes actual, con el punto en la fecha actual. Con un argumento numérico, como en Ctrl-u Alt-x calendar (C-u M-x calendar), le pide el mes y el año que debe ser el centro del calendario de tres meses. El calendario utiliza su propio búfer, cuyo modo principal es el de Calendario.

Con (ratón-3) en el calendario aparece un menú de operaciones sobre una fecha concreta; con (ratón-2) aparece un menú de funciones de calendario de uso común que son independientes de cualquier fecha concreta. Para salir del calendario, escriba q (q).

Movimiento en el calendario

El modo de calendario proporciona comandos para moverse a través del calendario en unidades lógicas de tiempo como días, semanas, meses y años. Si se desplaza fuera de los tres meses mostrados originalmente, la pantalla del calendario se desplaza automáticamente en el tiempo para hacer visible la fecha seleccionada. Desplazarse a una fecha le permite ver sus días festivos o entradas de la agenda, o convertirla a otros calendarios; desplazarse por largos periodos de tiempo también es útil simplemente para desplazar el calendario.

Movimiento por longitudes de tiempo estándar

Los comandos para el movimiento en la memoria del calendario son paralelos a los comandos para el movimiento en el texto. Puede avanzar y retroceder por días, semanas, meses y años.

Ctrl-f (C-f)
Mueve el punto un día hacia adelante (calendar-forward-day).
Ctrl-b (C-b)
Mueve el punto un día hacia atrás (calendar-backward-day).
Ctrl-n (C-n)
Mueve un punto una semana hacia adelante (calendar-forward-week).
Ctrl-p (C-p)
Mueve un punto una semana hacia atrás (calendar-backward-week).
Alt-} (M-} )
Mueve el punto un mes hacia adelante (calendar-forward-month).
Alt-{ (M-{ )
Mueve un punto un mes hacia atrás (calendar-backward-month).
Ctrl-[ (C-[ )
Mueve el punto un año hacia adelante (calendar-forward-year).
Ctrl-] (C-] )
Mueve el punto un año hacia adelante (calendar-forward-year).

Los comandos de día y semana son análogos naturales de los comandos habituales de Emacs para moverse por caracteres y por líneas. Al igual que Ctrl-n (C-n) suele moverse a la misma columna de la línea siguiente, en el modo Calendario se mueve al mismo día de la semana siguiente. Y Ctrl-p (C-p) se mueve al mismo día de la semana anterior.

Las teclas de flecha equivalen a Ctrl-f (C-f), Ctrl-b (C-b), Ctrl-n (C-n) y Ctrl-p (C-p), igual que normalmente en otros modos.

Los comandos para el movimiento por meses y años funcionan como los de las semanas, pero se mueven una distancia mayor. Los comandos de mes Alt-} (M-} ) y Alt-{ (M-{ ) avanzan o retroceden un mes entero. Los comandos de año Ctrl-x ] (C-x ] ) y Ctrl-x [ (C-x [ ) avanzan o retroceden un año entero.

La forma más fácil de recordar estos comandos es considerar los meses y los años análogos a los párrafos y las páginas de un texto, respectivamente. Pero los comandos de movimiento del calendario en sí mismos no son del todo paralelos a los de movimiento a través del texto: los comandos ordinarios de párrafo de Emacs se mueven al principio o al final de un párrafo, mientras que estos comandos de mes y año se mueven por un mes entero o un año entero, manteniendo la misma fecha dentro del mes o el año.

Todos estos comandos aceptan un argumento numérico como cuenta de repetición. Por comodidad, las teclas de dígitos y el signo menos especifican argumentos numéricos en el modo Calendario incluso sin el modificador Meta. Por ejemplo, 100 Ctrl-f (100 C-f) mueve el punto 100 días hacia adelante desde su ubicación actual.

Comienzo o fin de semana, mes o año

Una semana (o un mes, o un año) no es sólo una cantidad de días; pensamos en las semanas (los meses, los años) como algo que comienza en fechas concretas. Por ello, el modo Calendario ofrece comandos para desplazarse al principio o al final de una semana, un mes o un año:

Ctrl-a (C-a)
Mueve el punto al principio de la semana (calendar-beginning-of-week).
Ctrl-e (C-e)
Mueve el punto al final de la semana (calendar-end-of-week).
Alt-a (M-a)
Mueve el punto al principio del mes (calendar-beginning-of-month).
Alt-e (M-e)
Mueve el punto a final de mes (calendar-end-of-month).
Alt-< (M-<)
Mueve el punto al principio del año (calendar-beginning-of-year).
Alt-> (M->)
Mueve el punto al final del año (calendar-end-of-year).

Estos comandos también toman argumentos numéricos como cuentas de repetición, con la cuenta de repetición indicando cuántas semanas, meses o años se moverán hacia atrás o hacia adelante.

Por defecto, las semanas comienzan en domingo. Para que empiecen el lunes, establezca la variable calendar-week-start-day en 1. Para cambiar las cabeceras de los días que se resaltan como días de fin de semana, establezca la variable calendar-weekend-days.

Fechas específicas

El modo calendario proporciona comandos para desplazarse a una fecha concreta especificada de varias maneras.

gd (g d)
Mueve el punto a la fecha especificada (calendar-goto-date).
gD (g D)
Mueve el punto al día del año especificado (calendar-goto-day-of-year).
gw (g w)
Mueve el punto a la semana especificada del año (calendar-iso-goto-week).
o (o)
Centra el calendario en el mes especificado (calendar-other-month).
. (.)
Mueve el punto a la fecha de hoy (calendar-goto-today).

gd (g d, calendar-goto-date) pide un año, un mes y un día del mes, y luego se mueve a esa fecha. Dado que el calendario incluye todas las fechas desde el comienzo de la era actual, debe escribir el año en su totalidad; es decir, escribe ‘2010’, no ‘10’.

gD (g D, calendar-goto-day-of-year) solicita un número de año y de día, y se mueve a esa fecha. Los números de días negativos cuentan hacia atrás desde el final del año. gw (g w, calendar-iso-goto-week) solicita un año y un número de semana, y se mueve a esa semana.

o (o, calendar-other-month) solicita un mes y un año, y centra el calendario de tres meses en torno a ese mes.

Puede volver a la fecha actual con . (., calendar-goto-today).

Desplazamiento en el calendario

La pantalla del calendario se desplaza automáticamente por el tiempo cuando se sale de la parte visible. También puede desplazarse manualmente. Imagine que la ventana del calendario contiene una larga tira de papel con los meses. Desplazar el calendario significa mover la tira horizontalmente, de modo que los nuevos meses se hagan visibles en la ventana.

> (>)
Desplaza el calendario un mes hacia delante (calendar-scroll-left).
< (<)
Desplaza el calendario un mes hacia atrás (calendar-scroll-right).
Ctrl-v (C-v)
PageDown
Siguiente
Desplaza el calendario tres meses hacia delante (calendar-scroll-left-three-months).
Alt-v (Alt-v)
PageUp
anterior
Desplazarse hacia atrás tres meses (calendar-scroll-right-three-month).

Los comandos de desplazamiento del calendario más básicos se desplazan un mes cada vez. Esto significa que hay dos meses de solapamiento entre la visualización antes del comando y la visualización después. > (>) desplaza el contenido del calendario un mes hacia adelante. < (<) desplaza el contenido un mes hacia atrás.

Los comandos Ctrl-v (C-v) y Alt-v (M-v) desplazan el calendario por una pantalla entera -tres meses- en analogía con el significado habitual de estos comandos. Ctrl-v (C-v) hace visibles las fechas posteriores y Alt-v (M-v) hace visibles las fechas anteriores. Estos comandos toman un argumento numérico como cuenta de repetición; en particular, dado que Ctrl-u (C-u) multiplica el siguiente comando por cuatro, al escribir Ctrl-u Ctrl-v (C-u C-v) se desplaza el calendario hacia adelante un año y al escribir Ctrl-u Alt-v (C-u M-v) se desplaza el calendario hacia atrás un año.

Las teclas de función PageDown (o next (siguiente)) y PageUp (o prior (anterior)) son equivalentes a Ctrl-v (C-v) y Alt-v (M-v), al igual que en otros modos.

Contar los días

Alt-= (M-=)
Muestra el número de días en la región actual (calendar-count-days-region).

Para determinar el número de días de un intervalo, coloque la marca en una fecha utilizando Ctrl-SPACE (C-SPC), mueva el punto a otra fecha y escriba Alt-= (M-=, calendar-count-days-region). El número de días mostrado es inclusivo; es decir, incluye los días especificados por la marca y el punto.

Varios comandos del calendario

pd (p d)
Muestra el día en el año (calendar-print-day-of-year).
Ctrl-c Ctrl-l (C-c C-l)
Regenera la ventana del calendario (calendar-redraw).
SPACE (SPC)
Desplaza la siguiente ventana hacia arriba (scroll-other-window).
DEL (DEL)
Shift-SPACE (S-SPC)
Desplaza la ventana siguiente hacia abajo (scroll-other-window-down).
q (q)
Sale de la agenda (calendar-exit).

Para mostrar el número de días transcurridos desde el comienzo del año, o el número de días que quedan en el año, escriba el comando pd (p d, calendar-print-day-of-year). Esto muestra ambos números en el área de eco. El recuento de días transcurridos incluye la fecha seleccionada. El recuento de días restantes no incluye esa fecha.

Si el texto de la ventana del calendario se corrompe, escriba Ctrl-c Ctrl-l (C-c C-l, calendar-redraw) para volver a dibujarlo. (Esto sólo puede ocurrir si utilizas comandos de edición que no sean del modo Calendario).

En el modo Calendario, puede utiliza SPCACE (SPC, scroll-other-window) y DEL (DEL, scroll-other-window-down) para desplazar la otra ventana (si la hay) hacia arriba o hacia abajo, respectivamente. Esto es útil cuando se muestra una lista de vacaciones o entradas de la agenda en otra ventana.

Para salir de la agenda, escriba q (q, calendar-exit). Esto entierra todos los búferes relacionados con el calendario, seleccionando otros búferes. (Si un marco contiene una ventana dedicada al calendario, al salir del calendario se borra o se iconiza ese marco dependiendo del valor de calendar-remove-frame-by-deleting).

Escribir archivos de calendario

Puede escribir calendarios y entradas de diario en archivos HTML y LaTeX.

Los comandos HTML del Calendario producen archivos de código HTML que contienen entradas de calendario, vacaciones y agenda. Cada archivo se aplica a un mes y tiene un nombre con el formato aaaa-mm.html, donde aaaa y mm son los cuatro dígitos del año y los dos dígitos del mes, respectivamente. La variable cal-html-directory especifica el directorio de salida por defecto para los archivos HTML. Para evitar que se muestren los días festivos, personalice cal-html-holidays.

Las entradas del diario encerradas por < y > se interpretan como etiquetas HTML (por ejemplo: esta es una entrada del diario con algún texto rojo (<font color="red">algún texto rojo</font>)). Puede cambiar la apariencia general de las páginas HTML mostradas (por ejemplo, el color de varios elementos de la página, los estilos de la cabecera) a través de una hoja de estilo cal.css en el directorio que contiene los archivos HTML (vea el valor de la variable cal-html-css-default para los ajustes de estilo relevantes).

Hm (H m)
Genera un calendario de un mes (cal-html-cursor-month).
Hy (H y)
Genera un archivo de calendario para cada mes de un año, así como una página de índice (cal-html-cursor-year). Por defecto, este comando escribe los archivos en un subdirectorio aaaa; si se modifica, algunos hipervínculos entre años no funcionarán.

Si la variable cal-html-print-day-number-flag no es nula, los calendarios mensuales muestran el número del día del año. La variable cal-html-year-index-cols especifica el número de columnas en la página del índice anual.

Los comandos Calendar LaTeX producen un buffer de código LaTeX que se imprime como un calendario. Dependiendo del comando que utilice, el calendario impreso cubre el día, la semana, el mes o el año en que se encuentra ese punto.

tm (t m)
Genera un calendario de un mes (cal-tex-cursor-month).
td (t d)
Genera un calendario de un día (cal-tex-cursor-day).
tM (t M)
Genera un calendario de un mes con impresión lateral (cal-tex-cursor-month-landscape).
tw1 (t w 1)
Genera un calendario de una página para una semana, con horas (cal-tex-cursor-week).
t22 (t w 2)
Genera un calendario de dos páginas para una semana, con horas (cal-tex-cursor-week2).
tw3 (t w 3)
Genera un calendario de estilo ISO para una semana, sin horas (cal-tex-cursor-week-iso).
rw4 (t w 4)
Genera un calendario para una semana a partir del lunes, con horas (cal-tex-cursor-week-monday).
twW (t w W)
Genera un calendario de dos páginas para una semana, sin horas (cal-tex-cursor-week2-summary).
tfw (t f w)
Genera un calendario de dos semanas al estilo Filofax (cal-tex-cursor-filofax-2week).
tfW (t f W)
Genera un calendario de una semana al estilo Filofax (cal-tex-cursor-filofax-week).
ty (t y)
Genera un calendario para un año (cal-tex-cursor-year).
tY (t Y)
Genera un calendario de impresión lateral para un año (cal-tex-cursor-year-landscape).
tfy (t f y)
Genera un calendario estilo Filofax para un año (cal-tex-cursor-filofax-year).

Algunos de estos comandos imprimen el calendario de lado (en modo horizontal), por lo que puede ser más ancho que largo. Algunos de ellos utilizan el tamaño de papel Filofax (3,75in x 6,75in). Todos estos comandos aceptan un argumento de prefijo, que especifica cuántos días, semanas, meses o años hay que imprimir (empezando siempre por el seleccionado).

Si la variable cal-tex-holidays es no nula (el valor por defecto), los calendarios impresos muestran los días festivos en calendar-holidays. Si la variable cal-tex-diary es no nula (por defecto es nula), se incluyen también las entradas de la agenda (sólo en los calendarios mensuales, Filofax e isosemanal). Si la variable cal-tex-rules no es nula (por defecto es nula), el calendario muestra las páginas rayadas en los estilos que tienen suficiente espacio. Consulte la documentación de las funciones individuales de cal-tex para ver qué calendarios soportan qué características.

Puede utilizar la variable cal-tex-preamble-extra para insertar comandos LaTeX adicionales en el preámbulo del documento generado si lo necesita.

Días festivos

El calendario de Emacs conoce muchos días festivos mayores y menores, y puede mostrarlos. Puedes añadir tus propios días festivos a la lista por defecto.

Día Festivo (ratón-3 Día Festivo)
h (h)
Muestra los días festivos para la fecha seleccionada (calendar-cursor-holyday).
x (x)
Marca los días festivos en la ventana del calendario (calendar-mark-holyday).
u (u)
Desmarca la ventana del calendario (calendar-unmark).
a (a)
Lista todos los días festivos de los tres meses mostrados en otra ventana (calendar-list-holidays).
Alt-x holidays (M-x holidays)
Lista todos los días festivos de los tres meses alrededor de la fecha actual en otra ventana.
Alt-x list-holidays (M-x list-holidays)
Lista en otra ventana los días festivos de un rango de años especificado.

Para ver si algún día festivo cae en una fecha determinada, sitúe el punto en esa fecha en la ventana del calendario y utilice el comando h (h). O bien, haga clic en esa fecha con (ratón-3) y luego elija Holidays (días festivos) en el menú que aparece. De cualquier manera, esto muestra los días festivos para esa fecha, en el área de eco si caben allí, de lo contrario en una ventana separada.

Para ver la distribución de los días festivos para todas las fechas mostradas en el calendario, utilice el comando x (x). Esto muestra las fechas que son festivas en una cara diferente. Ver calendario-festivo-marcador (calendar-holiday-marker). El comando se aplica tanto a los meses actualmente visibles como a otros meses que posteriormente se hagan visibles al desplazarse. Para desactivar el marcado y borrar las marcas actuales, escriba u (u), que también borra las marcas de la agenda (véase La agenda). Si la variable calendar-mark-holidays-flag es no nula, la creación o actualización del calendario marca los días festivos automáticamente.

Para obtener información aún más detallada, utilice el comando a (a), que muestra un búfer separado que contiene una lista de todos los días festivos en el rango actual de tres meses. Puede utilizar SPACE (SPC) y DEL (DEL) en la ventana del calendario para desplazar esa lista hacia arriba y hacia abajo, respectivamente.

El comando Alt-x holidays (M-x holidays) muestra la lista de días festivos del mes actual y de los meses anteriores y posteriores; esto funciona incluso si no tiene una ventana de calendario. Si la variable calendar-view-holidays-initially-flag es no nula, la creación del calendario muestra los días festivos de esta manera. Si quieres que la lista de días festivos se centre en un mes diferente, utiliza Ctrl-u Alt-x holidays (C-u M-x holidays), que te pide el mes y el año.

Los días festivos conocidos por Emacs incluyen los de Estados Unidos y las principales fiestas bahá'ís, chinas, cristianas, islámicas y judías; también los solsticios y equinoccios.

El comando Alt-x holiday-list (M-x holiday-list) muestra la lista de días festivos para un rango de años. Esta función le pide los años de inicio y fin, y le permite elegir todos los días festivos o una de varias categorías de días festivos. Puedes utilizar este comando incluso si no tienes una ventana de calendario.

Las fechas utilizadas por Emacs para los días festivos se basan en la práctica actual, no en hechos históricos. Por ejemplo, el Día del Veterano comenzó en 1919, pero se muestra en años anteriores.

Horas de salida y puesta del sol

Los comandos especiales del calendario pueden indicarle, con una precisión de uno o dos minutos, las horas de salida y puesta del sol para cualquier fecha.

sunrise/sunset (ratón-3 sunrise/sunset salida/puesta del sol)
S (S)
Muestra las horas de salida y puesta del sol para la fecha seleccionada (calendar-sunrise-sunset).
Alt-x sunrise-sunset (M-x sunrise-sunset)
Muestra las horas de salida y puesta del sol para la fecha actual.
Ctrl-u Alt-x sunrise-sunset (C-u M-x sunrise-sunset)
Muestra las horas de salida y puesta del sol para una fecha determinada.
Alt-x calendar-sunrise-sunset-month (M-x calendar-sunrise-sunset-month)
Muestra las horas de salida y puesta del sol para el mes seleccionado.

Dentro del calendario, para mostrar las horas locales de salida y puesta del sol en la zona de eco, mueva el punto a la fecha que desee y escriba S (S). Alternativamente, haga clic con (ratón-3) en la fecha y elija ‘Sunrise/sunset’ en el menú que aparece. El comando Alt-x sunrise-sunet (M-x sunrise-sunset) está disponible fuera del calendario para mostrar esta información para la fecha de hoy o una fecha especificada. Para especificar una fecha distinta a la de hoy, utilice Ctrl-u Alt-x sunrise-sunset (C-u M-x sunrise-sunset), que le pedirá el año, el mes y el día.

Puede mostrar las horas de salida y puesta del sol para cualquier lugar y cualquier fecha con Ctrl-u Alt-x sunrise-sunset (C-u M-x sunrise-sunset). Esto le pide una longitud, una latitud, un número de minutos de diferencia con respecto al Tiempo Universal Coordinado y una fecha, y luego le indica las horas de salida y puesta del sol para esa ubicación en esa fecha.

Como las horas de salida y puesta del sol dependen de la ubicación en la tierra, necesita decirle a Emacs su latitud, longitud y nombre de ubicación antes de usar estos comandos. Aquí hay un ejemplo de lo que hay que poner:

(setq calendar-latitude 40.1)
(setq calendar-longitude -88.2)
(setq calendar-location-name "Urbana, IL")

Utilice una cifra decimal en los valores de calendar-latitude y calendar-longitude.

Su zona horaria también afecta a la hora local de salida y puesta del sol. Emacs normalmente obtiene la información de la zona horaria del sistema operativo, pero si estos valores no son los que quiere (o si el sistema operativo no los suministra), debe establecerlos Ud. mismo. He aquí un ejemplo:

(setq calendar-time-zone -360)
(setq calendar-standard-time-zone-name "CST")
(setq calendar-daylight-time-zone-name "CDT")

El valor de calendar-time-zone es el número de minutos de diferencia entre su hora estándar local y el Tiempo Universal Coordinado (hora de Greenwich). Los valores de calendar-standard-time-zone-name y calendar-daylight-time-zone-name son las abreviaturas utilizadas en su zona horaria. Emacs muestra las horas de salida y puesta del sol corregidas por el horario de verano. Consulte el horario de verano para saber cómo se determina el horario de verano.

Si quieres mostrar zonas horarias numéricas (como ‘"+0100"’) en lugar de simbólicas (como ‘"CET"’), ponlo en numérico.

Como Usuario, puede resultar conveniente establecer las variables de ubicación del calendario para su ubicación física habitual en su archivo init.el. Si Ud. es un administrador del sistema, puedes querer establecer estas variables para todos los usuarios en un archivo default.el. Ver El archivo de inicialización de Emacs.

Fases de la Luna

Estos comandos de calendario muestran las fechas y horas de las fases de la luna (luna nueva, primer cuarto, luna llena, último cuarto). Esta función es útil para depurar problemas que dependen de la fase de la luna.

M (M)
Muestra las fechas y horas de todos los cuartos de la luna para el período de tres meses mostrado (calendar-lunar-phases).
Alt-x lunar-phases (M-x lunar-phases)
Muestra las fechas y horas de los cuartos de la luna para tres meses alrededor de la fecha actual.

Dentro del calendario, utilice el comando M (M) para mostrar un buffer separado de las fases de la luna para el rango actual de tres meses. Las fechas y horas indicadas tienen una precisión de pocos minutos.

Fuera del calendario, utilice el comando Alt-x lunar-phases (M-x lunar-phases) para mostrar la lista de las fases de la luna para el mes actual y los meses anteriores y posteriores. Para obtener información sobre un mes diferente, utilice Ctrl-u Alt-x lunar-phases (C-u M-x lunar-phases), que solicita el mes y el año.

Las fechas y horas dadas para las fases de la luna se dan en hora local (corregida para el ahorro de luz diurna, cuando sea apropiado). Véase la discusión en la sección anterior. Vea las horas de salida y puesta del sol.

Conversión a y desde otros calendarios

El calendario de Emacs que se muestra es siempre el calendario gregoriano, a veces llamado calendario del Nuevo Estilo, que se utiliza en la mayor parte del mundo actualmente. Sin embargo, este calendario no existía antes del siglo XVI y no se utilizaba ampliamente antes del siglo XVIII; no desplazó completamente al calendario juliano y ganó aceptación universal hasta principios del siglo XX. El calendario de Emacs puede mostrar cualquier mes desde enero del año 1 de la era actual, pero el calendario que se muestra es siempre el gregoriano, incluso para una fecha en la que no existía el calendario gregoriano.

Aunque Emacs no puede mostrar otros calendarios, puede convertir fechas a y desde varios otros calendarios.

Sistemas de calendario compatibles

El calendario comercial ISO se utiliza a menudo en las empresas.

El calendario Juliano, que lleva el nombre de Julio César, fue el que se utilizó en Europa durante la época medieval y en muchos países hasta el siglo XIX.

Los Astrónomos utilizan un simple recuento de los días transcurridos desde el mediodía del lunes 1 de enero de 4713 a.C. en el calendario Juliano. El número de días transcurridos se denomina número de día juliano o número de día Astronómico.

El calendario Hebreo se utiliza por tradición en la religión Judía. El programa de calendario de Emacs utiliza el calendario Hebreo para determinar las fechas de las fiestas Judías. Las fechas del calendario Hebreo comienzan y terminan con la puesta de sol.

El calendario Islámico se utiliza en muchos países predominantemente islámicos. Emacs lo utiliza para determinar las fechas de las fiestas Islámicas. No hay un acuerdo universal en el mundo Islámico sobre el calendario; Emacs utiliza una versión ampliamente aceptada, pero las fechas precisas de las fiestas Islámicas a menudo dependen de la proclamación de las autoridades religiosas, no de los cálculos. Como consecuencia, las fechas reales de observancia pueden variar ligeramente de las fechas calculadas por Emacs. Las fechas del calendario Islámico comienzan y terminan con la puesta de sol.

El calendario revolucionario francés fue creado por los jacobinos tras la revolución de 1789, para representar una visión más secular y basada en la naturaleza del ciclo anual, e instalar una semana de 10 días en una medida de racionalización similar al sistema métrico. El gobierno francés abandonó oficialmente este calendario a finales de 1805.

El calendario revolucionario Francés fue creado por los Jacobinos tras la revolución de 1789, para representar una visión más secular y basada en la naturaleza del ciclo anual, e instalar una semana de 10 días en una medida de racionalización similar al sistema métrico. El gobierno Francés abandonó oficialmente este calendario a finales de 1805.

Los Mayas de América Central utilizaban tres sistemas de calendario separados y superpuestos, la cuenta larga, el tzolkin y el haab. Emacs conoce estos tres calendarios. Los expertos discuten la correlación exacta entre el calendario Maya y nuestro calendario; este Editor utiliza la correlación Goodman-Martínez-Thompson en sus cálculos.

Los Coptos utilizan un calendario basado en el antiguo calendario solar Egipcio. Su calendario consta de doce meses de 30 días seguidos de un periodo extra de cinco días. Una vez cada cuatro años añaden un día bisiesto a este periodo extra para que sea de seis días. El calendario Etíope es idéntico en su estructura, pero tiene diferentes números de año y nombres de mes.

Los Persas utilizan un calendario solar basado en un diseño de Omar Khayyam. Su calendario consta de doce meses, de los cuales los seis primeros tienen 31 días, los cinco siguientes 30 y el último 29 en años ordinarios y 30 en años bisiestos. Los años bisiestos se producen de forma complicada cada cuatro o cinco años. El calendario implementado aquí es el calendario aritmético persa defendido por Birashk, basado en un ciclo de 2.820 años. Se diferencia del calendario persa astronómico, que se basa en eventos astronómicos. En el momento de escribir este artículo, se prevé que la primera discrepancia futura se produzca el 20 de marzo de 2025. Actualmente no está claro cuál será el calendario oficial de Irán en ese momento.

El calendario Chino es un complicado sistema de meses lunares ordenados en años solares. Los años van en ciclos de sesenta, cada uno de los cuales contiene doce meses en un año ordinario o trece meses en un año bisiesto; cada mes tiene 29 o 30 días. Los años, los meses ordinarios y los días se nombran combinando uno de los diez tallos celestiales con una de las doce ramas terrestres para un total de sesenta nombres que se repiten en un ciclo de sesenta.

El sistema de calendario Bahá'í se basa en un ciclo solar de 19 meses con 19 días cada uno. Los cuatro días intercalares restantes se sitúan entre los meses 18 y 19.

Conversión a otros calendarios

Los siguientes comandos describen la fecha seleccionada (la fecha en el punto) en varios otros sistemas de calendario:

Other calendars (mouse-3 Other calendars (Otros calendarios))
po (p o)
Muestra la fecha seleccionada en varios otros calendarios. (calendar-print-other-dates).
pc (p c)
Muestra el equivalente del calendario comercial ISO para el día seleccionado (calendar-iso-print-date).
pj (p j)
Muestra la fecha Juliana del día seleccionado (calendar-julian-print-date).
pa (p a)
Muestra el número de día Astronómico (juliano) del día seleccionado (calendar-astro-print-day-number).
ph (p h)
Muestra la fecha Hebrea del día seleccionado (calendar-hebrew-print-date).
pi (p i)
Muestra la fecha Islámica del día seleccionado (calendar-islamic-print-date).
pf (p f)
Muestra la fecha de la Revolución Francesa para el día seleccionado (calendar-french-print-date).
pb (p b)
Muestra la fecha Bahá'í del día seleccionado (calendar-bahai-print-date).
pC (p C)
Muestra la fecha China del día seleccionado (calendar-chinese-print-date).
pk (p k)
Mostrar la fecha Copta del día seleccionado (calendar-coptic-print-date).
pe (p e)
Muestra la fecha Etíope del día seleccionado (calendar-ethiopic-print-date).
pp (p p)
Muestra la fecha Persa del día seleccionado (calendar-persian-print-date).
pm (p m)
Muestra la fecha Maya del día seleccionado (calendar-mayan-print-date).

De lo contrario, mueva el punto a la fecha que desee convertir y, a continuación, escriba el comando apropiado que empiece por ‘p’ de la tabla anterior. El prefijo ‘p’ es un mnemónico para "imprimir", ya que Emacs "imprime" la fecha equivalente en el área de eco. po (p o) muestra la fecha en todas las formas conocidas por el Editor. También puede utilizar (ratón-3) y luego elegir Otros calendarios en el menú que aparece. Esto muestra las formas equivalentes de la fecha en todos los calendarios que Emacs entiende, en forma de menú. (Elegir una alternativa de este menú no hace nada en realidad, el menú se usa sólo para la visualización).

Conversión desde otros calendarios

Puede utilizar los otros calendarios soportados para especificar una fecha a la que moverse. Esta sección describe los comandos para hacer esto usando calendarios distintos al Maya; para el calendario Maya, vea la siguiente sección.

gc (g c)
Mueve a una fecha especificada en el calendario comercial ISO (calendar-iso-goto-date).
gw (g w)
Mueve a una semana especificada en el calendario comercial ISO (calendar-iso-goto-week).
gj (g j)
Mueve a una fecha especificada en el calendario Juliano (calendar-julian-goto-date).
ga (g a)
Mueve a una fecha especificada con un número de día Astronómico (juliano) (calendar-astro-goto-day-number).
gb (g)
Mueve a una fecha especificada en el calendario Bahá'í (calendar-bahai-goto-date).
gh (g h)
Mueve a una fecha especificada en el calendario Hebreo (calendar-hebrew-goto-date).
gi (g i)
Mueve a una fecha especificada en el calendario Islámico (calendar-islamic-goto-date).
gf (g f)
Se desplaza a una fecha especificada en el calendario revolucionario Francés (calendar-french-goto-date).
gC (g C)
Se desplaza a una fecha especificada en el calendario Chino (calendar-chinese-goto-date).
gp (g p)
Mueve a una fecha especificada en el calendario Persa (calendar-persian-goto-date).
gk (g k)
Pasar a una fecha especificada en el calendario Copto (calendar-coptic-goto-date).
ge (g e)
Mueve a una fecha especificada en el calendario Etíope (calendar-ethiopic-goto-date).

Estos comandos le piden una fecha en el otro calendario, mueven el punto a la fecha del calendario gregoriano equivalente a esa fecha, y muestran la fecha del otro calendario en el área de eco. Emacs utiliza la terminación estricta (ver Salida de terminación) cada vez que le pide que escriba el nombre de un mes, por lo que no tiene que preocuparse por la ortografía de los nombres Hebreos, Islámicos o franceses.

Un problema común relacionado con el calendario Hebreo es el cálculo del aniversario de una fecha de fallecimiento, llamado yahrzeit. El calendario de Emacs incluye una facilidad para tales cálculos. Si está en el calendario, el comando Alt-x calendar-hebrew-list-yahrzeits (M-x calendar-hebrew-list-yahrzeits) le pide un rango de años y luego muestra una lista de las fechas de yahrzeit de esos años para la fecha dada por punto. Si no está en el calendario, este comando le pide primero la fecha de la muerte y el rango de años, y luego muestra la lista de fechas de yahrzeit.

La agenda

La agenda de Emacs mantiene un registro de las citas u otros eventos diarios, junto con el calendario. Para utilizar la función de agenda, primero debes crear un archivo de agenda que contenga una lista de eventos y sus fechas. Entonces el Editor puede escoger y mostrar automáticamente los eventos para hoy, para el futuro inmediato o para cualquier fecha especificada.

Aunque probablemente empieces creando una agenda manualmente, Emacs proporciona una serie de comandos que te permiten ver, añadir y cambiar las entradas de la agenda.

El archivo de la agenda

El archivo de la agenda es un archivo que registra los eventos asociados a determinadas fechas. El nombre del archivo del diario se especifica con la variable diary-file. El nombre por defecto es ~/.config/emacs/diary, aunque por compatibilidad con versiones anteriores Emacs utilizará ~/diary si existe.

Cada entrada en el archivo de diario describe un evento y consiste en una o más líneas. Una entrada siempre comienza con una especificación de fecha en el margen izquierdo. El resto de la entrada es simplemente texto para describir el evento. Si la entrada tiene más de una línea, las líneas posteriores a la primera deben comenzar con espacios en blanco para indicar que continúan una entrada anterior. Las líneas que no comienzan con fechas válidas y no continúan una entrada anterior se ignoran. He aquí un ejemplo:

 22/12/2015 ¡Veinte aniversario de boda!
 10/22 Cumpleaños de Ruth.
 * 21, *:    Día de pago
 Martes--reunión semanal con estudiantes de posgrado a las 10am.
          Maradona, Coca Sarli y Tuku Lito Saka Yama asistirán.
13/1/89 ¡Viernes trece!
thu 4pm juego de squash con El Cholo Zapata.
mar 16 Cumpleaños de papá.
15 de abril de 2016 Vence el impuesto sobre la renta.
* 15 tarjetas de tiempo debido.

Este ejemplo utiliza espacios adicionales para alinear las descripciones de los eventos de la mayoría de las entradas. Este tipo de formato es puramente una cuestión de gusto.

También puede utilizar un formato en el que la primera línea de una entrada de la agenda consista únicamente en la fecha o el nombre del día (sin espacios en blanco ni signos de puntuación). Por ejemplo:

02/11/2012
      Angelita Merquel visita Supermerk2s
      2pm Reunión del comité de estudios cognitivos
      2:30-5:30 Armando Esteban Quito muestra sus sillas
      4:00pm Cita con el dentista
      7:30pm Cena en ningún lado
      8:00-10:00pm concierto desafinado

Esta entrada tendrá un aspecto diferente si utiliza la visualización simple de la agenda (véase Visualización de la agenda). La visualización simple de la agenda omite la línea de la fecha al principio; sólo aparecen las líneas de continuación. Este estilo de entrada tiene un aspecto más ordenado cuando se muestran las entradas de un solo día, pero puede causar confusión si se piden las entradas de más de un día.

Visualización de la agenda

Una vez que haya creado un archivo de agenda, puede utilizar el calendario para visualizarlo. También puede ver los eventos de hoy fuera del modo Calendario. A continuación, los enlaces de las teclas se refieren a la memoria intermedia de la Agenda.

Diary (ratón-3 Diary)
d (d)
Muestra todas las entradas de la agenda para la fecha seleccionada (diary-view-entries).
s (s)
Muestra todo el archivo de la agenda (diary-show-all-entries).
m (m)
Desmarca la ventana de la agenda (calendar-unmark).
u (u)
Desmarca la ventana de la agenda (calendar-unmark).
Alt-x diary-print-entries (M-x diary-print-entries)
Imprime una copia de la pantalla de la agenda tal y como aparece.
Alt-x diary (M-x diary)
Muestra todas las entradas de la agenda para la fecha de hoy.
Alt-x diary-mail-entries (M-x diary-mail-entries)
Envía por correo electrónico recordatorios de las próximas entradas de la agenda.

La visualización de las entradas de la agenda con d (d) muestra en una memoria intermedia separada las entradas de la agenda para la fecha seleccionada en el calendario. La línea de modo de la nueva memoria intermedia muestra la fecha de las entradas de la agenda. Los días festivos se muestran en la memoria intermedia o en la línea de modo, dependiendo del método de visualización que elija (véase Visualización de la agenda). Si especifica un argumento numérico con d (d), muestra todas las entradas de la agenda para ese número de días sucesivos. Así, 2d (2 d) muestra todas las entradas de la fecha seleccionada y del día siguiente.

Otra forma de mostrar las entradas de la agenda para una fecha es hacer clic con (ratón-3) en la fecha, y luego elegir Entradas de la agenda en el menú que aparece. Si la variable calendar-view-diary-initially-flag es no nula, la creación del calendario muestra las entradas de la agenda para la fecha actual (siempre que la fecha actual sea visible).

Para obtener una visión más amplia de los días que se mencionan en la agenda, utilice el comando m (m). Esto marca las fechas que tienen entradas en la agenda en una cara diferente. Ver diary-entry-marker (diario-entrada-marcador).

Este comando se aplica tanto a los meses que están visibles en ese momento como a los que se hacen visibles posteriormente tras el desplazamiento. Para desactivar el marcado y borrar las marcas actuales, escriba u (u), que también desactiva las marcas de vacaciones (véase Vacaciones). Si la variable calendar-mark-diary-entries-flag no es nula, la creación o actualización del calendario marca las fechas de la agenda automáticamente.

Para evitar que una entrada individual de la agenda se marque en el calendario, inserte la cadena que especifica diary-nonmarking-symbol (el valor predeterminado es ‘&’) al principio de la entrada, antes de la fecha. Esto no afecta a la visualización de la entrada en el búfer de la agenda; sólo afecta a las marcas de las fechas en el calendario. Las entradas no marcadas pueden ser útiles para entradas genéricas que, de otro modo, marcarían muchas fechas diferentes.

Para ver el archivo de la agenda completo, en lugar de sólo algunas de las entradas, utilice el comando s (s).

El comando Alt-x diary (M-x diary) muestra las entradas del diario para la fecha actual, independientemente de la visualización del calendario, y opcionalmente también para los días siguientes; la variable diary-number-of-entries especifica cuántos días se deben incluir. Ver diary-number-of-entries.

Si pones (diary) en tu archivo .emacs, esto automáticamente muestra una ventana con las entradas del diario del día cuando inicias Emacs.

A algunas personas les gusta recibir notificaciones por correo electrónico de los eventos de su diario. Para enviarse este tipo de correo, utilice el comando Alt-x diary-mail-entries (M-x diary-mail-entries). Un argumento de prefijo especifica cuántos días (empezando por hoy) hay que comprobar; si no, la variable diary-mail-days dice cuántos días.

Formatos de fecha

A continuación se muestran algunos ejemplos de entradas de la agenda, que ilustran diferentes formas de dar formato a una fecha. Todos los ejemplos muestran las fechas en orden americano (mes, día, año), pero el modo Calendario admite el orden europeo (día, mes, año) y el orden ISO (año, mes, día) como opciones.

20/4/28 Cambio al nuevo sistema de tabulación
25 de abril Comienza la tabulación de los resultados anuales
4/30 Los resultados del mes de abril deben ser entregados
**/25 Finaliza el ciclo mensual
Viernes No te vayas sin hacer una copia de seguridad de los archivos

La primera entrada sólo aparece una vez, el 20 de abril de 2028. La segunda y la tercera aparecen cada año en las fechas especificadas, y la cuarta utiliza un comodín (asterisco) para el mes, por lo que aparece el 25 de cada mes. La última entrada aparece cada semana el viernes.

Puede utilizar sólo números para expresar una fecha, como en ‘month/day’ ("mes/día") o ‘month/day/year’ ("mes/día/año"). Esto debe ir seguido de un no dígito. En la fecha propiamente dicha, el mes y el día son números de una o dos cifras. El año opcional también es un número, y puede abreviarse con los dos últimos dígitos; es decir, puede utilizar ‘11/12/2028’ o ‘11/12/28".

Las fechas también pueden tener la forma ‘monthname day’ ("nombre del mes día") o ‘monthname day, year’ ("nombre del mes día, año"), donde el nombre del mes puede escribirse completo o abreviado (con o sin punto). Las abreviaturas preferidas para los nombres de mes y día pueden establecerse mediante las variables calendar-abbrev-length, calendar-month-abbrev-array y calendar-day-abbrev-array. Por defecto se utilizan las tres primeras letras de un nombre como abreviatura. Las mayúsculas y minúsculas no son significativas.

Una fecha puede ser genérica, es decir, parcialmente no especificada. Entonces la entrada se aplica a todas las fechas que coincidan con la especificación. Si la fecha no contiene un año, es genérica y se aplica a cualquier año. Alternativamente, el mes, el día o el año pueden ser ‘*‘; esto coincide con cualquier mes, día o año, respectivamente. Así, una entrada de diario ‘3/*/*’ coincide con cualquier día de marzo de cualquier año; lo mismo ocurre con ‘march *’ (marzo).

Si prefiere el estilo europeo de escribir las fechas (en el que el día va antes que el mes), o el estilo ISO (en el que el orden es año, mes, día), escriba Alt-x calendar-set-date-style (M-x calendar-set-date-style) mientras está en la agenda, o personalice la variable calendar-date-style. Esto afecta a cómo se interpretan las fechas de la agenda, a la visualización de las fechas y al orden en que algunos comandos esperan que se den sus argumentos.

Puede utilizar el nombre de un día de la semana como una fecha genérica que se aplica a cualquier fecha que caiga en ese día de la semana. Puede abreviar el día de la semana como se ha descrito anteriormente, o escribirlo completo; las mayúsculas y minúsculas no son significativas.

Comandos para añadir a la agenda

En la agenda hay varios comandos para crear entradas en la misma. Los comandos básicos se enumeran aquí; los comandos más sofisticados se encuentran en la siguiente sección (véase Entradas especiales en la agenda). Las entradas también pueden basarse en calendarios no gregorianos. Consulte Entradas de la agenda utilizando calendarios no gregorianos.

id (i d)
Añade una entrada en la agenda para la fecha seleccionada (diary-insert-entry).
iw (i w)
Añade una entrada de la agenda para el día de la semana seleccionado (diary-insert-weekly-entry).
im (i m)
Añade una entrada en la agenda para el día seleccionado del mes (diary-insert-monthly-entry).
iy (i y)
Añade una entrada de la agenda para el día seleccionado del año (diary-insert-yearly-entry).

Puede hacer una entrada en la agenda para una fecha específica seleccionando esa fecha en la ventana del calendario y escribiendo el comando id (i d). Este comando muestra el final del archivo de la agenda en otra ventana e inserta la fecha; a continuación, puede escribir el resto de la entrada de la agenda.

Si quiere hacer una entrada de la agenda que se aplique a un día específico de la semana, seleccione ese día de la semana (cualquier ocurrencia servirá) y escriba iw (i w). Esto inserta el día de la semana como una fecha genérica; entonces puede escribir el resto de la entrada de la agenda. Puede hacer una entrada de agenda mensual de la misma manera: seleccione el día del mes, utilice el comando im (i m) y escriba el resto de la entrada. Del mismo modo, puedes insertar una entrada anual en la agenda con el comando iy (i y).

Todos los comandos anteriores permiten realizar entradas de agenda marcadas por defecto. Para hacer una entrada en la agenda que no esté marcada, dé un argumento de prefijo al comando. Por ejemplo, Ctrl-u iw (C-u i w) hace una entrada de agenda semanal no marcada.

Cuando modifique el archivo de la agenda, asegúrese de guardar el archivo antes de salir de Emacs. Al guardar el archivo de la agenda después de utilizar cualquiera de los comandos de inserción anteriores, se actualizarán automáticamente las marcas de la agenda en la ventana del calendario, si procede. Puede utilizar el comando calendar-redraw para forzar una actualización en cualquier momento.

Entradas especiales en la agenda

Además de las entradas basadas en las fechas del calendario, el archivo de la agenda puede contener entradas sexp para eventos regulares como los aniversarios. Estas entradas se basan en expresiones Lisp (sexps) que Emacs evalúa mientras explora el archivo de la agenda. En lugar de una fecha, una entrada sexp contiene ‘%%’ seguido de una expresión Lisp que debe comenzar y terminar con paréntesis. La expresión Lisp determina a qué fechas se aplica la entrada.

El modo calendario proporciona comandos para insertar ciertas entradas sexp de uso común:

ia (i a)
Añade una entrada de diario de aniversario para la fecha seleccionada (diary-insert-anniversary-entry).
id (i d)
Añade una entrada de agenda en bloque para la región actual (diary-insert-block-entry).
ic (i c)
Añade una entrada de agenda cíclica que comience en la fecha (diary-insert-cyclic-entry).

Si quiere hacer una entrada de diario que se aplique al aniversario de una fecha específica, mueva el punto a esa fecha y use el comando ia (i a). Esto muestra el final de su archivo de diario en otra ventana e inserta la descripción del aniversario; entonces puede escribir el resto de la entrada del diario. La entrada tiene el siguiente aspecto:

%%(diary-anniversary 10 31 1988) Cumpleaños de Dragon Bolaseta

Esta entrada se aplica al 31 de octubre de cualquier año posterior a 1988; ‘10 31 1988’ especifica la fecha. (Si se utiliza el estilo de calendario europeo o ISO, el orden de entrada del mes, día y año es diferente). La razón por la que esta expresión requiere un año de inicio es que las funciones avanzadas de la agenda pueden utilizarla para calcular el número de años transcurridos.

Una entrada de agenda en bloque se aplica a un rango específico de fechas consecutivas. Aquí hay una entrada de agenda en bloque que se aplica a todas las fechas desde el 24 de junio de 2012 hasta el 10 de julio de 2012:

%%(diary-block 6 24 2012 7 10 2012) Vacaciones

El ‘6 24 2012’ indica la fecha de inicio y el ‘7 10 2012’ indica la fecha de finalización. (De nuevo, si está utilizando el estilo de calendario europeo o ISO, el orden de entrada del mes, día y año es diferente).

Para insertar una entrada en bloque, coloque el punto y la marca en las dos fechas que inician y terminan el rango, y escriba ib (i b). Este comando muestra el final de su archivo de agenda en otra ventana e inserta la descripción del bloque; entonces puede escribir la entrada de la agenda.

Las entradas cíclicas de la agenda se repiten después de un intervalo fijo de días. Para crear una, seleccione la fecha de inicio y utilice el comando ic (i c). El comando solicita la duración del intervalo y luego inserta la entrada, que tiene el siguiente aspecto:

%%(diary-cyclic 50 3 1 2012) renovar la medicación

Esta entrada se aplica al 1 de marzo de 2012 y a todos los 50 días siguientes; ‘3 1 2012’ especifica la fecha de inicio. (Si utiliza el estilo de calendario europeo o ISO, el orden de entrada del mes, el día y el año es diferente).

Estos tres comandos permiten realizar entradas de diario marcadas. Para insertar una entrada no marcada, dé un argumento de prefijo al comando. Por ejemplo, Ctrl-u ia (C-u i a) hace una entrada de diario de aniversario no marcada.

Marcar las entradas del diario sexp en el calendario puede llevar mucho tiempo, ya que cada fecha visible en la ventana del calendario debe ser comprobada individualmente. Por lo tanto, es una buena idea hacer que las entradas de la agenda sexp no estén marcadas (con ‘&’) cuando sea posible.

Otro tipo sofisticado de entrada sexp, una entrada de agenda flotante, especifica un evento que se produce regularmente mediante desplazamientos especificados en días, semanas y meses. Es comparable a una entrada crontab interpretada por la utilidad cron. A continuación se muestra una entrada de diario flotante no marcada que se aplica al cuarto jueves de noviembre:

&%%(diary-float 11 4 4) Culto umbanda

El 11 especifica noviembre (el undécimo mes), el 4 especifica el jueves (el cuarto día de la semana, donde el domingo se numera como cero), y el segundo 4 especifica el cuarto jueves (1 significaría "primero", 2 significaría "segundo", -2 significaría "penúltimo", y así sucesivamente). El mes puede ser un solo mes o una lista de meses. Así, podría cambiar el 11 anterior por ‘'(1 2 3)'’ y hacer que la entrada se aplique al último jueves de enero, febrero y marzo. Si el mes es t, la entrada se aplica a todos los meses del año.

%%(diary-offset '(diary-float t 3 4) 2) Reunión mensual del comité Peronista

Esta entrada se aplica al sábado siguiente al tercer jueves de cada mes. El 2 especifica el número de días después de cuando el sexp '(diary-float t 3 4) evaluaría a t. Esto es útil cuando, por ejemplo, su organización tiene una reunión de comité dos días después de cada reunión mensual que tiene lugar el tercer jueves, o si desea asistir a una reunión virtual programada en una zona horaria diferente que provoca una diferencia en la fecha.

Cada una de las entradas estándar de la agenda sexp toma un parámetro opcional que especifica el nombre de una cara o una cadena de un solo carácter que se utilizará para marcar la entrada en el calendario. En general, las entradas de la agenda sexp pueden realizar cálculos arbitrarios para determinar cuándo se aplican. Véase Entradas de la agenda sexp y la visualización de la agenda de fantasía.

Citas

Si tiene una entrada de la agenda para una cita, y esa entrada de la agenda comienza con una hora del día reconocible, Emacs puede avisarle por adelantado que hay una cita pendiente mostrando un mensaje en el formato que elija, especificado por la variable appt-display-format. Si el valor de appt-audible no es nulo, el aviso incluye un recordatorio audible. Además, si appt-display-mode-line no es nulo, Emacs muestra el número de minutos que faltan para la cita en la línea de modo.

Si appt-display-format tiene el valor window, entonces la variable appt-display-duration controla el tiempo que la ventana de recordatorio está visible; y las variables appt-disp-window-function y appt-delete-window-function dan los nombres de las funciones usadas para crear y destruir la ventana, respectivamente.

Para activar la notificación de citas, escriba Alt-x appt-activate (M-x appt-activate). Con un argumento positivo, activa la notificación; con un argumento negativo, desactiva la notificación; sin argumento, la activa. Al activar la notificación, también se crea una lista de citas para hoy a partir del archivo de la agenda, con todas las entradas de la agenda encontradas con horas reconocibles del día, y se le recuerda justo antes de cada una de ellas.

Por ejemplo, suponga que el archivo de la agenda contiene estas líneas:

Lunes
  9:30h Pausa mate cocido con pan con dulce
 12:00 horas Almuerzo: plumífero alado en su nido (patipechuga con lechuga)

Entonces, los lunes, se le recordará alrededor de las 9:20am sobre su descanso para el mate cocido con pan con dulce y alrededor de las 11:50am sobre el almuerzo. La variable appt-message-warning-time especifica con cuántos minutos de antelación (por defecto 12) se le avisará. Esta es una hora de aviso por defecto. Cada cita puede especificar una hora de advertencia diferente añadiendo un fragmento que coincida con appt-warning-time-regexp (vea la documentación de esa variable para más detalles).

Puede escribir las horas en estilo am/pm (con ‘12:00am’ para la medianoche y '12:00pm’ para el mediodía), o en estilo europeo/militar de 24 horas. No es necesario que sea consistente; su archivo de agenda puede tener una mezcla de los dos estilos. Las horas deben estar al principio de las entradas de la agenda para que sean reconocidas.

Emacs actualiza la lista de citas del archivo de la agenda automáticamente justo después de la medianoche. Puede forzar una actualización en cualquier momento volviendo a activar la notificación de citas. Ambas acciones también muestran el búfer de la agenda del día, a menos que establezcas appt-display-diary a nil. La lista de citas también se actualiza cada vez que se guarda el archivo de la agenda (o un archivo que incluya; ver Fancy Diary Display). Si se usa el Org Mode y se guardan las citas en los ficheros de agenda de Org, se pueden añadir esas citas a la lista usando el comando org-agenda-to-appt. Ver Recordatorios de citas en el Manual de Org, para mas informacion sobre ese comando.

Tambien puede usar la facilidad de notificación de citas como un reloj de alarma. El comando Alt-x appt-add (M-x appt-add) añade entradas a la lista de citas sin afectar a su archivo de agenda. Puedes borrar entradas de la lista de citas con Alt-x appt-delete (M-x appt-delete).

Importar y exportar entradas de la agenda

Puede transferir entradas de la agenda entre archivos de la agenda de Emacs y una variedad de otros formatos.

Puede importar entradas de la agenda desde mensajes de citas generados por Outlook. Mientras ve un mensaje de este tipo en Rmail o Gnus, haga Alt-x diary-from-outlook (M-x diary-from-outlook) para importar la entrada. Puede hacer que este comando reconozca otros formatos de mensajes de citas personalizando la variable diary-outlook-formats. Otros clientes de correo pueden establecer diary-from-outlook-function a un valor apropiado.

El paquete icalendar le permite transferir datos entre su archivo de agenda de Emacs y los archivos de iCalendar, que se definen en el RFC 2445-Internet Calendaring and Scheduling Core Object Specification (iCalendar) (así como el formato anterior vCalendar).

El comando icalendar-import-buffer extrae los datos de iCalendar del buffer actual y los añade al archivo de la agenda. Esta función también es adecuada para la extracción automática de datos de iCalendar; por ejemplo, con el cliente de correo Rmail se podría utilizar:

(add-hook 'rmail-show-message-hook 'icalendar-import-buffer)

El comando icalendar-import-file importa un archivo iCalendar y añade los resultados a un archivo de agenda Emacs. Por ejemplo:

(icalendar-import-file "/aquí/es/calendario.ics"
                       "/aquí/va/ical-diary")

Puede utilizar una directiva #include para añadir el contenido del archivo de importación al archivo principal del diario, si son archivos diferentes. Vea Visualización de la agenda de lujo.

Use calendar-export-file para exportar interactivamente un archivo de agenda Emacs completo al formato iCalendar. Para exportar sólo una parte de un archivo de agenda, marque el área correspondiente y llame a icalendar-export-region. En ambos casos, Emacs añade el resultado al archivo de destino.

Horario de verano

Emacs entiende la diferencia entre la hora estándar y el horario de verano -las horas dadas para la salida y la puesta del sol, los solsticios, los equinoccios y las fases de la luna lo tienen en cuenta. Las reglas del horario de verano varían de un lugar a otro y también han variado históricamente de un año a otro. Para hacer el trabajo correctamente, Emacs necesita saber qué reglas usar.

Algunos sistemas operativos mantienen un registro de las reglas que se aplican al lugar donde Ud. se encuentras; en estos sistemas, Emacs obtiene la información que necesita del sistema automáticamente. Si falta parte o toda esta información, Emacs rellena los huecos con las reglas que se usan actualmente en Cambridge, Massachusetts. Si las reglas resultantes no son las que quiere, puede decirle a Emacs las reglas que debe usar estableciendo ciertas variables: calendar-daylight-savings-starts y calendar-daylight-savings-ends.

Estos valores deben ser expresiones Lisp que se refieran a la variable año y se evalúen a la fecha gregoriana en la que comienza o termina (respectivamente) el horario de verano, en forma de lista (month day year, mes día año). Los valores deben ser nulos si su zona no utiliza el horario de verano.

Emacs utiliza estas expresiones para determinar la fecha de inicio del horario de verano para la lista de vacaciones y para corregir las horas del día en los cálculos solares y lunares.

Los valores para Cambridge, Massachusetts son los siguientes:

(calendar-nth-named-day 2 0 3 year)
(calendar-nth-named-day 1 0 11 year)

Es decir, el segundo día 0 (domingo) del tercer mes (marzo) del año especificado por año, y el primer domingo del undécimo mes (noviembre) de ese año. Si se cambiara el horario de verano para que comenzara el 1 de octubre, se establecería calendar-daylight-savings-starts con este valor:

(list 10 1 year)

Si no hay horario de verano en su localidad, o si quiere que todas las horas estén en hora estándar, establezca calendar-daylight-savings-starts y calendar-daylight-savings-ends a nil.

La variable calendar-daylight-time-offset especifica la diferencia entre el horario de verano y el horario estándar, medida en minutos. El valor para Cambridge, Massachusetts, es 60.

Por último, las dos variables calendar-daylight-savings-starts-time y calendar-daylight-savings-ends-time especifican el número de minutos después de la medianoche, hora local, en que debe producirse la transición hacia y desde el horario de verano. Para Cambridge, Massachusetts, los valores de ambas variables son 120.

Suma de intervalos de tiempo

El paquete timeclock suma intervalos de tiempo, para que pueda (por ejemplo) mantener un registro de cuanto tiempo pasa trabajando en proyectos particulares. (Una alternativa mas avanzada es usar las facilidades de Org Mode para registrar el tiempo, ver Clocking Work Time en The Org Manual).

Use el comando Altx timeclock-in (M-x timeclock-in) cuando empiece a trabajar en un proyecto, y el comando Alt-x timeclock-out (M-x timeclock-out) cuando termine. Cada vez que haga esto, añade un intervalo de tiempo al registro del proyecto. Puede cambiar a trabajar en un proyecto diferente con Alt-x timeclock-change (M-x timeclock-change).

Una vez que haya recogido los datos de un número de intervalos de tiempo, puede usar Alt-x timeclock-workday-remaining (M-x timeclock-workday-remaining) para ver cuánto tiempo le queda por trabajar hoy (asumiendo una media típica de 8 horas al día), y Alt-x timeclock-when-to-leave (M-x timeclock-when-to-leave) que calculará cuándo ha terminado.

Si quiere que Emacs muestre la cantidad de tiempo que le queda de su jornada laboral en la línea de modo, personalice la variable timeclock-mode-line-display y estable su valor en t, o invoque el comando Alt-x timeclock-mode-line-display (M-x timeclock-mode-line-display).

Terminar la sesión actual de Emacs puede significar que ha dejado de trabajar en el proyecto o no, y, por defecto, el Editor le pregunta. Puede, sin embargo, personalizar el valor de la variable timeclock-ask-before-exiting a nil para evitar la pregunta; entonces, sólo un Alt-x timeclock-out (M-x timeclock-out) o Alt-x timeclock-change (M-x timeclock-change) explícito le dirá a Emacs que el intervalo actual ha terminado.

Las funciones de reloj trabajan acumulando los datos en un archivo llamado ~/.config/emacs/timelog. Puede especificar un nombre diferente para este archivo personalizando la variable timeclock-file. Si edita el archivo timeclock manualmente, o si cambias el valor de cualquiera de las variables personalizables de timeclock, debe ejecutar el comando Alt-x timeclock-reread-log (M-x timeclock-reread-log) para actualizar los datos en Emacs desde el archivo.

Funciones más avanzadas del Calendario y la Agenda

Esta sección describe algunas de las características más avanzadas/especializadas del calendario y la agenda. Comienza con algunas de las muchas formas en las que puedes personalizar el calendario y la agenda para adaptarlos a tus gustos personales.

Personalización del calendario

Lamentablemente, la visualización del calendario no puede cambiarse a partir de los tres meses, pero puede personalizar el espacio en blanco utilizado configurando las variables: calendar-left-margin, calendar-day-header-width, calendar-day-digit-width, calendar-column-width y calendar-intermonth-spacing. Para mostrar texto entre los meses, por ejemplo los números de las semanas, personalice las variables calendar-intermonth-header y calendar-intermonth-text como se describe en su documentación.

La variable calendar-month-header controla el texto que aparece encima de cada mes en el calendario. Por defecto, muestra el mes y el año. La variable calendar-day-header-array controla el texto que aparece sobre la columna de cada día en cada mes. Por defecto, muestra las dos primeras letras del nombre de cada día.

La variable calendar-holiday-marker especifica cómo marcar una fecha que es festiva. Su valor puede ser una cadena de un solo carácter a insertar junto a la fecha, o un nombre de cara a utilizar para mostrar la fecha. Asimismo, la variable diary-entry-marker especifica cómo marcar una fecha que tiene entradas de diario. La función calendar-mark-today utiliza calendar-today-marker para marcar la fecha de hoy. Por defecto, el calendario utiliza las caras denominadas holiday, diary y calendar-today para estos propósitos.

Al iniciar el calendario se ejecuta el gancho normal calendar-initial-window-hook. El recuento de la visualización del calendario no ejecuta este gancho. Pero si se sale del calendario con el comando q (q) y se vuelve a entrar en él, el hook (gancho) se ejecuta de nuevo.

La variable calendar-today-visible-hook es un gancho normal que se ejecuta después de preparar el buffer del calendario, cuando la fecha actual es visible en la ventana. Uno de los usos de este gancho es marcar la fecha de hoy; para ello utilice cualquiera de las funciones calendar-mark-today o calendar-star-date:

(add-hook 'calendar-today-visible-hook 'calendar-mark-today)

Un gancho normal similar, calendar-today-invisible-hook se ejecuta si la fecha actual no es visible en la ventana.

Cada uno de los comandos de movimiento del cursor del calendario ejecuta el gancho calendar-move-hook después de mover el cursor.

Personalizar los días festivos

Hay varias variables que enumeran los días festivos que por defecto Emacs conoce. Estas son:

holiday-general-holidays holiday-local-holidays holiday-solar-holidays
holiday-christian-holidays holiday-hebrew-holidays holiday-islamic-holidays
holiday-oriental-holidays holiday-other-holidays holiday-solar-holidays

Los nombres deberían explicarse por sí mismos; por ejemplo: holiday-solar-holidays enumera las fiestas relacionadas con el sol y la luna.

Puede personalizar estas listas de días festivos según sus necesidades, eliminando o añadiendo días festivos como se describe a continuación. Establezca cualquiera de ellos como nulo para no mostrar los días festivos asociados.

Los días festivos generales (holiday-general-holidays) son, por defecto, días festivos comunes en todo Estados Unidos. Por el contrario, los días festivos locales (holiday-local-holidays) y los días festivos de otro tipo (holiday-other-holidays) están vacíos por defecto. Están pensados para la configuración de todo el sistema y para su uso individual, respectivamente.

Por defecto, Emacs no incluye todas las fiestas de las religiones que conoce, sólo las que se encuentran comúnmente en los calendarios seculares. Para obtener una colección más amplia de fiestas religiosas, puedes establecer a t cualquiera (o todas) de las siguientes variables:

calendar-bahai-all-holidays-flag calendar-christian-all-holidays-flag
calendar-hebrew-all-holidays-flag calendar-islamic-all-holidays-flag

Cada una de las variables de vacaciones es una lista de formas de vacaciones, cada una de las cuales describe un día festivo (o a veces una lista de días festivos). Esta es una tabla de los posibles tipos de formas de vacaciones. Los números de día y de mes cuentan a partir de 1, pero los números de nombre de día cuentan el domingo como 0. La cadena del argumento es siempre la descripción del día festivo, como una cadena.

(holiday-fixed mes día cadena)
Una fecha fija en el calendario gregoriano.
(holiday-float mes nombredia k cadena
opcional día) El nombre de día kº (nombre de día=0 para el domingo, y así sucesivamente) después o antes de la fecha gregoriana mes, día. Un k negativo significa que se cuenta hacia atrás desde el final del mes. El día opcional es por defecto 1 si k es positivo, y el último día del mes en caso contrario.
(holiday-chinese mes día cadena)
Una fecha fija en el calendario Chino.
(holiday-hebrew mes día cadena)
Una fecha fija en el calendario Hebreo.
(holiday-islamic mes día cadena)
Fecha fija en el calendario Islámico.
(holiday-julian mes día cadena)
Una fecha fija en el calendario juliano.
(holiday-sexp sexp cadena)
Una fecha calculada por la expresión sexp de Lisp. La expresión debe utilizar la variable year (año) para calcular y devolver la fecha de un día festivo en forma de lista (month day year, mes día año), o nil si el día festivo no se produce este año.
(if condición holiday-form)
Un día festivo que ocurre sólo si condición es verdadera.
(función [args])
Una lista de fechas calculadas por la función, llamada con los argumentos args.

Por ejemplo, suponga que quiere añadir el Día de la Bastilla, que se celebra en Francia el 14 de julio (es decir, el decimocuarto día del séptimo mes). Puede hacerlo de la siguiente manera:

(setq holiday-other-holidays '((holiday-fixed 7 14 "Bastille Day")))

Muchos días festivos tienen lugar en un día concreto de la semana, en un momento específico del mes. Aquí hay un formulario de vacaciones que describe el Día de la Súplica del Huracán, que se celebra en las Islas Vírgenes el cuarto lunes de julio:

(holiday-float 7 1 4 "Hurricane Supplication Day")

Aquí el 7 especifica julio, el 1 especifica el lunes (el domingo es 0, el martes es 2, y así sucesivamente), y el 4 especifica la cuarta ocurrencia en el mes (1 especifica la primera ocurrencia, 2 la segunda ocurrencia, -1 la última ocurrencia, -2 la penúltima ocurrencia, y así sucesivamente).

También puede especificar los días festivos que ocurren en días fijos de los calendarios Bahá'í, Chino, Hebreo, Islámico y juliano. Por ejemplo,

(setq holiday-other-holidays
      '((holiday-hebrew 10 2 "Último día de Hanukkah")
        (holiday-islamic 3 12 "Cumpleaños de Mahoma")
        (holiday-julian 4 2 "Cumpleaños de Jefferson Fittipaldi")))

añade el último día de Hanukkah (ya que los meses Hebreos se numeran con 1 empezando por Nisan), la fiesta islámica que celebra el cumpleaños de Mahoma (ya que los meses Islámicos se numeran con 1 empezando por Muharram), y el cumpleaños de Thomas Jefferson, que es el 2 de abril de 1743 en el calendario juliano.

Para incluir un día festivo de forma condicional, use el if de Emacs Lisp o la forma holiday-sexp. Por ejemplo, las elecciones presidenciales estadounidenses se celebran el primer martes después del primer lunes de noviembre de los años divisibles por 4:

(holiday-sexp '(if (zerop (% year 4))
                   (calendar-gregorian-from-absolute
                    (1+ (calendar-dayname-on-or-before
                          1 (+ 6 (calendar-absolute-from-gregorian
                                  (list 11 1 year)))))))
              "elecciones presidenciales")

o

(if (zerop (% displayed-year 4))
    (holiday-fixed 11
           (calendar-extract-day
             (calendar-gregorian-from-absolute
               (1+ (calendar-dayname-on-or-before
                     1 (+ 6 (calendar-absolute-from-gregorian
                              (list 11 1 displayed-year)))))))
           "elecciones presidenciales"))

Algunos días festivos no encajan en ninguna de estas formas porque hay cálculos especiales que intervienen en su determinación. En estos casos, debe escribir una función Lisp para realizar el cálculo. Para incluir los eclipses, por ejemplo, añada (eclipses) a holiday-other-holidays y escriba una función Emacs Lisp eclipses que devuelva una lista (posiblemente vacía) de las fechas gregorianas relevantes entre el rango visible en la ventana del calendario, con cadenas descriptivas, así:

(((6 4 2012) "Lunar Eclipse") ((11 13 2012) "Solar Eclipse") ... )

Conversión del calendario Maya

Aquí están los comandos para seleccionar las fechas basadas en el calendario Maya:

gml (g m l)
Mueve a una fecha especificada por el calendario de cuenta larga (calendar-mayan-goto-long-count-date).
gmnt (g m n t)
Mueve a la siguiente ocurrencia de un lugar en el calendario tzolkin (calendar-mayan-next-tzolkin-date).
gmpt (g m p t)
Va a la ocurrencia anterior de un lugar en el calendario tzolkin (calendar-mayan-previous-tzolkin-date).
gmnh (g m n h)
Va a la siguiente aparición de un lugar en el calendario haab (calendar-mayan-next-haab-date).
gmph (g m p h)
Va a la aparición anterior de un lugar en el calendario haab (calendar-mayan-previous-haab-date).
gmnc (g m n c)
Va a la siguiente ocurrencia de un lugar en la ronda del calendario (calendar-mayan-next-calendar-round-date).
gmnc (g m n c)
Va al lugar anterior de la ronda del calendario (calendar-mayan-previous-calendar-round-date).

Para entender estos comandos, necesita entender los calendarios Mayas. La cuenta larga es un conteo de días con estas unidades:

1 kin = 1 day   1 uinal = 20 kin   1 tun = 18 uinal
1 katun = 20 tun   1 baktun = 20 katun

Así, la fecha de la cuenta larga 12.16.11.16.6 significa 12 baktun, 16 katun, 11 tun, 16 uinal y 6 kin. El calendario de Emacs puede manejar las fechas de la cuenta larga Maya desde el 7.17.18.13.3, pero no antes. Cuando utilices el comando gml (g m l), escribe la fecha de la cuenta larga Maya con el baktun, katun, tun, uinal y kin separados por puntos.

El calendario Maya tzolkin es un ciclo de 260 días formado por un par de ciclos independientes de 13 y 20 días. Como este ciclo se repite infinitamente, Emacs proporciona comandos para retroceder y avanzar al punto anterior o siguiente del ciclo. Escriba gmpt (g m p t) para ir a la fecha tzolkin anterior; Emacs le pide una fecha tzolkin y mueve el punto a la ocurrencia anterior de esa fecha. Del mismo modo, escriba gmnt (g m n t) para ir a la siguiente ocurrencia de una fecha tzolkin.

El calendario Maya haab es un ciclo de 365 días organizado en 18 meses de 20 días cada uno, seguido de un período de 5 días sin mes. Al igual que el ciclo del tzolkin, este ciclo se repite infinitamente, y existen comandos para retroceder y avanzar al punto anterior o siguiente del ciclo. Escriba gmph (g m p h) para ir a la fecha haab anterior; Emacs le pide una fecha haab y mueve el punto a la ocurrencia anterior de esa fecha. Del mismo modo, escriba gmnh (g m n h) para ir a la siguiente ocurrencia de una fecha haab.

Los Mayas también utilizaban la combinación de la fecha tzolkin y la fecha haab. Esta combinación es un ciclo de unos 52 años llamado ronda calendárica. Si escribe gmpc (g m p c), Emacs le pide tanto una fecha haab como una fecha tzolkin y luego mueve el punto a la ocurrencia anterior de esa combinación. Use gmnc (g m n c) para mover el punto a la siguiente ocurrencia de una combinación. Estos comandos señalan un error si la combinación de fecha haab/tzolkin que ha escrito es imposible.

Emacs utiliza la terminación estricta (ver Salida de la terminación) siempre que le pide que escriba un nombre Maya, por lo que no tiene que preocuparse por la ortografía.

Formato de visualización de la fecha

Puede personalizar la forma en que se muestran las fechas en la agenda, las líneas de modo y los mensajes configurando calendar-date-display-form. Esta variable contiene una lista de expresiones que pueden incluir las variables month, day, year (mes, día y año), que son todos números en forma de cadena, y monthname (nombre del mes) y dayname (nombre del día), que son cadenas alfabéticas. En el estilo americano, el valor por defecto de esta lista es el siguiente:

((if dayname (concat dayname ", ")) monthname " " day ", " year)

mientras que en el estilo europeo este valor es el predeterminado:

((if dayname (concat dayname ", ")) day " " monthname " " year)

La representación de la fecha ISO por defecto es:

((format "%s-%.2d-%.2d" year (string-to-number month)
         (string-to-number day)))

Otro formato típico americano es:

(month "/" day "/" (substring year -2))

Formato de visualización de la hora

El calendario y la agenda muestran por defecto las horas del día al estilo americano convencional, con las horas de 1 a 12, los minutos, y el ‘’ o el ‘pm’. Si prefiere el estilo europeo, también conocido en Estados Unidos como militar, en el que las horas van de 00 a 23, puede modificar la variable calendar-time-display-form. Esta variable es una lista de expresiones que pueden incluir las variables 12-hours, 24-hours y minutos, que son todos números en forma de cadena, y am-pm y time-zone, que son ambas cadenas alfabéticas. El valor por defecto es:

(12-hours ":" minutes am-pm
          (if time-zone " (") time-zone (if time-zone ")"))

He aquí un valor que proporciona tiempos de estilo europeo:

(24-hours ":" minutes
          (if time-zone " (") time-zone (if time-zone ")"))

Tenga en cuenta que pocas funciones de calendario devuelven la hora del día (en la actualidad, sólo las funciones solares).

Personalizar la agenda

Normalmente, la ventana de la agenda indica los días festivos que caen en la fecha de las entradas de la agenda, ya sea en la línea de modo o en el propio buffer. El proceso de comprobación de los días festivos puede ser lento, dependiendo de los días festivos definidos. En ese caso, si se establece el indicador diary-show-holidays-flag a nil se acelerará la visualización de la agenda.

La variable diary-number-of-entries controla el número de días de las entradas de la agenda que se mostrarán a la vez. Afecta a la visualización inicial cuando calendar-view-diary-initially-flag es t, así como al comando Alt-x diary (M-x diary). Por ejemplo, un valor de 1 (el predeterminado) muestra sólo las entradas del diario del día actual, mientras que un valor de 2 mostrará también las entradas del día siguiente. El valor también puede ser un vector de siete enteros: por ejemplo, si el valor es [0 2 2 2 4 1] entonces no aparecen entradas de la agenda el domingo, las entradas de la fecha actual y del día siguiente aparecen de lunes a jueves, las entradas del viernes al lunes aparecen el viernes, mientras que el sábado sólo aparecen las entradas de ese día.

Puede personalizar la forma de las fechas en su archivo de agenda estableciendo la variable diary-date-forms. Esta variable es una lista de patrones para reconocer una fecha. Cada patrón de fecha es una lista cuyos elementos pueden ser expresiones regulares (véase Expresiones regulares en el Manual de referencia de Emacs Lisp) o los símbolos month, day, year, monthname, dayname (mes, día, año, nombre del mes y nombre del día). Todos estos elementos sirven como patrones que coinciden con ciertos tipos de texto en el archivo de la agenda. Para que el patrón de fecha en su conjunto coincida, todos sus elementos deben coincidir consecutivamente.

Una expresión regular en un patrón de fecha coincide de la manera habitual, utilizando la tabla de sintaxis estándar alterada para que ‘*’ sea un componente de la palabra.

Los símbolos month, day, year, monthname, dayname (mes, día, año, nombre del mes y nombre del día) coinciden con el número del mes, el número del día, el número del año, el nombre del mes y el nombre del día de la fecha considerada. Los símbolos que coinciden con números admiten ceros a la izquierda; los que coinciden con nombres admiten mayúsculas y abreviaturas (como se especifica en calendar-month-abbrev-array y calendar-day-abbrev-array). Todos los símbolos pueden coincidir con ‘*’; dado que ‘*’ en una entrada de agenda significa "cualquier día", "cualquier mes", etc., debería coincidir independientemente de la fecha que se considere.

El valor por defecto de diary-date-forms en el estilo americano es proporcionado por diary-american-date-forms:

((month "/" day "[^/0-9]")
 (month "/" day "/" year "[^0-9]")
 (monthname " *" day "[^,0-9]")
 (monthname " *" day ", *" year "[^0-9]")
 (dayname "\\W"))

Las variables diary-european-date-forms y diary-iso-date-forms proporcionan otros estilos por defecto.

Los patrones de fecha de la lista deben ser mutuamente excluyentes y no deben coincidir con ninguna parte de la entrada del diario en sí, sólo con la fecha y un carácter de espacio en blanco. Si, para ser mutuamente excluyente, el patrón debe coincidir con una parte del texto de la entrada de la agenda, más allá del espacio en blanco que finaliza la fecha, entonces el primer elemento del patrón de fecha debe ser una copia de seguridad. Esto hace que el reconocedor de fechas retroceda hasta el principio de la palabra actual de la entrada del diario, después de terminar la coincidencia. Incluso si utiliza la copia de seguridad, el patrón de fecha no debe coincidir en absoluto con más de una parte de la primera palabra de la entrada de la agenda. Por ejemplo, el valor por defecto de diary-european-date-forms es:

((day "/" month "[^/0-9]")
 (day "/" month "/" year "[^0-9]")
 (backup day " *" monthname "\\W+\\<\\([^*0-9]\\|\\([0-9]+[:aApP]\\)\\)")
 (day " *" monthname " *" year "[^0-9]")
 (dayname "\\W"))

Fíjese en el uso de backup (copia de seguridad) en el tercer patrón, porque necesita coincidir con parte de una palabra más allá de la propia fecha para distinguirlo del cuarto patrón.

Entradas de la agenda con calendarios no gregorianos

Además de las entradas basadas en el calendario Gregoriano estándar, su agenda puede tener entradas basadas en fechas Bahá'ís, Chinas, Hebreas o Islámicas. Sin embargo, el reconocimiento de estas entradas puede llevar mucho tiempo y, dado que la mayoría de la gente no las utiliza, debe habilitar explícitamente su uso. Si quieres que la agenda reconozca las entradas con fecha hebrea, por ejemplo, debes hacer lo siguiente:

(add-hook 'diary-nongregorian-listing-hook 'diary-hebrew-list-entries)
(add-hook 'diary-nongregorian-marking-hook 'diary-hebrew-mark-entries)

Del mismo modo, para las entradas islámicas, Bahá'ís y Chinas, añada:

diary-islamic-list-entries diary-islamic-mark-entries diary-bahai-list-entries
diary-bahai-mark-entries diary-chinese-list-entries diary-chinese-mark-entries

Estas entradas de diario tienen el mismo formato que las entradas de diario de fecha Gregoriana, excepto que diary-bahai-entry-symbol (por defecto ‘B’) debe preceder a una fecha Bahá'í, diary-chinese-entry-symbol (por defecto ‘C’) a una fecha China, diary-hebrew-entry-symbol (por defecto ‘H’) a una fecha Hebrea, y diary-islamic-entry-symbol (por defecto ‘I’) a una fecha Islámica. Además, los nombres de los meses no Gregorianos no pueden abreviarse (porque las tres primeras letras no suelen ser únicas). (Tenga en cuenta también que debe utilizar "Adar I" si quiere el Adar de un año Hebreo común). Por ejemplo, una entrada de diario para la fecha hebrea Heshvan 25 podría tener el siguiente aspecto

HHeshvan 25 ¡Feliz Cumpleaños Hebreo!

y aparecería en la agenda para cualquier fecha que corresponda a Heshvan 25 en el calendario Hebreo. Y aquí hay una entrada en la agenda de la fecha islámica que coincide con Dhu al-Qada 25:

IDhu al-Qada 25 ¡Feliz cumpleaños Islámico!

Al igual que las entradas de la agenda con fecha Gregoriana, las entradas no Gregorianas no se marcan si van precedidas por diary-nonmarking-symbol (por defecto ‘&’).

A continuación se muestra una tabla de comandos utilizados en el calendario para crear entradas de agenda que coincidan con la fecha seleccionada y con otras fechas que sean similares en los calendarios Bahá'í, Chino, Hebreo o Islámico:

ihd (i h d)
diary-hebrew-insert-entry
ihm (i h m)
diary-hebrew-insert-monthly-entry
ihy (i h y)
diary-hebrew-insert-yearly-entry
iid (i i d)
diary-islamic-insert-entry
iim (i i m)
diary-islamic-insert-monthly-insert
iiy (i i y)
diary-islamic-yearly-entry
iBd (i B d)
diary-bahai-insert-entry
iBm (i B m)
diary-bahai-insert-monthly-entry
iBy (i B y)
diary-bahai-insert-yearly-entry
iCd (i C d)
diary-chinese-insert-entry
iCm (i C m)
diary-chinese-insert-yearly-entry
iCy (i C y)
diary-chinese-insert-yearly-entry
iCa (i C a)
diary-chinese-insert-anniversary-entry

Estos comandos funcionan de forma muy parecida a los comandos correspondientes a las entradas ordinarias de la agenda: se aplican a la fecha en la que se encuentra el punto en la ventana del calendario, y lo que hacen es insertar sólo la parte de la fecha de una entrada de la agenda al final de su archivo de la agenda. A continuación, debe insertar el resto de la entrada de la agenda. Los comandos básicos añaden una entrada para la fecha específica no gregoriana, los comandos ‘monthly’ (mensuales) para el día no Gregoriano dado dentro del mes en cada mes, y los comandos ‘yearly’ (anuales) para el día y mes no Gregorianos dados en cada año.

Visualización (pantalla) de la agenda

La visualización de la agenda funciona preparando la lista de entradas de la agenda y luego ejecutando la función especificada por la variable diary-display-function. El valor predeterminado diary-fancy-display muestra las entradas de la agenda y las vacaciones copiándolas en un búfer especial que existe sólo para su visualización. Copiar las entradas de la agenda en un búfer separado ofrece la oportunidad de cambiar el texto mostrado para hacerlo más bonito, por ejemplo, para ordenar las entradas por las fechas a las que se aplican.

Normalmente, la memoria intermedia de la agenda no muestra los días para los que no hay entradas en la agenda, incluso si ese día es festivo. Si desea que estos días se muestren en el búfer de la agenda, establezca la variable diary-list-include-blanks en t.

El búfer de la agenda de lujo permite el modo de visualización (véase el modo de visualización).

El método de visualización alternativo diary-simple-display muestra el búfer de la agenda real, y utiliza texto invisible para ocultar las entradas que no se aplican. Las vacaciones se muestran en la línea de modo. La ventaja de este método es que puede editar el buffer y guardar los cambios directamente en el archivo de la agenda. Sin embargo, este método no es tan flexible como el método elegante. Por ejemplo, no puede ordenar las entradas. Otra desventaja es que el texto invisible puede ser confuso. Por ejemplo, si copia una región de texto para pegarla en otro lugar, puede incluirse texto invisible. Del mismo modo, dado que el búfer de la agenda, tal y como lo ve, es una ilusión, la simple impresión del búfer puede no imprimir lo que ve en su pantalla.

Por esta razón, existe un comando especial para imprimir una copia del búfer de la agenda tal y como aparece; este comando es Alt-x diary-print-entries (M-x diary-print-entries). Funciona con cualquiera de los dos métodos de visualización, aunque con la visualización elegante también puede imprimir el búfer como cualquier otro. Para imprimir una copia de la agenda día a día de una semana, sitúe el punto en el primer día de la semana, escriba 7d (7 d) y luego haga Alt-x diary-print-entries (M-x diary-print-entries). Como es habitual, la inclusión de los días festivos ralentiza ligeramente la visualización; puede acelerar las cosas estableciendo la variable diary-show-holidays-flag a nil.

Este comando prepara un búfer temporal que contiene sólo las entradas de la agenda actualmente visibles en el búfer de la agenda. A diferencia de la visualización simple, las otras entradas irrelevantes están realmente ausentes, no sólo ocultas. Después de preparar el buffer, ejecuta el gancho diary-print-entries-hook. El valor por defecto de este gancho envía los datos directamente a la impresora con el comando lpr-buffer (ver Impresión de copias duras). Si desea utilizar un comando diferente para realizar la impresión, simplemente cambie el valor de este gancho (hook). Otros usos pueden ser, por ejemplo, reorganizar las líneas en orden por día y hora.

Puede editar las entradas de la agenda tal y como aparecen en la ventana simple de la agenda, pero es importante recordar que el buffer que se muestra contiene todo el archivo de la agenda, con partes ocultas a la vista. Esto significa, por ejemplo, que el comando Ctrl-f (C-f, forward-char) puede poner un punto en lo que parece ser el final de la línea, pero que en realidad es la mitad de alguna línea oculta.

¡Tenga cuidado al editar las entradas del diario en la pantalla simple! Insertar líneas adicionales o añadir/borrar caracteres en medio de una línea visible no puede causar problemas, pero editar al final de una línea puede no hacer lo que espera. Borrar una línea puede borrar otras entradas invisibles que le siguen. Antes de editar el buffer de la agenda simple, es mejor mostrar todo el archivo con s (s, diary-show-all-entries).

Visualización de la agenda de lujo

Las siguientes características sólo funcionan con la visualización de la agenda de lujo.

Puede usar el gancho normal diary-list-entries-hook para ordenar las entradas de la agenda de cada día por su hora. Se hace de la siguiente forma:

(add-hook 'diary-list-entries-hook 'diary-sort-entries t)

Para cada día, esto ordena las entradas del diario que comienzan con una hora reconocible del día según sus tiempos. Las entradas de la agenda que no tienen hora aparecen primero dentro de cada día. Observe cómo el comando de ordenación se coloca al final de la lista de ganchos, en caso de que los miembros anteriores de la lista cambien el orden de las entradas de la agenda, o añadan elementos.

Puede escribir comments (comentarios) en las entradas de la agenda, estableciendo las variables diary-comment-start y diary-comment-end a cadenas que delimitan los comentarios. La pantalla de lujo no imprime los comentarios. Es posible que quiera poner metadatos para el uso de otros paquetes (por ejemplo, el paquete de citas, ver Citas) dentro de los comentarios.

El archivo principal de la agenda puede incluir otros archivos. Esto permite a un grupo de personas compartir un archivo de agenda para eventos que se aplican a todos ellos. Las líneas del archivo de la agenda que comienzan con diary-include-string:

#include "filename"

incluye las entradas de la agenda del archivo filename en el buffer de la agenda de lujo. El mecanismo de inclusión es recursivo, de modo que los archivos incluidos pueden incluir otros archivos, y así sucesivamente (debe tener cuidado de no tener un ciclo de inclusiones, por supuesto). A continuación se explica cómo activar el mecanismo de inclusión:

(add-hook 'diary-list-entries-hook 'diary-include-other-diary-files)
(add-hook 'diary-mark-entries-hook 'diary-mark-included-diary-files)

El mecanismo de inclusión sólo funciona con la visualización de la agenda de lujo, porque la visualización de la agenda simple muestra las entradas directamente desde su archivo de la agenda.

Entradas Sexp y la pantalla de la agenda de lujo

Las entradas de la agenda sexp le permiten hacer algo más que tener condiciones complicadas bajo las cuales se aplica una entrada de la agenda. Las entradas sexp deben ir precedidas por diary-sexp-entry-symbol (por defecto ‘%%’) en el archivo de la agenda. Con la visualización de la agenda, las entradas sexp pueden generar el texto de la entrada dependiendo de la propia fecha.

Por ejemplo, una entrada de diario de aniversario puede insertar el número de años desde la fecha de aniversario en el texto de la entrada del diario. Así, el ‘%d’ de esta entrada de diario:

%%(diary-anniversary 10 31 1948) Cumpleaños Arturo (%d years old)

se sustituye por la edad, por lo que el 31 de octubre de 1990 la entrada aparece en el buffer de la agenda de lujo de esta forma:

Cumpleaños de Arturo (42 años)

Si en cambio el archivo de la agenda contiene esta entrada:

%%(diary-anniversary 10 31 1948) Cumpleaños %d%s de Arturo

la entrada en el buffer de la agenda de lujo para el 31 de octubre de 1990 aparece así:

El 42º cumpleaños de Arthur

Del mismo modo, las entradas del diario cíclico pueden interpolar el número de repeticiones que se han producido:

%%(diary-cyclic 50 1 1 2012) Renovar la medicación (%d%s time)

se ve así:

Renovar la medicación (5º vez)

en la pantalla de la agenda de lujo el 7 de septiembre de 2012.

Hay un sexp de agenda de recordatorio anticipado que incluye su entrada en la agenda no sólo en la fecha de ocurrencia, sino también en fechas anteriores. Por ejemplo, si quiere un recordatorio una semana antes de su aniversario, puede usar:

%%(diary-remind '(diary-anniversary 12 22 1968) 7) Aniversario de Eduardo

y la agenda de lujo mostrará ‘el aniversario de Ed’ tanto el 15 de diciembre como el 22 de diciembre.

La función diary-date se aplica a las fechas descritas por una combinación de mes, día y año, cada una de las cuales puede ser un entero, una lista de enteros o t (es decir, todos los valores). Por ejemplo,

%%(diary-date '(10 11 12) 22 t) Barrer las hojas

Hace que el diario de lujo muestre:

Barrer las hojas

el 22 de octubre, el 22 de noviembre y el 22 de diciembre de cada año.

La función diary-float permite describir entradas de la agenda que se aplican a fechas como el tercer viernes de noviembre o el último martes de abril. Los parámetros son el mes (month), el nombre del día (dayname) y un índice n. La entrada aparece en el nésimo nombre del día (dayname) después del primer día del mes (month), donde nombre del día=0 significa domingo, 1 significa lunes, y así sucesivamente. Si n es negativo, cuenta hacia atrás desde el final del mes (month). El valor de month puede ser una lista de meses, un solo mes, o t para especificar todos los meses. También puede utilizar un parámetro opcional, day, para especificar el nésimo nombre del día (dayname) en o después/antes del día del mes (month); el valor de day es por defecto 1 si n es positivo y el último día del mes (month) si n es negativo. Por ejemplo:

%%(diary-float t 1 -1) Pagar alquiler

Hace que el diario de lujo muestre:

Pagar el alquiler

el último lunes de cada mes.

La generalidad de las entradas de la agenda sexp le permite especificar cualquier entrada de la agenda que pueda describir algorítmicamente. Una entrada de agenda sexp contiene una expresión que calcula si la entrada se aplica a una fecha determinada. Si su valor es no nulo, la entrada se aplica a esa fecha; en caso contrario, no. La expresión puede utilizar la variable date para encontrar la fecha considerada; su valor es una lista (mes día año) que se refiere al calendario Gregoriano.

La entrada del diario sexp se aplica a una fecha cuando el valor de la expresión es no nulo, pero algunos valores tienen significados más específicos. Si el valor es una cadena, esa cadena es una descripción del evento que ocurre en esa fecha. El valor también puede tener la forma (mark . string); entonces mark especifica cómo marcar la fecha en el calendario, y string es la descripción del evento. Si mark es una cadena de un solo carácter, ese carácter aparece junto a la fecha en el calendario. Si mark es un nombre de cara, la fecha se muestra en esa cara. Si mark es nil, eso especifica que no hay ningún resalte particular para la fecha.

Supongamos que Usted cobra el día 21 del mes si es un día de la semana, y el viernes anterior si el 21 cae en fin de semana. A continuación se explica cómo escribir una entrada de diario sexual que coincida con esas fechas:

&%%(let ((dayname (calendar-day-of-week date))
         (day (cadr date)))
      (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
          (and (memq day '(19 20)) (= dayname 5)))
         ) Cheque de pago depositado

Las siguientes entradas de diario sexp aprovechan la posibilidad (en la pantalla de diario de lujo) de confeccionar entradas de diario cuyo texto varía en función de la fecha:

(%%diary-sunrise-sunset)
Hace una entrada en el diario para las fases (cuartos) de la luna.
%%(diary-day-of-year)
Hace una entrada en el diario con el número de día de hoy en el año actual y el número de días que quedan en el año actual.
%%(diary-day-of-year)
Hace una entrada en el diario con el número de día de hoy en el año actual y el número de días que quedan en el año actual.
%%(diary-iso-date)
Crea una entrada en la agenda con la fecha comercial ISO equivalente de hoy.
%%(diary-julian-date)
Crea una entrada en la agenda con la fecha equivalente del calendario juliano de hoy.
%%(diary-astro-day-number)
Crea una entrada en la agenda con el número de día astronómico (juliano) equivalente de hoy.
%%(diary-bahai-date)
Crea una entrada en la agenda con la fecha equivalente del calendario bahá'í de hoy.
%%(diary-chinese-date)
Crea una entrada en la agenda con la fecha del calendario Chino equivalente a la de hoy.
%%(diary-coptic-date)
Crea una entrada en la agenda con la fecha equivalente del calendario copto de hoy.
%%(diary-ethiopic-date)
Crea una entrada en la agenda con la fecha equivalente del calendario Etíope de hoy.
%%(diary-french-date)
Crea una entrada en el diario con la fecha equivalente a la de hoy en el calendario revolucionario Francés.
%%(diary-hebrew-date)
Hace una entrada en el diario con la fecha equivalente de hoy en el calendario Hebreo.
%%(diary-islamic-date)
Hace una entrada en la agenda con la fecha equivalente del calendario Islámico de hoy.
%%(diary-mayan-date)
Hace una entrada en la agenda con la fecha del calendario Maya equivalente a la de hoy.
%%(diary-persian-date)
Crea una entrada en la agenda con la fecha del calendario persa equivalente a la de hoy.

Por ejemplo incluyendo la entrada del diario:

&%%(diary-hebrew-date)

hace que la visualización de la agenda de cada día contenga la fecha equivalente en el calendario Hebreo, si está utilizando la visualización de la agenda elegante. (Con la visualización simple de la agenda, la línea literal ‘&%%(diary-hebrew-date)’ aparece en la agenda para cualquier fecha).

Esta función se ha utilizado para construir ciertas entradas de la agenda estándar en Hebreo sexp:

%%(diary-hebrew-rosh-hodesh)
Crea una entrada en el diario que cuenta la ocurrencia y el anuncio ritual de cada nuevo mes Hebreo.
%%(diary-hebrew-parasha)
Crea una entrada en el diario de los sábados que cuente la lectura semanal de las escrituras en la Sinagoga.
%%(diary-hebrew-sabbath-candles)
Crea una entrada en el diario del viernes que indique la hora local del encendido de las velas del Sabbath.
%%(diary-hebrew-omer)
Crea una entrada en el diario que dé la cuenta del omer, cuando sea apropiado.
%%(diary-hebrew-yarhzeit month day year) nombre
Crea una entrada en el diario que marca el aniversario de una fecha de muerte. La fecha es la fecha Gregoriana (civil) del fallecimiento. La entrada del diario aparece en el aniversario del calendario Hebreo apropiado y en el día anterior. (El orden de los parámetros cambia según el estilo de fecha del calendario; por ejemplo, en el estilo europeo a día, mes, año).
%%(diary-hebrew-birthday month day year)
Crea una entrada de diario para un cumpleaños en el calendario Hebreo.

Todas las funciones documentadas anteriormente toman un argumento opcional mark que especifica cómo marcar la fecha en la visualización del calendario. Si una de estas funciones decide que se aplica a una fecha determinada, devuelve un valor que contiene mark, como se ha descrito anteriormente.



Envío de correo

Para enviar un mensaje de correo electrónico desde Emacs, escriba Ctrl-x m (C-x m). Esto cambia a un búfer llamado *unset mail*, donde puede editar el texto y las cabeceras del mensaje. Cuando haya terminado, escriba Ctrl-c Ctrl-s (C-c C-s) o Ctrl-c Ctrl-c (C-c C-c) para enviarlo.

Ctrl-x m (C-x m)
Comienza a componer el correo (compose-mail).
Ctrl-x 4m (C-x 4 m)
Igualmente, en otra ventana (compose-mail-other-window).
Ctrl-x 5m (C-x 5 m)
Igualmente, pero en un nuevo marco (compose-mail-other-frame).
Ctrl-c Ctrl-s (C-c C-s)
En el buffer de correo, envía el mensaje (message-send).
Ctrl-c Ctrl-c (C-c C-c)
En el búfer de correo, envía el mensaje y entierra el búfer (message-send-and-exit).

El búfer de correo es un búfer ordinario de Emacs, por lo que puede cambiar a otros búferes mientras compone el correo. Si quiere enviar otro mensaje antes de terminar el actual, escriba Ctrl-x m (C-x m) de nuevo para abrir un nuevo búfer de correo cuyo nombre tenga un sufijo numérico diferente (vea Operaciones varias con el búfer). (Esto sólo funciona si utiliza el modo Mensaje por defecto para redactar el correo electrónico; consulta Comandos de correo). Si sabe que le gustaría continuar componiendo el mensaje no enviado que estaba editando, invoque este comando con un argumento de prefijo, Ctrl-u Ctrl-x m (C-u C-x m), y Emacs cambiará al último búfer de correo que usó y le permitirá continuar editando el mensaje donde lo dejó.

El comando Ctrl-x 4m (C-x 4 m, compose-mail-other-window) hace lo mismo que Ctrl-x m (C-x m), excepto que muestra el buffer de correo en una ventana diferente. El comando Ctrl-x 5m (C-x 5 m, compose-mail-other-frame) lo hace en un nuevo marco.

Cuando escriba Ctrl-c Ctrl-c (C-c C-c) o Ctrl-c Ctrl-s (C-c C-s) para enviar el correo, Emacs puede preguntarle cómo debe entregar el correo-ya sea directamente vía SMTP, o usando algún otro método. Vea Envío de correo, para más detalles.

El formato del búfer de correo

Este es un ejemplo del contenido de un búfer de correo:

    To: capa8@ejemplo.org
    CC: soldadito.de.juguete@ejemplo.net, rms@gnu.org
    Subject: Re: ¿Qué es lo mejor de la vida?
    From: ratambo@ejemplo.org
    --text follows this line--
    Aplastar a tus enemigos, verlos expulsados ante ti, y
    escuchar el lamento de sus mujeres.

En la parte superior del búfer de correo hay un conjunto de campos de cabecera, que se utilizan para especificar la información sobre los destinatarios del correo electrónico, el asunto, etc. El búfer anterior contiene campos de cabecera ‘To’ (Para), ‘CC’, ‘Subject’ (Asunto) y ‘From’ (De). Algunos campos de cabecera se preinicializan automáticamente en el búfer de correo, cuando es apropiado.

La línea que dice ‘--text follows this line--’ ('--El texto sigue esta línea') separa los campos de cabecera del cuerpo (o texto) del mensaje. Todo lo que está por encima de esa línea se trata como parte de las cabeceras; todo lo que está por debajo se trata como el cuerpo. La línea delimitadora no aparece en el mensaje que se envía.

Puede insertar y editar los campos de la cabecera utilizando los comandos de edición ordinarios. Véase Edición de cabeceras de correo, para conocer los comandos específicos de edición de los campos de cabecera. Algunas cabeceras, como ‘Date’ (Fecha) y ‘Message-ID’ (ID del mensaje) se omiten normalmente en el búfer de correo y se crean automáticamente cuando se envía el mensaje.

Campos de cabecera del correo

Un campo de cabecera en el búfer de correo comienza con un nombre de campo al principio de una línea, terminado por dos puntos. Las mayúsculas y las minúsculas son equivalentes en los nombres de campo. Después de los dos puntos y del espacio en blanco opcional viene el contenido del campo.

Puede utilizar cualquier nombre que desee para un campo de cabecera, pero normalmente la gente utiliza sólo nombres de campo estándar con significados aceptados.

El campo de cabecera ‘From’ (Desde) identifica a la persona que envía el correo electrónico (es decir, Usted). Debe ser una dirección de correo válida, ya que las respuestas se envían normalmente allí. El contenido por defecto de este campo de cabecera se calcula a partir de las variables user-full-name (que especifica tu nombre completo) y user-mail-address (su dirección de correo electrónico). En algunos sistemas operativos, Emacs inicializa estas dos variables utilizando variables de entorno (ver Variables generales). Si esta información no está disponible o es incorrecta, debe personalizar las variables Ud. mismo (ver Interfaz de personalización fácil).

Aparte de ‘From‘, aquí hay una tabla de campos de uso común:

‘To’
La(s) dirección(es) postal(es) a la(s) que va dirigido el mensaje. Para enumerar más de una dirección, utilice comas para separarlas.
‘Subject’
El asunto del mensaje.
‘CC’
La(s) dirección(es) de correo adicional(es) a la(s) que se envía el mensaje. Es como "To", salvo que estos lectores no deben considerar que el mensaje va dirigido a ellos.
‘BBC’
Dirección(es) de correo adicional(es) para enviar el mensaje, que no debe(n) aparecer en la cabecera del mensaje realmente enviado. ‘BCC’ significa blind carbon copies (copia oculta).
‘FFC’
El nombre de un archivo al que se debe adjuntar una copia del mensaje enviado. Emacs escribe el mensaje en formato mbox, a menos que el archivo esté en formato Babyl (utilizado por Rmail antes de Emacs 23), en cuyo caso el Editor escribe en formato Babyl. Si un buffer de Rmail está visitando el archivo, Emacs lo actualiza en consecuencia. Para especificar más de un archivo, utiliza varios campos 'FCC', con un nombre de archivo en cada campo.
‘Reply to’
Dirección a la que deben enviarse las respuestas, en lugar de ‘From’ ("Desde"). Se utiliza si, por alguna razón, su dirección ‘From’ no puede recibir respuestas.
‘Mail-Reply-To’
Este campo tiene prioridad sobre ‘Reply-To’ ("Responder-A"). Se utiliza porque algunas listas de correo establecen el campo "Reply-To" para sus propios fines (una práctica algo controvertida).
‘Mail-Followup-To’
Una o más direcciones para usar como destinatarios por defecto para los mensajes de seguimiento. Esto se utiliza normalmente cuando respondes a un mensaje de una lista de correo a la que estás suscrito, y quieres que las respuestas vayan a la lista sin enviarte una copia extra.
‘In-Reply-To’
Identificador del mensaje al que se responde. La mayoría de los lectores de correo utilizan esta información para agrupar los mensajes relacionados. Normalmente, esta cabecera se rellena automáticamente cuando respondes a un mensaje en cualquier programa de correo integrado en Emacs.
‘References’
Identificadores para mensajes anteriores relacionados. Al igual que ‘In-Reply-To’, normalmente se rellena automáticamente.

Los campos ‘To’, ‘CC’ y ‘CCO’ pueden aparecer cualquier número de veces, y cada uno de estos campos de cabecera puede contener varias direcciones, separadas por comas. De este modo, puede especificar cualquier número de lugares a los que enviar el mensaje. Estos campos también pueden tener líneas de continuación: una o más líneas que comienzan con un espacio en blanco, después de la línea de inicio del campo, se consideran parte del campo. Este es un ejemplo de un campo ‘To’ con una línea de continuación:

To: foo@ejemplo.net, este@ejemplo.net,
  bob@ejemplo.com

Puede indicar a Emacs que inserte ciertas cabeceras por defecto en el búfer de correo estableciendo la variable mail-default-headers en una cadena. Entonces Ctrl-x m (C-x m) inserta esta cadena en las cabeceras del mensaje. Por ejemplo, así es como se añade una cabecera ‘Reply-To’ y ‘FCC’ a cada mensaje:

(setq mail-default-headers
      "Reply-To: foo@ejemplo.com\nFCC: ~/Mail/sent")

Si los campos de cabecera por defecto no son apropiados para un mensaje en particular, edítelos como sea necesario antes de enviar el mensaje.

Alias de correo

Puede definir alias de correo, que son nombres mnemónicos cortos que representan una o más direcciones de correo. Por defecto, los alias de correo se definen en el archivo ~/.mailrc. Puede especificar un nombre de archivo diferente para usar, estableciendo la variable mail-personal-alias-file.

Para definir un alias en ~/.mailrc, escriba una línea como esta

alias nick fulladdresses

Esto significa que nick debe expandirse en fulladdresses, donde fulladdresses puede ser una sola dirección, o múltiples direcciones separadas con espacios. Por ejemplo, para hacer que maingnu signifique gnu@gnu.org más una dirección local propia, ponga esta línea:

alias maingnu gnu@gnu.org local-gnu

Si una dirección contiene un espacio, cite toda la dirección con un par de comillas dobles de esta forma:

alias ptroilo "Pichuco Troilo <none@ejemplo.com>"

Tenga en cuenta que no es necesario incluir comillas dobles alrededor de partes individuales de la dirección, como el nombre completo de la persona. Emacs las pone si son necesarias. Por ejemplo, inserta la dirección anterior como ‘"Pichuco Troilo" <none@ejemplo.com>’.

Emacs también reconoce los comandos de inclusión en ~/.mailrc. Se ven así:

source filename

El archivo ~/.mailrc no es exclusivo de Emacs; muchos otros programas de lectura de correo lo utilizan para los alias de correo, y puede contener varios otros comandos. Sin embargo, el Editor ignora todo excepto las definiciones de alias y los comandos de inclusión.

Los alias de correo se expanden como abreviaturas, es decir, en cuanto se escribe un carácter separador de palabras después de un alias (véase Abreviaturas). Esta expansión sólo tiene lugar dentro de los campos de cabecera ‘To’, ‘From’, ‘CC’, ‘CCO’ y ‘Reply To’ (además de sus variantes ‘Resent-’); no tiene lugar en otros campos de cabecera, como ‘Subject’.

También puede insertar una dirección con alias directamente, utilizando el comando Alt-x mail-abbrev-insert-alias (M-x mail-abbrev-insert-alias). Esto lee un nombre de alias, con terminación, e inserta su definición en el punto.

Comandos de correo

El modo principal por defecto para el búfer de *mail* se llama modo Mensaje (Message mode). Se comporta como el modo Texto en muchos aspectos, pero proporciona varios comandos adicionales en el prefijo Ctrl-c (C-c), que hacen más conveniente la edición de un mensaje.

En esta sección, describiremos algunos de los comandos más utilizados disponibles en el modo Mensaje. El modo Mensaje también tiene su propio manual, donde se describen sus características con mayor detalle. Véase Mensaje en Mensaje.

Envío de correos

Ctrl-c Ctrl-c (C-c C-c)
Envía el mensaje y entierra el búfer de correo (message-send-and-exit).
Ctrl-c Ctrl-s (C-c C-s)
Envía el mensaje, y dejar el búfer de correo seleccionado (message-send).

El comando habitual para enviar un mensaje es Ctrl-c Ctrl-c (C-c C-c, message-send-and-exit). Esto envía el mensaje y luego entierra el búfer de correo, poniéndolo en la prioridad más baja para la reselección. Si quieres que mate el búfer de correo en su lugar, cambia la variable message-kill-buffer-on-exit a t.

El comando Ctrl-c Ctrl-c (C-c C-s, message-send) envía el mensaje y deja el buffer seleccionado. Utilice este comando si desea modificar el mensaje (quizás con nuevos destinatarios) y enviarlo de nuevo.

Al enviar un mensaje se ejecuta el gancho message-send-hook. También marca el búfer de correo como no modificado, excepto si el búfer de correo es también un búfer de visita de archivos (en ese caso, sólo guardar el archivo lo hace, y no recibe una advertencia si intenta enviar el mismo mensaje dos veces).

La variable message-send-mail-function controla cómo se entrega el mensaje (send-mail-function se utiliza para el modo Mail). El valor de send-mail-function debe ser una de las siguientes funciones:

sendmail-query-once
Consulta un método de entrega (una de las otras entradas de esta lista), y utiliza ese método para este mensaje; luego guarda el método en send-mail-function, para que se utilice en futuras entregas. Este es el método por defecto, a menos que ya haya configurado las variables para el envío de correo a través de smtpmail-send-it (ver más abajo).
smtpmail-send-it
Envía el correo a través de un host de correo externo, como el servidor de correo SMTP saliente de su proveedor de servicios de Internet. Si no le ha dicho a Emacs cómo contactar con el servidor SMTP, le pedirá esta información, que se guarda en la variable smtpmail-smtp-server y en el archivo ~/.authinfo. Ver Emacs SMTP Library en Envío de correo vía SMTP.
sendmail-send-it
Envía el correo utilizando el programa sendmail por defecto del sistema, o su equivalente. Esto requiere que el sistema esté configurado para entregar correo directamente a través de SMTP.
mailclient-send-it
Pasa el buffer de correo al cliente de correo designado por el sistema. Vea la sección de comentarios en el archivo mailclient.el para más detalles.
feedmail-send-it
Es similar a sendmail-send-it, pero permite poner en cola los mensajes para su posterior envío. Consulte la sección de comentarios en el archivo feedmail.el para más detalles.

Cuando se envía un mensaje que contiene caracteres no ASCII, es necesario codificarlos con un sistema de codificación (véase Sistemas de codificación). Normalmente, el sistema de codificación se especifica automáticamente por el entorno de lenguaje elegido (véase Entornos de lenguaje). Puede especificar explícitamente el sistema de codificación para el correo saliente estableciendo la variable sendmail-coding-system (ver Reconocimiento de sistemas de codificación). Si el sistema de codificación así determinado no maneja los caracteres de un mensaje en particular, Emacs le pide que seleccione el sistema de codificación a utilizar, mostrando una lista de posibles sistemas de codificación. Véase Elegir sistemas de codificación para la salida.

Edición de cabeceras de correo

El modo de mensajes ofrece los siguientes comandos especiales para desplazarse a determinados campos de cabecera y para completar direcciones en las cabeceras.

Ctrl-c Ctrl-f Ctrl-t (C-c C-f C-t)
Se desplaza a la cabecera ‘To’ ('Para') (message-goto-to).
Ctrl-c Ctrl-f Ctrl-s (C-c C-f C-s)
Se mueve a la cabecera ‘Subject’ ('Asunto') (message-goto-subject).
Ctrl-c Ctrl-f Ctrl-c (C-c C-f C-c)
Pasa a la cabecera ‘CC’ (message-goto-cc).
Ctrl-c Ctrl-f Ctrl-b (C-c C-f C-b)
Se mueve a la cabecera ‘CCO’ (mensaje-goto-bcc).
Ctrl-c Ctrl-f Ctrl-r (C-c C-f C-r)
Pasa a la cabecera ‘Reply-To’ (message-goto-reply-to).
Ctrl-c Ctrl-f Ctrl-f (C-c C-f C-f)
Se mueve al campo de la cabecera ‘Mail-Followup-To’ (message-goto-followup-to).
Ctrl-c Ctrl-f Ctrl-w (C-c C-f C-w)
Añade un nuevo campo de cabecera ‘FCC’, con terminación de nombre de archivo (message-goto-fcc).
Ctrl-c Ctrl-b (C-c C-b)
Se mueve al inicio del cuerpo del mensaje (message-goto-body).
TAB (TAB)
Completa una dirección de correo (message-tab).

Los comandos para mover el punto a determinados campos de cabecera se basan todos en el prefijo Ctrl-c Ctrl-f (C-c C-f, ‘C-f’ es para "field" (campo)). Si el campo en cuestión no existe, el comando crea uno (la excepción es mail-fcc, que crea un nuevo campo cada vez).

El comando Ctrl-c Ctrl-b (C-c C-b, message-goto-body) mueve el punto justo después de la línea de separación de la cabecera, es decir, al principio del cuerpo.

Durante la edición de un campo de cabecera que contenga direcciones, como ‘To:’, ‘CC:’ y ‘BCC:’, puede completar una dirección escribiendo TAB (TAB, message-tab). Esto intenta insertar el nombre completo correspondiente a la dirección basándose en un par de métodos, incluyendo EUDC, una biblioteca que reconoce un número de protocolos de servidores de directorio (ver EUDC en The Emacs Unified Directory Client). Si no lo consigue, intente expandir la dirección como un alias de correo (ver Alias de correo). Si point está en un campo de cabecera que no acepta direcciones, o si está en el cuerpo del mensaje, entonces TAB (TAB) simplemente inserta un carácter de tabulación.

Citar el correo

Ctrl-c Ctrl-y (C-c C-y)
Extrae el mensaje seleccionado del lector de correo, como cita (message-yank-original).
Ctrl-c Ctrl-q (C-c C-q)
Rellena cada párrafo citado desde otro mensaje (mensaje-yanked-mensaje).

Puede utilizar el comando Ctrl-c Ctrl-y (C-c C-y, mensaje-yank-original) para citar un mensaje al que está respondiendo. Esto inserta el texto de ese mensaje en el búfer de correo. Este comando sólo funciona si el búfer de correo se invoca desde un lector de correo que se ejecuta en Emacs, como Rmail.

Por defecto, Emacs inserta la cadena ‘>’ delante de cada línea del texto citado; esta cadena de prefijo se especifica mediante la variable message-yank-prefix. Si llama a messaje-yank-original con un argumento de prefijo, el prefijo de la cita no se inserta.

Después de usar Ctrl-c Ctrl-y (C-c C-y), puede escribir Ctrl-c (C-c C-q, message-fill-yanked-message) para rellenar los párrafos del mensaje citado. Un solo uso de Ctrl-c Ctrt-q (C-c C-q) rellena todos esos párrafos, cada uno por separado. Para rellenar un solo párrafo del mensaje citado, utilice Alt-q (M-q). Si el relleno no maneja automáticamente el tipo de prefijo de la cita que usted utiliza, intente establecer el prefijo de relleno explícitamente. Consulte Texto de Relleno.

Puede personalizar la cita por correo a través del gancho mail-citation-hook. Por ejemplo, puede utilizar el paquete Supercite, que proporciona una citación más flexible (véase Introducción en Supercite).

Miscelánea del correo

Puede adjuntar un archivo a un mensaje saliente escribiendo Ctrl-c Ctrl-a (C-c C-a, mml-attach-file) en el búfer de correo. Para adjuntar un archivo se utiliza el estándar MIME (Multipurpose Internet Mail Extensions).

El comando mml-attach-file solicita el nombre del archivo, el tipo de contenido, la descripción y la disposición del archivo adjunto. El tipo de contenido normalmente se detecta automáticamente; basta con escribir RETURN (RET) para aceptar el valor predeterminado. La descripción es una sola línea de texto que el destinatario verá junto al archivo adjunto; también puede optar por dejarla vacía. La disposición es ‘inline’, lo que significa que el destinatario verá un enlace al adjunto dentro del cuerpo del mensaje, o ‘attachment’, lo que significa que el enlace estará separado del cuerpo.

El comando mml-attach-file es específico del modo Mensaje; en el modo Correo utilice mail-add-attachment en su lugar. Sólo pedirá el nombre del archivo, y determinará el tipo de contenido y la disposición automáticamente. Si desea incluir alguna descripción del archivo adjunto, escríbala en el cuerpo del mensaje.

El contenido real del archivo adjunto no se inserta en el búfer del correo. En su lugar, se inserta en el búfer de correo un texto marcador de posición, como el siguiente:

<#part type="text/plain" filename="~/foo.txt" disposition=inline>
<#/part>

Cuando escriba Ctrl-c Ctrl-c (C-c C-c) o Ctrl-c Ctrl-s (C-c C-s) para enviar el mensaje, el archivo adjunto se entregará con él.

Mientras se redacta un mensaje, se puede corregir la ortografía del texto del mensaje escribiendo Alt-x ispell-message (M-x ispell-message). Si Usted ha replegado un mensaje entrante en el borrador saliente, este comando omite lo que se ha replegado, pero comprueba el texto que Usted mismo ha insertado (busca la sangría o el prefijo mail-yank para distinguir las líneas citadas de su entrada). Véase Comprobar y corregir la ortografía.

Al activar el modo de mensaje (que Ctrl-x m (C-x m) hace automáticamente) se ejecutan los ganchos normales text-mode-hook y message-mode-hook. La inicialización de un nuevo mensaje saliente ejecuta el gancho normal message-setup-hook; puede utilizar este gancho si desea realizar cambios en la apariencia del búfer de correo. Ver Ganchos.

La principal diferencia entre estos ganchos es simplemente cuándo se invocan. Siempre que escriba , Ctrl-x m message-mode-hook (C-x m, message-mode-hook) se ejecuta tan pronto como se crea el búfer de correo. Entonces la función message-setup inserta el contenido por defecto del buffer. Una vez insertados estos contenidos por defecto, se ejecuta message-setup-hook.

Si utiliza Ctrl-x m (C-x m) para continuar una composición existente, message-mode-hook se ejecuta inmediatamente después de cambiar al búfer de correo. Si el búfer no ha sido modificado, o si decide borrarlo y empezar de nuevo, message-setup-hook se ejecuta después de insertar los contenidos por defecto.

Firma de correo

Puede añadir un texto estándar -su firma de correo- al final de cada mensaje. Esta firma puede contener información como su número de teléfono o su ubicación física. La variable message-signature determina cómo Emacs maneja la firma del correo.

El valor por defecto de message-signature es t; esto significa buscar su firma de correo en el archivo ~/.signature. Si este archivo existe, su contenido se inserta automáticamente al final del buffer de correo. Puede cambiar el archivo de firma a través de la variable message-signature-file.

Si cambia message-signature por una cadena, ésta especifica el texto de la firma directamente.

Si cambia message-signature a nil, Emacs no insertará su firma de correo automáticamente. Puede insertar su firma de correo escribiendo Ctrl-c Ctrl-w (C-c C-w, message-insert-signature) en el buffer de correo. Emacs buscará su firma en el fichero de firmas.

Si utiliza el modo Correo en lugar del modo Mensaje para componer su correo, las variables correspondientes que determinan cómo se envía su firma son mail-signature y mail-signature-file.

Por convención, una firma de correo debe estar marcada por una línea cuyo contenido es ‘-- ’. Si su firma carece de este prefijo, se añadirá por Usted. El resto de su firma no debe tener más de cuatro líneas.

Diversiones de correo

Alt-x spook (M-x spook) añade una línea de palabras clave elegidas al azar a un mensaje de correo saliente. Las palabras clave se eligen de una lista de palabras que sugieren que se está hablando de algo subversivo.

La idea que subyace a esta función es la sospecha de que la NSA (16) y otras agencias de inteligencia fisgonean todos los mensajes de correo electrónico que contienen palabras clave que sugieren que podrían resultar interesantes. (Las agencias dicen que no lo hacen, pero eso es lo que dirían.) La idea es que si mucha gente añade palabras sospechosas a sus mensajes, las agencias estarán tan ocupadas con entradas espurias que tendrán que renunciar a leerlas todas. Sea o no cierto, al menos divierte a algunas personas.

Nota

(16) La Agencia de Seguridad Nacional de los Estados Unidos.

Puede utilizar el programa fortune para poner un mensaje de las galletas (cookies) de fortune en el correo saliente. Para ello, añada fortune-to-signature a mail-setup-hook:

(add-hook 'mail-setup-hook 'fortune-to-signature)

Es probable que tenga que establecer la variable fortune-file antes de usar esto.

Métodos de composición de correo

En este capítulo hemos descrito el modo habitual del Editor para la edición y el envío de correo: el modo mensaje. Este es sólo uno de los varios modos disponibles. Antes de Emacs 23.2, el modo por defecto era el modo Correo, que es similar al modo Mensaje en muchos aspectos pero carece de características como el soporte MIME. Otro modo disponible es MH-E (ver MH-E en The Emacs Interface to MH).

Puede elegir cualquiera de estos agentes de Usuario de correo como su método preferido para editar y enviar correo. Los comandos Ctrl-x m (C-x m), Ctrl-x 4m (C-x 4 m) y Ctrl-x 5m (C-x 5 m) utilizan el agente que hayas especificado; también lo hacen otras partes de Emacs que envían correo, como el reportador de errores (ver Reportando errores). Para especificar un agente de usuario de correo, personalice la variable mail-user-agent. Actualmente, los valores legítimos incluyen message-user-agent (modo Mensaje) sendmail-user-agent (modo Correo), gnus-user-agent, y mh-e-user-agent.

Si selecciona un método de composición de correo diferente, la información de este capítulo sobre el búfer de correo y el modo Mensaje no se aplica; los otros métodos utilizan un formato de texto diferente en un búfer diferente, y sus comandos también son diferentes.

Del mismo modo, para especificar su método preferido para leer el correo, personalice la variable read-mail-command. El valor por defecto es rmail (ver Lectura de correo con Rmail).



Leer el correo con Rmail

Rmail es un subsistema de Emacs para leer y disponer del correo que se recibe. Rmail almacena los mensajes de correo en archivos llamados archivos Rmail. La lectura de los mensajes en un archivo Rmail se realiza en un modo principal especial, el modo Rmail, que redefine la mayoría de las letras para ejecutar comandos para gestionar el correo.

Emacs también viene con un subsistema mucho más sofisticado y flexible para leer el correo, llamado Gnus. Gnus es un paquete muy grande, y por lo tanto se describe en su propio manual, ver el lector de noticias gnus.

Conceptos básicos de Rmail

Usando Rmail de la manera más simple, Usted tiene un archivo de Rmail (~/RMAIL) en el que se guarda todo su correo. Se llama su archivo Rmail primario. El comando Alt-x rmail (M-x rmail) lee su archivo primario de Rmail, combina los nuevos correos de sus bandejas de entrada, muestra el primer mensaje que aún no ha leído y le permite comenzar a leer. La variable rmail-file-name especifica el nombre del archivo primario de Rmail.

Rmail muestra sólo un mensaje a la vez en el archivo de Rmail. El mensaje que se muestra se llama mensaje actual. Los comandos especiales del modo Rmail pueden hacer cosas como borrar el mensaje actual, copiarlo en otro archivo, enviar una respuesta o pasar a otro mensaje. También puede crear varios archivos de Rmail (ver Manejo de Archivos) y usar Rmail para mover mensajes entre ellos (ver Copiar Mensajes a Archivos).

Dentro del archivo de Rmail, los mensajes se ordenan normalmente de forma secuencial por orden de recepción; puede especificar otras formas de ordenarlos (véase Ordenación del archivo de Rmail). Los mensajes se identifican mediante números enteros consecutivos que son sus números de mensaje. El número del mensaje actual se muestra en la línea de modo de Rmail, seguido del número total de mensajes en el archivo. Puede desplazarse a un mensaje especificando su número de mensaje con la tecla j (véase Desplazamiento entre mensajes).

Siguiendo las convenciones habituales de Emacs, los cambios en un archivo de Rmail se hacen permanentes sólo cuando se guarda el archivo. Puede guardarlo con s (s, rmail-expunge-and-save), que también expulsa primero los mensajes borrados del archivo (vea Borrar mensajes). Para guardar el archivo sin borrarlo, utilice Ctrl-x Ctrl-s (C-x C-s). Rmail guarda automáticamente el archivo de Rmail después de fusionar el correo nuevo de un archivo de bandeja de entrada (véase Archivos de Rmail y bandejas de entrada).

Puede salir de Rmail con q (q, rmail-quit); esto expulsa y guarda el archivo de Rmail, luego entierra el búfer de Rmail así como su búfer de resumen, si está presente (ver Resúmenes). Pero no es necesario salir formalmente. Si cambia de Rmail a la edición en otros búferes, y nunca vuelve a cambiar, ha salido. Sólo asegúrese de guardar el archivo de Rmail eventualmente (como cualquier otro archivo que haya cambiado). Ctrl-x s (C-x s) es una forma adecuada de hacerlo (ver Comandos para guardar archivos). El comando b (b) de Rmail, rmail-bury, entierra el buffer de Rmail y su resumen sin expurgar y guardar el archivo de Rmail.

Desplazamiento dentro de un mensaje

Cuando Rmail muestra un mensaje que no cabe en la pantalla, debe desplazarse por él para leer el resto. Puede hacerlo con los comandos de desplazamiento habituales: Ctrl-v (C-v), Alt-v (M-v) y Alt-< (M-<) (ver Desplazamiento), pero en Rmail el desplazamiento es tan frecuente que merece ser más sencillo.

SPACE (SPC)
Desplaza hacia adelante (scroll-up-command).
DEL (DEL)
Shift-SPACE (S-SPC)
Desplaza hacia atrás (scroll-down-command).
. (.)
Desplaza al inicio del mensaje (rmail-inicio-del-mensaje).
/ (/)
Desplaza hasta el final del mensaje (rmail-end-of-message).

Dado que lo más habitual mientras se lee un mensaje es desplazarse a través de él por pantallazos, Rmail hace que SPACE (SPC) y DEL (DEL) (o Shift-SPACE (S-SPC)) hagan lo mismo que Ctrl-v (C-v, scroll-up-command) y Alt-v (M-v, scroll-down-command) respectivamente.

El comando . (., rmail-beginning-of-message) se desplaza hacia atrás hasta el principio del mensaje seleccionado. Esto no es exactamente lo mismo que Alt-< (M-<): por un lado, no fija la marca, por otro; restablece los límites del búfer del mensaje actual si los ha cambiado (por ejemplo, editando, véase Editar dentro de un mensaje). Del mismo modo, el comando / (/, rmail-end-of-message) se desplaza hacia delante hasta el final del mensaje seleccionado.

Moverse entre los mensajes

Lo más básico que se puede hacer con un mensaje es leerlo. La forma de hacerlo en Rmail es hacer que el mensaje sea actual. La práctica habitual es moverse secuencialmente por el archivo, ya que este es el orden de recepción de los mensajes. Cuando entra en Rmail, se sitúa en el primer mensaje que aún no ha hecho actual (es decir, el primero que tiene el atributo ‘unseen’ ("no visto"); ver Atributos de Rmail). Avanza para ver los demás mensajes nuevos; retrocede para volver a ver los mensajes antiguos.

n (n)

Pasa al siguiente mensaje no eliminado, saltando cualquier mensaje eliminado que intervenga (rmail-next-undeleted-message).

p (p)

Va al mensaje anterior no eliminado (rmail-previous-undeleted-message).

Alt-n (M-n)

Pasa al siguiente mensaje, incluyendo los mensajes borrados (rmail-next-message).

Alt-p (M-p)

Va al mensaje anterior, incluyendo los mensajes borrados (rmail-previous-message).

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

Pasa al siguiente mensaje con el mismo asunto que el actual (rmail-next-same-subject).

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

Pasa al mensaje anterior con el mismo asunto que el actual (rmail-previous-same-subject).

j (j)

Pasa al primer mensaje. Con el argumento n, moverse al mensaje número n (rmail-show-message).

> (>)

Pasa al último mensaje (rmail-last-message).

< (<)

Pasa al primer mensaje (rmail-first-message).

Alt-s expreg RETURN (M-s expreg RET)

Pasa al siguiente mensaje que contenga una coincidencia de expreg (rmail-search).

- Alt-s expreg RETURN (- M-s expreg RET)

Pasa al mensaje anterior que contenga una coincidencia para expreg. (Esto es Alt-s (M-s) con un argumento negativo).

n (n) y p (p) son la forma habitual de moverse entre los mensajes en Rmail. Se mueven a través de los mensajes secuencialmente, pero se saltan los mensajes borrados, que es lo que normalmente se quiere hacer. Sus definiciones de comando se denominan rmail-next-undeleted-message y rmail-previous-undeleted-message. Si no quiere omitir los mensajes borrados, por ejemplo, si quiere ir a un mensaje para deshacerlo- utilice las variantes Alt-n (M-n) y (M-p, rmail-next-message y rmail-previous-message). Un argumento numérico para cualquiera de estos comandos sirve como recuento de repeticiones.

En Rmail, puede especificar un argumento numérico escribiendo sólo los dígitos. No es necesario escribir primero Ctrl-u (C-u). También puede especificar un argumento negativo escribiendo sólo ‘-’.

El comando Alt-s (M-s, rmail-search) es la versión de búsqueda de Rmail. El comando de búsqueda incremental habitual Ctrl-u (C-s) funciona en Rmail, pero sólo busca dentro del mensaje actual. El propósito de Alt-s (M-s) es buscar otro mensaje. Lee una expresión regular (ver Sintaxis de Expresiones Regulares) de forma no incremental, y luego busca una coincidencia a partir del principio del siguiente mensaje. A continuación, selecciona ese mensaje. Si la expreg está vacía, Alt-s (M-s) reutiliza expreg utilizada la vez anterior.

Para buscar otro mensaje hacia atrás en el archivo, dé al comando Alt-s (M-s) un argumento negativo. En Rmail puede hacerlo con - Alt-s (- M-s). De este modo, se inicia la búsqueda desde el final del mensaje anterior.

También es posible buscar un mensaje basándose en las etiquetas. Ver Etiquetas.

El comando Ctrl-c Ctrl-n (C-c C-n, rmail-next-same-subject) pasa al siguiente mensaje con el mismo tema que el actual. Un argumento prefijo sirve como cuenta de repetición. Con un argumento negativo, este comando se mueve hacia atrás, actuando como Ctrl-c Ctrl-p (C-c C-p, rmail-previous-same-subject). Al comparar los asuntos, estos comandos ignoran los prefijos que suelen añadirse a los asuntos de las respuestas. Estos comandos son útiles para leer todos los mensajes pertenecientes a un mismo asunto, es decir, un hilo de conversación.

Para pasar a un mensaje especificado por el número absoluto de mensaje, use j (j, rmail-show-message) con el número de mensaje como argumento. Sin argumento, j (j) selecciona el primer mensaje. < (<, mail-first-message) también selecciona el primer mensaje. > (>, rmail-last-message) selecciona el último mensaje.

Borrar mensajes

Cuando ya no necesite conservar un mensaje, puede borrarlo. Esto lo marca como ignorable, y algunos comandos de Rmail fingen que ya no está presente; pero todavía tiene su lugar en el archivo de Rmail, y todavía tiene su número de mensaje.

Al borrar el archivo de Rmail, en realidad se eliminan los mensajes borrados. Los mensajes restantes se vuelven a numerar consecutivamente.

d (d)
Borra el mensaje actual, y pasa al siguiente mensaje no borrado (rmail-delete-forward).
Ctrl-d (C-d)
Elimina el mensaje actual, y se mueve al mensaje anterior no eliminado (rmail-delete-backward).
u (u)
Deshace el mensaje actual, o retrocede al mensaje anterior borrado y deshacerlo (rmail-undelete-previous-message).
x (x)
Borra el archivo de Rmail (rmail-expunge).

Hay dos comandos de Rmail para borrar mensajes. Ambos borran el mensaje actual y seleccionan otro. d (d, rmail-delete-forward) se mueve al siguiente mensaje, saltando los mensajes ya borrados, mientras que Ctrl-d (C-d, rmail-delete-backward) se mueve al mensaje anterior no borrado. Si no hay ningún mensaje no eliminado al que moverse en la dirección especificada, el mensaje que acaba de ser eliminado sigue siendo el actual. Un argumento numérico en forma de prefijo sirve como cuenta de repetición, para permitir el borrado de varios mensajes en un solo comando. Un argumento negativo invierte el significado de d (d) y Ctrl-d (C-d).

Cada vez que Rmail borra un mensaje, ejecuta el gancho rmail-delete-message-hook. Cuando se invocan las funciones del gancho, el mensaje ha sido marcado como borrado, pero sigue siendo el mensaje actual en el buffer de Rmail.

Para hacer que todos los mensajes borrados desaparezcan finalmente del archivo de Rmail, escriba x (x, rmail-expunge). Hasta que haga esto, todavía puede deshacer el borrado de los mensajes. El comando de deshacer el borrado, u (u, rmail-undelete-previous-message), está diseñado para cancelar el efecto de un comando d (d) en la mayoría de los casos. Deshace el mensaje actual si el mensaje actual está borrado. En caso contrario, se mueve hacia atrás a los mensajes anteriores hasta que se encuentra un mensaje borrado, y lo deshace. Un argumento numérico en forma de prefijo sirve como cuenta de repetición, para permitir deshacer varios mensajes en un solo comando.

Normalmente se puede deshacer una d (d) con una u (u) porque la u (u) retrocede y deshace el mensaje que la d (d) ha borrado. Pero esto no funciona cuando la d (d) se salta unos cuantos mensajes ya borrados que siguen al mensaje que se está borrando; entonces el comando u (u) deshace el último de los mensajes que se saltó. No hay una forma limpia de evitar este problema. Sin embargo, repitiendo el comando u (u), puede volver eventualmente al mensaje que pretende deshacer. También puede seleccionar un mensaje borrado en particular con el comando Alt-p (M-p), y luego escribir u (u) para deshacer el borrado.

Un mensaje borrado tiene el atributo ‘deleted’ ("borrado"), y como resultado ‘deleted’ aparece en la línea de modo cuando se borra el mensaje actual. De hecho, borrar o deshacer un mensaje no es más que añadir o quitar este atributo. Véase Atributos de Rmail.

Archivos de correo y bandejas de entrada

Cuando recibe un correo localmente, el sistema operativo coloca el correo entrante para Usted en un archivo que llamamos su bandeja de entrada. Cuando se inicia Rmail, éste ejecuta un programa C llamado movemail para copiar los nuevos mensajes de su bandeja de entrada en su archivo Rmail principal, que también contiene otros mensajes guardados de sesiones anteriores de Rmail. Es en este archivo donde realmente se lee el correo con Rmail. Esta operación se denomina obtener correo nuevo. Puede obtener nuevo correo en cualquier momento en Rmail escribiendo g (g).

La variable rmail-primary-inbox-list contiene una lista de los archivos que son bandejas de entrada para su archivo Rmail primario. Si no establece esta variable explícitamente, Rmail usa la variable de entorno MAIL o, como último recurso, una bandeja de entrada por defecto basada en rmail-spool-directory. El archivo de la bandeja de entrada por defecto depende de su sistema operativo; a menudo es /var/mail/nombredeusuario, /var/pool/mail/nombredeusuario, o /usr/spool/mail/nombredeusuario.

Puede especificar el(los) archivo(s) de la bandeja de entrada para cualquier archivo de Rmail para la sesión actual con el comando set-rmail-inbox-list; consulte Múltiples archivos de Rmail.

Hay dos razones para tener archivos de Rmail y bandejas de entrada separados.

  1. El formato del archivo de la bandeja de entrada varía entre los sistemas operativos y según el otro software de correo en uso. Sólo una parte de Rmail necesita conocer las alternativas, y sólo necesita entender cómo convertirlas todas al formato propio de Rmail.

  2. Es muy engorroso acceder a un archivo de la bandeja de entrada sin peligro de perder el correo, porque es necesario intercalar con la entrega del correo. Además, los distintos sistemas operativos utilizan diferentes técnicas de enclavamiento. La estrategia de mover el correo fuera de la bandeja de entrada de una vez por todas a un archivo Rmail separado evita la necesidad de enclavamiento en todo el resto de Rmail, ya que sólo Rmail opera en el archivo Rmail.

Rmail usa el formato estándar ‘mbox’, introducido por los sistemas Unix y GNU para los archivos de la bandeja de entrada, como su formato interno de archivos de Rmail. (De hecho, hay algunos formatos mbox ligeramente diferentes. Las diferencias no son muy importantes, pero puede establecer la variable rmail-mbox-format para decirle a Rmail qué formato usa su sistema. Vea la documentación de esa variable para más detalles).

Cuando se recibe un nuevo correo, Rmail primero copia el nuevo correo del archivo de la bandeja de entrada al archivo de Rmail; luego guarda el archivo de Rmail; y después borra el de la bandeja de entrada. De este modo, un fallo del sistema puede provocar la duplicación del correo entre la bandeja de entrada y el archivo de Rmail, pero no puede perder el correo. Si rmail-preserve-inbox no es nulo, entonces Rmail no borra el archivo de la bandeja de entrada cuando recibe nuevos correos. Es posible que desee establecer esto, por ejemplo, en un ordenador portátil que utilice para comprobar su correo a través de POP mientras está de viaje, para que su correo permanezca en el servidor y pueda guardarlo más tarde en su estación de trabajo principal.

En algunos casos, Rmail copia el nuevo correo del archivo de la bandeja de entrada indirectamente. Primero ejecuta el programa movemail para mover el correo de la bandeja de entrada a un archivo intermedio llamado .newmail-inboxname, en el mismo directorio que el archivo de Rmail. A continuación, Rmail fusiona el nuevo correo de ese archivo, guarda el archivo de Rmail y sólo entonces borra el archivo intermedio. Si hay un fallo en el momento equivocado, este archivo sigue existiendo, y Rmail lo utilizará de nuevo la próxima vez que reciba nuevo correo de bandeja de entrada.

Si Rmail no puede convertir los datos de .newmail-inboxname en formato mbox, renombra el archivo a RMAILOSE.n (n es un número entero elegido para que el nombre sea único) para que Rmail no a tener problemas con los datos. Debería mirar el archivo, encontrar el mensaje que confunde a Rmail (probablemente uno que incluya el carácter de control-subrayado, código octal 037), y borrarlo. Luego puede usar 1g (1 g) para obtener nuevos correos del archivo corregido.

Múltiples archivos de Rmail

Rmail opera por defecto en su archivo primario de Rmail, que se llama ~/RMAIL y recibe el correo entrante desde el archivo de la bandeja de entrada del sistema. Pero también puede tener otros archivos de Rmail y editarlos con Rmail. Estos archivos pueden recibir correo a través de sus propias bandejas de entrada, o puede mover los mensajes a ellos con comandos explícitos de Rmail (ver Copiar mensajes a archivos).

i archivo RETURN (i archivo RET)
Lee el archivo en Emacs y ejecuta Rmail en él (rmail-input).
g (g)
Combina el nuevo correo de las bandejas de entrada del archivo de Rmail actual (rmail-get-new-mail).
Ctrl-u g archivo RETURN (C-u g archivo RET)
Fusiona el nuevo correo con el archivo de la bandeja de entrada.

Para ejecutar Rmail en un archivo que no sea su archivo principal de Rmail, puede utilizar el comando i (i, rmail-input) en Rmail. Esto visita el archivo en modo Rmail. Puede usar Alt-x rmail-input (M-x rmail-input) incluso cuando no está en Rmail, pero es más fácil escribir Ctrl-u Alt-x (C-u M-x rmail), que hace lo mismo.

El archivo que lee con i (i) debe ser normalmente un archivo mbox válido. Si no lo es, Rmail intenta convertir su texto a formato mbox, y visita el texto convertido en el buffer. Si guarda el buffer, eso convierte el archivo.

Si especifica un nombre de archivo que no existe, i (i) inicializa un nuevo buffer para crear un nuevo archivo de Rmail.

También puede seleccionar un archivo Rmail desde un menú. En el menú Clasificar, elija el elemento Archivo Rmail de entrada; a continuación, elija el archivo Rmail que desee. Las variables rmail-secondary-file-directory y rmail-secondary-file-regexp especifican qué archivos ofrecer en el menú: la primera variable dice en qué directorio encontrarlos; la segunda dice qué archivos de ese directorio ofrecer (todos los que coincidan con la expresión regular). Si no hay archivos que coincidan, no podrá seleccionar este elemento del menú. Estas variables también se aplican a la elección de un archivo para la salida (véase Copiar mensajes en archivos).

Los archivos de la bandeja de entrada que se utilizarán se especifican mediante la variable rmail-inbox-list, que es de tipo buffer-local en el modo Rmail. Como excepción especial, si no ha especificado ningún archivo de bandeja de entrada para su archivo principal de Rmail, éste utiliza la variable de entorno MAIL, o su bandeja de entrada estándar del sistema.

El comando g (g, rmail-get-new-mail) fusiona el correo en el archivo de Rmail actual desde sus bandejas de entrada. Si el archivo de Rmail no tiene bandejas de entrada, g (g) no hace nada. El comando Alt-x rmail (M-x rmail) también fusiona el correo nuevo en el archivo principal de Rmail.

Para fusionar el correo de un archivo que no es la bandeja de entrada habitual, dé a la tecla g (g) un argumento numérico, como en Ctrl-u g (C-u g). Entonces lee un nombre de archivo y fusiona el correo de ese archivo. El archivo de la bandeja de entrada no se borra ni se modifica de ninguna manera cuando se utiliza g (g) con un argumento. Se trata, por tanto, de una forma general de fusionar un fichero de mensajes en otro.

Copiar mensajes en archivos

Estos comandos copian los mensajes de un archivo de Rmail a otro archivo.

o archivo RETURN (o archivo RET)
Añade una copia completa del mensaje actual al archivo (rmail-output).
Ctrl-o archivo RETURN (C-o archivo RET)
Añade una copia del mensaje actual, tal y como se muestra, al archivo (rmail-output-as-seen).
w archivo RETURN (w archivo RET)
Envía sólo el cuerpo del mensaje al archivo, tomando el nombre del archivo por defecto de la cabecera ‘Subject’ ('Asunto') del mensaje.

Los comandos o (o) y Ctrl-o (C-o) copian el mensaje actual en un archivo especificado, añadiéndolo al final. Un argumento de prefijo positivo sirve como cuenta de repetición: ese número de mensajes consecutivos se copiará en el archivo especificado, empezando por el actual e ignorando los mensajes borrados.

Los dos comandos se diferencian principalmente en la cantidad de mensajes que se copian: o copia las cabeceras completas de los mensajes, aunque no estén todas visibles, mientras que Ctrl-o (C-o) copia exactamente las cabeceras que se muestran en ese momento y nada más. Véase Visualización de mensajes. Además, o convierte el mensaje al formato Babyl (utilizado por Rmail en la versión 22 de Emacs y anteriores) si el fichero está en formato Babyl; Ctrl-o (C-o) no puede emitir a ficheros Babyl en absoluto.

Si el archivo de salida es visitado actualmente en un buffer de Emacs, los comandos de salida añaden el mensaje a ese buffer. Depende de usted guardar el buffer eventualmente en su archivo.

A veces puede recibir un mensaje cuyo cuerpo contiene el contenido de un archivo. Puede guardar el cuerpo en un archivo (excluyendo la cabecera del mensaje) con el comando w (w, rmail-output-body-to-file). A menudo, estos mensajes contienen el nombre del archivo previsto en el campo ‘Subject’ ("Asunto"), por lo que dicho comando utiliza el campo "Asunto" como el nombre del archivo de salida por defecto (después de sustituir algunos caracteres que no se pueden utilizar de forma portátil en los nombres de archivo). Sin embargo, el nombre del archivo se lee utilizando el minibuffer, por lo que puede especificar un nombre diferente si lo desea.

También puede enviar un mensaje a un archivo Rmail elegido con un menú. En el menú Classify (Clasificar), elija el elemento de menú Archivo Rmail de salida; luego elija el archivo Rmail que desee. Esto envía el mensaje actual a ese archivo, como el comando o (o). Las variables rmail-secondary-file-directory y rmail-secondary-file-regexp especifican qué archivos ofrecer en el menú: la primera variable dice en qué directorio encontrarlos; la segunda dice qué archivos de ese directorio ofrecer (todos los que coincidan con la expresión regular). Si no hay archivos que coincidan, no podrá seleccionar esta opción de menú.

Copiar un mensaje con o (o) o Ctrl-o (C-o) da a la copia original del mensaje el atributo ‘filed’ ('archivado'), de modo que ‘archived’ ('archivado') aparece en la línea de modo cuando dicho mensaje es actual.

Si desea conservar una sola copia de cada mensaje de correo, establezca la variable rmail-delete-after-output en t; entonces los comandos o (o), Ctrl-o (C-o) y w (w) eliminan el mensaje original después de copiarlo. (Puede deshacer el borrado después si lo desea, vea Borrar mensajes).

Por defecto, o (o) dejará el estado de borrado de un mensaje que saca como estaba en el mensaje original; así, un mensaje borrado antes de salir aparecerá como borrado en el archivo de salida. Establecer la variable rmail-output-reset-deleted-flag a un valor no nulo contrarresta esto: la copia del mensaje tendrá su estado de borrado restablecido, por lo que el mensaje aparecerá como no borrado en el fichero de salida. Además, cuando esta variable es no nula, si se especifica un argumento positivo a o (o) no se ignorarán los mensajes borrados cuando se busquen mensajes consecutivos para la salida.

La variable rmail-output-file-alist permite especificar valores predeterminados inteligentes para el fichero de salida, basados en el contenido del mensaje actual. El valor debe ser una lista cuyos elementos tengan esta forma:

(expreg . nombre-expr)

Si hay una coincidencia de expreg en el mensaje actual, el nombre de archivo por defecto para la salida es nombre-exp. Si varios elementos coinciden con el mensaje, el primer elemento coincidente decide el nombre de archivo por defecto. La subexpresión nombre-exp puede ser una constante de cadena que da el nombre de archivo a utilizar, o más generalmente puede ser cualquier expresión Lisp que produzca un nombre de archivo como cadena. rmail-output-file-alist se aplica tanto a o como a Ctrl-o (C-o).

Rmail puede guardar automáticamente los mensajes de su archivo principal de Rmail (el que rmail-file-name especifies) en otros archivos, basándose en el valor de la variable rmail-automatic-folder-directives. Esta variable es una lista de elementos (‘directives’) que dicen qué mensajes guardar y dónde. Cada directiva es una lista que consiste en un archivo de salida, seguido de uno o más pares de un nombre de cabecera y una expresión regular. Si un mensaje tiene una cabecera que coincide con la expresión regular especificada, ese mensaje se guarda en el archivo dado. Si la directiva tiene más de una entrada de cabecera, todas deben coincidir. Rmail comprueba las directivas cuando muestra un mensaje del archivo rmail-file-name, y aplica la primera que coincida (si hay alguna). Si el archivo de salida es nulo, el mensaje se elimina, no se guarda. Por ejemplo, puede utilizar esta función para guardar los mensajes de una dirección concreta, o con un asunto concreto, en un archivo específico.

Etiquetas

Cada mensaje puede tener asignadas varias etiquetas como medio de clasificación. Cada etiqueta tiene un nombre; diferentes nombres son diferentes etiquetas. Cualquier etiqueta está presente o ausente en un mensaje concreto. Algunos nombres de etiquetas tienen un significado estándar y son asignados a los mensajes automáticamente por Rmail cuando es apropiado; estas etiquetas especiales se llaman atributos. (Ver Atributos de Rmail.) Todas las demás etiquetas son asignadas sólo por los usuarios.

a etiqueta RETURN (a etiqueta RET)
Asigna una etiqueta de nombre etiqueta al mensaje actual (rmail-add-label).
k etiqueta RETURN (k etiqueta RET)
Elimina la etiqueta del mensaje actual (rmail-kill-label).
Ctrl-Alt-n etiquetas RETURN (C-M-n RET)
Pasa al siguiente mensaje que tenga una de las etiquetas (rmail-next-labeled-message).
Ctrl-Alt-p etiquetas RETURN (C-M-p etiquetas RET)
Se mueve al mensaje anterior que tiene una de las etiquetas (rmail-previous-labeled-message).
l etiquetas RETURN (l etiquetas RET)
Ctrl-Alt-l etiquetas RETURN (C-M-l etiquetas RET)
Hace un resumen de todos los mensajes que contengan alguna de las etiquetas (rmail-summary-by-labels).

Los comandos a (a, rmail-add-label) y k (k, rmail-kill-label) permiten asignar o eliminar cualquier etiqueta del mensaje actual. Si el argumento etiqueta está vacío, significa que se asignará o eliminará la etiqueta asignada o eliminada más recientemente.

Una vez que haya dado etiquetas a los mensajes para clasificarlos como desee, hay tres formas de utilizar las etiquetas: en el desplazamiento, en los resúmenes y en la clasificación.

Ctrl-Alt-n etiquetas RETURN (C-M-n etiquetas RET, rmail-next-labeled-message) se mueve al siguiente mensaje que tenga una de las etiquetas. El argumento etiquetas especifica uno o más nombres de etiquetas, separados por comas. Ctrl-Alt-p (C-M-p, rmail-previous-labeled-message) es similar, pero se mueve hacia atrás a los mensajes anteriores. Un argumento numérico para cualquiera de los dos comandos sirve como recuento de repeticiones.

El comando Ctrl-Alt-l etiquetas RETURN (C-M-l etiquetas RET, rmail-summary-by-labels) muestra un resumen que contiene sólo los mensajes que tienen al menos una de las etiquetas especificadas. El argumento etiquetas es uno o más nombres de etiquetas, separados por comas. Para más información sobre los resúmenes, véase Resúmenes.

Si el argumento etiquetas de Ctrl-Alt-n (C-M-n), Ctrl-Alt-p (C-M-p) o Ctrl-Alt-l (C-M-l) está vacío, significa que se utiliza el último conjunto de etiquetas especificado para cualquiera de estos comandos.

Vea Ordenar el archivo de Rmail, para información sobre la ordenación de mensajes con etiquetas.

Atributos de Rmail

Algunas etiquetas como ‘deleted’ (‘borrado’) y ‘archived’ (‘archivado’) tienen significados incorporados, y Rmail las asigna a los mensajes automáticamente en los momentos adecuados; estas etiquetas se denominan atributos. Esta es una lista de los atributos de Rmail:

‘unseen’ (invisible)
Significa que el mensaje nunca ha sido actual. Se asigna a los mensajes cuando provienen de un archivo de la bandeja de entrada, y se elimina cuando un mensaje se hace actual. Cuando se inicia Rmail, inicialmente muestra el primer mensaje que tiene este atributo.
‘deleted’ (borrado)
Significa que el mensaje está borrado. Asignado por los comandos de borrado y eliminado por los comandos de deshacer el borrado (ver Borrar mensajes).
‘filed’ (archivado)
Significa que el mensaje se ha copiado en algún otro archivo. Asignado por los comandos de salida de archivos o (o) y Ctrl-o (C-o) (ver Copiar mensajes a archivos).
‘answered’ (respondido)
Significa que se ha enviado una respuesta al mensaje. Asignado por el comando r (r, rmail-reply). Véase Envío de respuestas.
‘forwarded’ (reenviado)
Significa que ha reenviado el mensaje. Asignado por el comando f (f, rmail-forward). Véase Envío de respuestas.
‘edited’ (editado)
Significa que ha editado el texto del mensaje dentro de Rmail. Vea Editar dentro de un mensaje.
‘resent’ (reenviado)
Significa que ha reenviado el mensaje. Asignado por el comando M-x rmail-resend. Vea Envío de respuestas.
‘retried’ (reintenado)
Significa que ha reintentado un mensaje saliente fallido. Asignado por el comando Alt-x rmail-retry-failure (M-x rmail-retry-failure). Véase Envío de respuestas.

Todas las demás etiquetas son asignadas o eliminadas sólo por los usuarios, y no tienen un significado estándar.

Envío de respuestas

Rmail tiene varios comandos para enviar correo saliente. Vea Envío de correo, para información sobre el uso del modo Mensaje, incluyendo ciertas características pensadas para trabajar con Rmail. Lo que se documenta en esta sección son los comandos especiales de Rmail para entrar en el búfer de correo utilizado para componer el mensaje saliente. Tenga en cuenta que las teclas habituales para enviar correo, Ctrl-x m (C-x m), Ctrl-x 4m (C-x 4 m), y Ctrl-x 5m (C-x 5 m) también funcionan normalmente en el modo Rmail.

m (m)
Envia un mensaje (rmail-mail).
c (c)
Continúa la edición del mensaje saliente ya iniciado (rmail-continue).
r (r)
Envía una respuesta al mensaje de Rmail actual (rmail-reply).
f (f)
Reenvía el mensaje actual a otros usuarios (rmail-forward).
Ctrl-u f (C-u f)
Reenvía el mensaje actual a otros usuarios (rmail-resend).
Alt-m (M-m)
Intenta enviar un mensaje rebotado por segunda vez (rmail-retry-failure).

La razón más común para enviar un mensaje mientras se está en Rmail es responder al mensaje que se está leyendo. Para ello, escriba r (r, rmail-reply). Esto muestra un búfer de composición de correo en otra ventana, muy parecido a Ctrl-x 4m (C-x 4 m), pero preinicializa los campos de cabecera ‘Subject’ ('Asunto'), ‘To’ ('Para'), ‘CC’, ‘In-Reply-To’ ('En-Respuesta-A') y ‘References’ ('Referencias') basándose en el mensaje al que está respondiendo. El campo ‘To’ comienza con la dirección de la persona que envió el mensaje que Ud. recibió, y el campo ‘CC’ comienza con todos los demás destinatarios de ese mensaje.

Puede excluir ciertos destinatarios para que no se incluyan automáticamente en las respuestas, utilizando la variable mail-dont-reply-to-names. Su valor debe ser una expresión regular; cualquier destinatario que coincida será excluido del campo ‘CC’. También se excluyen del campo ‘To’, a menos que esto deje el campo vacío. Si esta variable es nula, la primera vez que se redacta una respuesta se inicializa con un valor por defecto que coincide con su propia dirección.

Para responder sólo al remitente del mensaje original, introduzca el comando de respuesta con un argumento numérico: Ctrl-u r (C-u r) o 1-r (1 r). De este modo se omite completamente el campo ‘CC’ para una respuesta concreta.

Una vez que el búfer de composición del correo se ha inicializado, la edición y el envío del correo se realiza de la forma habitual (véase Envío de correo). Puede editar los campos de cabecera presupuesta si no son los que desea. También puede utilizar comandos como Ctrl-c Ctrl-C-c C-y (C-c C-y), que tira el mensaje al que está respondiendo (ver Comandos de correo). También puede cambiar al búfer de Rmail, seleccionar allí un mensaje diferente, volver a cambiar y tirar del nuevo mensaje actual.

A veces un mensaje no llega a su destino. Los emisores de correo suelen enviarle el mensaje fallido de vuelta, encerrado en un mensaje de fallo. El comando Alt-m (M-m) de Rmail (rmail-retry-failure) se prepara para enviar el mismo mensaje por segunda vez: establece un búfer de composición de correo con los mismos campos de texto y cabecera que antes. Si teclea Ctrl-c Ctrl-c (C-c C-c) de inmediato, vuelve a enviar el mensaje exactamente igual que la primera vez. Alternativamente, puede editar el texto o las cabeceras y luego enviarlo. La variable rmail-retry-ignored-headers, con el mismo formato que rmail-ignored-headers (véase Visualización de mensajes), controla qué cabeceras se eliminan del mensaje fallido al reintentarlo.

Otra razón frecuente para enviar correo en Rmail es reenviar el mensaje actual a otros usuarios. f (f, rmail-forward) hace esto fácil preinicializando el buffer de composición de correo con el mensaje actual como texto, y un asunto de la forma [from: subject], donde from y subject son el remitente y el asunto del mensaje original. Todo lo que tienes que hacer es rellenar los destinatarios y enviar. Cuando reenvía un mensaje, los destinatarios reciben un mensaje que viene de Ud. y que tiene el mensaje original en su contenido.

Rmail ofrece dos formatos para los mensajes reenviados. Por defecto se utiliza el formato MIME (ver Visualización de Mensajes). Esto incluye el mensaje original como una parte separada. Puede utilizar un formato más simple si lo prefiere, estableciendo la variable rmail-enable-mime-composing a nil. En este caso, Rmail sólo incluye el mensaje original encerrado entre dos líneas delimitadoras. También modifica cada línea que comienza con un guión, insertando ‘- ’ al principio de la línea. Cuando reciba un mensaje reenviado en este formato, si contiene algo más que texto ordinario -por ejemplo, el código fuente de un programa- puede resultarle útil deshacer esa transformación. Para ello, seleccione el mensaje reenviado y escriba Alt-x unforward-rmail-message (M-x unforward-rmail-message). Este comando extrae el mensaje original reenviado, borrando las cadenas ‘- ’ insertadas, y lo inserta en el archivo de Rmail como un mensaje separado inmediatamente después del actual.

El reenvío es una alternativa similar al reenvío; la diferencia es que el reenvío envía un mensaje que es del remitente original, tal y como le llegó a Usted, con unos pocos campos de cabecera añadidos (‘Resent-From’ y ‘Resent-To’) para indicar que vino a través de Usted. Para reenviar un mensaje en Rmail, use Ctrl-u f (C-u f). (f, f ejecuta rmail-forward, que invoca rmail-resend si proporciona un argumento numérico).

Utilice el comando m (m, rmail-mail) para comenzar a editar un mensaje saliente que no sea una respuesta. Deja los campos de la cabecera vacíos. Su única diferenciai con Ctrl-x 4 (C-x 4 m) es que hace que el búfer de Rmail sea accesible para Ctrl-c Crtl-y (C-c C-y), al igual que r (r).

El comando c (rmail-continue) reanuda la edición del búfer de composición del correo, para terminar de editar un mensaje saliente que ya estaba componiendo, o para modificar un mensaje que ha enviado.

Si establece la variable rmail-mail-new-frame a un valor no nulo, entonces todos los comandos de Rmail para iniciar el envío de un mensaje crean un nuevo marco para editarlo. Este marco se borra cuando se envía el mensaje.

Todos los comandos de Rmail para enviar un mensaje utilizan el método de composición de correo que haya elegido (véase Métodos de composición de correo).

Resúmenes

Un resumen es un búfer que contiene una línea por mensaje para darle una visión general del correo en un archivo de Rmail. Cada línea muestra el número y la fecha del mensaje, el remitente, el número de líneas, las etiquetas y el asunto. Al mover el punto en el búfer de resumen se seleccionan los mensajes a medida que se pasa a sus líneas de resumen. Casi todos los comandos de Rmail son válidos también en el búfer de resumen; cuando se utilizan allí, se aplican al mensaje descrito por la línea actual del resumen.

Una memoria intermedia de resumen se aplica a un solo archivo de Rmail; si está editando varios archivos de Rmail, cada uno puede tener su propia memoria intermedia de resumen. El nombre del búfer de resumen se hace añadiendo ‘-summary’ (-sumario) al nombre del búfer de Rmail. Normalmente, sólo se muestra un búfer de resumen a la vez.

Hacer resúmenes

Estos son los comandos para crear un resumen para el búfer de Rmail actual. Una vez que el búfer de Rmail tiene un resumen, los cambios en el búfer de Rmail (como la eliminación o el borrado de mensajes, y la obtención de nuevos correos) actualizan automáticamente el resumen.

h (h)
Ctrl-Alt-h (C-M-h)
Resume todos los mensajes (rmail-summary).
l etiqueta RETURN (l etiqueta RET)
Ctrl-Alt-l etiqueta RETURN (C-M-l etiqueta RET)
Resume los mensajes que tienen una o más de las etiquetas especificadas (rmail-summary-by-labels).
Ctrl-Alt-r rcpt RETURN (C-M-r rcpts RET)
Resume los mensajes que coinciden con los destinatarios especificados (rmail-summary-by-recipients).
Ctrl-Alt-t topic RETURN (C-M-t topic)
Resume los mensajes que tienen una coincidencia con el tema expreg especificado en sus asuntos (rmail-summary-by-topic).
Ctrl-Alt-s expreg RETURN (C-M-s expreg)
Resume los mensajes cuyas cabeceras coinciden con la expresión regular expreg especificada (rmail-summary-by-regexp).
Ctrl-Alt-f remitentes RETURN (C-M-f remitentes RET)
Resume los mensajes que coinciden con los remitentes especificados. (rmail-summary-by-senders).

El comando Ctrl-Alt-h o h (C-M-h o h, rmail-summary) llena el búfer de resumen para el búfer de Rmail actual con un resumen de todos los mensajes del búfer. A continuación, muestra y selecciona el búfer de resumen en otra ventana.

Ctrl-Alt-l etiquetas RETURN (C-M-l etiquetas RET, rmail-summary-by-labels) hace un resumen parcial mencionando sólo los mensajes que tienen una o más de las etiquetas. etiquetas debe contener nombres de etiquetas separados por comas.

Ctrl-Alt-r rcpts RETURN (C-M-r rcpts RET, rmail-summary-by-recipients) hace un resumen parcial mencionando sólo los mensajes que tienen uno o más destinatarios que coinciden con la expresión regular rcpts. Se compara con las cabeceras ‘To’ ("Para"), ‘From’ ("Desde") y ‘CC’ (proporcione un argumento de prefijo para excluir la cabecera ‘CC’).

Ctrl-Alt-t topic RETURN (C-M-t topic RET, rmail-summary-by-topic) hace un resumen parcial mencionando sólo los mensajes cuyos asuntos tienen una coincidencia con la expresión regular topic. Con un argumento de prefijo, la coincidencia es con todo el mensaje, no sólo con el asunto.

Ctrl-Alt-s expreg RETURN (C-M-s expreg RET, rmail-summary-by-regexp) hace un resumen parcial que menciona sólo los mensajes cuyas cabeceras (incluyendo la fecha y las líneas de asunto) coinciden con la expresión regular expreg.

Ctrl-Alt-f senders RETURN (C-M-f senders RET, rmail-summary-by-senders) hace un resumen parcial que menciona sólo los mensajes cuyos campos ‘From’ coinciden con la expresión regular senders.

Tenga en cuenta que sólo hay un búfer de resumen para cualquier búfer de Rmail; hacer cualquier tipo de resumen descarta cualquier resumen anterior.

La variable rmail-summary-window-size dice cuántas líneas usar para la ventana de resumen. La variable rmail-summary-line-count-flag controla si la línea de resumen de un mensaje debe incluir el número de líneas del mensaje. Establecer esta opción a nil puede acelerar la generación de resúmenes.

Edición en los resúmenes

Puede utilizar el búfer de resumen de Rmail para hacer casi cualquier cosa que pueda hacer en el propio búfer de Rmail. De hecho, una vez que tenga un búfer de resumen, no hay necesidad de volver al búfer de Rmail.

Puede seleccionar y mostrar varios mensajes en el buffer de Rmail, desde el buffer de resumen, simplemente moviendo el punto en el buffer de resumen a diferentes líneas. No importa qué comando de Emacs utilice para mover el punto; cualquiera que sea la línea en la que esté el punto al final del comando, ese mensaje será seleccionado en la memoria intermedia de Rmail.

Casi todos los comandos de Rmail funcionan tanto en el buffer de resumen como en el buffer de Rmail. Así, d (d) en la memoria intermedia de resumen borra el mensaje actual, u (u) lo deshace y x (x) lo expulsa. (Sin embargo, en la memoria intermedia de resumen, si no hay más mensajes sin borrar en la dirección correspondiente, los comandos de borrado van al primer o al último mensaje, en lugar de quedarse en el mensaje actual). o (o) y Ctrl-o (C-o) envían el mensaje actual a un ARCHIVO; r (r) inicia una respuesta al mismo; etc. Puede desplazarse por el mensaje actual mientras permaneces en la memoria intermedia de resumen utilizando SPACE (SPC) y DEL (DEL). Sin embargo, en el búfer de resumen, el desplazamiento más allá del final o del principio de un mensaje con SPACE (SPC) o DEL (DEL) va, respectivamente, al siguiente o al anterior mensaje no borrado. Personalice la opción rmail-summary-scroll-between-messages a nil para desactivar el desplazamiento a los mensajes siguientes/anteriores.

Alt-u (M-u, rmail-summary-undelete-many) deshace todos los mensajes borrados en el resumen. Un argumento de prefijo significa que se deshace esa cantidad de mensajes borrados anteriormente.

Los comandos de Rmail para moverse entre mensajes también funcionan en el buffer de resumen, pero con un giro: se mueven a través del conjunto de mensajes incluidos en el resumen. También se aseguran de que el búfer de Rmail aparezca en la pantalla (a diferencia de los comandos de movimiento del cursor, que actualizan el contenido del búfer de Rmail pero no lo muestran en una ventana a menos que ya aparezca). A continuación se muestra una lista de estos comandos:

n (n)
Pasa a la siguiente línea, saltando las líneas que dicen "borrado", y seleccionar su mensaje (rmail-summary-next-msg).
p (p)
Pasa a la línea anterior, saltando las líneas que dicen "deleted", y seleccionar su mensaje (rmail-summary-previous-msg).
Alt-n (M-n)
Pasa a la línea siguiente y selecciona su mensaje (rmail-summary-next-all).
Alt-p (M-p)
Pasa a la línea anterior y selecciona su mensaje (rmail-summary-previous-all).
> (>)
Se desplaza hasta la última línea y selecciona su mensaje (rmail-summary-last-message).
< (<)
Va a la primera línea y selecciona su mensaje (rmail-summary-first-message).
j (j)
RETURN (RET)
Selecciona el mensaje en la línea actual (asegurando que el buffer de Rmail aparezca en la pantalla; rmail-summary-goto-msg). Con el argumento n, selecciona el mensaje número n y se desplaza a su línea en el buffer de resumen; esto señala un error si el mensaje no aparece en el buffer de resumen.
Alt-s patron RETURN (M-s patron RET)
Busca en los mensajes un patrón que empiece por el mensaje actual; selecciona el mensaje encontrado y mueve el punto en el buffer de resumen a la línea de ese mensaje (rmail-summary-search). Un argumento prefijo actúa como una cuenta de repetición; un argumento negativo significa buscar hacia atrás (equivalente a rmail-summary-search-backward).
Ctrl-Alt-n etiqueta RETURN (C-M-n etiquetas RET)
Pasa al siguiente mensaje con al menos una de las etiquetas especificadas (rmail-summary-next-labeled-message). etiquetas es una lista de etiquetas separada por comas. Un argumento de prefijo actúa como una cuenta de repetición.
Ctrl-Alt-p etiquetas RETURN (C-M-p etiquetas RET )
Se mueve al mensaje anterior con al menos una de las etiquetas especificadas (rmail-summary-previous-labeled-message).
Ctrl-c Ctrl-n RETURN (C-c C-n RET)
Pasa al siguiente mensaje con el mismo asunto que el actual (rmail-summary-next-same-subject). Un argumento prefijo actua como una cuenta de repeticion.
Ctrl-c Ctrl-p RETURN (C-c C-p RET)
Mueve al mensaje anterior con el mismo asunto que el mensaje actual (rmail-summary-previous-same-subject).

Borrar, deshacer y obtener nuevo correo, e incluso seleccionar un mensaje diferente, todo ello actualiza el buffer de resumen cuando se hace en el buffer de Rmail. Si la variable rmail-redisplay-summary no es nula, estas acciones también devuelven el buffer de resumen a la pantalla.

Cuando haya terminado de utilizar el resumen, escriba Q (Q, rmail-summary-wipe) para eliminar la ventana del búfer de resumen. También puede salir de Rmail mientras está en el resumen: q (q, rmail-summary-quit) borra la ventana del resumen, luego sale de Rmail guardando el archivo de Rmail y cambiando a otro búfer. Alternativamente, b (b, rmail-summary-bury) simplemente entierra el resumen de Rmail y el buffer.

Clasificación del archivo Rmail

Ctrl-c Ctrl-s Ctrl-d (C-c C-s C-d)
Alt-x rmail-sort-by-date (M-x rmail-sort-by-date)
Ordena los mensajes del buffer de Rmail actual por fecha.
Ctrl-c Ctrl-s Ctrl-s (C-c C-s C-s)
Alt-x rmail-sort-by-subject (M-x rmail-sort-by-subject)
Ordena los mensajes del buffer actual de Rmail por tema.
Ctrl-c Ctrl-s Ctrl-a (C-c C-s C-a)
Alt-x rmail-sort-by-author (M-x rmail-sort-by-author)
Ordena los mensajes del buffer de Rmail actual por el nombre del autor.
Ctrl-c Ctrl-s Ctrl-r (C-c C-s C-r)
Alt-x rmail-sort-by-recipient (M-x rmail-sort-by-recipient)
Ordena los mensajes del buffer de Rmail actual por el nombre del destinatario.
Ctrl-c Ctrl-s Ctrl-c (C-c C-s C-c)
Alt-x rmail-sort-by-correspondent (M-x rmail-sort-by-correspondent)
Ordena los mensajes del buffer de Rmail actual por el nombre del otro corresponsal.
Ctrl-c Ctrl-s Ctrl-l (C-c C-s C-l)
Alt-x rmail-sort-by-lines (M-x rmail-sort-by-lines)
Ordena los mensajes del buffer de Rmail actual por número de líneas.
Ctrl-c Ctrl-s Ctrl-k RETURN etiquetas RETURN
(C-c C-s C-k RET etiquetas RET)
Alt-x rmail-sort-by-labels RETURN etiquetas RETURN
(M-x rmail-sort-by-labels RET etiquetas RET)
Ordena los mensajes del buffer actual de Rmail por etiquetas. El argumento etiquetas debe ser una lista de etiquetas separadas por comas. El orden de estas etiquetas especifica el orden de los mensajes; los mensajes con la primera etiqueta van primero, los mensajes con la segunda etiqueta van segundo, y así sucesivamente. Los mensajes que no tienen ninguna de estas etiquetas van al final.

Los comandos de ordenación de Rmail realizan una ordenación estable: si no hay ninguna razón para preferir uno de los dos mensajes, su orden permanece inalterado. Puede utilizar esto para ordenar por más de un criterio. Por ejemplo, si utiliza rmail-sort-by-date y luego rmail-sort-by-author, los mensajes del mismo autor aparecen ordenados por fecha.

Con un argumento de prefijo, todos estos comandos invierten el orden de comparación. Esto significa que ordenan los mensajes de más reciente a más antiguo, de mayor a menor, o en orden alfabético inverso.

Las mismas teclas en el buffer de resumen ejecutan funciones similares; por ejemplo, Ctrl-c Ctrl-s Ctrl-l (C-c C-s C-l) ejecuta rmail-summary-sort-by-lines. Estos comandos siempre ordenan todo el búfer de Rmail, incluso si el resumen sólo muestra un subconjunto de mensajes.

Tenga en cuenta que no puede deshacer una ordenación, por lo que puede desear guardar el búfer de Rmail antes de ordenarlo.

Visualización de los mensajes

Esta sección describe cómo Rmail muestra las cabeceras de los mensajes, las secciones MIME y los archivos adjuntos, las URL y los mensajes cifrados.

t (t)
Alterna la visualización de la cabecera completa (rmail-toggle-header).

Antes de mostrar cada mensaje por primera vez, Rmail reformatea su cabecera, ocultando los campos de cabecera no interesantes para reducir el desorden. El comando t (t, rmail-toggle-header) alterna entre mostrar los campos de cabecera reformateados y mostrar la cabecera original completa. Con un argumento de prefijo positivo, el comando muestra la cabecera reformateada; con un argumento de prefijo cero o negativo, muestra la cabecera completa. Al seleccionar de nuevo el mensaje también se reformatea si es necesario.

La variable rmail-ignored-headers contiene una expresión regular que especifica los campos de cabecera a ocultar; cualquier línea de cabecera que coincida se ocultará. La variable rmail-nonignored-headers anula esto: cualquier campo de cabecera que coincida con esa expresión regular se muestra incluso si también coincide con rmail-ignored-headers. La variable rmail-displayed-headers es una alternativa a estas dos variables; si no es nula, debe ser una expresión regular que especifique qué cabeceras mostrar (el valor predeterminado es nulo).

Rmail resalta ciertos campos de cabecera que son especialmente interesantes, por defecto, los campos ‘From’ ("Desde") y ‘Subject‘ ("Asunto"). Este resaltado utiliza la cara rmail-highlight. La variable rmail-highlighted-headers contiene una expresión regular que especifica los campos de cabecera a resaltar; si coincide con el principio de un campo de cabecera, se resalta todo ese campo. Para desactivar esta función, establezca rmail-highlighted-headers en nil.

Si un mensaje está en formato MIME (Multipurpose Internet Mail Extensions) y contiene múltiples partes (entidades MIME), Rmail muestra cada parte con un lema o eslogan. Este eslogan resume el índice, el tamaño y el tipo de contenido de la parte. Dependiendo del tipo de contenido, también puede contener uno o más botones; estos realizan acciones como guardar la parte en un archivo.

RETURN (RET)
Oculta o muestra la parte MIME en el punto (rmail-mime-toggle-hidden).
TAB (TAB)
Mueve el punto al siguiente botón de la parte MIME. (rmail-mime-next-item).
Shift-TAB (S-TAB)
Mueve el punto a la parte MIME anterior (rmail-mime-previous-item).
v (v)
Alterna entre la visualización de MIME y el mensaje en bruto (rmail-mime).

Cada parte MIME de texto plano se muestra inicialmente inmediatamente después de su lema, como parte del búfer de Rmail (a menos que el mensaje tenga una parte HTML, ver más adelante), mientras que las partes MIME de otros tipos se representan sólo por sus lemas, con su contenido real oculto. En cualquier caso, puede alternar una parte MIME entre sus estados mostrados y ocultos escribiendo RETURN (RET) en cualquier lugar de la parte, o en cualquier lugar de su línea de etiquetas (excepto los botones para otras acciones, si los hay). Escriba RETURN (RET) (o haga clic con ) para activar un botón de la línea de etiquetas, y TAB (TAB) para cambiar de punto entre los botones de la línea de etiquetas.

El comando v (v, rmail-mime) alterna entre la visualización por defecto de MIME descrita anteriormente, y una visualización cruda que muestra los datos MIME sin decodificar. Con un argumento de prefijo, este comando alterna la visualización de sólo una entidad en el punto.

Si el mensaje tiene una parte MIME HTML, Rmail la muestra con preferencia a la parte de texto plano, si Emacs puede renderizar HTML (17). Para evitarlo, y que se muestre la parte de texto plano en su lugar, personalice la variable rmail-mime-prefer-html con un valor nulo.

Nota

(17) Esta capacidad requiere que Emacs esté construido con soporte para libxml2 o que tenga instalado el navegador Lynx.

Para evitar que Rmail maneje mensajes decodificados MIME, cambie la variable rmail-enable-mime a nil. En este caso, el comando (v, rmail-mime) crea un búfer temporal para mostrar el mensaje MIME actual.

Si el mensaje actual es uno encriptado, utilice el comando Ctrl-c Ctrl-d (C-c C-d, rmail-epa-decrypt) para desencriptarlo, utilizando la biblioteca EasyPG (ver EasyPG en el Manual de Usuario del Asistente EasyPG).

Puede resaltar y activar URLs en el buffer de Rmail usando el modo Goto Address:

(add-hook 'rmail-show-message-hook 'goto-address-mode)

A continuación, puede navegar por estas URLs haciendo clic en ellas con (ratón-2) (o con (ratón-1) rápidamente) o desplazándose a una y escribiendo Ctrl-c RETURN (C-c RET). Véase Activación de URLs.

Rmail y los sistemas de codificación

Rmail decodifica automáticamente los mensajes que contienen caracteres no ASCII, al igual que Emacs hace con los archivos que visita y con la salida de los subprocesos. Rmail utiliza la cabecera estándar ‘charset=charse’ del mensaje, si la hay, para determinar cómo fue codificado el mensaje por el remitente. Asigna el conjunto de caracteres al correspondiente sistema de codificación de Emacs (ver Sistemas de codificación), y utiliza ese sistema de codificación para decodificar el texto del mensaje. Si la cabecera del mensaje no tiene la especificación ‘charset’, o si no se reconoce el charset, Rmail elige el sistema de codificación con la heurística habitual del Editor y los valores por defecto (ver Reconocimiento de sistemas de codificación).

Ocasionalmente, un mensaje es decodificado incorrectamente, ya sea porque Emacs adivinó el sistema de codificación equivocado en ausencia de la especificación ‘charset’, o porque la especificación era inexacta. Por ejemplo, un emisor de correo mal configurado podría enviar un mensaje con una cabecera ‘charset=iso-8859-1’ cuando el mensaje está realmente codificado en koi8-r. Si ve el texto del mensaje distorsionado, o algunos de sus caracteres se muestran como códigos hexadecimales o casillas vacías, pudo haber ocurrido esto.

Puede corregir el problema decodificando el mensaje de nuevo usando el sistema de codificación adecuado, si puede averiguar o adivinar cuál es el correcto. Para ello, invoque el comando Alt-x rmail-redecode-body (M-x rmail-redecode-body). Este comando lee el nombre de un sistema de codificación y luego redecodifica el mensaje utilizando el sistema de codificación que Usted especificó. Si ha especificado el sistema de codificación correcto, el resultado debería ser legible.

Cuando se recibe un nuevo correo en Rmail, cada mensaje se traduce automáticamente desde el sistema de codificación en el que está escrito, como si fuera un archivo independiente. Para ello se utiliza la lista de prioridades de los sistemas de codificación que haya especificado. Si un mensaje MIME especifica un conjunto de caracteres, Rmail obedece esa especificación. Para leer y guardar los archivos de Rmail, Emacs utiliza el sistema de codificación especificado por la variable rmail-file-coding-system. El valor por defecto es nil, lo que significa que los archivos de Rmail no se traducen (se leen y escriben en el código de caracteres interno del Editor).

Editar dentro de un mensaje

La mayoría de las combinaciones de teclas habituales de Emacs están disponibles en el modo Rmail, aunque algunas, como Ctrl-Alt-n (C-M-n) y Ctrl-Atl-h (C-M-h), son redefinidas por Rmail para otros fines. Sin embargo, el búfer de Rmail es normalmente de sólo lectura, y la mayoría de las letras son redefinidas como comandos de Rmail. Si desea editar el texto de un mensaje, debe utilizar el comando de Rmail e (e).

e (e)
Edita el mensaje actual como texto ordinario.

El comando e (e, rmail-edit-current-message) cambia del modo Rmail al modo Rmail Edit, otro modo principal que es casi igual al modo Texto. La línea de modo indica este cambio.

En el modo Rmail Edit, las letras se insertan como siempre y los comandos de Rmail no están disponibles. Puede editar el cuerpo del mensaje y los campos de la cabecera. Cuando haya terminado de editar el mensaje, escriba Ctrl-c Ctrl-c (C-c C-c, rmail-cease-edit) para volver al modo Rmail. También puede volver al modo Rmail pero cancelar cualquier edición que haya realizado, escribiendo Ctrl-c Ctrl-] (C-c C-], rmail-abort-edit).

Al entrar en el modo de edición de Rmail se ejecuta el gancho text-mode-hook; luego se ejecuta el gancho rmail-edit-mode-hook (ver Hooks). Al volver al modo ordinario de Rmail, se añade el atributo ‘edited’ ("editado") al mensaje, si ha realizado algún cambio en él (ver Atributos de Rmail).

Mensajes de compendio

Un mensaje de compendio es un mensaje que existe para contener y transportar varios otros mensajes. Los compendios se utilizan en algunas listas de correo; todos los mensajes que llegan a la lista durante un periodo de tiempo como un día se ponen dentro de un único compendio que luego se envía a los suscriptores. La transmisión del resumen único utiliza menos tiempo de ordenador que la transmisión de los mensajes individuales, aunque el tamaño total sea el mismo, debido a la sobrecarga por mensaje en la transmisión de correo en red.

Cuando se recibe un mensaje en forma de resumen, la forma más conveniente de leerlo es desintegrarlo: convertirlo de nuevo en muchos mensajes individuales. Así podrá leer y borrar los mensajes individuales según le convenga. Para ello, seleccione el mensaje digerido y escriba el comando Alt-x undigestify-rmail-message (M-x undigestify-rmail-message). Esto extrae los submensajes como mensajes de Rmail separados, y los inserta a continuación del resumen. El propio mensaje de resumen se marca como eliminado.

Lectura de mensajes Rot13

Los mensajes de las listas de correo que pueden ofender o molestar a algunos lectores se codifican a veces en un sencillo código llamado rot13, llamado así porque gira el alfabeto en 13 letras. Este código no sirve para mantener el secreto, ya que no proporciona ninguno; más bien, permite a quienes desean evitar ver el texto real del mensaje. Por ejemplo, la crítica de una película podría utilizar rot13 para ocultar puntos importantes de la trama.

Para ver un búfer que utiliza el código rot13, utilice el comando Alt-x rot13-other-window (M-x rot13-other-window). Esto muestra el buffer actual en otra ventana que aplica el código al mostrar el texto.

Programa movemail

Rmail utiliza el programa movemail para mover el correo de su bandeja de entrada a su archivo de Rmail (ver Archivos y bandejas de entrada de Rmail). Cuando se carga por primera vez, Rmail intenta localizar el programa movemail y determinar su versión. Hay dos versiones de este programa: la versión de GNU Mailutils (ver movemail en GNU mailutils), y una versión específica de Emacs que se construye e instala a menos que haya sido configurado con la opción --with-mailutils en efecto. Las dos versiones de movemail soportan la misma sintaxis de línea de comandos y el mismo subconjunto básico de opciones. Sin embargo, la versión Mailutils ofrece características adicionales y es más segura.

La versión movemail de Emacs puede recuperar correo de los formatos habituales de buzón de Unix. Advertencia: Aunque también puede utilizar el protocolo POP3, no es recomendable porque no soporta POP3 a través de canales TLS encriptados.

La versión de Mailutils es capaz de manejar un amplio conjunto de formatos de buzón, como buzones Unix simples, buzones maildir y MH, etc. Es capaz de acceder a buzones remotos utilizando el protocolo POP3 o IMAP4, y puede recuperar el correo de ellos utilizando un canal cifrado TLS. También acepta argumentos de buzón en forma de URL. La descripción detallada de las URL de los buzones puede encontrarse en URL en Formatos de URL de los buzones. En resumen, una URL es:

proto://[usuario[:contraseña]@]host-o-nombre-de-archivo[:puerto]

donde los corchetes denotan elementos opcionales.

proto
Especifica el protocolo del buzón, o el formato a utilizar. La semántica exacta del resto de elementos de la URL depende del valor real de proto (ver más abajo).
usuario
Nombre de usuario para acceder al buzón remoto.
contraseña
Contraseña del usuario para acceder al buzón remoto.
host-o-nombre-archivo
Nombre de host del servidor remoto para buzones remotos o nombre de archivo de un buzón local.
puerto
Número de puerto opcional, si no es el predeterminado para ese protocolo.
mbox
El formato habitual de los buzones de correo de Unix. En este caso, no se utilizan usuario, contraseña y puerto, y host-o-nombre-de-archivo denota el nombre del archivo del buzón, por ejemplo, mbox:///var/spool/mail/smith.
mh
Un buzón local en formato MH. No se utilizan usuario, contraseña ni puerto. host-o-nombre-de-archivo denota el nombre de la carpeta MH, por ejemplo, mh:///Mail/inbox.
maildir
Un buzón local en formato maildir. No se utilizan usuario, contraseña ni puerto, y host-o-file-name denota el nombre del buzón maildir, por ejemplo, maildir:///mail/inbox.
archivo
Cualquier archivo local en formato de buzón. Su formato real es detectado automáticamente por movemail.
pop
pops
Un buzón remoto al que se accede mediante el protocolo POP3. El usuario especifica el nombre de usuario remoto que se va a utilizar, contraseña se puede utilizar para especificar la contraseña del usuario, host-o-nombre-archivo es el nombre o la dirección IP del servidor de correo remoto al que se va a conectar, y el puerto es el número de puerto; por ejemplo, pop://smith:guessme@remote.server.net:995. Si el servidor lo soporta, movemail intenta utilizar una conexión encriptada, utiliza la forma ‘pops’ para requerirla.
imap
imaps
Un buzón remoto al que se accede mediante el protocolo IMAP4. El usuario especifica el nombre de usuario remoto que se va a utilizar, contraseña se puede utilizar para especificar la contraseña del usuario, host-o-file-name es el nombre o la dirección IP del servidor de correo remoto al que se va a conectar, y puerto es el número de puerto; por ejemplo, imap://smith:guessme@remote.server.net:993. Si el servidor lo soporta, movemail intenta utilizar una conexión encriptada, utiliza el formulario ‘imaps’ para requerirla.

Alternativamente, puedes especificar el nombre del archivo del buzón de correo a utilizar. Esto es equivalente a especificar el protocolo ‘file’:

/var/spool/mail/user ≡ file:///var/spool/mail/user

La variable rmail-movemail-program controla qué versión de movemail se va a utilizar. Si es una cadena, especifica el nombre de archivo absoluto del ejecutable de movemail. Si es nil, Rmail busca movemail en los directorios listados en movemailrmail-movemail-search-path, luego en exec-path (ver Ejecutar comandos de shell desde Emacs), luego en exec-directory.

Recuperación de correo de buzones remotos

Algunos sitios utilizan un método llamado POP3 para acceder a los datos de la bandeja de entrada de los usuarios en lugar de almacenar los datos en los archivos de la bandeja de entrada. El movemail de Mailutils soporta por defecto POP3 con encriptación TLS. Advertencia: Aunque el movemail de Emacs soporta POP3, no se recomienda su uso para esto ya que no soporta conexiones encriptadas, la versión de Mailutils sí. Ambas versiones de movemail sólo funcionan con POP3, no con versiones antiguas de POP.

Puede especificar una bandeja de entrada POP3 utilizando una URL POP3 (ver programa movemail). Una URL POP3 tiene la forma ‘pop://<tt><i><tt>nombredeusuario@nombredehostel:puerto’, donde nombre de host y puerto son el nombre de host (o dirección IP) y el número de puerto del servidor de correo remoto y nombre de usuario es el nombre de usuario en ese servidor. Además, puede especificar la contraseña en la URL del buzón: ‘pop://nombredeusuario:contraseña@nombredehostedelpuerto’. En este caso, la contraseña tiene preferencia sobre la establecida por rmail-remote-password (ver más abajo). Esto es especialmente útil si tiene varios buzones remotos con diferentes contraseñas. Si utiliza Mailutils movemail, es posible que desee utilizar ‘pops’ en lugar de ‘pop’.

Por compatibilidad con versiones anteriores, Rmail también admite una forma alternativa de especificar buzones POP3 remotos. Especificar un nombre de buzón en la forma 'po:nombre de usuario:nombre de host:puerto' es equivalente a 'pop://nombre de usuario@nombre de host:puerto’. Si se omite la parte :hostname, la variable de entorno MAILHOST especifica la máquina en la que se debe buscar el servidor POP3.

Otro método para acceder a los buzones remotos es el IMAP. Este método sólo es soportado por el movemail de Mailutils. Para especificar un buzón IMAP en la lista de entrada, utilice la siguiente URL de buzón: 'imap://nombredeusuario[:contraseña]@nombredehostedelpuerto'. La parte de la contraseña es opcional, como se ha descritoanteriormente. Puede utilizar ‘imaps’ en lugar de ‘imap’.

El acceso a un buzón remoto puede requerir una contraseña. Rmail utiliza el siguiente algoritmo para recuperarla:

  1. Si una contraseña está presente en la URL del buzón (ver arriba), se utiliza.

  2. Si la variable rmail-remote-password-required es nil, Rmail asume que no se requiere ninguna contraseña.

  3. Si la variable rmail-remote-password no es nula, se utiliza su valor.

  4. En caso contrario, Rmail le pedirá la contraseña a utilizar.

En algunos servidores de correo los nombres de usuario incluyen información de dominio, lo que puede significar que contengan el carácter ‘@’. La cadena del especificador de la bandeja de entrada utiliza ‘@’ para señalar el comienzo del nombre del servidor de correo. Esto crea confusión para movemail. Si su nombre de usuario contiene ‘@’ y está usando Mailutils movemail, puedes arreglar esto: Sustituye @ en el nombre de usuario por su codificación URL ‘%40’.

Si necesita pasar banderas adicionales de línea de comandos a movemail, establezca la variable rmail-movemail-flags una lista de las banderas que desea utilizar. No utilice esta variable para pasar la bandera ‘-p’ para preservar el contenido de la bandeja de entrada; utilice rmail-preserve-inbox en su lugar.

El programa movemail instalado en su sitio puede soportar la autenticación Kerberos. Si es compatible, se utiliza por defecto cada vez que se intenta recuperar el correo POP3 cuando rmail-remote-password y rmail-remote-password-required no están establecidos.

Algunos servidores POP3 almacenan los mensajes en orden inverso. Si su servidor hace esto, y Usted prefiere leer su correo en el orden en que fue recibido, puede decirle a movemail que invierta el orden de los mensajes descargados añadiendo la bandera ‘-r’ a rmail-movemail-flags.

Mailutils movemail soporta encriptación TLS. Si desea utilizarlo, añada la bandera '--tls' a rmail-movemail-flags.

Recuperación de correo de buzones locales en varios formatos

Si su correo entrante está almacenado en una máquina local en un formato distinto al buzón Unix, necesitará el programa movemail de Mailutils para recuperarlo. Vea el programa movemail, para la descripción detallada de las versiones de este. Por ejemplo, para acceder al correo de un buzón en formato maildir ubicado en /var/spool/mail/in, deberá incluir lo siguiente en la lista de buzones de Rmail:

maildir:///var/spool/mail/in


Correo electrónico y noticias de Usenet con Gnus

Gnus es un paquete de Emacs diseñado principalmente para leer y publicar noticias de Usenet. También puede utilizarse para leer y responder a mensajes de otras fuentes: correo electrónico, directorios remotos, resúmenes, etc. Aquí presentamos Gnus y describimos varias características básicas. Para más detalles, vea Gnus en el Manual de Gnus.

Bufferes de Gnus

Gnus utiliza varios buffers para mostrar información y recibir comandos. Los tres búferes más utilizados por Gnus son el búfer de grupo, el búfer de resumen y el búfer de artículo.

El búfer de grupo contiene una lista de fuentes de artículos (por ejemplo, grupos de noticias y buzones de correo electrónico), que se denominan colectivamente grupos. Este es el primer búfer que muestra Gnus cuando se inicia. Normalmente muestra sólo los grupos a los que está suscrito y que contienen artículos no leídos. Desde este buffer, puedes seleccionar un grupo para leer.

El buffer de resumen muestra los artículos de un solo grupo, mostrando un artículo por línea. Por defecto, muestra el autor, el tema y el número de línea de cada artículo, pero esto se puede personalizar; véase Formato del búfer de resumen en el Manual de Gnus. La memoria intermedia de resumen se crea cuando se selecciona un grupo en la memoria intermedia de grupo, y se elimina cuando se sale del grupo.

Desde el buffer de resumen, puede elegir un artículo para verlo. El artículo se muestra en intermedia de artículos. En el uso normal de Gnus, Usted ve este búfer pero no lo selecciona, todos los comandos útiles de Gnus pueden ser invocados desde el búfer de resumen. Pero puede seleccionar la memoria intermedia del artículo y ejecutar los comandos de Gnus desde ella, si lo desea.

Cuando Gnus se inicia

Si su sistema ha sido configurado para leer las noticias de Usenet, empezar con Gnus es fácil: sólo tiene que escribir Alt-x gnus (M-x gnus).

Al arrancar, Gnus lee su archivo de inicialización de noticias: un archivo llamado .newsrc en su directorio personal que enumera sus grupos de noticias y suscripciones a Usenet (este archivo no es exclusivo de Gnus; es utilizado por muchos otros programas lectores de noticias). A continuación, intenta ponerse en contacto con el servidor de noticias por defecto del sistema, que suele estar especificado por la variable de entorno NNTPSERVER.

Si su sistema no tiene un servidor de noticias por defecto, o si desea usar Gnus para leer el correo electrónico, entonces antes de invocar Alt-x gnus (M-x gnus) necesita decirle a Gnus dónde obtener las noticias y/o el correo. Para ello, personalice las variables gnus-select-method y/o gnus-secondary-select-methods. Vea Cómo encontrar las noticias en el Manual de Gnus.

Una vez que Gnus ha arrancado, muestra el buffer de grupo. Por defecto, el buffer de grupos muestra sólo un pequeño número de grupos suscritos. Los grupos con otros estados unsubscribed (no suscritos), killed (muertos) o zombie (zombis) están ocultos. La primera vez que inicie Gnus, cualquier grupo al que no esté suscrito se convierte en un grupo muerto; cualquier grupo que aparezca posteriormente en el servidor de noticias se convierte en un grupo zombi.

Para proceder, debe seleccionar un grupo en el buffer de grupos para abrir el buffer de resumen de ese grupo; luego, seleccione un artículo en el buffer de resumen para ver su buffer de artículos en una ventana separada. Las siguientes secciones explican cómo utilizar las memorias intermedias de grupo y de resumen para hacer esto.

Para salir de Gnus, escriba q (q) en el buffer de grupo. Esto registra automáticamente sus estados de grupo en los archivos .newsrc y .newsrc.eld, para que tengan efecto en las siguientes sesiones de Gnus.

Uso del buffer de grupo Gnus

Los siguientes comandos están disponibles en el buffer de grupo Gnus:

SPACE (SPC)
Pasa al buffer de resumen del grupo en la línea actual (gnus-group-read-group).
l (l)
A-s (A-s)
En el buffer de grupos, listar sólo los grupos a los que está suscrito y que contienen artículos no leídos (gnus-group-list-groups; éste es el listado por defecto).
L (L)
A-u (A-u)
Lista todos los grupos suscritos y no suscritos, pero no los grupos muertos o zombis (gnus-group-list-all-groups).
A-k (A k)
Lista de grupos muertos (gnus-group-list-killed).
A-z (A z)
Lista de grupos zombis (gnus-group-list-zombies).
u (u)
Conmuta el estado de suscripción del grupo (gnus-group-toggle-subscription) en la línea actual. Si se invoca esta opción en un grupo muerto o zombi, se convierte en un grupo no suscrito.
Ctrl-k (C k)
Mata al grupo en la línea actual (gnus-group-kill-group). Los grupos eliminados no se registran en el archivo .newsrc, y no se muestran en los listados l (l) o L ().
DEL (DEL)
Mueve el punto al grupo anterior que contiene artículos no leídos (gnus-group-prev-unread-group).
n (n)
Mueve el punto al siguiente grupo no leído (gnus-group-next-unread-group).
p (p)
Mueve el punto al grupo anterior no leído (gnus-group-prev-unread-group).
q (q)
Actualiza la configuración de Gnus, y salir de Gnus (gnus-group-exit).

Uso del buffer de resumen de Gnus

Los siguientes comandos están disponibles en el buffer de resumen de Gnus:

SPC (SPC)
Si no hay ningún artículo seleccionado, selecciona el artículo en la línea actual y muestra su buffer de artículos. De lo contrario, intente desplazarse por el búfer de artículos seleccionado en su ventana; al llegar al final del búfer, seleccione el siguiente artículo no leído (gnus-summary-next-page).
Así, puede leer todos los artículos escribiendo repetidamente SPC (SPC).
DEL (DEL)
Desplaza el texto del artículo hacia atrás (gnus-summary-prev-page).
n (n)
Selecciona el siguiente artículo no leído (gnus-summary-next-unread-article).
p (p)
Selecciona el artículo anterior no leído (gnus-summary-prev-unread-article).
s (s)
Hace una búsqueda incremental en el buffer de artículos seleccionado (gnus-summary-isearch-article), como si se cambiara al buffer y se tecleara Ctrl-s (C-s) (ver Búsqueda incremental).
Alt-s expreg RETURN (M-s expreg RET)
Busca hacia adelante artículos que contengan una coincidencia de expreg (gnus-summary-search-article-forward).
Alt-r expreg RETURN (M-r expreg RET)
Busca hacia atrás artículos que contengan una coincidencia con expreg (gnus-summary-search-article-backward).
q (q)
Sale del buffer de resumen y volver al buffer de grupo (gnus-summary-exit).


Seguridad en el host

Emacs se ejecuta dentro de un sistema operativo como GNU/Linux, y depende del sistema operativo para comprobar las restricciones de seguridad como los accesos a los archivos. Las configuraciones por defecto del Editor están diseñadas para un uso típico; pueden requerir algunas adaptaciones en entornos donde la seguridad es más o menos preocupante de lo habitual. Por ejemplo, las variables locales de archivo pueden ser arriesgadas, y puedes establecer la variable variable enable-local-variables a :safe o (incluso más conservador) a nil; por el contrario, si todos sus archivos son de confianza y la comprobación por defecto de estas variables es irritante, puede establecer enable-local-variables a :all. Vea Seguridad de las Variables de Archivo.

Vea Security Considerations en The Emacs Lisp Reference Manual, para más información sobre las consideraciones de seguridad cuando se usa Emacs como parte de una aplicación mayor.



Seguridad de la red

Siempre que Emacs establece cualquier conexión de red, pasa la conexión establecida al Network Security Manager (NSM). El NSM se encarga de reforzar la seguridad de la red bajo su control. Actualmente, esto funciona utilizando las características de Seguridad de la Capa de Transporte (TLS).

La variable network-security-level determina el nivel de seguridad que NSM aplica. Si su valor es bajo, no se realiza ninguna comprobación de seguridad. Esto no es recomendable, y básicamente significará que tus conexiones de red no son de confianza. Sin embargo, la configuración puede ser útil en circunstancias limitadas, como cuando se prueban los problemas de la red.

Si esta variable es mediium (que es la predeterminada), se realizarán una serie de comprobaciones. Si, como resultado, NSM determina que la conexión de red podría no ser de confianza, te lo hará saber y te preguntará qué hacer con la conexión de red.

Puede decidir registrar una excepción de seguridad permanente para una conexión no verificada, una excepción temporal o rechazar la conexión por completo.

Además de las comprobaciones básicas de corrección de certificados, hay disponibles varias comprobaciones de algoritmos TLS. Algunas tecnologías de encriptación que antes se consideraban seguras han demostrado ser frágiles, por lo que Emacs (por defecto) le advierte de algunos de estos problemas.

Las comprobaciones de red del protocolo se controlan a través de la variable network-security-protocol-checks.

Es una lista en la que el primer elemento de cada asociación es el nombre de la comprobación, y el segundo elemento es el nivel de seguridad en el que se debe utilizar la comprobación.

Un elemento como (rc4 medium) hará que la función nsm-protocol-check--rc4 sea llamada así: (nsm-protocol-check--rc4 host port status settings). La función debe devolver un valor no nulo si la conexión debe continuar y nulo en caso contrario.

A continuación se muestra una lista de las comprobaciones realizadas en el nivel medio por defecto.

unable to verify a TLS certificate (No se puede verificar un certificado TLS)
SM comprobará si el certificado utilizado para establecer la identidad del servidor al que nos conectamos puede ser verificado.
Aunque un certificado no válido suele ser motivo de preocupación (podría haber un Man-in-the-Middle secuestrando su conexión de red y robando su contraseña), puede haber razones válidas para seguir adelante con la conexión de todos modos. Por ejemplo, el servidor puede estar utilizando un certificado autofirmado, o el certificado puede haber expirado. Ud. debes determinar si es aceptable continuar con la conexión.
a self-signed certificate has changed (un certificado autofirmado ha cambiado)
Si ha aceptado previamente un certificado autofirmado, pero ahora ha cambiado, eso podría significar que el servidor acaba de cambiar el certificado, pero también podría significar que la conexión de red ha sido secuestrada.
previously encrypted connection now unencrypted (La conexión previamente encriptada ahora está sin encriptar)
Si la conexión está sin encriptar, pero estaba encriptada en sesiones anteriores, esto podría significar que hay un proxy entre Usted y el servidor que elimina los anuncios STARTTLS, dejando la conexión sin encriptar. Esto suele ser muy sospechoso.
tolking to an unencrypted service when sending a password (Hablar con un servicio no encriptado al enviar una contraseña)
Cuando se conecta a un servidor IMAP o POP3, normalmente deberían estar encriptados, porque es común enviar contraseñas a través de estas conexiones. Del mismo modo, si envía un correo electrónico a través de SMTP que requiere una contraseña, normalmente querrá que esa conexión esté cifrada. Si la conexión no está cifrada, NSM le avisará.
Diffie-Hellman low prime bits (Bits primos bajos de Diffie-Hellman)
Al realizar el intercambio de clave pública, el número de bits primos debe ser lo suficientemente alto como para garantizar que el canal no pueda ser espiado por terceros. Si este número es demasiado bajo, Emacs le avisará. (Esta es la comprobación diffie-hellman-prime-bits en network-security-protocol-checks).
RC4 stream cipber (Cifrado de flujo RC4)
Se cree que el cifrado de flujo RC4 es de baja calidad y puede permitir la escucha por parte de terceros. (Esta es la comprobación rc4 en 1network-security-protocol-checks).
SHA1 in the host certificate or in intermediate certificates (SHA1 en el certificado del host o en los certificados intermedios)
Se cree que si un certificado intermedio utiliza el algoritmo de hash SHA1, terceros pueden emitir certificados haciéndose pasar por esa instancia emisora. Por lo tanto, estas conexiones son vulnerables a los ataques "man-in-the-middle". (Estas son las comprobaciones signature-sha1 e intermediate-sha1 en network-security-protocol-checks).
SSL1, SSL2 y SSL3
Se cree que los protocolos anteriores a TLS1.0 son vulnerables a una serie de ataques, y es posible que desee evitar su uso si lo que está haciendo requiere una mayor seguridad. (Esta es la comprobación ssl en network-security-protocol-checks).

Si network-security-level es high, se harán las siguientes comprobaciones, además de las anteriores:

3DES cipher (Cifrado 3DES)
El cifrado de flujo 3DES proporciona como máximo 112 bits de seguridad efectiva, lo que se considera hacia el extremo inferior. (Esta es la comprobación 3des en network-security-protocol-checks).
a validate certificate changes the public key (un certificado validado cambia la clave pública)
Los servidores cambian sus claves de vez en cuando, y normalmente no hay que preocuparse por ello. Sin embargo, si le preocupa que sus conexiones de red sean secuestradas por agencias que tienen acceso a Autoridades de Certificación flexibles que emiten nuevos certificados para servicios de terceros, es posible que quiera hacer un seguimiento de estos cambios.

Por último, si network-security-leel es paranoid, también se le notificará la primera vez que NSM vea cualquier certificado nuevo. Esto le permitirá inspeccionar todos los certificados de todas las conexiones que haga Emacs.

Las siguientes variables adicionales se pueden utilizar para controlar los detalles del funcionamiento de NSM:

nsm-settings-file
Este es el archivo donde NSM almacena los detalles de las conexiones. Por defecto es ~/.emacs.d/network-security.data.
nsm-save-host-names
Por defecto, los nombres de host no se guardan para las conexiones que no son STARTTLS. En su lugar se utiliza un hash de host/puerto para identificar las conexiones. Esto significa que no se puede leer casualmente el archivo de configuración para ver a qué servidores se ha conectado el usuario. Si esta variable es t, NSM también guardará los nombres de host en el nsm-settings-file.


Visualización de documentos

El modo DocView es un modo principal para la visualización de documentos DVI, PostScript (PS), PDF, OpenDocument y Microsoft Office. Ofrece funciones como el corte, el zoom y la búsqueda dentro de los documentos. Funciona convirtiendo el documento en un conjunto de imágenes mediante los comandos gs (GhostScript) o mudraw/pdfdraw (MuPDF) y otras herramientas externas (18), y mostrando esas imágenes.

Nota

(18) Para los archivos PostScript, GhostScript es un requisito indispensable. Para los archivos DVI, se necesita dvipdf o dvipdfm. Para los documentos OpenDocument y Microsoft Office, se necesita la herramienta unoconv.

Cuando se visita un archivo de documento que puede ser mostrado con el modo DocView, Emacs utiliza automáticamente ese modo (19). Como excepción, cuando visita un archivo PostScript, el Editor cambia al modo PS, un modo mayor para editar archivos PostScript como texto; sin embargo, también habilita el modo menor DocView, por lo que puede escribir Ctrl-c Ctrl-c (C-c C-c) para ver el documento con DocView. Ya sea en el modo mayor o menor de DocView, repitiendo Ctrl-c Ctrl-c (C-c C-c, doc-view-toggle-display) cambia entre DocView y el contenido del archivo subyacente.

Nota

(19) Las herramientas externas necesarias para el tipo de documento deben estar disponibles, y Emacs debe ejecutarse en un marco gráfico y tener soporte para imágenes PNG. Si no se cumplen estos requisitos, Emacs pasa a otro modo principal.

Cuando se visita un archivo que normalmente sería manejado por el modo DocView, pero no se cumple algún requisito (por ejemplo, se opera en un marco de terminal o Emacs no tiene soporte para PNG), se le pregunta si desea ver el contenido del documento como texto plano. Si confirma, el buffer se pone en modo texto y se activa el modo menor de DocView. Así, tecleando Ctrl-c Ctrl-c (C-c C-c) se pasa al modo menor. Con otro Ctrl-c Ctrl-c (C-c C-c) se vuelve al modo DocView. El contenido de texto plano también puede mostrarse desde el modo DocView escribiendo Ctrl-c Ctrl-t (C-c C-t, doc-view-open-text).

Puede activar explícitamente el modo DocView con el comando Alt-x doc-view-mode (M-x doc-view-mode). Puede activar el modo menor de DocView con Alt-x doc-view-minor-mode (M-x doc-view-minor-mode).

Cuando el modo DocView se inicia, muestra una pantalla de bienvenida y comienza a formatear el archivo, página por página. Muestra la primera página una vez que ha sido formateada.

Para matar el buffer de DocView, escriba k (k, doc-view-kill-proc-and-buffer). Para enterrarlo, escriba q (q, quit-window).

En el modo DocView, puede desplazarse por la página actual utilizando las teclas de movimiento habituales de Emacs: Ctrl-p (C-p), Ctrl-p (C-n), Ctrl-b (C-b), Ctrl-f (C-f), y las teclas de dirección.

Por defecto, las teclas de movimiento de línea Ctrl-p (C-p) y Ctrl-n (C-n) detienen el desplazamiento al principio y al final de la página actual, respectivamente. Sin embargo, si cambia la variable doc-view-continuous a un valor no nulo, entonces Ctrl-p (C-p) muestra la página anterior si ya estás al principio de la página actual, y Ctrl-n (C-n) muestra la página siguiente si estás al final de la página actual.

También puede mostrar la página siguiente escribiendo n (n), PageDown, next o Ctrl-x ] (C-x ], doc-view-next-page). Para mostrar la página anterior, escriba p (p), PageUp, prior o Ctrl-x [ (C-x [, doc-view-previous-page).

SPACE (SPC, doc-view-scroll-up-or-next-page) es una forma cómoda de avanzar por el documento. Se desplaza dentro de la página actual o avanza a la siguiente. DEL (DEL) se desplaza hacia atrás de forma similar (doc-view-scroll-down-or-previous-page).

Para ir a la primera página, escriba Alt-< (M-<, M-<doc-view-first-page); para ir a la última, escriba Alt-> (M->, doc-view-last-page). Para saltar a una página por su número, escribe Alt-g Alt-g (M-g M-g) o Alt-g g (M-g g, doc-view-goto-page).

Puedes ampliar o reducir el documento con + (+, doc-view-enlarge) y - (-, doc-view-shrink). Por defecto, estos comandos sólo reescalan la imagen ya renderizada. Si desea que la imagen se vuelva a renderizar con el nuevo tamaño, establezca doc-view-scale-internally como nulo. Para especificar el tamaño por defecto de DocView, personalice la variable doc-view-resolution.

Búsqueda en DocView

En el modo DocView, puede buscar en el texto del archivo una expresión regular (véase Sintaxis de expresiones regulares). La interfaz de búsqueda está inspirada en isearch (véase Búsqueda incremental).

Para iniciar una búsqueda, escriba Ctrl-s (C-s, doc-view-search) o Ctrl-r (C-r, doc-view-search-backward). Esto lee una expresión regular utilizando un minibuffer, y luego se hace eco del número de coincidencias encontradas dentro del documento. Puede avanzar y retroceder entre las coincidencias escribiendo Ctrl-s (C-s) y Ctrl-r (C-r). El modo DocView no tiene forma de mostrar la coincidencia dentro de la imagen de la página; en su lugar, muestra un tooltip (en la posición del ratón) con una lista de todas las líneas coincidentes en la página actual. Para forzar la visualización de este tooltip, escriba Ctrl-t (C-t, doc-view-show-tooltip).

Para iniciar una nueva búsqueda, utilice el comando de búsqueda con un argumento de prefijo; es decir, Ctrl-u Ctrl-s (C-u C-s) para una búsqueda hacia adelante o Ctrl-u Ctrl-r (C-u C-r) para una búsqueda hacia atrás.

Cortes de DocView

Los documentos suelen tener márgenes amplios para la impresión. Son molestos cuando se lee el documento en la pantalla, porque ocupan espacio en la misma y pueden causar un desplazamiento incómodo.

Con DocView puede ocultar estos márgenes seleccionando una porción de páginas para mostrar. Una porción es un rectángulo dentro del área de la página; una vez que se especifica una porción en DocView, se aplica a cualquier página que se mire.

Para especificar la porción numéricamente, escriba Ctrl-s (C-s, doc-view-set-slice); a continuación, introduzca la posición del píxel superior izquierdo y la anchura y altura de la porción.

Una forma más conveniente de especificar el corte es con Ctrl-m (C-m, doc-view-set-slice-using-mouse), donde se utiliza el ratón para seleccionar el corte. Basta con mantener pulsado (ratón-1) en la esquina superior izquierda de la región que desea tener en el corte, luego arrastrar el puntero del ratón a la esquina inferior derecha y soltar el botón.

La forma más conveniente es establecer el corte óptimo utilizando la información de BoundingBox determinada automáticamente desde el documento escribiendo Ctrl-b (C-b, doc-view-set-slice-from-bounding-box).

Para cancelar el corte seleccionado, escriba cr (c r, doc-view-reset-slice). Entonces DocView muestra toda la página incluyendo todos sus márgenes.

Conversión de DocView

Por eficiencia, DocView almacena en caché las imágenes producidas por gs. El nombre del directorio donde se almacenan las imágenes viene dado por la variable doc-view-cache-directory. Puede borrar el directorio de caché escribiendo Alt-x doc-view-clear-cache (M-x doc-view-clear-cache).

Para forzar la reconversión del documento visualizado actualmente, escriba r (r) o g (g) (revert-buffer). Para matar el proceso de conversión asociado con el buffer actual, escriba k (k, doc-view-kill-proc). El comando k (k, doc-view-kill-proc-and-buffer) mata el proceso de conversión y el buffer DocView.



Ejecutar comandos de la shell desde Emacs

Emacs tiene comandos para pasar líneas de comando individuales a subprocesos de la shell, y para ejecutar una shell de forma interactiva con entrada y salida a un buffer del Editor, y para ejecutar una shell en una ventana de emulador de terminal.

Alt-! cmd RETURN (M-! cmd RET)
Ejecuta el comando de shell cmd y muestra la salida (shell-command).
Alt-| cmd RETURN (M-| cmd RET)
Ejecuta el comando de shell cmd con el contenido de la región como entrada; opcionalmente, sustituye la región por la salida (shell-command-on-region).
Alt-& cmd RETURN (M-& cmd RET)
Ejecuta el comando shell cmd de forma asíncrona y muestra la salida (async-shell-command).
Alt-x shell (M-x shell)
Ejecuta un subshell con entrada y salida a través de un buffer Emacs. A continuación, puede dar comandos de forma interactiva.
Alt-x term (M-x term)
Ejecuta un subshell con entrada y salida a través de un buffer Emacs. A continuación, puede dar comandos de forma interactiva. La emulación de terminal completa está disponible

Siempre que especifique un nombre de archivo relativo para un programa ejecutable (ya sea en el argumento cmd de uno de los comandos anteriores, o en otros contextos), Emacs busca el programa en los directorios especificados por la variable exec-path. El valor de esta variable debe ser una lista de directorios; el valor por defecto se inicializa a partir de la variable de entorno PATH cuando se inicia Emacs (ver Variables Generales).

Alt-x eshell (M-x eshell) invoca un shell implementado completamente en Emacs. Está documentado en su propio manual. Ver Eshell en Eshell: The Emacs Shell.

Comandos de shell individuales

Alt-! (M-!, shell-command) lee una línea de texto utilizando el minibuffer y la ejecuta como un comando del shell, en un subshell hecho sólo para ese comando. La entrada estándar para el comando proviene del dispositivo null. Si el comando de la shell produce alguna salida, ésta aparece en el área de eco (si es corta), o en el búfer ‘"*Shell Command Output*"’ (‘"*Salida del comando de la shell*"’, shell-command-buffer-name, si la salida es larga). Las variables resize-mini-windows y max-mini-window-height (ver Editar en el Minibuffer) controlan cuando Emacs debe considerar que la salida es demasiado larga para el área de eco.

Por ejemplo, una forma de descomprimir un archivo llamado foo.gz es escribir Alt-! gunzip foo.gz RETURN (M-! gunzip foo.gz RET). Este comando del shell normalmente crea el archivo foo y no produce ninguna salida en el terminal.

Un argumento numérico para shell-command , por ejemplo, Alt-1 Alt-! (M-1 M-!), hace que inserte la salida de la terminal en el búfer actual en lugar de un búfer separado. Por defecto, pone el punto antes de la salida, y pone la marca después de la salida (pero un valor no predeterminado de shell-command-dont-erase-buffer puede cambiar esto, ver más abajo). Por ejemplo, Atl-1 Alt-! gunzip < foo.gz RETURN (M-1 M-! gunzip < foo.gz RET) insertaría la forma descomprimida del archivo foo.gz en el buffer actual.

Siempre que el comando del shell especificado no termine con ‘&’, se ejecuta de forma sincrónica, y debes esperar a que salga antes de seguir usando Emacs. Para dejar de esperar, teclea Ctrl-g (C-g) para salir; esto envía una señal SIGINT para terminar el comando del shell (es la misma señal que Ctrl-c (C-c) genera normalmente en el shell). Emacs entonces espera hasta que el comando realmente termine. Si el comando del shell no se detiene (porque ignora la señal SIGINT), escribe Ctrl-g (C-g) de nuevo; esto envía al comando una señal SIGKILL, que es imposible de ignorar.

Un comando del shell que termina en ‘&’ se ejecuta de forma asíncrona, y puede seguir utilizando Emacs mientras se ejecuta. También puede escribir Alt-& (M-&, async-shell-command) para ejecutar un comando del shell de forma asíncrona; esto es exactamente como llamar a Alt-! (M-!) con un ‘&’ al final, excepto que no necesita el ‘&’. La salida de los comandos asíncronos del shell, por defecto, va al buffer ‘"*Async Shell Command*"’ (shell-command-buffer-name-async). Emacs inserta la salida en este búfer a medida que llega, tanto si el búfer es visible en una ventana como si no.

Si quiere ejecutar más de un comando de shell asíncrono al mismo tiempo, podrían acabar compitiendo por el buffer de salida. La opción async-shell-command-buffer especifica qué hacer al respecto; por ejemplo, si se debe renombrar el buffer de salida preexistente, o utilizar un buffer diferente para el nuevo comando. Consulte la documentación de la variable para más posibilidades.

Si desea que el búfer de salida para los comandos asíncronos del shell se muestre sólo cuando el comando genere salida, establezca async-shell-command-display-buffer a nil.

La opción async-shell-command-width define el número de columnas de visualización disponibles para la salida de los comandos del shell asíncrono. Un número entero positivo indica al shell que debe utilizar ese número de columnas para la salida de comandos. El valor por defecto es nil, que significa utilizar el mismo número de columnas que proporciona el shell.

Para hacer que los comandos anteriores muestren el directorio actual en sus avisos, personalice la variable shell-command-prompt-show-cwd a un valor no nulo.

Alt-| (M-|, shell-command-on-region) es como , Alt-! (M-!) pero pasa el contenido de la región como entrada estándar al comando del shell, en lugar de no tener entrada. Con un argumento numérico, borra la antigua región y la reemplaza con la salida del comando de la shell.

Por ejemplo, puede usar Alt-| (M-|) con el programa gpg para ver qué claves hay en el buffer. Si el búfer contiene una clave GnuPG, escriba Ctrl-x h Alt-| gpg RETURN (C-x h M-| gpg RET) para alimentar todo el contenido del búfer a gpg. Esto mostrará la lista de claves en el búfer cuyo nombre es el valor de shell-command-buffer-name.

Los comandos anteriores utilizan el shell especificado por la variable shell-file-name. Su valor por defecto está determinado por la variable de entorno SHELL cuando se inicia Emacs. Si el nombre del archivo es relativo, el Editor busca en los directorios listados en exec-path (ver Ejecutar comandos de shell desde Emacs).

Si el directorio por defecto es remoto (ver Archivos remotos), el valor por defecto es /bin/sh. Esto puede cambiarse declarando shell-file-name connection-local (véase Variables locales por conexión).

Para especificar un sistema de codificación para Alt-! (M-!) o Alt-| (M-|), utilice el comando Ctrl-x RETURN c (C-x RET c) inmediatamente antes. Vea Sistemas de codificación para la comunicación entre procesos.

Por defecto, la salida de errores se entremezcla con la salida normal en el buffer de salida. Pero si cambia el valor de la variable shell-command-default-error-buffer a una cadena, la salida de errores se inserta en un buffer con ese nombre.

Por defecto, el búfer de salida se borra entre los comandos del shell, excepto cuando la salida va al búfer actual. Si cambia el valor de la opción shell-command-dont-erase-buffer a erase, el búfer de salida se borra siempre. Otros valores no nulos evitan el borrado del búfer de salida, y -si el búfer de salida no es el búfer actual- también controlan dónde poner el punto después de insertar la salida del comando de la shell:

beg-last-out
Coloca el punto al principio de la última salida del comando de la shell.
end-last-out
Pone el punto al final de la última salida del comando de la shell, es decir, al final del búfer de salida.
save-point
Restablece la posición del punto tal y como estaba antes de insertar la salida del comando shell.

Subshell interactiva

Para ejecutar un subproceso interactivo, escriba Alt-x shell (M-x shell). Esto crea (o reutiliza) un buffer llamado *shell*, y ejecuta un subproceso de shell con entrada procedente de ese buffer y salida hacia él. Es decir, cualquier salida de terminal del subproceso va al buffer, avanzando el punto, y cualquier entrada de terminal para el subproceso viene del texto en el buffer. Para dar entrada a la subshell, ve al final del buffer y escribe la entrada, terminada por RETURN (RET).

Por defecto, cuando la subshell es invocada interactivamente, el buffer *shell* se muestra en una nueva ventana, a menos que la ventana actual ya muestre el buffer *shell*. Este comportamiento puede personalizarse mediante display-buffer-alist (ver Cómo funciona display-buffer).

Mientras el subshell está esperando o ejecutando un comando, puede cambiar de ventana o de buffer y realizar otras ediciones en Emacs. El Editor inserta la salida del subshell en el buffer de la Shell siempre que tenga tiempo de procesarla (por ejemplo, mientras espera la entrada del teclado).

En el buffer de Shell, las indicaciones se muestran con la cara comint-highlight-prompt, y las líneas de entrada enviadas se muestran con la cara comint-highlight-input. Esto hace que sea más fácil distinguir las líneas de entrada de la salida del shell. Véase Caras de texto.

Para hacer múltiples subshells, invoque Alt-x shell (M-x shell) con un argumento de prefijo (por ejemplo, Ctrl-u Alt-x shell (C-u M-x shell)). Entonces el comando leerá un nombre de buffer, y creará (o reutilizará) un subshell en ese buffer. También puede renombrar el buffer *shell* usando Alt-x rename-uniquely (M-x rename-uniquely), y luego crear un nuevo buffer *shell* usando Alt-x shell (M-x shell) simple. Las subcápsulas en diferentes búferes se ejecutan de forma independiente y en paralelo.

Para especificar el nombre del archivo del shell utilizado por Alt-x shell (M-x shell), personalice la variable explicit-shell-file-name. Si es nil (el valor por defecto), Emacs utiliza la variable de entorno ESHELL si existe. De lo contrario, normalmente utiliza la variable shell-file-name (ver Single Shell Commands); pero si el directorio por defecto es remoto (ver Archivos remotos), le pide el nombre del archivo de la shell. Ver Minibuffers para los nombres de archivos, para consejos sobre cómo escribir nombres de archivos remotos de manera efectiva.

Emacs envía a la nueva shell el contenido del archivo ~/.emacs_nombreshell como entrada, si existe, donde nombreshell es el nombre del archivo desde el que se cargó la shell. Por ejemplo, si usa bash, el archivo enviado es ~/.emacs_bash. Si este archivo no se encuentra, Emacs lo intenta con ~/.config/emacs/init_shellname.sh.

Para especificar un sistema de codificación para el shell, puedes usar el comando Ctrl-x RETURN c (C-x RET c) inmediatamente antes de Alt-x shell (M-x shell). También puede cambiar el sistema de codificación para un subshell en ejecución escribiendo Ctrl-x RETURN p (C-x RET p) en el buffer del shell. Véase Sistemas de codificación para la comunicación entre procesos.

Emacs establece la variable de entorno INSIDE_EMACS en la subshell a ‘version, comint’, donde version es la versión del Editor (por ejemplo, ‘28.2’). Los programas pueden comprobar esta variable para determinar si se están ejecutando dentro de una subshell de Emacs.

Modo Shell

El modo principal para los buffers de Shell es el modo Shell. Muchos de sus comandos especiales están ligados al prefijo Ctrl-c (C-c), y se asemejan a los caracteres habituales de edición y control de trabajos presentes en los shells ordinarios, con la salvedad de que hay que teclear primero Ctrl-c (C-c). Esta es una lista de los comandos del modo Shell:

RETURN (RET)
Envía la línea actual como entrada al subshell (comint-send-input). Se omite cualquier aviso de la shell al principio de la línea (ver Avisos de la Shell). Si el punto está al final del buffer, esto es como enviar la línea de comandos en un shell interactivo ordinario. Sin embargo, también puede invocar RETURN (RET) en cualquier parte del buffer del shell para enviar la línea actual como entrada.
TAB (TAB)
Completa el nombre del comando o del archivo antes del punto en el buffer del shell (completion-at-point). Esto utiliza las reglas habituales de finalización de Emacs (ver Finalización), siendo las alternativas de finalización los nombres de archivo, los nombres de variables de entorno, el historial de comandos del shell y las referencias al historial (ver Referencias al historial del shell). Para las opciones que controlan la finalización, vea Opciones del Modo Shell.
Alt-? (M-?)
Muestra temporalmente una lista de las posibles terminaciones del nombre de archivo antes del punto (comint-dynamic-list-filename-completions).
Ctrl-d (C-d)
Borra un carácter o envía EOF (comint-delchar-o-maybe-eof). Si se escribe al final del búfer del shell, se envía EOF al subshell. Si se escribe en cualquier otra posición del buffer, se borra un carácter como es habitual.
Ctrl-c Ctrl-a (C-c C-a)
Se mueve al principio de la línea, pero después del prompt si lo hay (comint-bol-o-process-mark). Si repite este comando dos veces seguidas, la segunda vez se mueve de nuevo a la marca de proceso, que es el comienzo de la entrada que aún no ha enviado a la subescala. (Normalmente ese es el mismo lugar -el final del prompt en esta línea- pero después de Ctrl-c SPACE (C-c SPC) la marca de proceso puede estar en una línea anterior).
Ctrl-c SPACE (C-c SPC)
Acumula múltiples líneas de entrada, luego las envía juntas (comint-accumulate). Este comando inserta una nueva línea antes del punto, pero no envía el texto precedente como entrada al subshell, al menos, no todavía. Ambas líneas, la anterior a esta nueva línea y la posterior, se enviarán juntas (junto con la nueva línea que las separa), cuando escriba RETURN (RET).
Ctrl-c Ctrl-u (C-c C-u)
Mata todo el texto pendiente al final del buffer para ser enviado como entrada (comint-kill-input). Si el punto no está al final del buffer, esto sólo mata la parte de este texto que precede al punto.
Ctrl-c Ctrl-w (C-c C-w)
Mata una palabra antes del punto (backward-kill-word).
Ctrl-c Ctrl-c (C-c C-c)
Interrumpe el shell o su subjob actual si lo hay (comint-interrupt-subjob). Este comando también mata cualquier entrada de la shell pendiente en el buffer de la shell y aún no enviada.
Ctrl-c Ctrl-z (C-c C-z)
Detiene el shell o su subjob actual si lo hay (comint-stop-subjob). Este comando tambien mata cualquier entrada de la shell pendiente en el buffer de la shell y aun no enviada.
Ctrl-c Ctrl-\ (C-c C-\)
Envía una señal de salida al shell o a su subjob actual si lo hay (comint-quit-subjob). Este comando tambien mata cualquier entrada de la shell pendiente en el buffer de la shell y aun no enviada.
Ctrl-c Ctrl-o (C-c C-o)
Borra el último lote de salida de un comando del shell (comint-delete-output). Esto es útil si un comando del shell arroja mucha salida que simplemente estorba. Con un argumento de prefijo, este comando guarda el texto borrado en el kill-ring (ver The Kill Ring), de modo que usted podría más tarde arrancarlo (ver Yanking) en otro lugar.
Ctrl-c Ctrl-s (C-c C-s)
Escribe el último lote de salida de un comando del shell en un archivo (comint-write-output). Con un argumento de prefijo, el archivo se anexa en su lugar. Cualquier prompt al final de la salida no se escribe.
Ctrl-c Ctrl-r (C-c C-r)
Ctrl-Alt-l (C-M-l)
Se desplaza para mostrar el principio del último lote de salida en la parte superior de la ventana; también mover el cursor allí (comint-show-output).
Ctrl-c Ctrl-e (C-c C-e)
Se desplaza para poner la última línea del buffer en la parte inferior de la ventana (comint-show-maximum-output).
Ctrl- Ctrl-f (C-c C-f)
Avanza un comando del shell, pero no más allá de la línea actual (shell-forward-command). La variable shell-command-regexp especifica cómo reconocer el final de un comando.
Ctrl-c Ctrl-b (C-c C-b)
Se mueve hacia atrás a través de un comando del shell, pero no más allá de la línea actual (shell-backward-command).
Alt-x dirs (M-x dirs)
Pregunta al shell por su directorio de trabajo, y actualiza el directorio por defecto del buffer del Shell. Véase Seguimiento de directorios.
Alt-x comint-send-invisible RETURN texto RETURN
(M-x comint-send-invisible RET texto RET)
Envía texto como entrada al shell, después de leerlo sin hacer eco. Esto es útil cuando un comando del shell ejecuta un programa que pide una contraseña.
Tenga en cuenta que Emacs no hará eco de las contraseñas por defecto. Si realmente quiere que se haga eco de ellas, evalúe (vea Evaluando Expresiones Lisp de Emacs) la siguiente expresión Lisp:
(remove-hook 'comint-output-filter-functions
             'comint-watch-for-password-prompt)
	
Alt-x comint-continuar-subjob (M-x comint-continuar-subjob)
Continúa el proceso de la shell. Esto es útil si se suspende accidentalmente el proceso de la shell.(20)
Alt-x comint-strip-ctrl-m (M-x comint-strip-ctrl-m)
Descarta todos los caracteres de control-M del grupo actual de salida del shell. La forma más conveniente de utilizar este comando es hacer que se ejecute automáticamente cuando se obtiene la salida del subshell. Para ello, evalúe esta expresión Lisp:
(add-hook 'comint-output-filter-functions
          'comint-strip-ctrl-m)
	
Alt-x comint-truncate-buffer (M-x comint-truncate-buffer)
Este comando trunca el buffer del shell a un cierto número máximo de líneas, especificado por la variable comint-buffer-maximum-size. Así es como se hace esto automáticamente cada vez que se obtiene la salida del subshell:
(add-hook 'comint-output-filter-functions
          'comint-truncate-buffer)
	

Nota

(20) No debe suspender el proceso del shell. Suspender un sub-trabajo del shell es un asunto completamente diferente-eso es una práctica normal, pero debe usar el shell para continuar el sub-trabajo; este comando no lo hará.

Por defecto, el modo Shell maneja los códigos de escape ANSI comunes (por ejemplo, para cambiar el color del texto). Emacs también soporta opcionalmente algunos códigos de escape extendidos, como algunos de los OSC (Operating System Codes) si pones lo siguiente en tu archivo init:

(add-hook 'comint-output-filter-functions 'comint-osc-process-output)

Con esta opción activada, la salida de, por ejemplo, ls --hyperlink se convertirá en botones clicables en el buffer del modo Shell.

El modo Shell es un derivado del modo Comint, un modo de propósito general para comunicarse con subprocesos interactivos. La mayoría de las características del modo Shell provienen en realidad del modo Comint, como se puede ver en los nombres de los comandos mencionados anteriormente. Las características especiales del modo Shell incluyen la función de rastreo de directorios, y algunos comandos de usuario.

Otras características de Emacs que utilizan variantes del modo Comint son GUD (ver Ejecutar depuradores bajo Emacs) y Alt-x run-lisp (M-x run-lisp) (ver Ejecutar un Lisp externo).

Puede usar Alt-x comint-run (M-x comint-run) para ejecutar cualquier programa de tu elección en un subproceso usando el modo Comint no modificado-sin las especializaciones del modo Shell. Para pasar argumentos al programa, utilice Ctrl-u Alt-x comint-run (C-u M-x comint-run).

Prompt de Shell

Un prompt es la salida de texto de un programa para mostrar que está listo para aceptar nuevas entradas del usuario. Normalmente, el modo Comint (y, por tanto, el modo Shell) calcula automáticamente qué parte del búfer es un prompt, basándose en la salida del subproceso. (Específicamente, asume que cualquier línea de salida recibida que no termine con una nueva línea es un prompt).

El modo Comint divide el buffer en dos tipos de campos: campos de entrada (donde se teclea la entrada del usuario) y campos de salida (en todos los demás lugares). Los avisos forman parte de los campos de salida. La mayoría de los comandos de movimiento de Emacs no cruzan los límites de los campos, a menos que se muevan por varias líneas. Por ejemplo, cuando el punto está en el campo de entrada en una línea de comandos del shell, Ctrl-a (C-a) pone el punto al principio del campo de entrada, después del prompt. Internamente, los campos se implementan utilizando la propiedad de texto del campo (ver Propiedades de Texto en el Manual de Referencia de Emacs Lisp).

Si cambia la variable comint-use-prompt-regexp a un valor no nulo, entonces el modo Comint reconocerá los avisos usando una expresión regular (ver Sintaxis de Expresiones Regulares). En el modo Shell, la expresión regular se especifica mediante la variable shell-prompt-pattern. El valor por defecto de comint-use-prompt-regexp es nulo, porque este método para reconocer las indicaciones es poco fiable, pero puede querer establecer un valor no nulo en circunstancias inusuales. En ese caso, Emacs no divide el buffer Comint en campos, por lo que los comandos de movimiento general se comportan como lo hacen normalmente en buffers sin propiedades especiales de texto. Sin embargo, puede usar los comandos de movimiento de párrafo para navegar convenientemente por el búfer (ver Párrafos); en el modo Shell, Emacs usa shell-prompt-pattern como límites de párrafo.

Historial de comandos del shell

Los búferes del shell admiten tres formas de repetir comandos anteriores. Puedes usar teclas como las que se usan para el historial del minibuffer; éstas funcionan de forma muy parecida a como lo hacen en el minibuffer, insertando texto de comandos anteriores mientras el punto permanece siempre al final del buffer. Puedes desplazarte por el buffer hasta las entradas anteriores en su lugar original, y luego volver a enviarlas o copiarlas al final. O puede utilizar una referencia histórica del tipo ‘!’.

Anillo del Historial de Shell

Alt-p (M-p)
Ctrl-UP (C-UP)
Recupera el siguiente comando anterior del shell (comint-previous-input).
Alt-n (M-n)
Ctrl-DOWN (C-DOWN)
Obtiene el comando de shel siguiente al anterior (comint-next-input).
Alt-r (M-r)
Comienza una busqueda incremental expreg de comandos antiguos del shell (comint-history-isearch-backward-regexp).
Ctrl-c Ctrl-x (C-c C-x)
Obtiene el siguiente comando del historial (comint-get-next-from-history).
Ctrl-c . (C-c .)
Obtiene un argumento de un comando del shell antiguo (comint-input-previous-argument).
Ctrl- Ctrl-l (C-c C-l)
Mostrar el historial del buffer de comandos del shell en otra ventana (comint-dynamic-list-input-ring).

Los búferes del shell proporcionan un historial de los comandos del shell introducidos anteriormente. Para reutilizar los comandos del shell del historial, utilice los comandos de edición Alt-p (M-p), Atl-n (M-n) y Alt-r (M-r). Estos comandos funcionan de forma similar a los comandos del historial del minibuffer (ver Historial del minibuffer), excepto que operan dentro del buffer del shell en lugar del minibuffer, y Alt-r (M-r) en un buffer del shell invoca la búsqueda incremental a través del historial de comandos del shell.

Alt-p (M-p) recupera un comando del shell anterior hasta el final del buffer del shell. El uso sucesivo de Alt-p (M-p) recupera sucesivamente comandos anteriores del shell, cada uno de los cuales reemplaza cualquier texto que ya estaba presente como posible entrada del shell. Alt-n (M-n) hace lo mismo, excepto que encuentra sucesivamente comandos del shell más recientes del buffer. C-UP funciona como Alt-p (M-p), y C-DOWN como Alt-n (M-n).

El comando de búsqueda en el historial Alt-r (M-r) comienza una búsqueda incremental de expresiones regulares de comandos anteriores del shell. Después de escribir Alt-r (M-r), comience a escribir la cadena o expresión regular deseada; el último comando del shell que coincida se mostrará en la línea actual. Los comandos de búsqueda incremental tienen sus efectos habituales; por ejemplo, Ctrl-s (C-s) y Ctrl-r (C-r) buscan hacia delante y hacia atrás la siguiente coincidencia (véase Búsqueda incremental). Cuando encuentre la entrada deseada, escriba RETURN (RET) para terminar la búsqueda. Esto pone la entrada en la línea de comandos. Cualquier entrada parcial que estuviera componiendo antes de navegar por la lista del historial se restablece cuando va al principio o al final del anillo del historial.

A menudo es útil reejecutar varios comandos sucesivos del shell que fueron ejecutados previamente en secuencia. Para ello, primero busque y reejecute el primer comando de la secuencia. A continuación, escriba Ctrl-c Ctrl-x (C-c C-x); esto recuperará el siguiente comando, el que sigue al comando que acaba de repetir. A continuación, escriba RETURN (RET) para volver a ejecutar este comando. Puedes reejecutar varios comandos sucesivos escribiendo Ctrl-c Ctrl-x RETURN (C-c C-x RET) una y otra vez.

El comando Ctrl-c . (C-c ., comint-insert-previous-argument) copia un argumento individual de un comando anterior, como Esc. (ESC .) en Bash y zsh. El uso más simple copia el último argumento del comando anterior del shell. Con un argumento prefijo n, copia el enésimo argumento en su lugar. La repetición de Ctrl-c . (C-c .) copia desde un comando shell anterior, siempre usando el mismo valor de n (no de un argumento prefijo cuando repita el comando Ctrl-c . (C-c .)).

Si establece comint-insert-previous-argument-from-end a un valor no nulo, Ctrl-c . (C-c .) copiará en su lugar el enésimo argumento contando desde el último; esto emula a Esc. (ESC .) en zsh.

Estos comandos obtienen el texto de los comandos anteriores del shell de una lista especial del historial, no del propio buffer del shell. Por lo tanto, editar el buffer del shell, o incluso matar grandes partes del mismo, no afecta al historial al que acceden estos comandos.

Algunas shells almacenan sus historiales de comandos en archivos para que puedas consultar los comandos de sesiones anteriores de la shell. Emacs lee el archivo del historial de comandos de la shell elegida, para inicializar su propio historial de comandos. El nombre del archivo es ~/.bash_history para bash, ~/.sh_history para ksh, y ~/.history para otras shell.

Si ejecuta el intérprete de comandos en un host remoto, esta configuración puede ser sobrescrita por la variable tramp-histfile-override. Se recomienda establecer esta variable como nula (nil).

Copia del historial del Shell

Ctrl-c Ctrl-p (C-c C-p)
Mueve el punto al prompt anterior (comint-previous-prompt).
Ctrl-c Ctrl-n (C-c C-n)
Mueve el punto al siguiente prompt (comint-next-prompt).
Ctrl-c RETURN ()
Copia el comando de entrada en el punto, insertando la copia al final del buffer (comint-copy-old-input). Esto es útil si se mueve el punto hacia atrás a un comando anterior. Después de copiar el comando, puede enviar la copia como entrada con RETURN (RET). Si lo desea, puede editar la copia antes de volver a enviarla. Si usa este comando en una línea de salida, copia esa línea al final del buffer.
(ratón-2)
Si comint-use-prompt-regexp es (el valor por defecto), copia el antiguo comando de entrada sobre el que se hace clic, insertando la copia al final del buffer (comint-insert-input). Si comint-use-prompt-regexp es no , o si el clic no está sobre la entrada antigua, simplemente tira como siempre.

Moverse a una entrada anterior y luego copiarla con Ctrl-c RETURN (C-c RET) o (ratón-2) produce los mismos resultados, el mismo contenido del buffer- que obtendría usando Alt-p (M-p) suficientes veces para obtener esa entrada anterior de la lista del historial. Sin embargo, Ctrl-c RETURN (C-c RET) copia el texto del búfer, que puede ser diferente de lo que hay en la lista del historial si editas el texto de entrada en el búfer después de haberlo enviado.

Referencias del historial de la shell

Varios shells, incluyendo csh y bash, soportan referencias al historial que comienzan con ‘!’ y ‘^’. El modo Shell reconoce estas construcciones y puede realizar la sustitución del historial por Usted.

Si inserta una referencia al historial y escribe TAB, esto busca en el historial de entrada un comando que coincida, realiza la sustitución si es necesario, y coloca el resultado en el buffer en lugar de la referencia al historial. Por ejemplo, puedes buscar el comando más reciente que empiece por 'mv' con ! m v TAB. Puedes editar el comando si lo deseas, y luego reenviar el comando al shell escribiendo RET.

El modo Shell puede opcionalmente expandir las referencias del historial en el buffer cuando las envíe al shell. Para solicitarlo, establezca la variable comint-input-autoexpand en input. Puede hacer que SPC realice la expansión del historial vinculando SPC al comando comint-magic-space. Consulte Cambio de enlaces de teclas de forma interactiva.

El modo Shell reconoce las referencias al historial cuando siguen a un prompt. Vea Avisos de Shell, para saber cómo el modo Shell reconoce los avisos.

Seguimiento de directorios

El modo Shell realiza un seguimiento de los comandos ‘cd’, ‘pushd’ y ‘popd’ dados al subshell, para mantener el directorio por defecto del buffer Shell (ver Nombres de archivos) igual que el directorio de trabajo del shell. Reconoce estos comandos examinando las líneas de entrada que envía.

Si usas alias para estos comandos, puedes decirle a Emacs que los reconozca también, estableciendo las variables shell-pushd-regexp, shell-popd-regexp, y shell-cd-regexp a las expresiones regulares apropiadas (ver Sintaxis de Expresiones Regulares). Por ejemplo, si shell-pushd-regexp coincide con el comienzo de una línea de comandos del shell, esa línea se considera un comando pushd. Estos comandos sólo se reconocen al principio de una línea de comandos del shell.

Si Emacs se confunde con los cambios en el directorio de trabajo de la subshell, escriba Alt-x dirs (M-x dirs). Este comando pregunta al shell por su directorio de trabajo y actualiza el directorio por defecto en consecuencia. Funciona para los shells que soportan la sintaxis de comandos más común, pero puede no funcionar para los shells inusuales.

También puede utilizar el modo Dirtrack, un modo menor de búfer local que implementa un método alternativo de seguimiento del directorio de trabajo del shell. Para utilizar este método, el prompt de su shell debe contener el directorio de trabajo en todo momento, y debe suministrar una expresión regular para reconocer qué parte del prompt contiene el directorio de trabajo; consulte la documentación de la variable dirtrack-list para más detalles. Para utilizar el modo Dirtrack, escriba Alt-x dirtrack-mode (M-x dirtrack-mode) en el buffer de la shell, o añada dirtrack-mode a shell-mode-hook (véase Hooks).

Opciones del modo Shell

Si la variable comint-scroll-to-bottom-on-input es distinta de nil, los comandos de inserción y yank se desplazan por la ventana seleccionada hasta el fondo antes de insertar. El valor por defecto es nulo (nil).

Si comint-scroll-show-maximum-output es no nil, la llegada de la salida cuando el punto está al final intenta desplazar la última línea de texto hasta la línea inferior de la ventana, mostrando todo el texto útil posible. (Esto imita el comportamiento de desplazamiento de la mayoría de los terminales.) El valor por defecto es t.

Estableciendo comint-move-point-for-output, puede optar por que point salte al final del buffer cuando llegue la salida, sin importar en qué parte del buffer estaba antes. Si el valor es this, el punto salta en la ventana seleccionada. Si el valor es all, point salta en cada ventana que muestra el buffer Comint. Si el valor es other, el punto salta en todas las ventanas no seleccionadas que muestren el buffer actual. El valor por defecto es nil, lo que significa que point no salta al final.

Si se establece comint-prompt-read-only, las indicaciones en el buffer Comint son de sólo lectura.

La variable comint-input-ignoredups controla si las sucesivas entradas idénticas se almacenan en el historial de entradas. Un valor no nulo significa omitir una entrada que sea igual a la anterior. El valor por defecto es nil, lo que significa almacenar cada entrada incluso si es igual a la anterior.

Tres variables personalizan la finalización del nombre del archivo. La variable comint-completion-addsuffix controla si el completamiento inserta un espacio o una barra para indicar un nombre de archivo o directorio completado en su totalidad (no nil significa que se inserta un espacio o una barra). comint-completion-recexact, si no es nil, dirige a TAB (TAB) para que elija el completamiento más corto posible si el algoritmo de completamiento habitual de Emacs no puede añadir ni un solo carácter. comint-completion-autolist, si no es nil, dice que se listan todos los completamientos posibles cuando dicho completamiento no es exacto.

La finalización de comandos normalmente sólo considera los archivos ejecutables. Si establece shell-completion-execonly a nil, también considera los archivos no ejecutables.

La variable shell-completion-fignore especifica una lista de extensiones de nombres de archivo para ignorar en la finalización en modo Shell. La configuración por defecto es nula, pero algunos usuarios prefieren ("~" "#" "%") ignorar los nombres de archivo que terminan en ‘~’, ‘#’ o '%'. Otros modos Comint relacionados utilizan la variable comint-completion-fignore en su lugar.

Algunos detalles de la implementación de la finalización de comandos del shell también pueden encontrarse en la documentación de Lisp de la función shell-dynamic-complete-command.

Puede configurar el comportamiento de ‘pushd’. Las variables controlan si ‘pushd’ se comporta como ‘cd’ si no se da ningún argumento (shell-pushd-tohome), en lugar de rotar con un argumento numérico (shell-pushd-dextract), y sólo añade directorios a la pila de directorios si no están ya en ella (shell-pushd-dunique). Los valores que elija deben coincidir con el shell subyacente, por supuesto.

El modo Comint establece la variable de entorno TERM a un valor predeterminado seguro, pero este valor desactiva algunas características útiles. Por ejemplo, el color está deshabilitado en las aplicaciones que usan TERM para determinar si el color está soportado. Por lo tanto, Emacs proporciona una opción comint-terminfo-terminal, que puede establecer a un terminal que esté presente en la base de datos terminfo de tu sistema, para aprovechar las características avanzadas de ese terminal.

Emulador de terminal Emacs

Para ejecutar una subshell en un emulador de terminal de texto, utilice Alt-x term (M-x term). Esto crea (o reutiliza) un buffer llamado *terminal* y ejecuta un subshell con entrada proveniente de su teclado, y la salida va a ese buffer.

El emulador de terminal utiliza el modo Term, que tiene dos modos de entrada. En el modo línea, Term actúa básicamente como el modo Shell (ver Modo Shell). En modo char, cada carácter se envía directamente al subshell, como entrada de la terminal; la única excepción es el carácter de escape de la terminal, que por defecto es Ctrl-c (C-c) (ver Modo Term). Cualquier eco de su entrada es responsabilidad de la subshell; cualquier salida de terminal de la subshell va al buffer, avanzando el punto.

Algunos programas (como el propio Emacs) necesitan controlar en detalle la apariencia de la pantalla de la terminal. Lo hacen emitiendo códigos de control especiales. El modo Term reconoce y maneja las secuencias de escape del estilo VT100 del estándar ANSI, que son aceptadas por la mayoría de los terminales modernos, incluyendo xterm. (De hecho, puedes ejecutar Emacs dentro de una ventana de términos del Editor ).

La cara de term especifica la apariencia por defecto del texto en el emulador de terminal (la apariencia por defecto es la misma que la cara por defecto). Cuando se utilizan códigos de control de terminal para cambiar la apariencia del texto, éstos se representan en el emulador de terminal por las caras term-color-black, term-color-red, term-color-green, term-color-yellow, term-color-blue, term-color-magenta, term-color-cian, term-color-white, term-color-underline y term-color-bold. Véase Caras de texto.

También puede utilizar el modo Term para comunicarse con un dispositivo conectado a un puerto serie. Ver Terminal Serial.

El nombre del archivo utilizado para cargar el subshell se determina de la misma manera que para el modo Shell. Para hacer múltiples emuladores de terminal, renombre el buffer *terminal* a algo diferente usando Alt-x rename-uniquely (M-x rename-uniquely), igual que con el modo Shell.

A diferencia del modo Shell, el modo Term no rastrea el directorio actual examinando su entrada. Pero algunos shells pueden decirle a Term cuál es el directorio actual. Esto lo hace automáticamente bash versión 1.15 y posteriores.

Modo Term

Para cambiar entre el modo línea y el modo char en el modo Term, utilice estos comandos:

Ctrl-c Ctrl-j (C-c C-j)
Cambia al modo de línea (term-line-mode). No hace nada si ya está en modo línea.
Ctrl-c Ctrl-k (C-c C-k)
Cambia al modo char (term-char-mode). No hace nada si ya está en modo char.

Los siguientes comandos sólo están disponibles en modo char:

Ctrl-c Ctrl-c (C-c C-c)
Envia un literal C-c al sub-shell (term-interrupt-subjob).
Ctrl-c char (C-c char)
Esto es equivalente a Ctrl-x char (C-x char) en Emacs normal. ‘other-window’.

El modo term tiene una función de página a la vez. Cuando está activada, hace que la salida se detenga al final de cada pantalla:

Ctrl-c Ctrl-q (C-c C-q)
Activa la función "page-at-a-time" (term-pager-toggle). Este comando funciona tanto en el modo de línea como en el modo char. Cuando la función está activada, la línea de modo muestra la palabra ‘page’ ("página"), y cada vez que Term recibe más de una pantalla de salida, hace una pausa y muestra ‘**MORE**’ ("**MÁS**") en la línea de modo. Escriba SPACE (SPC) para mostrar la siguiente pantalla de salida, o ? (?) para ver sus otras opciones. La interfaz es similar a la del programa more.

Shell de host remoto

Puedes iniciar sesión en un ordenador remoto, utilizando cualquier comando que usarías desde un terminal normal (por ejemplo, usando los comandos ssh o telnet o rlogin), desde una ventana de Term.

Un programa que le pida una contraseña normalmente suprimirá el eco de la misma, por lo que la contraseña no aparecerá en el búfer. Esto sucederá como si estuvieras usando una terminal real, si el buffer está en modo char. Si está en modo de línea, la contraseña será visible temporalmente, pero se borrará cuando pulse RETURN (RET). (Esto ocurre automáticamente; no hay un procesamiento especial de la contraseña).

Cuando se conecta a una máquina diferente, necesita especificar el tipo de terminal que está usando, estableciendo la variable de entorno TERM en el entorno para el comando de inicio de sesión remoto. (Si usa bash, lo hace escribiendo la asignación de la variable antes del comando de inicio de sesión remoto, sin una coma de separación). Los tipos de terminal ‘ansi’ o ‘vt100’ funcionarán en la mayoría de los sistemas.

Terminal en puerto serie

Si tiene un dispositivo conectado a un puerto serie de su ordenador, puede comunicarse con él escribiendo Alt- serial-term (M-x serial-term). Este comando pide el nombre del puerto serie y la velocidad, y cambia a un nuevo búfer en modo Term. Emacs se comunica con el dispositivo serie a través de este búfer como lo hace con un terminal en modo Term ordinario.

La velocidad del puerto serie se mide en bits por segundo. La velocidad más común es de 9600 bits por segundo. Puede cambiar la velocidad de forma interactiva haciendo clic en la línea de modo.

Un puerto serie puede configurarse aún más haciendo clic en ‘8N1’ en la línea de modo. Por defecto, un puerto serie está configurado como ‘8N1’, lo que significa que cada byte consta de 8 bits de datos, Ningún bit de comprobación de paridad y 1 bit de parada.

Si la velocidad o la configuración es incorrecta, no podrá comunicarse con su dispositivo y probablemente sólo verá una salida basura en la ventana.



Uso de Emacs como servidor

Varios programas pueden invocar su elección de editor para editar un trozo de texto en particular. Por ejemplo, los programas de control de versiones invocan un editor para introducir registros de control de versiones (ver Control de versiones), y la utilidad de correo de Unix invoca un editor para introducir un mensaje a enviar. Por convención, su elección de editor está especificada por la variable de entorno EDITOR. Si se establece EDITOR como ‘emacs’, se invocará al Editor, pero de una manera inconveniente: iniciando un nuevo proceso de Emacs. Esto es inconveniente porque el nuevo proceso-Emacs no comparte búferes, un historial de comandos u otro tipo de información con cualquier proceso-Emcas existente.

Puede resolver este problema configurando Emacs como un servidor de edición, de forma que "escuche" las peticiones de edición externas y actúe en consecuencia. Hay varias maneras de iniciar un servidor Emacs:

  • Ejecute el comando server-start en un proceso Emacs existente: o bien escriba Alt-x server-start (M-x server-start), o escriba la expresión (server-start) en su fichero init (ver El fichero de inicialización de Emacs). El proceso Emacs existente es el servidor; cuando salga del Editor, el servidor morirá con este proceso.

  • Ejecute Emacs como un demonio, usando una de las opciones de la línea de comandos '--daemon'. Ver Opciones iniciales. Cuando Emacs se inicia de esta manera, llama a server-start después de la inicialización y no abre un marco inicial. Entonces espera las peticiones de edición de los clientes.

  • Si su sistema operativo utiliza systemd para gestionar el arranque, puede iniciar automáticamente Emacs en modo demonio cuando se conecta utilizando el archivo systemd unit file suministrado. Para activar esto:
    systemctl --user enable emacs
    	
    (Si su Emacs se instaló en una ubicación no estándar, puede que tenga que copiar el archivo emacs.service a un directorio estándar como ~/.config/systemd/user/).

  • Un proceso externo puede invocar al servidor Emacs cuando se produce un evento de conexión sobre un socket específico y pasar el socket al nuevo proceso del servidor Emacs. Un ejemplo de esto es la funcionalidad de socket de systemd: el servicio systemd crea un socket y escucha conexiones en él; cuando emacsclient se conecta a él por primera vez, systemd puede lanzar el servidor Emacs y pasarle el socket para que atienda las conexiones de emacsclient. Una configuración para usar esta funcionalidad podría ser:
    [Socket]
    ListenStream=/ruta/a/.emacs.socket
    DirectoryMode=0700
    
    [Install]
    WantedBy=sockets.target
    	
    (El archivo emacs.service descrito anteriormente también debe estar instalado).

    La ruta ListenStream será la ruta en la que Emacs escucha las conexiones de emacsclient; es un archivo de su elección.

Una vez que se inicia un servidor Emacs, se puede utilizar un comando del shell llamado emacsclient para conectarse al proceso Emacs y decirle que visite un archivo. Entonces puede establecer la variable de entorno EDITOR a ’emacsclient’, de modo que los programas externos usen el proceso del Editor existente para la edición.(21)

Nota

(21) Algunos programas utilizan una variable de entorno diferente; por ejemplo, para que TeX utilice ‘emacsclient’, establezca la variable de entorno TEXEDIT como ‘emacsclient +%d %s’.

Puede ejecutar varios servidores Emacs en la misma máquina dándole a cada uno un nombre de servidor único, usando la variable server-name. Por ejemplo, Alt-x set-variable RETURN set-variable RETURN server-name RETURN "foo" RETURN (M-x set-variable RET server-name RET "foo" RET) establece el nombre del servidor como ‘foo’. El programa emacsclient puede especificar un servidor por su nombre, usando la opción ‘-s’ o ‘-f’ (ver Opciones de emacsclient), dependiendo de si el servidor usa o no un socket TCP (ver Servidor TCP Emacs).

Si quiere ejecutar múltiples demonios de Emacs (ver Opciones iniciales), puede dar a cada demonio su propio nombre de servidor así:

emacs --daemon=foo

Si ha definido un servidor con un nombre de servidor único, es posible conectarse al servidor desde otra instancia de Emacs y evaluar expresiones Lisp en el servidor, utilizando la función server-eval-at. Por ejemplo, (server-eval-at "foo" '(+ 1 2)) evalúa la expresión (+ 1 2) en el servidor ‘foo’, y devuelve 3. (Si no hay ningún servidor con ese nombre, se señala un error.) Actualmente, esta función es principalmente útil para los desarrolladores.

Si el entorno de escritorio de su sistema operativo es compatible con freedesktop.org (que es el caso de la mayoría de GNU/Linux y otras GUIs recientes tipo Unix), puede utilizar la entrada de menú ‘Emacs (Cliente)’ para conectarse a un servidor Emacs con emacsclient. El demonio se inicia si no se está ejecutando.

Servidor Emacs

Un servidor Emacs normalmente escucha las conexiones en un socket local de dominio Unix. Algunos sistemas operativos, como MS-Windows, no soportan sockets locales; en ese caso, el servidor utiliza sockets TCP en su lugar. En algunos casos es útil que el servidor escuche en un socket TCP incluso si los sockets locales están soportados, por ejemplo, si necesita contactar con el servidor Emacs desde una máquina remota. Puede poner server-use-tcp a un valor no nulo para que Emacs escuche en un socket TCP en lugar de un socket local. Este es el valor por defecto si su sistema operativo no soporta sockets locales.

Si el servidor Emacs está configurado para usar TCP, escuchará por defecto en un puerto aleatorio de la interfaz localhost. Esto puede cambiarse a otra interfaz y/o a un puerto fijo utilizando las variables server-host y server-port.

Un socket TCP no está sujeto a los permisos del sistema de archivos. Para mantener cierto control sobre qué Usuarios pueden hablar con un servidor Emacs a través de sockets TCP, el programa emacsclient debe enviar una clave de autorización al servidor. Esta clave es normalmente generada aleatoriamente por el servidor Emacs. Este es el modo de funcionamiento recomendado.

Si es necesario, puede establecer la clave de autorización a un valor estático estableciendo la variable server-auth-key. La clave debe consistir en 64 caracteres ASCII imprimibles, excepto el espacio (esto significa caracteres desde ‘!’ hasta ‘~’, o desde el código decimal 33 hasta el 126). Puede utilizar Alt-x server-generate-key (M-x server-generate-key) para obtener una clave aleatoria.

Cuando inicia un servidor TCP de Emacs, el Editor crea un fichero de servidor que contiene la información TCP que usará emacsclient para conectarse al servidor. La variable server-auth-dir especifica el directorio por defecto que contiene el archivo del servidor; por defecto, es ~/.config/emacs/server/. En ausencia de un socket local con permisos de archivo, los permisos de este directorio determinan qué Usuarios pueden hacer que sus procesos emacsclient hablen con el servidor Emacs. Si server-name es un nombre de archivo absoluto, el archivo del servidor se crea donde se especifica por ese nombre de archivo.

Para decirle a emacsclient que se conecte al servidor a través de TCP con un archivo de servidor específico, use la opción ‘-f’ o ‘--server-file’, o establezca la variable de entorno EMACS_SERVER_FILE (ver Opciones de emacsclient). Si server-auth-dir se establece a un valor no estándar, o si server-name se establece a un nombre de archivo absoluto, emacsclient necesita un nombre de archivo absoluto para el archivo del servidor, ya que el server-auth-dir por defecto está codificado en emacsclient para ser usado como el directorio para resolver nombres de archivo relativos.

Invocar emacsclient

La forma más sencilla de utilizar el programa emacsclient es ejecutar el comando del shell ‘emacsclient archivo’, donde archivo es un nombre de archivo. Esto se conecta a un servidor Emacs, y le dice a ese proceso-Emacs que visite el archivo en uno de sus marcos existentes -ya sea un marco gráfico, o uno en una terminal de texto (ver Marcos y Pantallas Gráficas). Puedes entonces seleccionar ese marco para empezar a editar.

Si no hay un servidor Emacs, el programa emacsclient se detiene con un mensaje de error (puede evitar que esto ocurra usando la opción ‘--alternate-editor=""’ de emacsclient, ver Opciones de emacsclient). Si el proceso de Emacs no tiene un marco existente -lo que puede ocurrir si se inició como un demonio (ver Uso de Emacs como servidor)- entonces el Editor abre un marco en la terminal en la que llamó a emacsclient.

También puede forzar a emacsclient a abrir un nuevo marco en una pantalla gráfica usando la opción ‘-c’, o en una terminal de texto usando la opción ‘-t‘. Vea las opciones de emacsclient.

Si está ejecutando en una única terminal de texto, puede cambiar entre el shell de emacsclient y el servidor Emacs usando uno de los dos métodos: (i) ejecutar el servidor Emacs y emacsclient en diferentes terminales virtuales, y cambiar a la terminal virtual del servidor Emacs después de llamar a emacsclient; o (ii) llamar a emacsclient desde el propio servidor Emacs, usando el modo Shell (ver Subshell Interactivo) o el modo Term (ver Modo Term); emacsclient bloquea sólo el subshell bajo el Editor, y todavía puede usar Emacs para editar el fichero.

Cuando termine de editar el archivo en el servidor Emacs, escriba Ctrl-x # (C-x #, server-edit) en su buffer. Esto guarda el archivo y envía un mensaje de vuelta al programa emacsclient, diciéndole que salga. Los programas que utilizan EDITOR suelen esperar a que el Editor -en este caso emacsclient- salga antes de hacer otra cosa.

Si quiere abandonar la edición, utilice el comando Alt-x server-edit-abort (M-x server-edit-abort). Esto envía un mensaje al programa emacsclient, diciéndole que salga con un estado de salida anormal, y no guarda ningún búfer.

También puede llamar a emacsclient con múltiples argumentos de nombres de archivos: ‘emacsclient archivo1 archivo2 ...’ le dice al servidor de Emacs que visite archivo1, archivo2, y así sucesivamente. Emacs selecciona el búfer que visita el archivo1, y entierra los otros búferes en la parte inferior de la lista de búferes (ver Uso de múltiples búferes). El programa emacsclient sale una vez que todos los archivos especificados han terminado (es decir, una vez que ha escrito Ctrl-x # (C-x #) en cada buffer del servidor).

Terminar con un buffer del servidor también mata el buffer, a menos que ya existiera en la sesión de Emacs antes de que se pidiera al servidor que lo creara. Sin embargo, si establece server-kill-new-buffers a nil, entonces se utiliza un criterio diferente: terminar con un buffer del servidor lo mata si el nombre del fichero coincide con la expresión regular serverx-temp-file-regexp. Esto se establece para distinguir ciertos archivos temporales.

Cada Ctrl-x # (C-x #) comprueba si hay otras peticiones externas pendientes para editar varios archivos, y selecciona el siguiente archivo de este tipo. Usted puede cambiar a un buffer del servidor manualmente si lo desea; no tiene que llegar a él con Ctrl-x # (C-x #). Pero Ctrl-x # (C-x #) es la forma de decirle a emacsclient que ha terminado.

Si establece el valor de la variable server-window a una ventana (window) o a un cuadro (frame), Ctrl-x # (C-x #) siempre muestra el siguiente buffer del servidor en esa ventana (window) o en ese cuadro (frame).

Cuando emacsclient se conecta, el servidor normalmente mostrará un mensaje que dice cómo salir del marco del cliente. Si server-client-instructions se establece como nil, este mensaje se inhibe.

Opciones de emacsclient

Puede pasar algunos argumentos opcionales al programa emacsclient, como por ejemplo:

emacsclient -c +12 archivo1 +4:3 archivo2

Los argumentos ‘+line’ o ‘+línea:columna’ especifican números de línea, o números de línea y columna, para el siguiente argumento de archivo. Se comportan como los argumentos de la línea de comandos de Emacs. Ver Argumentos de Acción.

Los otros argumentos opcionales reconocidos por emacsclient se enumeran a continuación:

-a comando
--alternate-editor=comando
Especifica un comando de shell para ejecutar si emacsclient falla en contactar con Emacs. Esto es útil cuando se ejecuta emacsclient en un script. El comando puede incluir argumentos, que pueden ser entrecomillados "así". Actualmente, el escape de las comillas no está soportado.
Como excepción especial, si comando es la cadena vacía, entonces emacsclient inicia Emacs en modo demonio (como ‘emacs --daemon’) y luego intenta conectarse de nuevo.
La variable de entorno ALTERNATE_EDITOR tiene el mismo efecto que la opción ‘-a’. Si ambas están presentes, esta última tiene prioridad.
-c
--create-frame
Crea un nuevo marco gráfico de cliente, en lugar de utilizar un marco Emacs existente. Vea más abajo el comportamiento especial de Ctrl-x Ctrl-c (C-x C-c) en un marco de cliente. Si Emacs no puede crear un nuevo marco gráfico (por ejemplo, si no puede conectarse al servidor X), intenta crear un marco de cliente de terminal de texto, como si hubiera suministrado la opción ‘-t’ en su lugar.
En MS-Windows, una sola sesión de Emacs no puede mostrar marcos en terminales gráficos y de texto, ni en múltiples terminales de texto. Por lo tanto, si el servidor Emacs se está ejecutando en un terminal de texto, la opción ‘-c’, al igual que la opción ‘-t’, crea un nuevo marco en el terminal de texto actual del servidor. Ver Cómo iniciar Emacs en MS-Windows.
Si omite un argumento de nombre de archivo mientras suministra la opción ‘-c‘, el nuevo marco muestra por defecto el buffer *scratch*. Puede personalizar este comportamiento con la variable initial-buffer-choice (ver Entering Emacs).
-F alist
--frame-parameters=alist
Establece los parámetros de un marco gráfico recién creado (véase Parámetros de marco).
-d display
--display=display
Indica a Emacs que abra los archivos dados en la pantalla X (suponiendo que haya más de una pantalla X disponible).
-e
--eval
Dígale a Emacs que evalúe algún código Emacs Lisp, en lugar de visitar algunos archivos. Cuando se da esta opción, los argumentos de emacsclient se interpretan como una lista de expresiones a evaluar, no como una lista de ficheros a visitar.
-f servidor-archivo
--server-file=archivo-servidor
Especifica un archivo de servidor (ver servidor TCP Emacs) para conectarse a un servidor Emacs vía TCP. Alternativamente, puedes establecer la variable de entorno EMACS_SERVER_FILE para que apunte al archivo del servidor. (La opción de la línea de comandos anula la variable de entorno).
Un servidor Emacs normalmente utiliza un socket local para escuchar las conexiones, pero también soporta conexiones a través de TCP. Para conectarse a un servidor Emacs TCP, emacsclient necesita leer un archivo de servidor que contenga los detalles de conexión del servidor Emacs. El nombre de este archivo se especifica con esta opción, ya sea como un nombre de archivo relativo a ~/.config/emacs/server o como un nombre de archivo absoluto. Ver Servidor TCP Emacs.
-n
--no-wait
Deja que emacsclient salga inmediatamente, en lugar de esperar hasta que todos los buffers del servidor hayan terminado. Puede tomarse todo el tiempo que quiera para editar los buffers del servidor dentro de Emacs, y no se matan cuando escribe Ctrl-x # (C-x #) en ellos.
--parent-id=id
Abre un marco emacsclient como un marco cliente en la ventana X padre con un número de identificador id, a través del protocolo XEmbed. Actualmente, esta opción es principalmente útil para los desarrolladores.
-q
--quiet
No permite que emacsclient muestre mensajes sobre la espera de Emacs o la conexión a sockets de servidores remotos.
-u
--suppress-output
No permite que emacsclient muestre los resultados devueltos por el servidor. Principalmente útil en combinación con ‘-e’ cuando la evaluación realizada es por efecto secundario en lugar de por resultado.
-s servidor-nombre
--socket-name=nombre-servidor
Conecta con el servidor Emacs llamado nombre-servidor. (Esta opción no está soportada en MS-Windows.) El nombre del servidor viene dado por la variable server-name en el servidor. Si se omite esta opción, emacsclient se conecta al socket por defecto. Si establece el nombre del servidor Emacs como un nombre de archivo absoluto, dele el mismo nombre de archivo absoluto que el nombre del servidor a esta opción para indicar a emacsclient que se conecte a ese servidor. Necesita usar esta opción si inició al Editor como demonio (ver Opciones iniciales) y especificó el nombre para el servidor iniciado por el demonio.
Alternativamente, puede establecer la variable de entorno EMACS_SOCKET_NAME para que apunte al socket del servidor. (La opción de la línea de comandos anula la variable de entorno).
-t
--tty
-nw
Crea un nuevo marco de cliente en la terminal de texto actual, en lugar de utilizar un marco Emacs existente. Esto se comporta como la opción ‘-c’, descrita anteriormente, excepto que crea un marco de terminal de texto (ver Terminales no-Window).
En MS-Windows, ‘-t’ se comporta igual que ‘-c’ si el servidor Emacs está usando la pantalla gráfica, pero si dicho servidor está corriendo en una terminal de texto, crea un nuevo marco en la terminal de texto actual.
‘-T tramp-prefix’
--tramp-prefix=tramp-prefix'
Establece el prefijo a añadir a los nombres de archivo para que Emacs localice archivos en máquinas remotas (ver Archivos remotos) usando TRAMP (ver El manual de Tramp). Esto es mayormente útil en combinación con el uso del servidor Emacs sobre TCP (ver TCP Emacs server). Reenviando por ssh el puerto de escucha y haciendo que el archivo-servidor esté disponible en una máquina remota, los programas en la máquina remota pueden usar emacsclient como valor para las variables de entorno EDITOR y similares, pero en lugar de hablar con un servidor Emacs en la máquina remota, los archivos serán visitados en la sesión local de Emacs usando TRAMP.
Establece la variable de entorno EMACSCLIENT_TRAMP tiene el mismo efecto que usar la opción ‘-T’. Si se especifican ambas, la opción de la línea de comandos tiene prioridad.
Por ejemplo, supongamos dos hosts, ‘local’ y ‘remoto’, y que el Emacs local escucha en el puerto tcp 12345. Supongamos además que /home está en un sistema de archivos compartido, de modo que el archivo del servidor ~/.config/emacs/server/server es legible en ambos hosts.
local$ ssh -R12345:localhost:12345 remote
remote$ export EDITOR="emacsclient \
        --server-file=server \
        --tramp=/ssh:remote:"
remote$ $EDITOR /tmp/foo.txt #Debería abrirse en Emacs local.
	

Los nuevos marcos gráficos o de texto de la terminal creados por las opciones ‘-c’ o ‘-t’ se consideran marcos de cliente. Cualquier marco nuevo que se cree a partir de un marco de cliente también se considera un marco de cliente. Si escribe Ctrl-x Ctrl-c (C-x C-c, save-buffers-kill-terminal) en un marco de cliente, ese comando no mata la sesión de Emacs como lo hace normalmente (ver Salir de Emacs). En su lugar, el Editor borra el marco del cliente; además, si el marco del cliente tiene un emacsclient esperando para recuperar el control (es decir, si no ha suministrado la opción ‘-n’), Emacs borra todos los demás marcos del mismo cliente, y marca los buffers del servidor del cliente como terminados, como si hubiera tecleado Ctrl-x # (C-x #) en todos ellos. Si resulta que no hay tramas restantes después de borrar la(s) trama(s) del cliente, la sesión de Emacs se cierra.

Como excepción, cuando Emacs se inicia como demonio, todas las tramas se consideran tramas cliente, y Ctrl-x Ctrl-c (C-x C-c) nunca mata al Editor. Para matar una sesión de demonio, escriba Alt-x kill-emacs (M-x kill-emacs).

Tenga en cuenta que las opciones ‘-t’ y ‘-n’ son contradictorias: ‘-t’ dice que se tome el control del terminal de texto actual para crear una nueva trama de cliente, mientras que ‘-n’ dice que no se tome el control del terminal de texto. ‘-t’.



Impresión de copias en papel

Emacs proporciona comandos para imprimir copias en pael de todo un búfer o de parte de él. Puede invocar los comandos de impresión directamente, como se detalla a continuación, o utilizando el menú ’File’ (‘Archivo') de la barra de menús.

Además de los comandos descritos en esta sección, también puede llevar a cabo imprimesiones formato papel desde Dired (ver Operar con archivos) y la agenda (ver Visualizar la agenda). También puede "imprimir" un buffer de Emacs a HTML con el comando Alt-x htmlfontify-buffer (M-x htmlfontify-buffer), que convierte el buffer actual en un archivo HTML, reemplazando las caras de Emacs con marcas basadas en CSS. Además, el modo Org le permite imprimir ficheros Org a una variedad de formatos, como PDF (ver Org Mode).

Alt-x print-buffer (M-x print-buffer)
Imprime una copia formato papel del buffer actual con encabezados de página que contienen el nombre del archivo y el número de página.
Alt-x lpr-buffer (M-x lpr-buffer)
Imprime una copia formato papel del búfer actual sin encabezados de página.
Alt-x print-region (M-x print-regio)
Como print-buffer pero imprimiendo sólo la región actual.
Alt-x lpr-region (M-x lpr-region)
Como lpr-buffer pero imprime sólo la región actual.

En la mayoría de los sistemas operativos, los comandos de impresión anteriores envían los archivos para su impresión llamando al programa lpr. Para cambiar el programa de impresión, personalice la variable lpr-command. Para especificar interruptores adicionales para dar al programa de impresión, personalice la variable de lista lpr-switches. Su valor debe ser una lista de cadenas de opciones, cada una de las cuales debe comenzar con ‘-’ (por ejemplo, la cadena de opciones "-w80" especifica un ancho de línea de 80 columnas). El valor por defecto es la lista vacía, nil.

Para especificar la impresora a utilizar, establezca la variable printer-name. El valor por defecto, nil, especifica la impresora por defecto. Si la establece con un nombre de impresora (una cadena), ese nombre se pasa a lpr con la opción ‘lpr-P’; si no está usando lpr, debe especificar la opción con lpr-printer-switch.

La variable lpr-headers-switches especifica de manera similar los interruptores adicionales a utilizar para hacer los encabezados de las páginas. La variable lpr-add-switches controla si se suministran las opciones ‘-T’ y ‘-J’ (adecuadas para lpr) al programa de impresión: nil significa que no se añaden (este debería ser el valor si su programa de impresión no es compatible con lpr).

Copia impresa de PostScript

Estos comandos convierten el contenido del buffer a PostScript, imprimiéndolo o dejándolo en otro buffer de Emacs.

Alt-x ps-print-buffer (Alt-x ps-print-buffer)
Imprime una copia formato papel del buffer actual en forma PostScript.
Alt-x ps-print-region (M-x ps-print-region)
Imprime una copia formato papel de la región actual en forma PostScript.
Alt-x ps-print-buffer-with-faces (M-x ps-print-buffer-with-faces)
Imprime una copia formato papel del buffer actual en forma PostScript, mostrando las caras utilizadas en el texto por medio de características PostScript.
Alt-x ps-print-region-whith-faces (M-x ps-print-region-whith-faces)
Imprime una copia formato papel de la región actual en formato PostScript, mostrando las caras utilizadas en el texto.
Alt-x ps-spool-buffer (M-x ps-spool-buffer)
Genera y pone en cola de impresión una imagen PostScript para el texto del buffer actual.
Alt-x ps-spool-región (M-x ps-spool-región)
Genera y envía a la cola de impresión una imagen PostScript para la región actual.
Alt-x ps-spool-buffer-whith-faces (M-x ps-spool-buffer-whith-faces)
Genera y envía a la cola de impresión una imagen PostScript para el buffer actual, mostrando las caras utilizadas.
Alt-x ps-spool-whith-faces (M-x ps-spool-whith-faces)
Genera y envía la cola de impresión una imagen PostScript para la región actual, mostrando las caras utilizadas.
Alt-x ps-despool (M-x ps-despool)
Envía el PostScript en cola a la impresora.
Alt-x handwrite (M-x handwrite)
Genera/imprime PostScript para el búfer actual como si estuviera escrito a mano.

Los comandos ps-print-buffer y ps-print-region imprimen el contenido del buffer en forma PostScript. Uno de los comandos imprime todo el búfer; el otro, sólo la región. Los comandos ps-print-buffer-with-faces y ps-print-region-with-faces se comportan de forma similar, pero utilizan características PostScript para mostrar las caras (fuentes y colores) del texto del buffer.

Interactivamente, cuando se utiliza un argumento de prefijo (Ctrl-u (C-u)), estos comandos solicitan al Usuario un nombre de archivo, y guardan la imagen PostScript en ese archivo en lugar de enviarla a la impresora.

Los comandos cuyos nombres tienen ‘spool’ en lugar de ‘print’, generan la salida PostScript en un buffer de Emacs en lugar de enviarla a la impresora.

Use el comando ps-despool para enviar las imágenes en spool a la impresora. Este comando envía el PostScript generado por los comandos '-spool-' (ver comandos anteriores) a la impresora. Con un argumento de prefijo Ctrl-u (C-u), pide un nombre de archivo, y guarda la imagen PostScript en cola en ese archivo en lugar de enviarla a la impresora.

Alt-x handwrite (M-x handwrite) es más frívolo. Genera una interpretación PostScript del búfer actual como un documento manuscrito en cursiva. Se puede personalizar en el grupo de handwrite. Esta función sólo admite los caracteres ISO 8859-1.

Variables para Copias Impresas en formato papel (Hardcopy) de PostScript

Todos los comandos de copia formato papel de PostScript utilizan las variables ps-lpr-command y ps-lpr-switches para especificar cómo imprimir la salida. ps-lpr-command especifica el nombre del comando a ejecutar, ps-lpr-switches especifica las opciones de línea de comandos a utilizar, y ps-printer-name especifica la impresora. Si no establece las dos primeras variables Usted mismo, éstas toman sus valores iniciales de lpr-command y lpr-switches. Si ps-printer-name es nulo, se utiliza printer-name.

La variable ps-print-header controla si estos comandos añaden líneas de encabezado a cada página, configúrela como nil para desactivar los encabezados.

Si su impresora no admite colores, debe desactivar el procesamiento de colores estableciendo ps-print-color-p a nil. Por defecto, si la pantalla soporta colores, Emacs produce una salida impresa con información en color; en impresoras en blanco y negro, los colores se emulan con tonos de gris. Esto puede producir una salida apenas legible o incluso ilegible, incluso si los colores de su pantalla sólo utilizan tonos de gris.

Como alternativa, puede establecer ps-print-color-p en blanco y negro para que los colores se muestren mejor en las impresoras en blanco y negro. Esto funciona utilizando la información de ps-black-white-faces para expresar los colores mediante una lista personalizable de tonos de gris, aumentada por los atributos de negrita y cursiva.

Por defecto, la impresión PostScript ignora los colores de fondo de las caras, a menos que la variable ps-use-face-background sea no nula. Esto es para evitar interferencias no deseadas con las franjas de cebra y la imagen/texto de fondo.

La variable ps-paper-type especifica para qué tamaño de papel se va a formatear; los valores legítimos incluyen:

a4 a3 b5 a4small b4 executive
legal letter letter-small statement tabloid ledger

El valor por defecto es letter (tamaño carta). Puede definir otros tamaños de papel cambiando la variable ps-page-dimensions-database.

La variable ps-landscape-mode especifica la orientación de la impresión en la página. El valor por defecto es nil, que significa modo vertical (portrait mode). Cualquier valor no nulo especifica el modo horizontal (landscape mode).

La variable ps-number-of-columns especifica el número de columnas; tiene efecto tanto en modo horizontal como vertical. El valor por defecto es 1.

La variable ps-font-family especifica la familia de fuentes a utilizar para la impresión de texto ordinario. Los valores legítimos incluyen Courier, Helvetica, NewCenturySchlbk, Palatino y Times. La variable ps-font-size especifica el tamaño de la fuente para el texto ordinario y por defecto es de 8,5 puntos. El valor de ps-font-size también puede ser una constante de punto flotante igual a 2: uno para el modo apaisado (landscape mode), el otro para el modo vertical (portrait mode).

Emacs soporta más scripts y caracteres que una típica impresora PostScript. Por lo tanto, algunos de los caracteres de su búfer podrían no ser imprimibles usando las fuentes incorporadas en su impresora. Puede aumentar las fuentes suministradas con la impresora con las del paquete GNU Intlfonts, o puede instruir a Emacs para que utilice exclusivamente Intlfonts. La variable ps-multibyte-buffer controla esto: el valor por defecto, nil, es apropiado para imprimir caracteres ASCII y Latin-1; un valor de non-latin-printer es para impresoras que tienen las fuentes para caracteres ASCII, Latin-1, japonés y coreano incorporadas. Un valor de bdf-font hace que se utilicen las fuentes BDF del paquete Intlfonts para todos los caracteres. Por último, un valor de bdf-font-except-latin ordena que la impresora utilice las fuentes incorporadas para los caracteres ASCII y Latin-1, y las fuentes BDF de Intlfonts para el resto.

Para poder utilizar las fuentes BDF, Emacs necesita saber dónde encontrarlas. La variable bdf-directory-list contiene la lista de directorios donde el Editor debe buscar las fuentes; el valor por defecto incluye un único directorio /usr/local/share/emacs/fonts/bdf.

Muchas otras variables de personalización para estos comandos se definen y describen en los archivos Lisp: ps-print.el y ps-mule.el.

Paquete Printing

Las facilidades básicas de Emacs para imprimir en papel pueden ampliarse con el paquete Printing. Éste proporciona una interfaz fácil de usar para elegir qué imprimir, previsualizar los archivos PostScript antes de imprimirlos y establecer varias opciones de impresión, como cabeceras de impresión, modos horizontal o vertical, modos dúplex, etc. En los sistemas GNU/Linux o Unix, el paquete Printing se basa en las utilidades gs y gv, que se distribuyen como parte del programa GhostScript. En MS-Windows, se puede utilizar el puerto gstools de Ghostscript.

Para utilizar el paquete Printing, añada (require 'printing) a su archivo init (véase El archivo de inicialización de Emacs), seguido de (pr-update-menus). Esta función sustituye los comandos de impresión habituales de la barra de menús por un submenú ‘Printing’ que contiene varias opciones de impresión. También puede escribir Alt-x pr-interface RETURN (M-x pr-interface RET); esto crea un búfer de *Printing Interface* (*Interfaz de impresión*), similar a un búfer de personalización, donde puede establecer las opciones de impresión. Después de seleccionar qué y cómo se va a imprimir, se inicia el trabajo de impresión utilizando el botón ‘Print’ (‘Imprimir’) (haga clic con (ratón-2) en él, o mueva el punto sobre él y escriba RETURN (RET)). Para obtener más información sobre las distintas opciones, utilice el botón ‘Print Help’ (‘Ayuda de la interfaz’).



Ordenar el texto

Emacs proporciona varios comandos para ordenar el texto en el buffer. Todos operan sobre el contenido de la región. Dividen el texto de la región en muchos registros de ordenación, identifican una clave de ordenación para cada registro y luego reordenan los registros en el orden determinado por las claves de ordenación. Los registros se ordenan de forma que sus claves estén en orden alfabético o, para la ordenación numérica, en orden numérico. En la ordenación alfabética, todas las letras mayúsculas de la ‘A’ a la ‘Z’ van antes de las minúsculas de la ‘a’, de acuerdo con la secuencia de caracteres ASCII (pero la ordenación por mayúsculas, descrita más adelante, puede cambiar esto).

Los distintos comandos de ordenamiento difieren en cómo dividen el texto en registros de ordenación y en qué parte de cada registro se utiliza como clave de ordenamiento. La mayoría de los comandos hacen de cada línea un registro de ordenación separado, pero algunos comandos utilizan párrafos o páginas como registros de ordenamiento. La mayoría de estos comandos utilizan cada registro de ordenamiento completo como su propia clave de ordenamiento, pero algunos utilizan sólo una parte del registro como clave de ordenamiento.

Alt-x (M-x sort-lines)
Divide la región en líneas, y ordena comparando el texto completo de una línea. Un argumento numérico significa ordenar en orden descendente.
Alt-x sort-paragraph (M-x sort-paragraph)
Divide la región en párrafos y la ordena comparando todo el texto de un párrafo (excepto las líneas en blanco). Un argumento numérico significa que la ordenación es descendente.
Alt-x sort-fields (M-x sort-fields)
Divide la región en líneas y la ordena comparando el contenido de un campo en cada línea. Los campos se definen como separados por espacios en blanco, por lo que la primera serie de caracteres consecutivos sin espacios en blanco en una línea constituye el campo 1, la segunda serie constituye el campo 2, etc.
Especifique el campo por el que se va a ordenar con un argumento numérico: 1 para ordenar por el campo 1, etc.; el valor por defecto es 1. Un argumento negativo significa contar los campos desde la derecha en lugar de desde la izquierda; así, menos 1 significa ordenar por el último campo. Si varias líneas tienen contenidos idénticos en el campo que se ordena, mantienen el mismo orden relativo que tenían en el buffer original.
Alt-x sort-numeric-fields (M-x sort-numeric-fields)
Al igual que Alt-x sort-fields (M-x sort-fields), excepto que el campo especificado se convierte en un número entero para cada línea, y los números se comparan. El ’10’ va antes del ‘2’ cuando se considera como texto, pero después cuando se considera como número. Por defecto, los números se interpretan según sort-numeric-base, pero los números que empiezan por ‘0x’ o ‘0’ se interpretan como hexadecimales y octales, respectivamente.
Alt-x sort-columns (M-x sort-columns)
Como Alt-x sort-fields (M-x sort-fields), salvo que el texto de cada línea utilizado para la comparación procede de un rango fijo de columnas. Con un argumento de prefijo, ordena en orden inverso. Para más detalles sobre este comando, véase más abajo.
Alt-x reverse-region (M-x reverse-region)
Invierte el orden de las líneas de la región. Esto es útil para clasificar en orden descendente por campos, ya que esos comandos de ordenación no tienen una función para hacerlo.

Por ejemplo, si el buffer contiene esto:

En los sistemas en los que se ha implementado la detección de colisiones (bloqueo de los archivos que se editan)
implementado, Emacs también comprueba la primera vez que se modifica un buffer
si el archivo ha cambiado en el disco desde la última vez que se visitó o
guardado.  Si lo ha hecho, se le pide que confirme que quiere cambiar
el buffer.

aplicando Alt-x sort-lines (M-x sort-lines) a todo el buffer produce esto:

En los sistemas en los que la detección de colisiones (bloqueo de los archivos que se están editando) es
implementado, Emacs también comprueba la primera vez que modificas un buffer
guardado.  Si lo ha hecho, se le pedirá que confirme que desea cambiar
el buffer.
si el archivo ha cambiado en el disco desde la última vez que se visitó o

donde las claves de ordenación eran ‘Emacs’, ‘Si’, ‘buffer’, ‘systema’ y ‘el’.

Alt-x sort-columns (M-x sort-columns) requiere más explicación. Se especifican las columnas poniendo punto en una de las columnas y la marca en la otra columna. Como esto significa que no puedes poner el punto o la marca al principio de la primera línea del texto que quieres ordenar, este comando utiliza una definición inusual de "región": toda la línea en la que está el punto se considera parte de la región, y también toda la línea en la que está la marca, así como todas las líneas intermedias.

Por ejemplo, para ordenar una tabla por la información que se encuentra en las columnas 10 a 15, podría poner la marca en la columna 10 en la primera línea de la tabla, y el punto en la columna 15 en la última línea de la tabla, y luego ejecutar sort-columns. De manera equivalente, podría ejecutarlo con la marca en la columna 15 en la primera línea y el punto en la columna 10 en la última línea.

Esto se puede considerar como ordenar el rectángulo especificado por el punto y la marca, excepto que el texto de cada línea a la izquierda o a la derecha del rectángulo se mueve junto con el texto dentro del rectángulo. Véase Rectángulos.

Muchos de los comandos de ordenación ignoran las diferencias entre mayúsculas y minúsculas al comparar, si sort-fold-case no es nulo.



Edición de imágenes

Para editar una imagen hecha con caracteres de texto (por ejemplo, una imagen de la división de un registro en campos, como un comentario en un programa), utilice el comando Alt-x picture-mode (M-x picture-mode) para entrar en el modo Imagen.

En el modo Imagen, la edición se basa en el modelo de cuarto de plano del texto, según el cual los caracteres del texto se sitúan en un área que se extiende infinitamente hacia la derecha y hacia abajo. El concepto de final de línea no existe en este modelo; lo máximo que se puede decir es dónde se encuentra el último carácter no en blanco de la línea.

Por supuesto, Emacs siempre considera el texto como una secuencia de caracteres, y las líneas realmente tienen finales. Pero el modo Imagen sustituye los comandos más utilizados por variantes que simulan el modelo de cuarto de plano del texto. Lo hacen insertando espacios o convirtiendo los tabuladores en espacios.

La mayoría de los comandos básicos de edición de Emacs son redefinidos por el modo Imagen para hacer esencialmente lo mismo pero en forma de cuarto de plano. Además, el modo Imagen define varias teclas que comienzan con el prefijo Ctrl-c (C-c) para ejecutar comandos especiales de edición de imágenes.

Una de estas teclas, Ctrl-c Ctrl-c (C-c C-c), es particularmente importante. A menudo, una imagen forma parte de un archivo más grande que suele editarse en algún otro modo principal. El modo de imagen registra el nombre del modo principal anterior para que pueda utilizar el comando (C-c C-c, picture-mode-exit) más tarde para volver a ese modo. Ctrl-c Ctrl-c (C-c C-c) también borra los espacios del final de las líneas, a menos que se le dé un argumento numérico.

Los comandos especiales del modo Imagen funcionan todos en otros modos (siempre que la biblioteca de imágenes esté cargada), pero no están vinculados a teclas excepto en el modo Imagen. Las descripciones que siguen hablan de mover "una columna" y demás, pero todos los comandos del modo Imagen manejan argumentos numéricos como sus equivalentes normales.

Al activar el modo de imagen se ejecuta el gancho picture-mode-hook. Se pueden encontrar extensiones adicionales al modo Picture en artist.el.

Edición básica en el modo de imagen

La mayoría de las teclas hacen lo mismo en el modo Imagen que normalmente, pero lo hacen en un estilo de cuarto de plano. Por ejemplo, Ctrl-f (C-f) está rebote para ejecutar picture-forward-column, un comando que mueve el punto una columna a la derecha, insertando un espacio si es necesario para que el final real de la línea no haga ninguna diferencia. Ctrl-b (C-b) está de rebote para ejecutar picture-backward-column, que siempre mueve el punto una columna a la izquierda, convirtiendo un tabulador en múltiples espacios si es necesario. Ctrl-n (C-n, picture-move-down) y Ctrl-p (C-p, picture-move-up) son de rebote para ejecutar para que pueden insertar espacios o convertir tabulaciones según sea necesario para asegurarse de que el punto se mantiene exactamente en la misma columna. Ctrl-e (C-e) ejecuta picture-end-of-line, que se desplaza hasta después del último carácter no en blanco de la línea. Ctrl-a (C-a) ejecuta la imagen de inicio de línea. (La elección del modelo de pantalla no afecta a los inicios de línea; lo único que hace este comando es actualizar la columna de imagen actual a 0).

La inserción de texto se adapta al modelo de pantalla de cuarto de plano mediante el uso del modo de sobrescritura (ver Modos menores.) Los caracteres autoinsertados reemplazan el texto existente, columna por columna, en lugar de empujar el texto existente a la derecha. RETURN (RET) ejecuta picture-newline, que simplemente se mueve al principio de la línea siguiente para que el nuevo texto reemplace esa línea.

En el modo Picture, los comandos que normalmente borran o matan el texto, en su lugar borran el texto (reemplazándolo con espacios). DEL (DEL, picture-backward-clear-column) reemplaza el carácter precedente con un espacio en lugar de eliminarlo; esto mueve el punto hacia atrás. (C-d, picture-clear-column) reemplaza el siguiente carácter o caracteres con espacios, pero no mueve el punto. (Si desea borrar caracteres a espacios y avanzar sobre ellos, utilice SPACE (SPC)). Ctrl-k (C-k, picture-clear-line) realmente elimina el contenido de las líneas, pero no borra las nuevas líneas del buffer.

Para hacer una inserción real, debe usar comandos especiales. Ctrl-o (C-o, picture-open-line) crea una línea en blanco después de la línea actual; nunca divide una línea. Ctrl-Alt-o (C-M-o, split-line) tiene sentido en el modo Picture, por lo que no se modifica. Ctrl-j (C-j, picture-duplicate-line) inserta otra línea con el mismo contenido debajo de la línea actual.

Para hacer un borrado real en el modo Imagen, use Ctrl-w (C-w), Ctrl-c Ctrl-d (C-c C-d) (que se define como delete-char, como Ctrl- (C-d) en otros modos), o uno de los comandos de rectángulo de imagen (vea Comandos de rectángulo en modo Imagen).

Control del movimiento después de la inserción

Dado que los caracteres de autoinserción en el modo Imagen sobrescriben y mueven el punto, no hay ninguna restricción esencial sobre cómo debe moverse el punto. Normalmente el punto se mueve hacia la derecha, pero puede especificar cualquiera de las ocho direcciones ortogonales o diagonales para el movimiento después de un carácter autoinsertado. Esto es útil para dibujar líneas en el buffer.

Ctrl-c < (C-c <)
Ctrl-c (C-c LEFT)
Se mueve a la izquierda después de la inserción (picture-movement-left).
Ctrl-c > (C-c >)
Ctrl-c (C-c RIGHT)
Se mueve a la derecha después de la inserción (imagen-movimiento-derecha).
Ctrl-c ^ (C-c ^)
Ctrl-c (C-c UP)
Se mueve hacia arriba después de la inserción (picture-image-up).
Ctrl-c . (C-c .)
Ctrl-c (C-c DOWN)
Se mueve hacia abajo después de la inserción (picture-movement-down).
Ctrl-c ` (C-c `)
Ctrl-c Inicio (C-c Inicio)
Se mueve hacia arriba y hacia la izquierda ("noroeste") después de la inserción (picture-movement-nw).
Ctrl-c ' (C-c ')
Ctrl-c RePag (C-c PageUp)
Ctrl-c prior (C-c prior)
Se mueve hacia arriba y derecha ("noreste") despues de insertar (picture-movement-ne).
Ctrl-c / (C-c /)
Ctrl-c Fin (C-c Fin)
Se mueve hacia abajo y hacia la izquierda ("suroeste") después de la inserción (picture-movement-sw).
Ctrl-c \ (C-c \)
Ctrl-c AvPag (C-c PageDown)
Ctrl-c next (C-c next)
Se mueve hacia abajo y a la derecha ("sureste") despues de la insercion (picture-movement-se).

Dos comandos de movimiento se mueven en función de la dirección de inserción de la imagen actual. El comando Ctrl-c Ctrl-f (C-c C-f, picture-motion) se mueve en la misma dirección que el movimiento después de la inserción actual, mientras que Ctrl-c Ctrl-b (C-c C-b, picture-motion-reverse) se mueve en la dirección opuesta.

Pestañas del modo imagen

En el modo de imagen se ofrecen dos tipos de acciones similares a las pestañas. Use Alt-TAB (M-TAB, picture-tab-search) para el tabulado basado en el contexto. Sin argumento, se mueve a un punto debajo del siguiente carácter "interesante" que sigue al espacio en blanco en la línea anterior no en blanco. "Siguiente" significa aquí "aparecer en una posición horizontal mayor que la del punto de partida". Con el argumento del prefijo, como en Ctrl-u Alt-TAB (C-u M-TAB), este comando se mueve al siguiente carácter interesante en la línea actual. Alt-TAB (M-TAB) no cambia el texto; sólo mueve el punto. Los caracteres "interesantes" son definidos por la variable picture-tab-chars, que debe definir un conjunto de caracteres. La sintaxis de esta variable es como la utilizada dentro de ‘[...]’ en una expresión regular, pero sin el ‘[' y el ‘]’. Su valor por defecto es "!-~".

El propio TAB (TAB) ejecuta picture-tab, que opera basándose en la configuración actual de la parada del tabulador; es el equivalente del tab-to-tab-stop del modo Picture. Normalmente sólo mueve el punto, pero con un argumento numérico borra el texto sobre el que se mueve.

Las formas de tabulación basadas en el contexto y en las paradas de tabulación se unen con el comando Ctrl-c TAB (C-c TAB, picture-set-tab-stops). Este comando establece las paradas de tabulación en las posiciones que Atl-TAB (M-TAB) consideraría significativas en la línea actual. El uso de este comando, junto con TAB (TAB), puede conseguir el efecto del tabulado basado en el contexto. Pero Alt-TAB (M-TAB) es más conveniente en los casos en que es suficiente.

Puede ser conveniente evitar el uso de caracteres de tabulación reales en las imágenes. Por ejemplo, esto evita que Ctrl-x TAB (C-x TAB) estropee la imagen. Puede hacer esto estableciendo la variable indent-tabs-mode a nil.

Comandos de rectángulo en modo imagen

El modo imagen define los comandos para trabajar en piezas rectangulares del texto de forma que se ajusten al modelo de cuarto plano. Los comandos estándar de rectángulo también pueden ser útiles. Ver Rectángulos.

Ctrl-c Ctrl-k (C-c C-k)
Borra la region-rectangle con espacios (picture-clear-rectangle). Con un argumento de prefijo, borra el texto.
Ctrl-c Ctrl-w r (C-c C-w r)
Similar a C-c C-k anterior, pero primero guarda el contenido del rectángulo en el registro r (picture-clear-rectangle-to-register). Ver Registros.
Ctrl-c Ctrl-y (C-c C-y)
Copia el último rectángulo matado en el buffer sobrescribiendolo, con la esquina superior izquierda en el punto (picture-yank-rectangle). Con argumento, inserta en su lugar.
Ctrl-c Ctrl-x r (C-c C-x r)
Similar a C-c C-y, pero usa el rectángulo en el registro r (picture-yank-rectangle-from-register).

Los comandos de rectángulo de imagen Ctrl-c Ctrl-k (C-c C-k, picture-clear-rectangle) y Ctrl-c Ctrl-w (C-c C-w, picture-clear-rectangle-to-register) difieren de los comandos de rectángulo estándar en que normalmente borran el rectángulo en lugar de eliminarlo; esto es análogo a la forma en que se cambia Ctrl-d (C-d) en el modo Imagen.

Sin embargo, el borrado de rectángulos puede ser útil en el modo Imagen, por lo que estos comandos borran el rectángulo si se les da un argumento numérico. Ctrl-c Ctrl-k (C-c C-k) con o sin un argumento numérico guarda el rectángulo para Ctrl-c Ctrl-y (C-c C-y).

Los comandos del modo Imagen para arrancar rectángulos difieren de los estándar en que sobrescriben en lugar de insertar. Esto es lo mismo que la inserción de otro texto en el modo Picture difiere de otros modos. Ctrl-c Ctrl-y (C-c C-y, picture-yank-rectangle) inserta (sobrescribiendo) el rectángulo que fue eliminado más recientemente, mientras que Ctrl-c Ctrl-x (C-c C-x, picture-yank-rectangle-from-register) hace lo mismo con el rectángulo encontrado en un registro especificado.



Edición de archivos binarios

Existe un modo principal especial para editar archivos binarios: El modo Hexl. Para utilizarlo, utilice Alt-x hexl-find-file (M-x hexl-find-file) en lugar de Ctrl-x Ctrl-f (C-x C-f) para visitar el archivo. Este comando convierte el contenido del archivo a hexadecimal y le permite editar la traducción. Al guardar el archivo, se convierte automáticamente en binario.

También puede usar el modo Alt-x hexl (M-x hexl) para traducir un buffer existente a hex. Esto es útil si visitas un archivo normalmente y luego descubres que es un archivo binario.

La inserción de texto siempre se sobrescribe en el modo Hexl. Esto es para reducir el riesgo de estropear accidentalmente la alineación de los datos en el archivo. Los caracteres de texto ordinarios se insertan solos (es decir, se sobrescriben con ellos mismos). Existen comandos para la inserción de caracteres especiales por su código. La mayoría de las teclas de movimiento del cursor, así como Ctrl-x Ctrl-s (C-x C-s), están vinculadas en el modo Hexl a comandos que producen el mismo efecto. Aquí hay una lista de otros comandos importantes especiales para el modo Hexl:

Ctrl-Alt-d (C-M-d)
Inserta un byte con un código escrito en decimal.
Ctrl-Alt-o (C-M-o)
Inserta un byte con un código escrito en octal.
Ctrl-Alt-x (C-M-x)
Inserta un byte con un código escrito en hexadecimal.
Ctrl-Alt-a (C-M-a)
Se mueve al principio de una página de 512 bytes.
Ctrl-Alt-e (C-M-e)
Se mueve al final de una página de 512 bytes.
Ctrl-x [ (C-x [ )
Va al principio de una página de 1k bytes.
Ctrl-x ] (C-x ] )
Va al final de una página de 1k bytes.
Alt-g (M-g)
Se mueve a una dirección especificada en hexadecimal.
Alt-j (M-j)
Se mueve a una dirección especificada en decimal.
Ctrl-c Ctrl-c (C-c C-c)
Abandona el modo Hexl, volviendo al modo principal que tenía este buffer antes de invocar el modo Hexl.

Otros comandos Hexl le permiten insertar cadenas (secuencias) de bytes binarios, moverse por shorts o ints, etc.; escriba Ctrl-h a hexl- TAB (C-h a hexl- TAB) para más detalles.

El modo Hexl también puede utilizarse para editar archivos de texto. Esto puede ser útil si el archivo de texto incluye caracteres inusuales o utiliza una codificación inusual (ver Sistemas de Codificación). Para ello, los comandos Hexl que insertan bytes también pueden insertar caracteres ASCII y no ASCII, incluidos los caracteres multibyte. Para editar un archivo de texto con Hexl, visite el archivo como de costumbre y, a continuación, escriba Alt-x hexl-mode RETURN (M-x hexl-mode RET) para cambiar al modo Hexl. Ahora puede insertar caracteres de texto escribiéndolos. Sin embargo, la inserción de caracteres multibyte requiere un cuidado especial, para evitar el peligro de crear secuencias multibyte inválidas: debe comenzar a escribir dichos caracteres cuando el punto esté en el primer byte de una secuencia multibyte en el archivo.



Guardar sesiones de Emacs

Utiliza la biblioteca del escritorio para guardar el estado de Emacs de una sesión a otra. Una vez que guarda el escritorio del Editor -los búferes, sus nombres de archivo, los modos principales, las posiciones de los búferes, etc.-, las siguientes sesiones de Emacs vuelven a cargar el escritorio guardado. Por defecto, el escritorio también intenta guardar la configuración de marcos y ventanas. Para desactivar esto, establezca desktop-restore-frames a nil. (Vea la documentación de esa variable para algunas opciones relacionadas que puede personalizar para afinar este comportamiento).

La información sobre los buffers que visitan los archivos remotos no se guarda por defecto. Personalice la variable desktop-files-not-to-save para cambiar esto.

Cuando el escritorio restaura la configuración del marco y de la ventana, utiliza los valores grabados de los parámetros del marco, ignorando cualquier configuración de esos parámetros que tenga en su archivo de inicialización (ver El archivo de inicialización de Emacs). Esto significa que los parámetros de los marcos, como las fuentes y las caras para los marcos restaurados, vendrán del archivo del escritorio, donde fueron guardados cuando salió de su sesión anterior de Emacs; cualquier configuración de esos parámetros en su archivo de inicialización será ignorada. Para desactivar esto, personalice el valor de frameset-filter-alist para filtrar los parámetros de los marcos que no quiere que se restauren.

Puede guardar el escritorio manualmente con el comando Alt-x desktop-save (M-x desktop-save). También puede habilitar el guardado automático del escritorio cuando salga de Emacs, y la restauración automática del último escritorio guardado cuando el Editor se inicie: use el buffer de personalización (ver Interfaz de personalización fácil) para establecer desktop-save-mode a t para futuras sesiones, o añada esta línea en su archivo init (ver El archivo de inicialización de Emacs):

(desktop-save-mode 1)

Si activa el modo de guardar el escritorio en su archivo init, entonces cuando Emacs se inicia, busca un escritorio guardado en el directorio actual. (Más precisamente, busca en los directorios especificados por desktop-path, y utiliza el primer escritorio que encuentra). Así, puede tener distintos escritorios guardados en diferentes directorios, y el directorio de inicio determina cuál recarga Emacs. Puede guardar el escritorio actual y recargar uno guardado en otro directorio escribiendo Alt-x desktop-change-dir (M-x desktop-change-dir). Escribiendo Alt-x desktop-revert (M-x desktop-revert) se vuelve al escritorio previamente recargado.

Especifique la opción ‘--no-desktop’ en la línea de comandos cuando no desee recargar ningún escritorio guardado. Esto desactiva el modo de guardar el escritorio para la sesión actual. Iniciar Emacs con la opción ‘--no-init-file’ también desactiva la recarga de escritorios, ya que evita el archivo de inicio, donde el modo de guardar escritorios suele estar activado.

Por defecto, todos los buffers del escritorio se restauran de una sola vez. Sin embargo, esto puede ser lento si hay muchos buffers en el escritorio. Puedes especificar el número máximo de buffers a restaurar inmediatamente con la variable desktop-restore-eager; los buffers restantes se restauran perezosamente, cuando Emacs está inactivo.

Escriba Alt-x desktop-clear (M-x desktop-clear) para vaciar el escritorio de Emacs. Esto mata todos los buffers excepto los internos, y borra las variables globales listadas en desktop-globals-to-clear. Si quiere que esto conserve ciertos buffers, personalice la variable desktop-clear-preserve-buffers-regexp, cuyo valor es una expresión regular que coincide con los nombres de los buffers que no hay que matar.

Si quiere guardar el historial de minibufferes de una sesión a otra, utilice la biblioteca .

Mientras Emacs se ejecuta con el modo desktop-save activado, por defecto auto-guarda el escritorio cada vez que cambia algo de él. La variable desktop-auto-save-timeout determina la frecuencia con la que el Editor comprueba las modificaciones en el escritorio.

El archivo en el que Emacs guarda el escritorio está bloqueado mientras se ejecuta la sesión, para evitar sobrescribirlo inadvertidamente desde otra sesión de Emacs. Ese bloqueo se elimina normalmente cuando se sale del Editor, pero si Emacs o su sistema se bloquea, el bloqueo se mantiene, y cuando reinicie el Editor, por defecto le preguntará si quiere usar el archivo de escritorio bloqueado. Puede evitar la pregunta personalizando la variable desktop-load-locked-desktop a nil, que significa no cargar nunca el escritorio en este caso, o a t, que significa cargar el escritorio sin preguntar.

Cuando Emacs se inicia en modo demonio, no puede hacer ninguna pregunta, así que si encuentra el archivo del escritorio bloqueado, no lo cargará, a menos que desktop-load-locked-desktop sea t. Tenga en cuenta que restaurar el escritorio en modo demonio es algo problemático por otras razones: por ejemplo, el demonio no puede usar las características de la GUI, así que parámetros como la posición del marco, el tamaño y las decoraciones no pueden ser restaurados. Por esta razón, puede querer retrasar la restauración del escritorio en modo demonio hasta que el primer cliente se conecte, llamando a desktop-read en una función gancho (hook) que añada a server-after-make-frame-hook (vea Creating Frames en The Emacs Lisp Reference Manual).



Niveles de edición recursiva

Una edición recursiva es una situación en la que utiliza los comandos de Emacs para realizar una edición arbitraria mientras está en medio de otro comando del Editor . Por ejemplo, cuando escribe Ctrl-r (C-r) dentro de una query-replace (consulta-reemplazo), entra en una edición recursiva en la que puede 1 cambiar el buffer actual. Al salir de la edición recursiva, se vuelve a la consulta-reemplazo (query-replace). Ver Consulta-Reemplazo.

Salir de la edición recursiva significa volver al comando no terminado, que continúa la ejecución. El comando para salir es Ctrl-Alt-c (C-M-c, exit-recursive-edit).

También puede abortar la edición recursiva. Esto es como salir, pero también sale del comando inacabado inmediatamente. Utilice el comando Ctrl-] (C-], abort-recursive-edit) para hacerlo. Vea Salir y Abortar.

La línea de modo le muestra cuando está en una edición recursiva mostrando corchetes alrededor de los paréntesis que siempre rodean los nombres de modo mayor y menor. La línea de modo de cada ventana muestra esto de la misma manera, ya que estar en una edición recursiva es cierto para Emacs como un todo y no para cualquier ventana o búfer en particular.

Es posible estar en ediciones recursivas dentro de ediciones recursivas. Por ejemplo, después de escribir Ctrl-r (C-r) en una consulta-reemplazo (query-replace), puede escribir un comando que entre en el depurador. Esto inicia un nivel de edición recursiva para el depurador, dentro del nivel de edición recursiva para Ctrl-r (C-r). Las líneas de modo muestran un par de corchetes para cada nivel de edición recursiva en curso.

Al salir de la edición recursiva interna (como con el comando c (c) del depurador) se reanuda el comando que se ejecuta en el siguiente nivel superior. Cuando ese comando termina, puede usar Ctrl-Alt-c (C-M-c) para salir de otro nivel de edición recursiva, y así sucesivamente. Salir se aplica sólo al nivel más interno. Abortar también sale de un solo nivel de edición recursiva; vuelve inmediatamente al nivel de comandos de la edición recursiva anterior. Si lo desea, puede entonces abortar el siguiente nivel de edición recursiva.

Alternativamente, el comando Alt-x top-level (M-x top-level) aborta todos los niveles de edición recursiva, volviendo inmediatamente al nivel de comandos del nivel superior. También sale del minibuffer, si está activo.

El texto que se está editando dentro de la edición recursiva no tiene por qué ser el mismo que se estaba editando en el nivel superior. Depende de para qué sea la edición recursiva. Si el comando que invoca la edición recursiva selecciona primero un búfer diferente, ese es el búfer que se editará recursivamente. En cualquier caso, puedes cambiar de búfer dentro de la edición recursiva de forma normal (siempre y cuando las teclas de cambio de búfer no hayan sido rebotadas). Probablemente podría hacer todo el resto de tu edición dentro de la edición recursiva, visitando archivos y todo. Pero esto podría tener efectos sorprendentes (como el desbordamiento de la pila) de vez en cuando. Así que recuerde salir o abortar la edición recursiva cuando ya no la necesite.

En general, tratamos de minimizar el uso de niveles de edición recursiva en GNU Emacs. Esto se debe a que obligan al Usuario a retroceder en un orden particular, desde el nivel más interno hacia el nivel superior. Cuando es posible, presentamos diferentes actividades en buffers separados para que pueda cambiar entre ellos como quiera. Algunos comandos cambian a un nuevo modo principal que proporciona un comando para volver. Estos enfoques le dan más flexibilidad para volver a las tareas inacabadas en el orden que Usted elija.



Funciones de hipervínculo y navegación web

Las siguientes subsecciones describen las características de conveniencia para el manejo de URLs y otros tipos de enlaces que ocurren en el texto del buffer de Emacs.

EWW, el Emacs Web Wowser, es un paquete de navegador web para Emacs. Permite navegar por URLs dentro de un buffer del Editor. El comando Alt-x eww (M-x eww) abrirá una URL o buscará en la web. Puede abrir un archivo usando el comando Alt-x eww-open-file (M-x eww-open-file). Puede usar EWW como navegador web para browse-url, ver Siguiendo URLs. Para más detalles, vea EWW en The Emacs Web Wowser Manual.

Widgets WebKit incrustados

Si Emacs fue compilado con los paquetes de soporte apropiados, es capaz de mostrar widgets del navegador en sus buffers. El comando Alt-x xwidget-webkit-browse-url (M-x xwidget-webkit-browse-url) pide una URL para mostrar en el widget del navegador. La URL normalmente viene por defecto de la URL en o antes del punto, pero si hay una región activa (ver La marca y la región), la URL por defecto viene de la región en su lugar, después de eliminar cualquier espacio en blanco de la misma. El comando crea entonces un nuevo búfer con el navegador incrustado que muestra la URL especificada. El búfer se pone en el modo Xwidget-WebKit (similar al modo Imagen, ver Ver archivos de imagen), que proporciona comandos de una sola tecla para desplazar el widget, cambiar su tamaño y recargarlo. Escriba Ctrl-h b (C-h b) en ese buffer para ver los enlaces de las teclas.

Siguiendo URLs

Alt-x browse-url RETURN url RETURN (M-x browser-url RET url RET)
Carga una URL en un navegador web.

El paquete Browse-URL permite seguir fácilmente las URLs desde Emacs. La mayoría de las URLs se siguen invocando un navegador web; las URLs ‘mailto:’ se siguen invocando el comando Emacs compose-mail para enviar el correo a la dirección especificada (ver Envío de correo).

El comando Alt-x browser-url (M-x browse-url) pide una URL y la sigue. Si el punto se encuentra cerca de una URL plausible, esa URL se ofrece por defecto. El paquete Browse-URL también proporciona otros comandos que se pueden asociar a teclas, como browse-url-at-point y browse-url-at-mouse.

Puede personalizar el comportamiento de Browse-URL mediante varias opciones del grupo browse-url Customize. En particular, la opción browse-url-mailto-function le permite definir cómo seguir las URLs ‘mailto:’, mientras que browse-url-browser-function especifica su navegador por defecto.

Puede definir que ciertas URLs sean navegadas con otras funciones personalizando browse-url-handlers, una lista de expresiones regulares o predicados emparejados con funciones para navegar por las URLs coincidentes.

Para más información, vea el comentario del paquete escribiendo Ctrl-h P browser-url RETURN (C-h P browse-url RET).

Emacs también tiene un modo menor que tiene cierto soporte para manejar URLs como si fueran archivos. url-handler-mode es un modo menor global que afecta a la mayoría de los comandos y primitivas del Editor que tratan con nombres de archivos. Después de activar este modo, puedes decir, por ejemplo, Ctrl-x Ctrl-f https://www.gnu.org/ RETURN (C-x C-f https://www.gnu.org/ RET) para ver el HTML de esa página web, y entonces puede editarlo y guardarlo en un archivo local, por ejemplo.

Activación de URLs

Alt-x goto-address-mode (M-x goto-address-mode)
Activa URLs y direcciones de correo electrónico en el buffer actual.
Alt-x global-goto-address-mode (M-x global-goto-address-mode)
Activa el modo goto-dirección en todos los buffers.

Puede hacer que Emacs marque las URLs especialmente en el buffer actual, escribiendo Alt-x goto-address-mode (M-x goto-address-mode). Cuando este modo menor del búfer está habilitado, encuentra todas las URLs en el búfer, las resalta y las convierte en botones clicables. Puede seguir la URL escribiendo Ctrl-c RETURN (C-c RET, goto-address-at-point) mientras el punto está en su texto; o haciendo clic con (ratón-2), o haciendo clic con (ratón-1) rápidamente (ver Siguiendo Referencias con el Ratón). Seguir una URL se hace llamando a browse-url como subrutina (ver Seguir URLs).

Puede ser útil añadir goto-address-mode a los ganchos (hooks) de modo y a los ganchos para mostrar un mensaje entrante (por ejemplo, rmail-show-message-hook para Rmail). Esto no es necesario para Gnus o MH-E, que tienen características similares propias.

Búsqueda de archivos y URLs en el punto

El paquete FFAP sustituye ciertas combinaciones de teclas para buscar archivos, como Ctrl-x Ctrl-f (C-x C-f), por comandos que proporcionan valores predeterminados más sensibles. Estos comandos se comportan como los ordinarios cuando se les da un argumento de prefijo. En caso contrario, obtienen el nombre de archivo o la URL por defecto del texto alrededor del punto. Si lo que se encuentra en el búfer tiene la forma de una URL en lugar de un nombre de archivo, los comandos utilizan browse-url para verlo (véase Seguir URLs).

Esta función es útil para seguir referencias en los buffers de correo o noticias, archivos README, archivos MANIFEST, etc. Para más información, vea el comentario del paquete escribiendo Ctrl-h P ffap RETURN (C-h P ffap RET).

Para activar FFAP, escriba Alt-x ffap-bindings (M-x ffap-bindings). Esto hace los siguientes enlaces de teclas, y también instala ganchos para la funcionalidad adicional de FFAP en Rmail, Gnus y los búferes de artículos de VM.

Ctrl-x Ctrl-f nombre-de-archivo RETURN (C-x C-f nombre-de-archivo RET)
Encuentra nombre-de-archivo, adivinando un texto por defecto alrededor del punto (find-file-at-point).
Ctrl-x Ctrl-r nombre-de-archivo RETURN (C-x C-r nombre-de-archivo RET)
ffap-read-only, análogo a find-file-read-only.
Ctrl-x Ctrl-v nombre-de-archivo RETURN (C-x C-v nombre-de-archivo RET)
ffap-alternate-file, análogo a find-alternate-file.
Ctrl-x d directorio RETURN (C-x d directorio RET)
Inicia Dired en el directorio, por defecto el directorio en el punto (dired-at-point).
Ctrl-x Ctrl-d directorio RETURN (C-x C-d directorio RET)
ffap-list-directory, análogo a list-directory.
Ctrl-x 4f nombre-de-archivo RETURN (C-x 4 f nombre-de-archivo RET)
ffap-other-window, análogo a find-file-other-window.
Ctrl-x 4r nombre-de-archivo RETURN (C-x 4 r nombre-de-archivo RET)
ffap-read-only-other-window, análogo a find-file-read-only-other-window.
Ctrl-x 4d directorio RETURN (C-x 4 d directorio RET)
ffap-dired-other-window, como dired-other-window.
Ctrl-x 5f nombre-de-archivo RETURN (C-x 5 f nombre-de-archivo RET)
ffap-other-frame, análogo a find-file-other-frame.
Ctrl-x 5r nombre-de-archivo RETURN (C-x 5 r nombre-de-archivo RET)
ffap-read-only-other-frame, análogo a find-file-read-only-other-frame.
Ctrl-x 5d directorio RETURN (C-x 5 d directorio RET)
ffap-dired-other-frame, análogo a dired-other-frame.
Ctrl-x t Ctrl-f nombre-de-archivo RETURN
(C-x t C-f nombre-de-archivo RET)
ffap-other-tab, análogo a find-file-other-tab.
Ctrl-x t Ctrl-r nombre-de-archivo RETURN
(C-x t C-r nombre-de-archivo RET)
ffap-read-only-other-tab, análogo a find-file-read-only-other-tab.
Alt-x ffap-next (M-x ffap-next)
Busca en el búfer el siguiente nombre de archivo o URL, y luego encuentra ese archivo o URL.
Shift- (S-ratón-3)
ffap-at-mouse encuentra el archivo adivinado a partir del texto alrededor de la posición donde se hizo clic con el ratón.
Ctrl-Shift- (C-S-ratón-3)
Muestra un menú de archivos y URLs mencionados en el búfer actual, luego encuentra el que se selecciona (ffap-menu).


Juegos y otras diversiones

El paquete animate hace bailar el texto (por ejemplo, Alt-x animate-birthday-present (M-x animate-birthday-present)).

Alt-x blackbox (M-x blackbox), Alt-x mpuz (M-x mpuz) y Alt-x 5x5 (M-x 5x5) son rompecabezas. blackbox lo reta a determinar la ubicación de los objetos dentro de una caja mediante tomografía. mpuz muestra un rompecabezas de multiplicación con letras que representan dígitos en un código que debe adivinar: para adivinar un valor, escribe una letra y luego el dígito que cree que representa. El objetivo de 5x5 es completar todas las casillas.

Alt-x bubbles (M-x bubbles) es un juego en el que el objetivo es eliminar tantas burbujas como pueda en el menor número de movimientos.

Alt-x decipher (M-x decipher) lo ayuda a criptoanalizar un búfer que está encriptado en un simple cifrado de sustitución monoalfabética.

Alt-x dissociated-press (M-x dissociated-press) revuelve el texto en el búfer actual de Emacs, palabra por palabra o carácter por carácter, escribiendo su salida en un búfer llamado *Disociation*. Un argumento positivo le dice que opere carácter por carácter, y especifica el número de caracteres superpuestos. Un argumento negativo le dice que opere palabra por palabra, y especifica el número de palabras superpuestas. Dissociated Press produce resultados bastante parecidos a los de una cadena de Markov, pero es, sin embargo, una invención independiente e ignorante; copia técnicamente varios caracteres consecutivos del texto de muestra entre saltos aleatorios, a diferencia de una cadena de Markov que saltaría aleatoriamente después de cada palabra o carácter. Mantenga las dissociwords (palabras disociadas) fuera de su documentación, si quiere que tenga un buen uso y sea correcta.

Alt-x dunnet (M-x dunnet) ejecuta un juego de aventuras basado en texto.

Si quiere un poco más de implicación personal, pruebe Alt-x gomoky (M-x gomoku), que juega al juego Go Moku contigo.

Si se aburre un poco, puede probar Alt-x hanoi (M-x hanoi). Si está considerablemente aburrido, dele un argumento numérico. Si está muy, muy aburrido, pruebe con un argumento de 9. Siéntese y observe.

Alt-x life (M-x life) ejecuta el autómata celular Game of Life de Conway.

Alt-x morse-region (M-x morse-region) convierte el texto de la región en código Morse; Alt-x unmorse-region (M-x unmorse-region) lo vuelve a convertir. Alt-x nato-region (M-x nato-región) convierte el texto de la región en alfabeto fonético de la OTAN; Alt-x denato-region (M-x denato-región) lo devuelve.

Alt-x pong (M-x pong), Alt-x snake (M-x snake) y Alt-x tetris (M-x tetris) son implementaciones de los conocidos juegos Pong, Snake y Tetris.

Alt-x solitaire (M-x solitaire) reproduce un juego de solitario en el que se saltan clavijas a través de otras clavijas.

El comando Alt-x zone (M-x zone) juega con la pantalla cuando Emacs está inactivo.

"Real Programmers" despliega Alt-x butterfly (M-x butterfly), que utiliza mariposas para voltear un bit en el disco duro, ver https://xkcd.com/378.

Finalmente, si se encuentras frustrado, intente describir sus problemas a la famosa psicoterapeuta Eliza. Simplemente haga Alt-x doctor (M-x doctor). Termine cada entrada escribiendo RETURN4 (RET) dos veces.



Paquetes Emacs Lisp

Emacs se extiende implementando características adicionales en paquetes, que son bibliotecas Emacs Lisp. Éstas pueden ser escritas por Ud. o proporcionadas por alguien más. Si quiere instalar un paquete de este tipo para que esté disponible en su futura sesión del Editor, necesita compilarlo y ponerlo en un directorio donde Emacs busque bibliotecas Lisp. Vea Bibliotecas de código Lisp para Emacs, para más detalles sobre este método de instalación manual. Muchos paquetes proporcionan instrucciones de instalación y uso en el gran comentario cerca del principio del archivo Lisp; puede usar esas instrucciones para instalar y afinar el uso del paquete.

Los paquetes también pueden ser proporcionados por archivos de paquetes, que son grandes colecciones de paquetes Emacs Lisp. Cada paquete es un programa Emacs Lisp separado, que a veces incluye otros componentes como un manual de información. Emacs incluye una función que permite descargar e instalar fácilmente paquetes de dichos archivos. El resto de este capítulo describe esta facilidad.

Para listar los paquetes disponibles para su instalación desde los archivos de paquetes, escriba Alt-x list-packages RETURN (M-x list-packages RET). Aparecerá un búfer llamado *Packages* (*Paquetes*) con una lista de todos los paquetes. Puede instalar o desinstalar paquetes a través de este buffer. Vea el buffer del menú de paquetes.

El comando Ctrl-h P (C-h P, describe-paquete) pide el nombre de un paquete, y muestra un buffer de ayuda describiendo los atributos del paquete y las características que implementa.

Por defecto, Emacs descarga los paquetes desde un archivo de paquetes mantenido por los desarrolladores de Emacs y alojado en el proyecto GNU. Opcionalmente, también puede descargar paquetes de archivos mantenidos por terceros. Ver Instalación de paquetes.

Para información sobre cómo convertir un programa Emacs Lisp en un paquete instalable, vea Empaquetado en el Manual de Referencia de Emacs Lisp.

El menú de paquetes

El comando Alt-x list-packages (M-x list-packages) muestra el menú de paquetes. Este es un buffer que lista todos los paquetes que Emacs conoce, uno en cada línea, con la siguiente información:

  • El nombre del paquete (por ejemplo, ‘auctex’).
  • El número de versión del paquete (por ejemplo, '11.86').
  • El estado del paquete, normalmente uno de los siguientes: ‘available’ ("disponible") (puede descargarse del archivo del paquete), ‘installed’ ("instalado"), o ‘built-in’ ("incorporado") (incluido en Emacs por defecto). Ver Estados de los paquetes.
  • De qué archivo de paquetes proviene este paquete, si tiene más de un archivo de paquetes activado.
  • Una breve descripción del paquete.

El comando list-packages accede a la red, para recuperar la lista de paquetes disponibles de los servidores de archivos de paquetes. Si la red no está disponible, recurre a la lista recuperada más recientemente.

Los siguientes comandos están disponibles en el menú del paquete:

h (h)
Imprime un breve mensaje que resume cómo utilizar el menú de paquetes (package-menu-quick-help).
? (?)
RETURN (RET)
Muestra un buffer de ayuda para el paquete en la línea actual (package-menu-describe-package), similar a la ventana de ayuda mostrada por el comando Ctrl-h P (C-h P) (ver Emacs Lisp Packages).
i (i)
Marca el paquete en la línea actual para su instalación (package-menu-mark-install). ‘I’ al principio de la línea; al teclear x (ver más abajo) se descargará e instalará el paquete.
d (d)
Marca el paquete en la línea actual para su eliminación (package-menu-mark-delete). Si el estado del paquete es ‘installed’ (‘instalado‘), esto añade un carácter ‘D’ al principio de la línea; tecleando x (x) (ver abajo) se borrará el paquete. Vea Archivos de paquetes y disposición de directorios, para información sobre lo que implica la eliminación de paquetes.
w (w)
Abre el sitio web del paquete en la línea actual en un navegador (package-browse-url). browse-url se utiliza para abrir el navegador.
~ (~)
Marca todos los paquetes obsoletos para su eliminación (package-menu-mark-obsolete-for-deletion). Esto marca para su eliminación todos los paquetes cuyo estado es ‘obsolete’ (‘obsoleto’).
u (u)
DEL (DEL)
Elimina cualquier marca de instalación o de borrado añadida previamente a la línea actual por la orden i (i) o d (d) (package-menu-mark-unmark).
U (U)
Marca todos los paquetes con una versión más nueva disponible para su actualización (package-menu-mark-upgrades). Esto coloca una marca de instalación en las nuevas versiones disponibles, y una marca de eliminación en las antiguas versiones instaladas (marcadas con el estado ‘obsolete’).
x (x)
package-menu-execute, descarga e instala todos los paquetes marcados con i (i), y sus dependencias; también elimina todos los paquetes marcados con d (d). Esto también elimina las marcas.
g (g)
r (r)
Refresca la lista de paquetes (revert-buffer). Esto recupera la lista de paquetes disponibles del archivo de paquetes de nuevo, y vuelve a mostrar la lista de paquetes.
H (H)
Oculta los paquetes cuyos nombres coinciden con una expresión regular (package-menu-hide-package). Esto solicita una expresión regular y luego oculta los paquetes con nombres que coinciden. El valor por defecto de la expreg ocultará sólo el paquete cuyo nombre esté en el punto, por lo que con sólo pulsar RETURN (RET) a la pregunta se ocultará el paquete actual.
( ( ( )
Alterna la visibilidad de las versiones antiguas de los paquetes y también de las versiones de los archivos de menor prioridad (package-menu-toggle-hiding).
/a (/ a)
Filtra la lista de paquetes por archivo (package-menu-filter-by-archive). Esto pide un archivo de paquetes (por ejemplo, ‘gnu’), y luego muestra sólo los paquetes de ese archivo.
/d (/ d)
Filtra la lista de paquetes por descripción (package-menu-filter-by-description). Esto pide una expresión regular, y luego muestra sólo los paquetes con descripciones que coinciden con esa expreg.
/k (/ k)
Filtra la lista de paquetes por palabra clave (package-menu-filter-by-keyword). Pide una palabra clave (por ejemplo, ‘games’ (‘juegos’)) y muestra sólo los paquetes con esa palabra clave.
/N (/ N)
Filtra la lista de paquetes por nombre o descripción (package-menu-filter-by-name-or-description). Esto pide una expresión regular, y luego muestra sólo los paquetes con un nombre o descripción que coincida con esa expreg.
/n (/ n)
Filtra la lista de paquetes por nombre (package-menu-filter-by-name). Pide una expresión regular y muestra sólo los paquetes con nombres que coinciden con esa expresión.
/s (/ s)
Filtra la lista de paquetes por estado (package-menu-filter-by-status). Solicita uno o más estados (por ejemplo, ‘available’ (‘disponible’)), y luego muestra sólo los paquetes que coinciden con ese estado.
/v (/ v)
Filtra la lista de paquetes por versión (package-menu-filter-by-version). Esto pide primero uno de los calificadores ‘<’, ‘>’ o ‘=’, y luego una versión del paquete, y muestra los paquetes que tienen una versión menor, igual o mayor que la especificada.
/m (/ m)
Filtra la lista de paquetes por una marca no vacía (package-menu-filter-marked). Esto muestra sólo los paquetes que han sido marcados para ser instalados o eliminados.
/u (/ u)
Filtra la lista de paquetes para mostrar sólo los paquetes para los que hay actualizaciones disponibles (package-menu-filter-upgradable).
// (/ /)
Borra el filtro aplicado actualmente a la lista de paquetes (package-menu-filter-clear).

Por ejemplo, puede instalar un paquete escribiendo i (i) en la línea que enumera ese paquete, seguido de x (x).

Estados de los paquetes

Un paquete puede tener uno de los siguientes estados:

available’ (‘disponible‘)
El paquete no está instalado, pero puede descargarse e instalarse desde el archivo de paquetes.
avail-obso
El paquete está disponible para su instalación, pero también está disponible una versión más reciente. Los paquetes con este estado están ocultos por defecto.
built-in’ (‘integrado’)
El paquete está incluido en Emacs por defecto. No puede ser eliminado a través del menú de paquetes, y no se considera para la actualización.
dependency’ (‘dependencia’)
El paquete se instaló automáticamente para satisfacer una dependencia de otro paquete.
disable2’ (‘desactivado’)
El paquete ha sido desactivado mediante la variable package-load-list.
external’ (‘externo’)
El paquete no está integrado y no proviene del directorio especificado por package-user-dir (vea Archivos de paquetes y disposición de directorios). ‘built-in‘ (‘incorporados’) y no pueden ser eliminados.
held’ (‘’)
El paquete está retenido, véase Instalación de paquetes.
incompat’ (‘incompatible’)
El paquete no puede ser instalado por alguna razón, por ejemplo porque depende de paquetes desinstalables.
installed’ (‘instalado’)
El paquete está instalado.
new’ (‘nuevo’)
Equivale a ‘available’ (‘instalado’), excepto que el paquete se ha vuelto disponible en el archivo de paquetes después de su última invocación de M-x list-packages.
obsolete’ (‘obsoleto’)
El paquete es una versión instalada obsoleta; además de esta versión del paquete, también está instalada una versión más nueva.

Instalación de paquetes

Los paquetes se instalan más convenientemente usando el menú de paquetes (ver El menú de paquetes), pero también puede usar el comando Alt-x package-install (M-x package-install). Este comando pide el nombre de un paquete con el estado ‘available‘ (‘disponible’), y luego lo descarga e instala.

Un paquete puede requerir que se instalen otros paquetes, porque depende de la funcionalidad proporcionada por ellos. Cuando Emacs instala un paquete de este tipo, también descarga e instala automáticamente cualquier paquete necesario que no esté ya instalado. (Si un paquete requerido no está disponible de alguna manera, el Editor señala un error y detiene la instalación). La lista de requisitos de un paquete se muestra en su buffer de ayuda.

Por defecto, los paquetes se descargan de un único archivo de paquetes mantenido por los desarrolladores de Emacs. Esto es controlado por la variable package-archives, cuyo valor es una lista de archivos de paquetes conocidos por el Editor. Cada elemento de la lista debe tener la forma (id . location), donde id es el nombre de un archivo de paquetes y location es la URL o el nombre del directorio del archivo de paquetes. Puede alterar esta lista si desea utilizar archivos de paquetes de terceros, pero hágalo bajo su propia responsabilidad y utilice sólo aquellos en los que pueda confiar.

Los mantenedores de los archivos de paquetes pueden aumentar la confianza que puede tener en sus paquetes firmándolos. Generan un par de claves criptográficas privadas/públicas, y utilizan la clave privada para crear un archivo de firma para cada paquete. Con la clave pública, puede utilizar los archivos de firma para verificar al creador del paquete y asegurarse de que el paquete no ha sido manipulado. La verificación de la firma utiliza el paquete GnuPG a través de la interfaz EasyPG (ver EasyPG en el Manual del Asistente EasyPG de Emacs). Una firma válida no es una garantía de hierro fundido de que un paquete no es malicioso, por lo que debe tener cuidado. Los archivos de los paquetes deberían proporcionar instrucciones sobre cómo obtener su clave pública. Una forma es descargar la clave desde un servidor como https://pgp.mit.edu/. Use Alt-x package-import-keyring (M-x package-import-keyring) para importar la clave al Editor. Emacs almacena las claves de los paquetes en el directorio especificado por la variable package-gnupghome-dir, por defecto en el subdirectorio gnupg de package-user-dir, lo que hace que Emacs invoque a GnuPG con la opción ‘--homedir’ al verificar las firmas. Si ackage-gnupghome-dir es nulo, la opción ‘--homedir’ de GnuPG se omite. La clave pública del archivo de paquetes GNU se distribuye con Emacs, en el archivo etc/package-keyring.gpg. El Editor la utiliza

Si la opción de usuario package-check-signature no es nula, Emacs intenta verificar las firmas cuando se instalan los paquetes. Si la opción tiene el valor allow-unsigned, y se encuentra una configuración OpenPGP utilizable, se comprobarán los paquetes firmados, pero aún puede instalar un paquete que no esté firmado. Si utiliza algunos archivos que no firman sus paquetes, puede añadirlos a la lista package-unsigned-archives. (Si el valor es allow-unsigned y no se encuentra ningún OpenPGP utilizable, esta opción se trata como si su valor fuera nulo). Si el valor es t, al menos una firma debe ser válida; si el valor es all, todas deben ser válidas.

Para más información sobre claves criptográficas y firmas, vea GnuPG en The GNU Privacy Guard Manual. Emacs viene con una interfaz para GNU Privacy Guard, ver EasyPG en Emacs EasyPG Assistant Manual.

Si tiene más de un archivo de paquetes habilitado, y algunos de ellos ofrecen diferentes versiones del mismo paquete, puede encontrar útil la opción package-pinned-packages. Puede añadir pares paquete/archivo a esta lista, para asegurarse de que el paquete especificado sólo se descargue del archivo especificado.

Otra opción que resulta útil cuando se tienen varios archivos de paquetes activados es package-archive-priorities. Especifica la prioridad de cada archivo (los números más altos especifican archivos de mayor prioridad). Por defecto, los archivos tienen la prioridad cero, a menos que se especifique lo contrario mediante el valor de esta opción. Los paquetes de los archivos de menor prioridad no se mostrarán en el menú, si el mismo paquete está disponible en un archivo de mayor prioridad. (Esto se controla con el valor de package-menu-hide-low-priority).

Una vez que se ha descargado e instalado un paquete, se pone a disposición de la sesión actual de Emacs. Para hacer que un paquete esté disponible añada su directorio a load-path, esto carga sus autoloads. El efecto de las autocargas de un paquete varía de un paquete a otro. La mayoría de los paquetes sólo hacen disponibles algunos comandos nuevos, mientras que otros tienen efectos más amplios en la sesión de Emacs. Para esta información, consulta el buffer de ayuda del paquete.

Los paquetes instalados son automáticamente puestos a disposición por Emacs en todas las sesiones posteriores. Esto ocurre en el arranque, antes de procesar el fichero init pero después de procesar el fichero early init (ver El fichero early init). Como excepción, Emacs no hace disponibles los paquetes al inicio si se invoca con las opciones ‘-q‘ o ‘-no-init-file’ (ver Opciones iniciales).

Para evitar que Emacs haga disponibles los paquetes automáticamente al inicio, cambie la variable package-enable-at-startup a nil. Debe hacer esto en el archivo early init, ya que la variable se lee antes de cargar el archivo init regular. Actualmente esta variable no se puede establecer a través de Personalizar.

Si tiene muchos paquetes instalados, puede mejorar los tiempos de arranque estableciendo la opción de Usuario package-quickstart a t. Establecer esta opción hará que Emacs precalcule muchas cosas en lugar de recalcularlas en cada arranque del Editor. Sin embargo, si hace esto, tendrá que ejecutar manualmente el comando package-quickstart-refresh cuando las activaciones necesiten ser cambiadas, como cuando cambias el valor de package-load-list.

Si ha configurado package-enable-at-startup como , aún puede hacer que los paquetes estén disponibles durante o después del inicio. Para que los paquetes instalados estén disponibles durante el arranque, llame a la función package-activate-all en su fichero init. Para que los paquetes instalados estén disponibles después del inicio, invoque el comando Alt-: (package-activate-all) RETURN (M-: (package-activate-all) RET) .

Para un control más preciso sobre los paquetes que se ponen a disposición al inicio, puede utilizar la variable package-load-list. Su valor debe ser una lista. Un elemento de la lista de la forma (nombre versión) le dice a Emacs que haga disponible la versión del paquete llamado nombre. Aquí, la versión debe ser una cadena de versión (correspondiente a una versión específica del paquete), o t (que significa hacer disponible cualquier versión instalada), o nil (que significa ninguna versión; esto desactiva el paquete, evitando que esté disponible). Un elemento de la lista también puede ser el símbolo all, que significa poner a disposición la última versión instalada de cualquier paquete no nombrado por los otros elementos de la lista. El valor por defecto es simplemente '(all).

Por ejemplo, si establece package-load-list a ‘((muse "3.20") all), entonces Emacs sólo pone a disposición la versión 3.20 del paquete ‘muse’ , además de cualquier versión instalada de los paquetes que no sean ‘muse’. Cualquier otra versión de ‘muse’ que esté instalada será ignorada. Este paquete aparecerá en el menú de paquetes con el estado ‘held’ (’retenido’).

Archivos del paquete y disposición del directorio

Cada paquete se descarga del archivo de paquetes en forma de un único archivo de paquete, ya sea un archivo fuente de Emacs Lisp o un archivo tar que contiene múltiples archivos fuente de Emacs Lisp y otros archivos. Los archivos de paquete son recuperados, procesados y eliminados automáticamente por los comandos de Emacs que instalan paquetes. Normalmente, no necesitará tratar directamente con ellos, a menos que esté haciendo un paquete (ver Packaging en The Emacs Lisp Reference Manual). Si alguna vez necesita instalar un paquete directamente desde un archivo de paquete, utilice el comando Alt-x package-install-file (M-x package-install-file).

Una vez instalado, el contenido de un paquete se coloca en un subdirectorio de ~/.config/emacs/elpa/ (puede cambiar el nombre de ese directorio cambiando la variable package-user-dir). El subdirectorio del paquete se llama nombre-versión, donde nombre es el nombre del paquete y versión es su cadena de versión.

Además de package-user-dir, Emacs busca los paquetes instalados en los directorios listados en package-directory-list. Estos directorios están pensados para que los administradores del sistema hagan que los paquetes de Emacs estén disponibles en todo el sistema; Emacs nunca instala paquetes allí. Los subdirectorios de paquetes para package-directory-list están dispuestos de la misma manera que en package-user-dir.

Borrar un paquete (ver El búfer del menú de paquetes) implica borrar el subdirectorio de paquetes correspondiente. Esto sólo funciona para los paquetes instalados en package-user-dir; si se le dice que actúe sobre un paquete en un directorio de paquetes de todo el sistema, el comando de borrado señala un error.



Personalización

Este capítulo describe algunos métodos simples para personalizar el comportamiento de Emacs.

Aparte de los métodos descritos aquí, vea Opciones y recursos de X para información sobre el uso de recursos de X para personalizar Emacs, y vea Macros de teclado para información sobre la grabación y reproducción de macros de teclado. Hacer cambios más amplios y abiertos implica escribir código Emacs Lisp; ver Emacs Lisp en The Emacs Lisp Reference Manual.

Interfaz de fácil personalización

Emacs tiene muchos ajustes que puede cambiar. La mayoría de los ajustes son variables personalizables (ver Variables), que también se llaman opciones de Usuario. Hay un gran número de variables personalizables, que controlan numerosos aspectos del comportamiento de Emacs; las variables documentadas en este manual están listadas en Índice de variables. Una clase separada de ajustes son las caras, que determinan las fuentes, los colores y otros atributos del texto (ver Caras del texto).

Para examinar y modificar los ajustes (tanto variables como caras), escriba Alt-x customize (M-x customize). Esto crea un búfer de personalización, que le permite navegar a través de una lista lógicamente organizada de ajustes, editar y establecer sus valores, y guardarlos permanentemente.

Grupos de personalización

Los ajustes de personalización se organizan en grupos de personalización. Estos grupos se reúnen en grupos más grandes, hasta llegar a un grupo maestro llamado Emacs.

Alt-x customize (M-x customize) crea un buffer de personalización que muestra el grupo Emacs de nivel superior. Se ve así, en parte:

For help using this buffer, see [Easy Customization] in the [Emacs manual].

________________________________________ [ Search ]

 Operate on all settings in this buffer:
 [ Revert... ] [ Apply ] [ Apply and Save ]


Emacs group: Customization of the One True Editor.
      [State]: visible group members are all at standard values.
      See also [Manual].

[Editing]      Basic text editing facilities.
[Convenience]  Convenience features for faster editing.

...more second-level groups...
Para obtener ayuda sobre el uso de este búfer, consulte [Personalización fácil] en el [Manual de Emacs].

________________________________________ [ Buscar ]

 Operar en todos los ajustes de este buffer:
 [ Revertir... ] [ Aplicar ] [ Aplicar y Guardar ]


Grupo Emacs: Personalización del One True Editor.
      [Estado]: los miembros visibles del grupo tienen todos los valores estándar.
      Ver también [Manual].

[Edición] Facilidades básicas de edición de texto.
[Conveniencia] Características de conveniencia para una edición más rápida.

...más grupos de segundo nivel...

La parte principal de este buffer muestra el grupo de personalización ‘Emacs’, que contiene varios otros grupos (‘Edition’, ‘Convenience‘ (‘Edición’, ‘Conveniencia’), etc.). Los contenidos de esos grupos no se enumeran aquí, sólo una línea de documentación cada uno.

El estado del grupo indica si la configuración en ese grupo ha sido editada, establecida o guardada. Véase Modificación de una variable.

La mayor parte del búfer de personalización es de sólo lectura, pero incluye algunos campos editables que puede modificar. Por ejemplo, en la parte superior del búfer de personalización hay un campo editable para la búsqueda de configuraciones (ver Navegar y buscar configuraciones). También hay botones y enlaces, que puede activar haciendo clic con el ratón, o moviendo el punto allí y escribiendo RETURN (RET). ‘Editing’ (‘[Editar]’) son enlaces; al activar uno de estos enlaces se abre el búfer de personalización de ese grupo.

En el buffer de personalización, puede escribir TAB (TAB, widget-forward) para avanzar al siguiente botón o campo editable. Shift-TAB (S-TAB, widget-backward) permite volver al botón o campo editable anterior.

Desde el buffer de personalización de nivel superior creado por Alt-x customieze (M-x customize), puede seguir los enlaces a los subgrupos del grupo de personalización ‘Emacs’. Estos subgrupos pueden contener configuraciones que puede personalizar; también pueden contener otros subgrupos, que tratan de subsistemas aún más especializados de Emacs. Mientras navega por la jerarquía de grupos de personalización, debería encontrar algunos ajustes que desee personalizar.

Si está interesado en personalizar una configuración o grupo de personalización en particular, puede ir directamente allí con los comandos Alt-x customize-option (M-x customize-option), Alt-x customize-face (M-x customize-face), o Alt-x customize-group (M-x customize-group). Véase Personalización de elementos específicos.

Si no sabe exactamente qué grupos o ajustes quiere personalizar, puede buscarlos utilizando el campo de búsqueda editable en la parte superior de cada búfer de personalización. Aquí puede introducir un término de búsqueda, ya sea una o varias palabras separadas por espacios, o una expresión regular (véase Sintaxis de las Expresiones Regulares). A continuación, escriba RETURN (RET) en el campo, o active el botón ‘Search’ (‘Buscar’) situado junto a él, para pasar a un búfer de personalización que contenga grupos y ajustes que coincidan con esos términos. Tenga en cuenta, sin embargo, que esta función sólo encuentra los grupos y configuraciones que están cargados en la sesión actual de Emacs.

Si no quiere que los buffers de personalización muestren el campo de búsqueda, cambie la variable custom-search-field a nil.

El comando Alt-x customize-apropos (M-x customize-apropos) es similar al uso del campo de búsqueda, excepto que lee el/los término(s) de búsqueda usando el minibuffer. Véase Personalización de elementos específicos.

Alt-x customize-browse (M-x customize-browse) es otra forma de navegar por las configuraciones disponibles. Este comando crea un buffer de personalización especial, que muestra sólo los nombres de los grupos y las configuraciones, en un diseño estructurado. Puede mostrar el contenido de un grupo, en el mismo buffer, invocando el botón ‘[+]’ junto al nombre del grupo. Cuando se muestra el contenido del grupo, el botón cambia a ‘[-]’; al invocarlo se vuelve a ocultar el contenido de dicho grupo. Cada grupo o ajuste en este buffer tiene un enlace que dice ‘[Group]‘ ‘[Option]’ ‘[Face]’ (‘[Grupo]’, ‘[Opción]’ o ‘[Cara]’). Al invocar este enlace se crea un búfer de personalización ordinario que muestra sólo ese grupo, opción o cara; esta es la forma de cambiar los ajustes que se encuentran con Alt-x customize-group (M-x customize-browse).

Modificación de una variable

Este es un ejemplo de cómo se ve una variable, u opción de Usuario, en el buffer de personalización:

[Hide] Kill Ring Max: 60
   [State]: STANDARD.
   Maximum length of kill ring before oldest elements are thrown away.
[Ocultar] Kill Ring Max: 60
   [Estado]: ESTÁNDAR.
   Longitud máxima del anillo de muerte antes de que los elementos más antiguos sean desechados.

La primera línea muestra que la variable se llama kill-ring-max, formateada como ‘Kill Ring Max’ para facilitar su visualización. Su valor es ‘60’. Si el botón ‘[Hide]’ (‘[Ocultar]’) está activado, oculta el valor y el estado de la variable; esto es útil para evitar saturar el buffer de personalización con valores muy largos (por esta razón, las variables que tienen valores muy largos pueden empezar ocultas). Si utiliza el botón ‘[Hide]’, cambia a ‘[Show-value]’ (‘[Mostrar valor]’), que puede activar para revelar el valor y el estado. En una pantalla gráfica, los botones ‘[Hide]’ y ‘[Show Value]’ se sustituyen por triángulos gráficos que apuntan hacia abajo y hacia la derecha respectivamente.

La línea que sigue al nombre de la variable indica el estado de personalización de la misma: en este ejemplo, ‘STÁNDAR’ significa que no se ha modificado la variable, por lo que su valor es el predeterminado. El botón ‘[State]’ (‘[Estado]’) ofrece un menú de operaciones para personalizar la variable.

Debajo del estado de personalización está la documentación de la variable. Esta es la misma documentación que se mostraría con el comando Ctrl-h v (C-h v) (ver Examinar y configurar variables). Si la documentación tiene más de una línea, es posible que sólo se muestre una línea. Si es así, esa línea termina con un botón ‘[More]’ (‘[Más]’); actívelo para ver la documentación completa.

Para introducir un nuevo valor para ‘Kill Ring Max’, sólo tiene que mover el punto al valor y editarlo. Por ejemplo, escriba Alt-d (M-d) para borrar el ‘60’ y escribir otro número. A medida que empiece a modificar el texto, la línea ‘State’ (‘[Estado]’) cambiará:

[State]: EDITED, shown value does not take effect until you
         set or save it.
[Estado]: EDITADO, el valor mostrado no tiene efecto hasta que usted
         lo establezca o lo guarde.

La edición del valor no hace que tenga efecto inmediatamente. Para ello, debe fijar la variable activando el botón ‘[State]’ (‘[Estadi]’) y eligiendo ‘Set for Current Session’ (‘Establecido para la sesión actual’). Entonces el estado de la variable pasa a ser:

[State]: SET for current session only.
[Estado]: SET sólo para la sesión actual.

No tiene que preocuparse por especificar un valor que no sea válido; la operación ‘Set for Current Session‘ (‘Establecido para la sesión actual’) comprueba la validez y no instalará un valor inaceptable.

Mientras edita ciertos tipos de valores, como nombres de archivos, nombres de directorios y nombres de comandos de Emacs, puede realizar la finalización con Ctrl-Alt-i (C-M-i, widget-complete), o las teclas equivalentes Alt-TAB (M-TAB) o ESC-TAB (ESC TAB). Esto se comporta de forma muy parecida a la finalización del minibuffer (ver Finalización).

Escribir RETURN (RET) en un campo de valor editable mueve el punto hacia adelante al siguiente campo o botón, como TAB (TAB). Por lo tanto, puede escribir RETURN (RET) cuando haya terminado de editar un campo, para pasar al siguiente botón o campo. Para insertar una nueva línea dentro de un campo editable, use Ctrl-o (C-o) o Ctrl-q Ctrl-j (C-q C-j).

Para algunas variables, sólo hay un conjunto fijo de valores legítimos, y no se permite editar el valor directamente. En su lugar, aparece un botón ‘[Value Menu’ ('[Menú de valores]') antes del valor; al activar este botón se presenta una selección de valores. En el caso de un valor booleano on u off ("activado o desactivado"), el botón dice ‘[Toggle]’ (‘[Alternar]’), y cambia el valor. Después de utilizar el botón ‘[Value Menu]’ o ‘Toggle’ (‘[Alternar]‘), debe volver a configurar la variable para que el valor elegido surta efecto.

Algunas variables tienen valores con una estructura compleja. Por ejemplo, el valor de minibuffer-frame-alist es una lista de asociación. Así es como aparece en el buffer de personalización:

[Hide] Minibuffer Frame Alist:
[INS] [DEL] Parameter: width
            Value: 80
[INS] [DEL] Parameter: height
            Value: 2
[INS]
   [ State ]: STANDARD.
   Alist of parameters for the initial minibuffer frame. [Hide]
   […more lines of documentation…]
[Ocultar] Lista de cuadros del minibuffer:
[INS] [DEL] Parámetro: ancho
            Valor: 80
[INS] [DEL] Parámetro: altura
            Valor: 2
[INS]
   [Estado]: ESTÁNDAR.
   Lista de parámetros para el cuadro inicial del minibuffer. [Ocultar]
   [...más líneas de documentación...]

En este caso, cada asociación de la lista consta de dos elementos, uno denominado ‘Parameter’ (‘Parámetro’) y otro ‘Value’ (‘Valor’); ambos son campos editables. Puede eliminar una asociación de la lista con el botón ‘[DEL]’ que se encuentra junto a ella. Para añadir una asociación, utilice el botón ‘[INS]’ en la posición en la que desea insertarla; el último botón ‘[INS]’ inserta al final de la lista.

Cuando fija una variable, el nuevo valor sólo tiene efecto en la sesión actual de Emacs. Para guardar el valor para futuras sesiones, utilice el botón ‘[State]’ y seleccione la operación ‘Save for Future Sessions’ (‘Guardar para Futuras Sesiones’).

También puede restaurar la variable a su valor estándar utilizando el botón ‘State’ (‘[Estado]’) y seleccionando la operación ‘Erase Customization’ (‘Borrar personalización’). En realidad hay cuatro operaciones de restablecimiento:

‘Undo Edits’ (’Deshacer-Cambios’)
Si ha modificado la variable pero aún no la ha establecido, esta operación restablece el texto en el búfer de personalización para que coincida con el valor real.
‘Revert This Session's Customizations’
(’Revertir las personalizaciones de esta sesión'’)
Esto restaura el valor de la variable al último valor guardado, si es que hay uno. En caso contrario, restablece el valor estándar. Actualiza el texto en consecuencia.
‘Erase Customization’ (’Borrar Personalización’)
Esto restablece el valor de la variable a su valor estándar. También se elimina cualquier valor guardado que tenga.
‘Set to Backup Value’ (’Ajustar al valor de reserva’)
Esto establece la variable a un valor anterior que se estableció en el buffer de personalización en esta sesión. Si personaliza una variable y luego la restablece, lo que descarta el valor personalizado, puede recuperar el valor descartado con esta operación.

A veces es útil registrar un comentario sobre una personalización específica. Utilice la opción ‘Add Comment’ (‘Añadir comentario’) del menú ‘[State]‘ (‘[Estado]’) para crear un campo para introducir el comentario.

Cerca de la parte superior del buffer de personalización hay dos líneas de botones:

Operate on all settings in this buffer:
[Revert...] [Apply] [Apply and Save]
Operar en todos los ajustes de este buffer:
[Revertir...] [Aplicar] [Aplicar y guardar]

El botón ‘[Revert...]’ (‘[Revertir...]’) despliega un menú con las 3 primeras operaciones de restablecimiento descritas anteriormente. El botón ‘[Apply]’ (‘[Aplicar]’) aplica la configuración para la sesión actual. El botón ‘[Apply and Save]’ (‘[Aplicar y Guardar]’) aplica la configuración y la guarda para futuras sesiones; este botón no aparece si Emacs se inició con la opción -q o -Q (ver Opciones iniciales).

El comando Ctrl-c Ctrl-c (C-c C-c, Custom-set) es equivalente a usar el botón ‘[Set for Current Session]’ (‘[Configurar para la Sesión Actual]’). El comando Ctrl-x Ctrl-s (C-x C-s, Custom-save) es como usar el botón ‘[Save for Future Sessions]’ (‘Guardar para Sesiones Futuras’).

El botón ‘[Exit]’ (‘[Salir]’) sale del búfer de personalización y lo entierra en la parte inferior de la lista de búferes. Para hacer que mate el buffer de personalización en su lugar, cambie la variable custom-buffer-done-kill a t.

Guardar personalizaciones

En el búfer de personalización, puede guardar una configuración de personalización eligiendo la opción ‘Save for Future Sessions’ (‘Guardar para futuras sesiones’) de su botón ‘State’ (‘[Estado]’). El comando Ctrl-c Ctrl-s (C-x C-s, Custom-save) , o el botón ‘[Apply and Save]’ (‘[Aplicar y Guardar]’) en la parte superior del buffer de personalización, guarda todos los ajustes aplicables en el buffer.

Guardar funciona escribiendo código en un archivo, normalmente su archivo de inicialización (ver El archivo de inicialización de Emacs). Las futuras sesiones del Editor leen automáticamente este archivo al iniciar, lo que configura las personalizaciones de nuevo.

Puede elegir guardar las personalizaciones en otro lugar que no sea su fichero de inicialización. Para que esto funcione, debe añadir un par de líneas de código a su fichero de inicialización, para establecer la variable custom-file con el nombre del fichero deseado, y para cargar ese fichero. Por ejemplo:

(setq custom-file "~/.config/emacs-custom.el")
(load custom-file)

Incluso puede especificar diferentes archivos de personalización para diferentes versiones de Emacs, de la siguiente forma:

(cond ((< emacs-major-version 28)
       ;; Emacs 27 customization.
       (setq custom-file "~/.config/custom-27.el"))
      ((and (= emacs-major-version 26)
            (< emacs-minor-version 3))
       ;; Personalización Emacs 26 , anterior a la versión 26.3.
       (setq custom-file "~/.config/custom-26.el"))
      (t
       ;; Emacs version 28.1 or posterior.
       (setq custom-file "~/.config/emacs-custom.el")))

(load custom-file)

Si Emacs fue invocado con las opciones -q o --no-init-file (ver Opciones iniciales), no le permitirá guardar sus personalizaciones en su fichero de inicialización. Esto se debe a que guardar las personalizaciones de una sesión de este tipo borraría todas las demás personalizaciones que pudiera tener en su fichero de inicialización.

Tenga en cuenta que cualquier personalización que no haya elegido guardar para futuras sesiones se perderá cuando termines Emacs. Si quiere que se se pregunte por las personalizaciones no guardadas en el momento de terminar la sesión, añada lo siguiente a su fichero de inicialización:

(add-hook 'kill-emacs-query-functions
          'custom-prompt-customize-unsaved-options)

Personalización de las caras

Puede personalizar las caras (ver Caras de texto), que determinan cómo Emacs muestra los diferentes tipos de texto. Los grupos de personalización pueden contener tanto variables como caras.

Por ejemplo, en los modos de lenguaje de programación, los comentarios del código fuente se muestran con font-lock-comment-face (ver Modo de bloqueo de fuente). En un buffer de personalización, después de hacer clic en el enlace ‘[Show All Attributes]’ (‘[Mostrar todos los atributos]’) esa cara aparece así,:

[Hide] Font Lock Comment Face:[sample]
   [State] : STANDARD.
   Font Lock mode face used to highlight comments.
   [ ] Font Family: --
   [ ] Font Foundry: --
   [ ] Width: --
   [ ] Height: --
   [ ] Weight: --
   [ ] Slant: --
   [ ] Underline: --
   [ ] Overline: --
   [ ] Strike-through: --
   [ ] Box around text: --
   [ ] Inverse-video: --
   [X] Foreground: Firebrick     [Choose]  (sample)
   [ ] Background: --
   [ ] Stipple: --
   [ ] Inherit: --
   [Hide Unused Attributes]
[Ocultar] Cara de comentario de bloqueo de fuente: [muestra]
   [Estado] : STANDARD.
   Cara del modo Font Lock utilizada para resaltar los comentarios.
   [ ] Familia de fuentes: --
   [ ] Fundición de fuentes: --
   [ ] Ancho: --
   [ ] Altura: --
   [ ] Peso: --
   [ ] Inclinación: --
   [ ] Subrayado: --
   [ ] Sobrelínea: --
   [ ] Tachado: --
   [ ] Recuadro alrededor del texto: --
   [ ] Vídeo inverso: --
   [X] Primer plano: Firebrick [Elegir] (muestra)
   [ ] Fondo: --
   [ ] Estratificación: --
   [ ] Heredar: --
   [Ocultar atributos no utilizados]

Las tres primeras líneas muestran el nombre, el botón ‘[State]’ (‘[Estado]’) y la documentación de la cara. Debajo hay una lista de atributos de la cara. Delante de cada atributo hay una casilla de verificación. Una casilla de verificación llena, ‘[X]’, significa que la cara especifica un valor para este atributo; una casilla de verificación vacía, ‘[ ]’, significa que la cara no especifica ningún valor especial para el atributo. Puedes activar una casilla de verificación para especificar o no su atributo.

Una cara no tiene que especificar todos los atributos; de hecho, la mayoría de las caras sólo especifican unos pocos atributos. En el ejemplo anterior, font-lock-comment-face sólo especifica el color de primer plano. Cualquier atributo no especificado se toma de la cara especial llamada default, cuyos atributos están todos especificados. La cara por defecto es la cara que se utiliza para mostrar cualquier texto que no tenga una cara asignada explícitamente; además, su atributo de color de fondo sirve como color de fondo del marco.

El botón ‘[Hide Unused Attributes]’ (‘[Ocultar Atributos No Usados]’), al final de la lista de atributos, oculta los atributos no especificados de la cara. Cuando se ocultan los atributos, el botón cambia a ‘[Show All the Attributes]’ (‘[Mostrar todos los atributos]'), que revela toda la lista de atributos. El búfer de personalización puede comenzar con los atributos no especificados ocultos, para evitar que la interfaz quede desordenada.

Cuando se especifica un atributo, se puede cambiar su valor de las formas habituales.

Los colores de primer y segundo plano pueden especificarse utilizando nombres de colores o tripletes RGB (véase Colores para las caras). También puede utilizar el botón ‘[Choose]’ (‘[Elegir]’) para cambiar a una lista de nombres de colores; seleccione un color con RETURN (RET) en ese búfer para poner el nombre del color en el campo de valor.

Establecer, guardar y restablecer una cara funcionan como las mismas operaciones para las variables (véase Cambiar una variable).

Una cara puede especificar diferentes apariencias para diferentes tipos de pantallas. Por ejemplo, una cara puede hacer que el texto sea rojo en una pantalla de color, pero utilizar una fuente en negrita en una pantalla monocromática. Para especificar varias apariencias para una cara, seleccione ‘For All Kinds of Displays’ (‘Para todos los tipos de pantallas’) en el menú que se obtiene al invocar ‘[State]’ (‘[Estado]’).

Personalización de elementos específicos

Alt-x customize-option RETURN opción RETURN
(M-x customize-option RET opción RET)
Alt-x customize-variable-variable RETURN opción RETURN
(M-x customize-variable RET opción RET)
Configura un buffer de personalización para una sola opción de usuario, opción.
Alt-x customize-face RETURN face RETURN
(M-x customize-face RET face RET)
Establece un búfer de personalización para una sola cara, face.
Alt-x customize-group RETURN group RETURN
(M-x customize-group RET group RET)
Establece un búfer de personalización para un solo grupo, group.
Alt-x customize-apropos RETURN expreg RETURN
(M-x customize-apropos RET expreg RET)
Establece un búfer de personalización para todos los ajustes y grupos que coincidan con expreg.
Alt-x customize-changed RETURN versión RETURN
(M-x customize-changed RET versión RET)
Establece un buffer de personalización con todas las opciones de usuario, caras y grupos cuyo significado ha cambiado desde (o se ha añadido después de) la versión de Emacs.
Alt-x customize-saved (M-x customize-saved)
Configura un buffer de personalización con todas las opciones que has guardado con los buffers de personalización.
Alt-x customize-unsaved (M-x customize-unsaved)
Establece un buffer de personalización que contiene todos los ajustes que ha establecido pero no ha guardado.

Si quiere personalizar una opción de Usuario en particular, escriba Alt-x customize-option (M-x customize-option). Esto lee el nombre de la variable, y configura el buffer de personalización con sólo esa opción de Usuario. Al introducir el nombre de la variable en el minibuffer, la finalización está disponible, pero sólo para los nombres de las variables que se han cargado en Emacs.

Del mismo modo, puede personalizar una cara específica usando Alt-x customize-face (M-x customize-face). Puede configurar un buffer de personalización para un grupo de personalización específico usando Alt-x customize-group (M-x customize-group).

Alt-x customize-apropos (M-x customize-apropos) solicita un término de búsqueda, ya sea una o varias palabras separadas por espacios o una expresión regular, y establece un búfer de personalización para todas las configuraciones y grupos cargados con nombres coincidentes. Esto es como utilizar el campo de búsqueda en la parte superior del búfer de personalización (véase Grupos de personalización).

Cuando se actualiza a una nueva versión de Emacs, se puede considerar la posibilidad de personalizar nuevas configuraciones, y configuraciones cuyos significados o valores por defecto han cambiado. Para hacer esto, use Alt-x customize-changed (M-x customize-changed) y especifique un número de versión anterior de Emacs usando el minibuffer. Crea un buffer de personalización que muestra todas las configuraciones y grupos cuyas definiciones han sido cambiadas desde la versión especificada, cargándolas si es necesario.

Si cambia las configuraciones y luego decide que el cambio fue un error, puede usar dos comandos para revisar sus cambios. Use Alt-x customize-saved (M-x customize-saved) para personalizar los ajustes que haya guardado. Use Alt-x customize-unsaved (M-x customize-unsaved) para personalizar los ajustes que ha establecido pero no ha guardado.

Temas personalizados

Los temas personalizados son colecciones de ajustes que pueden activarse o desactivarse como una unidad. Puede utilizar los temas personalizados para cambiar fácilmente entre varias colecciones de ajustes, y para transferir dichas colecciones de un ordenador a otro.

Un tema personalizado se almacena como un archivo fuente de Emacs Lisp. Si el nombre del tema personalizado es nombre, el archivo del tema se llama nombre-tema.el. Vea Crear temas personalizados, para el formato de un archivo de tema y cómo hacer uno.

Escriba Alt-x customize-themes (M-x customize-themes) para cambiar a un buffer llamado *Custom Theme* (*Temas personalizados*), que lista los temas personalizados que Emacs conoce. Por defecto, el Editor busca archivos de temas en dos lugares: el directorio especificado por la variable custom-theme-directory (que por defecto es ~/.config/emacs/), y un directorio llamado etc/themes en su instalación de Emacs (ver la variable data-directory). Este último contiene varios temas personalizados distribuidos con Emacs que personalizan las caras del Editor para ajustarse a varios esquemas de color. (Tenga en cuenta, sin embargo, que los temas personalizados no tienen por qué limitarse a este propósito; también pueden utilizarse para personalizar variables).

Si quiere que Emacs busque temas personalizados en algún otro directorio, añada el directorio a la variable de lista custom-theme-load-path. Su valor por defecto es (custom-theme-directory t); aquí, el símbolo custom-theme-directory tiene el significado especial del valor de la variable custom-theme-directory, mientras que t representa el directorio de temas incorporado etc/themes. Los temas listados en el buffer *Custom Themes* (*Temas personalizados*) son los que se encuentran en los directorios especificados por custom-theme-load-path.

En el búfer *Temas personalizados* (*Custom Themes*), puede activar la casilla junto a un tema personalizado para activar o desactivar el tema para la sesión actual de Emacs. Cuando se activa un tema personalizado, todos sus ajustes (variables y caras) tienen efecto en la sesión del Editor. Para aplicar la elección del tema(s) a futuras sesiones de Emacs, escriba Ctrl-x Ctrl-s (C-x C-s, custom-theme-save) o utilice el botón ‘[Save Theme Settings]’ (‘[Guardar los Ajustes del Tema]’).

Cuando activa por primera vez un tema personalizado, Emacs muestra el contenido del archivo del tema y le pregunta si realmente quiere cargarlo. Debido a que cargar un tema personalizado puede ejecutar código Lisp arbitrario, sólo debería decir que sí, si sabe que el tema es seguro; en ese caso, Emacs ofrece recordar en el futuro que el tema es seguro (esto se hace guardando el hash SHA-256 del archivo del tema en la variable custom-safe-themes; si quiere tratar todos los temas como seguros, cambie su valor a t). Los temas que vienen con el Editor (en el directorio etc/themes) están exentos de esta comprobación, y siempre se consideran seguros.

Establecer o guardar temas personalizados funciona en realidad personalizando la variable custom-enabled-themes. El valor de esta variable es una lista de nombres de temas personalizados (como símbolos Lisp, por ejemplo, tango). En lugar de utilizar el búfer *Custom Themes* (*Temas personalizados*) para establecer custom-enabled-themes, puede personalizar la variable utilizando la interfaz de personalización habitual, por ejemplo, con Alt-x customize-option (M-x customize-option). Tenga en cuenta que los temas personalizados no pueden establecer ellos mismos los temas habilitados habitualmente.

Cualquier cambio que realice a través del buffer de personalización tiene prioridad sobre la configuración de los temas. Esto le permite anular fácilmente los ajustes individuales del tema con los que no está de acuerdo. Si los ajustes de dos temas diferentes se superponen, el tema que aparece antes en custom-enabled-themes tiene prioridad. En el búfer de personalización, si un ajuste ha sido cambiado de su valor por defecto por un tema personalizado, su pantalla ‘State’ (‘Estado’) muestra ‘THEMED’ en lugar de ‘STANDARD’.

Puede activar un tema personalizado específico en la sesión actual de Emacs escribiendo Alt-x load-theme (M-x load-theme). Esto pide un nombre de tema, carga el tema desde el archivo de tema, y lo activa. Si un archivo de tema ha sido cargado antes, puede activar el tema sin cargar su archivo escribiendo Alt-x enable-theme (M-x enable-theme). Para desactivar un tema personalizado, escriba Alt-x disable-theme (M-x disable-theme).

Para ver la descripción de un tema personalizado, escriba ? (?) en su línea de buffer Custom Themes (*Temas personalizados*); o escriba Alt-x describe-theme (M-x describe-theme) en cualquier lugar de Emacs e introduzca el nombre del tema.

Creación de temas personalizados

Puede definir un tema personalizado utilizando una interfaz similar al búfer de personalización, escribiendo Alt-x customize-create-theme (M-x customize-create-theme). Esto cambia a un buffer llamado *Custom Theme* (*Tema Personalizado*). También ofrece insertar algunas caras comunes de Emacs en el tema (una conveniencia, ya que los temas personalizados se usan a menudo para personalizar caras). Si responde que no, el tema no contendrá inicialmente ninguna configuración.

Cerca de la parte superior del búfer de *Custom Theme* (*Temas personalizados*), hay campos editables donde puedes introducir el nombre y la descripción del tema. El nombre puede ser cualquier cosa excepto ‘user’ (‘usuario’). La descripción es la que se mostrará cuando invoque Alt-x describe-theme (M-x describe-theme) para el tema. Su primera línea debe ser un breve resumen de una frase; en el buffer hecho por Alt-x customize-themes(M-x customize-themes), esta frase se muestra junto al nombre del tema.

Para añadir una nueva configuración al tema, utilice los botones ‘[Insert Additional Face]’ (‘[Insertar Cara Adicional]’) o ‘[Insert Additional Variable]’ (‘[Insertar Variable Adicional]’). Cada botón lee un nombre de cara o de variable utilizando el minibuffer, con finalización, e inserta una entrada de personalización para la cara o la variable. Puede editar los valores de la variable o los atributos de la cara de la misma manera que en un búfer de personalización normal. Para eliminar una cara o variable del tema, desmarque la casilla de verificación situada junto a su nombre.

Después de especificar las caras y variables del tema personalizado, escriba Ctrl-x Ctrl-s (C-x C-s, custom-theme-write) o utilice el botón ‘[Save Theme]’ del buffer. Esto guarda el archivo del tema, llamado nombre-tema.el, donde nombre es el nombre del tema, en el directorio citado por custom-theme-directory.

Desde el búfer *Tema personalizado* (*Custom Theme*), puede ver y editar un tema personalizado existente activando el botón ‘[Visit Theme]’ (‘[Visitar tema]’) y especificando el nombre del tema. También puede añadir la configuración de otro tema en el buffer, utilizando el botón ‘[Merge-Theme]’ (‘[Combinar Tema]’). Puede importar la configuración de un tema que no sea un tema a un tema personalizado, utilizando el botón ‘[Merge Theme]’ ‘[Fusionar Tema]’ y especificando el tema especial llamado ‘usuario’.

Un archivo de tema es simplemente un archivo fuente de Emacs Lisp, y la carga del tema personalizado funciona cargando el archivo Lisp. Por lo tanto, puede editar un archivo de tema directamente en lugar de usar el buffer *Custom Theme* (Tema Personalizado*). Vea Temas Personalizados en el Manual de Referencia de Emacs Lisp, para más detalles.

Variables

Una variable es un símbolo Lisp que tiene un valor. El nombre del símbolo también se llama nombre de la variable. Un nombre de variable puede contener cualquier carácter que pueda aparecer en un archivo, pero la mayoría de los nombres de variables consisten en palabras ordinarias separadas por guiones.

El nombre de la variable sirve como descripción compacta de su función. La mayoría de las variables también tienen una cadena de documentación, que describe cuál es el propósito de la variable, qué tipo de valor debe tener y cómo se utilizará el valor. Puede ver esta documentación utilizando el comando de ayuda Ctrl-h v (C-h v, describe-variable). Véase Examinar y establecer variables.

Emacs utiliza muchas variables Lisp para el mantenimiento de registros internos, pero las variables más interesantes para un Usuario no programador son las que están pensadas para que los Usuarios las cambien, estas se llaman variables personalizables u opciones de Usuario (ver Interfaz de Personalización Fácil). En las siguientes secciones, describiremos otros aspectos de las variables de Emacs, como por ejemplo, cómo establecerlas fuera de Customize.

Emacs Lisp permite que cualquier variable (con algunas excepciones) tenga cualquier tipo de valor. Sin embargo, muchas variables sólo tienen sentido si se les asignan valores de un determinado tipo. Por ejemplo, sólo los números son valores significativos para kill-ring-max, que especifica la longitud máxima del anillo de muerte (ver Yanking Earlier Kills); si da a kill-ring-max un valor de cadena, comandos como Ctrl-y (C-y, yank) señalarán un error. Por otro lado, algunas variables no se preocupan por el tipo; por ejemplo, si una variable tiene un efecto para valores nulos y otro efecto para valores no nulos, entonces cualquier valor que no sea el símbolo nulo induce el segundo efecto, independientemente de su tipo (por convención, solemos utilizar el valor t, un símbolo que significa "verdadero" (true), para especificar un valor no nulo). Si establece una variable utilizando el búfer de personalización, no debe preocuparse por darle un tipo no válido: el búfer de personalización normalmente sólo permite introducir valores significativos. En caso de duda, utilice Ctrl-h v (C-h v, describe-variable) para comprobar la cadena de documentación de la variable para ver qué tipo de valor espera (véase Examinar y establecer variables).

Examinar y ajustar las variables

Ctrl-h v var RETURN (C-h v var RET)
Muestra el valor y la documentación de la variable var (describe-variable).
Alt-x set-variable RETURN var RETURN valor RETURN
(M-x set-variable RET var RET valor RET)
Cambia el valor de la variable var a valor.

Para examinar el valor de una variable, utilice Ctrl-h v (C-h v, describe-variable). Esto lee un nombre de variable utilizando el minibuffer, con finalización, y muestra tanto el valor como la documentación de la variable. Por ejemplo:

C-h v fill-column RET

muestra algo así:

fill-column is a variable defined in ‘C source code’.
Its value is 70

  Automatically becomes buffer-local when set.
  This variable is safe as a file local variable if its value
  satisfies the predicate ‘integerp’.
  Probably introduced at or before Emacs version 18.

Documentation:
Column beyond which automatic line-wrapping should happen.
Interactively, you can set the buffer local value using C-x f.

You can customize this variable.
fill-column es una variable definida en 'C source code'.
Su valor es 70

  Se convierte automáticamente en local del buffer cuando se establece.
  Esta variable es segura como variable local de archivo si su valor
  satisface el predicado 'integerp'.
  Probablemente se introdujo en la versión 18 de Emacs o antes.

Documentación:
Columna más allá de la cual debe producirse el ajuste de línea automático.
Interactivamente, puedes establecer el valor local del buffer usando C-x f.

Puede personalizar esta variable.

La línea que dice ‘You can customize the variable’ (‘Puede personalizar esta variable’) indica que esta variable es una opción del Usuario. Ctrl-h v (C-h v) no se limita a las opciones de Usuario; también permite variables no personalizables.

La forma más conveniente de establecer una variable específica personalizable es con Alt-x set-variable (M-x set-variable). Esto lee el nombre de la variable con el minibuffer (con finalización), y luego lee una expresión Lisp para el nuevo valor usando el minibuffer una segunda vez (puede insertar el valor antiguo en el minibuffer para editarlo mediante Alt-n (M-n)). Por ejemplo:

M-x set-variable RET fill-column RET 75 RET

fija el valor de fill-column en 75.

Alt-x set-variable (M-x set-variable) está limitado a las variables personalizables, pero puede establecer cualquier variable con una expresión Lisp como esta:

(setq fill-column 75)

Para ejecutar tal expresión, escriba Alt-: eval-expression (M-:, eval-expression) e introduzca la expresión en el minibuffer (véase Evaluación de expresiones Emacs Lisp). Alternativamente, vaya al buffer *scratch*, escriba la expresión, y luego escriba Ctrl-j (C-j) (vea Bufferes de Interacción Lisp).

La configuración de variables, al igual que todos los medios de personalización de Emacs, salvo que se indique lo contrario, sólo afecta a la sesión actual del Editor. La única manera de alterar la variable en futuras sesiones es poner algo en su fichero de inicialización (ver El fichero de inicialización de Emacs).

Ganchos

Los ganchos son un mecanismo importante para personalizar Emacs. Un gancho es una variable Lisp que contiene una lista de funciones, que serán llamadas en alguna ocasión bien definida. (A esto se lo llama correr (ejecutar) el gancho). Las funciones individuales de la lista se denominan funciones gancho del gancho. Por ejemplo, el gancho kill-emacs-hook se ejecuta justo antes de salir de Emacs (ver Salir de Emacs).

La mayoría de los hooks (ganchos) son hooks normales. Esto significa que cuando Emacs ejecuta el gancho, llama a cada función del gancho por turnos, sin argumentos. Hemos hecho un esfuerzo para mantener la mayoría de los hooks normales, para que pueda usarlos de manera uniforme. Cada variable cuyo nombre termina en ‘-hook’ es un hook normal.

Algunos ganchos son anormales. Sus nombres terminan en ‘-functions’, en lugar de ‘-hook’ (algunos códigos antiguos también pueden usar el sufijo obsoleto ‘-hooks’). Lo que hace que estos ganchos sean anormales es la forma en que se llaman sus funciones, quizás se les dan argumentos, o quizás los valores que devuelven se utilizan de alguna manera. Por ejemplo, find-file-not-found-functions es anormal porque tan pronto como una función hook devuelve un valor no nulo, el resto no es llamado (ver Visitando Archivos). La documentación de cada variable hook anormal explica cómo se utilizan sus funciones.

Puede establecer una variable gancho con setq como cualquier otra variable Lisp, pero la forma recomendada de añadir una función a un gancho (ya sea normal o anormal) es utilizar add-hook, como se muestra en los siguientes ejemplos. Vea Hooks en The Emacs Lisp Reference Manual, para más detalles.

La mayoría de los modos principales ejecutan uno o más ganchos de modo como el último paso de la inicialización. Los ganchos de modo son una forma conveniente de personalizar el comportamiento de los modos individuales; siempre son normales. Por ejemplo, así es como se configura un gancho para activar el modo de Relleno Automático en el modo Texto y otros modos basados en el modo Texto:

(add-hook 'text-mode-hook 'auto-fill-mode)

Esto funciona llamando a auto-fill-mode, que activa el modo menor cuando no se suministra ningún argumento (véase Modos menores). A continuación, suponga que no desea activar el modo de relleno automático en el modo LaTeX, que es uno de los modos basados en el modo Texto. Puede hacerlo con la siguiente línea adicional:

(add-hook 'latex-mode-hook (lambda () (auto-fill-mode -1)))

Aquí hemos usado la macro especial lambda para construir una función anónima (ver Expresiones Lambda en el Manual de Referencia de Emacs Lisp), que llama a auto-fill-mode con un argumento de -1 para deshabilitar el modo menor. Como el modo LaTeX ejecuta latex-mode-hook después de ejecutar text-mode-hook, el resultado deja el modo de autorelleno desactivado.

He aquí un ejemplo más complejo, que muestra cómo utilizar un gancho para personalizar la sangría del código C:

(setq my-c-style
  '((c-comment-only-line-offset . 4)
    (c-cleanup-list . (scope-operator
                       empty-defun-braces
                       defun-close-semi))))

(add-hook 'c-mode-common-hook
  (lambda () (c-add-style "my-style" my-c-style t)))

Los ganchos de modo principal también se aplican a otros modos principales derivados del modo original (véase Modos derivados en el Manual de referencia de Emacs Lisp). Por ejemplo, el modo HTML se deriva del modo Texto (véase Modos SGML y HTML); cuando se activa el modo HTML, se ejecuta text-mode-hook antes de ejecutar html-mode-hook. Esto proporciona una forma conveniente de utilizar un único gancho para afectar a varios modos relacionados. En particular, si quiere aplicar una función hook a cualquier modo de lenguaje de programación, añádala a prog-mode-hook; el modo Prog es un modo mayor que no hace otra cosa que permitir que otros modos mayores hereden de él, exactamente para este propósito.

Es mejor diseñar sus funciones hook de manera que el orden en que se ejecuten no importe. Cualquier dependencia del orden es buscarse problemas. Sin embargo, el orden es predecible: las funciones hook se ejecutan en el orden en que aparecen en el hook.

Si juega a añadir varias versiones diferentes de una función hook llamando a add-hook una y otra vez, recuerde que todas las versiones que haya añadido permanecerán juntas en la variable hook. Puede borrar las funciones individuales llamando a remove-hook, o hacer (setq hook-variable nil) para eliminar todo.

Si la variable hook es buffer-local, se utilizará esta variable en lugar de la variable global. Sin embargo, si la variable buffer-local contiene el elemento t, la variable hook global se ejecutará también.

Variables locales

Alt-x make-local-variable RETURN var RETURN
(M-x make-local-variable RET var RET)
Hace que la variable var tenga un valor local en el buffer actual.
Alt-x kill-local-variable RETURN var RETURN
(M-x kill-local-variable RET var RET)
Hace que la variable var utilice su valor global en el buffer actual.
Alt-x make-variable-buffer-local RETURN var RETURN
(M-x make-variable-buffer-local RET var RET)
Marca la variable var para que al establecerla se haga local en el buffer actual en ese momento.

Casi cualquier variable puede hacerse local a un búfer específico de Emacs. Esto significa que su valor en ese buffer es independiente de su valor en otros buffers. Unas pocas variables son siempre locales en cada buffer. Todas las demás variables del Editor tienen un valor global que está en vigor en todos los búferes que no han hecho local la variable.

Alt-x make-local-variable (M-x make-local-variable) lee el nombre de una variable y la hace local en el buffer actual. El cambio de su valor posteriormente en este buffer no afectará a otros, y los cambios en su valor global no afectarán a este buffer.

Alt-x make-variable-buffer-local (M-x make-variable-buffer-local) marca una variable para que se convierta en local automáticamente cada vez que se establezca. Más precisamente, una vez que una variable ha sido marcada de esta manera, las formas habituales de establecer la variable automáticamente primero hacen make-local-variable. A estas variables las llamamos variables per-buffer. Muchas variables en Emacs son normalmente per-buffer; la cadena de documento de la variable le dice cuando esto es así. El valor global de una variable por búfer normalmente no es efectivo en ningún búfer, pero sigue teniendo un significado: es el valor inicial de la variable para cada nuevo búfer.

Los modos mayores (ver Modos Mayores) siempre hacen que las variables sean locales al buffer antes de establecer las variables. Por eso, cambiar los modos mayores en un búfer no tiene efecto en otros búferes. Los modos menores también funcionan estableciendo variables, normalmente, cada modo menor tiene una variable de control que no es nula cuando el modo está activado (ver Modos Menores). Para muchos modos menores, la variable de control es por búfer, y por lo tanto siempre es local al búfer. Si no, puede hacerla local en un búfer específico como cualquier otra variable.

Unas pocas variables no pueden ser locales a un búfer porque siempre son locales a cada pantalla en su lugar (ver Múltiples pantallas). Si intenta hacer una de estas variables local en un buffer, obtendrá un mensaje de error.

Alt-x kill-local-variable (M-x kill-local-variable) hace que una variable especificada deje de ser local al buffer actual. El valor global de la variable, a partir de ahora, está en vigor en este buffer. Al establecer el modo mayor se matan todas las variables locales del buffer excepto algunas variables especialmente marcadas como locales permanentes.

Para establecer el valor global de una variable, independientemente de que la variable tenga un valor local en el buffer actual, se puede utilizar la construcción Lisp: setq-default. Esta construcción se utiliza igual que setq, pero establece los valores globales de las variables en lugar de sus valores locales (si los hay). Cuando el buffer actual tiene un valor local, el nuevo valor global puede no ser visible hasta que se cambie a otro buffer. He aquí un ejemplo:

(setq-default fill-column 75)

setq-default es la única manera de establecer el valor global de una variable que ha sido marcada con make-variable-buffer-local.

Los programas Lisp pueden utilizar default-value para consultar el valor por defecto de una variable. Esta función toma un símbolo como argumento y devuelve su valor por defecto. El argumento se evalúa; normalmente hay que citarlo explícitamente. Por ejemplo, así es como se obtiene el valor por defecto de fill-column:

(default-value 'fill-column)

Variables locales en archivos

Un archivo puede especificar valores de variables locales para usar cuando se edita el archivo con Emacs. Al visitar el archivo o establecer un modo principal se comprueba si hay especificaciones de variables locales; automáticamente se convierten en variables locales del buffer y se establecen los valores especificados en el archivo.

Las variables locales del archivo anulan las variables locales del directorio (ver Variables locales por directorio), si se especifica alguna para el directorio de un archivo.

Especificación de variables de archivos

Hay dos maneras de especificar los valores de las variables locales del archivo: en la primera línea, o con una lista de variables locales. A continuación se explica cómo especificarlas en la primera línea:

-*- mode: modename; var: value; … -*-

Puede especificar cualquier número de pares variable/valor de esta manera, cada par con dos puntos y punto y coma. El par variable/valor especial mode: modename;, si está presente, especifica un modo principal (sin el sufijo "-mode"). Los valores se utilizan literalmente y no se evalúan.

Puede utilizar Alt-x add-file-local-variable-prop-line (M-x add-file-local-variable-prop-line) en lugar de añadir entradas a mano. Este comando solicita una variable y un valor, y los añade a la primera línea de la forma adecuada. Alt-x delete-file-local-variable-prop-line (M-x delete-file-local-variable-prop-line) solicita una variable y borra su entrada de la línea. El comando Alt-x M-x copy-dir-locals-to-file-locals-prop-line (M-x copy-dir-locals-to-file-locals-prop-line) copia las variables locales del directorio actual a la primera línea (ver Variables locales por directorio).

Aquí hay un ejemplo de primera línea que especifica el modo Lisp y establece dos variables con valores numéricos:

;; -*- mode: Lisp; fill-column: 75; comment-column: 50; -*-

Además de mode, otras palabras clave que tienen un significado especial como variables de archivo son coding, unibyte y eval. Estas se describen a continuación.

En los scripts del shell, la primera línea se utiliza para identificar el intérprete del script, por lo que no puede poner ninguna variable local allí. Para acomodar esto, Emacs busca especificaciones de variables locales en la segunda línea si la primera línea especifica un intérprete. Lo mismo ocurre con las páginas de manual que comienzan con la cadena mágica ‘'\"’ para especificar una lista de preprocesadores troff (no todos lo hacen, sin embargo).

Además de utilizar una línea ‘-*-’, puede definir las variables locales del archivo utilizando una lista de variables locales cerca del final del archivo. El inicio de la lista de variables locales no debe estar a más de 3000 caracteres del final del archivo, y debe estar en la última página si el archivo está dividido en páginas.

Si un fichero tiene tanto una lista de variables locales como una línea ‘-*-’, Emacs procesa primero todo lo que hay en la línea ‘-*-’ y después todo lo que hay en la lista de variables locales. La excepción a esto es una especificación de modo mayor. El Editor aplica esto primero, dondequiera que aparezca, ya que la mayoría de los modos mayores matan todas las variables locales como parte de su inicialización.

Una lista de variables locales comienza con una línea que contiene la cadena ‘Local Variables:’, y termina con una línea que contiene la cadena 'End:’ (‘Fin’). En medio vienen los nombres y valores de las variables, un conjunto por línea, así:

/* Local Variables:  */
/* mode: c           */
/* comment-column: 0 */
/* End:              */

En este ejemplo, cada línea comienza con el prefijo ‘/*’ y termina con el sufijo ‘*/’. Emacs reconoce el prefijo y el sufijo al encontrarlos rodeando la cadena mágica ‘Local Variables:’, en la primera línea de la lista; luego los descarta automáticamente de las demás líneas de la lista. La razón habitual para utilizar un prefijo y/o un sufijo es la de incrustar la lista de variables locales en un comentario, para que no confunda a otros programas a los que está destinado el archivo. El ejemplo anterior es para el lenguaje de programación C, donde los comentarios comienzan con ‘/*’ y terminan con ‘*/’.

Si algún texto no relacionado puede parecerle a Emacs una lista de variables locales, puede contrarrestarlo insertando un carácter de alimentación de forma (un delimitador de página, ver Páginas) después de ese texto. El Editor sólo busca variables locales de archivo en la última página de un archivo, después del último delimitador de página.

En lugar de escribir la lista de variables locales directamente, puede utilizar el comando Alt-x add-file-local-variable (M-x add-file-local-variable). Esto solicita una variable y un valor, y los agrega a la lista, añadiendo la cadena ‘Local Variables:’ y los marcadores de inicio y fin según sea necesario. El comando Alt-x delete-file-local-variable (M-x delete-file-local-variable) borra una variable de la lista. Alt-x copy-dir-locals-to-file-locals (M-x copy-dir-locals-to-file-locals) copia las variables locales de directorio a la lista (ver Variables locales por directorio).

# Local Variables:
# compile-command: "cc foo.c -Dfoo=bar -Dhack=whatever \
#   -Dmumble=blaah"
# End:

Algunos nombres tienen significados especiales en una lista de variables locales:

  • mode: habilita el modo principal especificado.
  • eval: evalúa la expresión Lisp especificada (el valor devuelto por esa expresión se ignora).
  • eval: evalúa la expresión Lisp especificada (el valor devuelto por esa expresión se ignora).
  • bcoding: especifica el sistema de codificación para la conversión del código de caracteres de este archivo. Véase Sistemas de codificación.
  • bunibyte: dice que se cargue o compile un fichero de Emacs Lisp en modo unibyte, si el valor es t. Vea Disabling Multibyte Characters en GNU Emacs Lisp Reference Manual.

Estas cuatro palabras clave no son realmente variables; establecerlas en cualquier otro contexto no tienen ningún significado especial.

No utilice la palabra clave mode para los modos menores. Para activar o desactivar un modo menor en una lista de variables locales, utilice la palabra clave eval con una expresión Lisp que ejecute la orden mode (véase Modos menores). Por ejemplo, la siguiente lista de variables locales habilita el modo ElDoc (ver Emacs Lisp Documentation Lookup) llamando a eldoc-mode sin argumento (llamándolo con un argumento de 1 haría lo mismo), y desactiva el modo Font Lock (ver Font Lock mode) llamando a font-lock-mode con un argumento de -1.

;; Local Variables:
;; eval: (eldoc-mode)
;; eval: (font-lock-mode -1)
;; End:

Tenga en cuenta, sin embargo, que a menudo es un error especificar los modos menores de esta manera. Los modos menores representan las preferencias individuales de los Usuarios, y puede ser inapropiado imponer sus preferencias a otro Usuario que pueda editar el archivo. Si desea activar o desactivar automáticamente un modo menor en función de la situación, a menudo es mejor hacerlo en un hook de modo mayor (ver Hooks).

Use el comando Alt-x normal-mode (M-x normal-mode) para restablecer las variables locales y el modo mayor de un búfer de acuerdo con el nombre del archivo y su contenido, incluyendo la lista de variables locales si la hay. Ver Elección de los modos de archivo.

Seguridad de las variables de archivo

Las variables locales de archivo pueden ser peligrosas; cuando visitas el archivo de otra persona, no se sabe lo que su lista de variables locales podría hacer a tu Emacs. Valores inapropiados de la "variable" eval, y otras variables como load-path, podrían ejecutar código Lisp que no tenías intención de ejecutar.

Por lo tanto, cada vez que Emacs encuentra valores de variables locales de archivo que no se sabe si son seguros, muestra toda la lista de variables locales del archivo, y le pide confirmación antes de establecerlas. Puede teclear y (y) o SPACE (SPC) para poner en marcha la lista de variables locales, o n (n) para ignorarla. Cuando Emacs se ejecuta en modo batch (ver Opciones iniciales), no puede realmente preguntarle, así que asume la respuesta n.

Emacs normalmente reconoce ciertos pares variable/valor como seguros. Por ejemplo, es seguro dar a comment-column o fill-column cualquier valor entero. Si un fichero especifica sólo pares variable/valor conocidos como seguros, Emacs no pide confirmación antes de establecerlos. De lo contrario, puede decirle al Editor que registre todos los pares de variables/valores de este archivo como seguros, escribiendo ! (!) en el prompt de confirmación. Cuando Emacs encuentre estos pares variable/valor posteriormente, en el mismo fichero o en otros, asumirá que son seguros

También puede decirle a Emacs que ignore permanentemente todos los pares variable/valor en el archivo, escribiendo i (i) en el prompt de confirmación, estos pares serán ignorados a partir de entonces en este archivo y en todos los demás.

Algunas variables, como load-path, se consideran particularmente arriesgadas: rara vez hay alguna razón para especificarlas como variables locales, y cambiarlas puede ser peligroso. Si un archivo contiene sólo variables locales de riesgo, Emacs no ofrece ni acepta ! (!) como entrada en el prompt de confirmación. Si algunas de las variables locales de un fichero son arriesgadas, y otras son sólo potencialmente inseguras, puede introducir ! (!) en el prompt. Se aplica a todas las variables, pero sólo marca las que no son peligrosas como seguras para el futuro. Si realmente quiere registrar valores seguros para las variables de riesgo, hágalo directamente personalizando ‘safe-local-variable-values’ (ver Interfaz de Personalización Fácil). Del mismo modo, si quiere registrar valores de variables de riesgo que deben ser ignorados permanentemente, personalice ignored-local-variable-values.

La variable enable-local-variables le permite cambiar la forma en que Emacs procesa las variables locales. Su valor por defecto es t, que especifica el comportamiento descrito anteriormente. Si es nil, Emacs simplemente ignora todas las variables locales de los archivos. :safe significa que sólo utiliza los valores seguros e ignora el resto. Cualquier otro valor dice que consulte cada archivo que tenga variables locales, sin intentar determinar si los valores son conocidos como seguros.

La variable enable-local-eval controla si Emacs procesa las variables eval. Las tres posibilidades para el valor de la variable son t, nil, y cualquier otra cosa, igual que para enable-local-variables. El valor por defecto es maybe, que no es ni t ni nil, así que normalmente Emacs pide confirmación sobre el procesamiento de las variables eval.

Como excepción, Emacs nunca pide confirmación para evaluar cualquier forma eval si esa forma ocurre dentro de la variable safe-local-eval-forms.

Variables locales por directorio

A veces, puede desear definir el mismo conjunto de variables locales para todos los archivos de un determinado directorio y sus subdirectorios, como el árbol de directorios de un gran proyecto de software. Esto puede lograrse con variables locales de directorio. Las variables locales de archivo anulan las variables locales de directorio, por lo que si algunos de los archivos de un directorio necesitan ajustes especializados, puede especificar los ajustes para la mayoría de los archivos del directorio en las variables de directorio, y luego definir las variables locales de archivo en unos pocos archivos que necesitan los ajustes generales anulados.

La forma habitual de definir las variables locales de directorio es poner un fichero llamado .dir-locals.el (22) en un directorio. Siempre que Emacs visite cualquier fichero en ese directorio o en cualquiera de sus subdirectorios, aplicará las variables locales de directorio especificadas en .dir-locals.el, como si hubieran sido definidas como variables locales de fichero para ese fichero (ver Variables locales en ficheros). El Editor busca .dir-locals.el empezando en el directorio del fichero visitado, y moviéndose hacia arriba en el árbol de directorios. Para evitar la ralentización, esta búsqueda se omite para los archivos remotos. Si es necesario, la búsqueda puede ser extendida para archivos remotos estableciendo la variable enable-remote-dir-locals a t.

Nota

(22) En MS-DOS, el nombre de este archivo debe ser _dir-locals.el, debido a las limitaciones de los sistemas de archivos de DOS. Si el sistema de archivos está limitado a 8+3 nombres de archivo, el nombre del archivo será truncado por el SO a _dir-locals.el.

También puede usar .dir-locals-2.el; si se encuentra, Emacs lo carga además de .dir-locals.el. Esto es útil cuando .dir-locals.el está bajo control de versiones en un repositorio compartido y no puede ser usado para personalizaciones.

El archivo .dir-locals.el debe contener una lista especialmente construida, que mapea los nombres de los modos principales (símbolos) a alists (ver Association Lists en The Emacs Lisp Reference Manual). Cada entrada de la lista consiste en un nombre de variable y el valor local del directorio que se asigna a esa variable, cuando el modo principal especificado está activado. En lugar de un nombre de modo, puede especificar ‘nil', lo que significa que la lista se aplica a cualquier modo; o puede especificar un subdirectorio (una cadena), en cuyo caso la lista se aplica a todos los archivos de ese subdirectorio.

Este es un ejemplo de un archivo .dir-locals.el:

(nil . ((indent-tabs-mode . t)
        (fill-column . 80)
        (mode . auto-fill)))
(c-mode . ((c-file-style . "BSD")
           (subdirs . nil)))
("src/imported"
 . ((nil . ((change-log-default-name
             . "ChangeLog.local"))))))

Esto establece las variables ‘indent-tabs-mode’ y fill-column para cualquier archivo en el árbol de directorios, y el estilo de indentación para cualquier archivo fuente C. El elemento especial mode especifica el modo menor a habilitar. Así, (mode . auto-fill) especifica que el modo menor auto-fill-mode debe estar habilitado. El elemento special subdirs no es una variable, sino una palabra clave especial que indica que la configuración del modo C sólo debe aplicarse en el directorio actual, no en ningún subdirectorio. Finalmente, especifique un nombre de archivo ChangeLog diferente para cualquier archivo en el subdirectorio src/importado.

Si el archivo .dir-locals.el contiene múltiples valores diferentes para una variable utilizando diferentes nombres de modo o directorios, los valores se aplicarán en un orden tal que los valores para modos más específicos tengan prioridad sobre los modos más genéricos. Los valores especificados bajo un directorio tienen aún más prioridad. Por ejemplo:

((nil . ((fill-column . 40)))
 (c-mode . ((fill-column . 50)))
 (prog-mode . ((fill-column . 60)))
 ("narrow-files" . ((nil . ((fill-column . 20))))))

Los archivos que utilizan c-mode también coinciden con prog-mode porque el primero hereda del segundo. Sin embargo, el valor utilizado para la columna de relleno en los archivos C será 50 porque el nombre del modo es más específico que prog-mode. Los archivos que utilicen otros modos que hereden de prog-mode utilizarán 60. Cualquier fichero bajo el directorio narrow-files utilizará el valor aunque utilice c-mode porque las entradas de directorio tienen prioridad sobre las entradas de modo.

Puede especificar las variables mode, eval, y unibyte en su .dir-locals.el, y tienen el mismo significado que tendrían en las variables locales de archivo. coding no puede ser especificada como una variable local de directorio. Vea Variables locales en archivos.

La clave especial auto-mode-alist en un .dir-locals.el le permite establecer el modo principal de un archivo. Funciona de forma muy parecida a la variable auto-mode-alist (ver Elección de los modos de los archivos). Por ejemplo, así es como puede decirle a Emacs que los archivos fuente .def en este directorio deben estar en modo C:

((auto-mode-alist . (("\\.def\\'" . c-mode))))

En lugar de editar el archivo .dir-locals.el a mano, puede utilizar el comando Alt-x add-dir-local-variable (M-x add-dir-local-variable). Esto solicita un modo o subdirectorio, la variable y el valor, y añade la entrada que define la variable directory-local. Alt-x delete-dir-local-variable (M-x delete-dir-local-variable) borra una entrada. Alt-x copy-file-locals-to-dir-locals (M-x copy-file-locals-to-dir-locals) copia las variables file-local del fichero actual en .dir-locals.el.

Otro método para especificar variables locales de directorio es definir un grupo de pares de variables/valores en una clase de directorio, usando la función dir-locals-set-class-variables; luego, dígale a Emacs qué directorios corresponden a la clase usando la función dir-locals-set-directory-class. Estas llamadas a la función normalmente van en su fichero de inicialización (ver El fichero de inicialización de Emacs). Este método es útil cuando no puede poner .dir-locals.el en un directorio por alguna razón. Por ejemplo, puede aplicar la configuración a un directorio no escribible de esta manera:

(dir-locals-set-class-variables 'unwritable-directory
   '((nil . ((some-useful-setting . value)))))

(dir-locals-set-directory-class
   "/usr/include/" 'unwritable-directory)

Si una variable tiene especificado tanto un valor local de directorio como un valor local de archivo, el valor local de archivo tiene efecto. Las variables locales de directorio inseguras se manejan de la misma manera que las variables locales de archivo inseguras (ver Seguridad de las variables de archivo).

Las variables locales de directorio también tienen efecto en ciertos búferes que no visitan un archivo directamente sino que realizan trabajos dentro de un directorio, como los búferes Dired (ver Dired, el editor de directorios).

Variables locales por conexión

La mayoría de las variables reflejan la situación en la máquina local. A menudo, deben utilizar un valor diferente cuando se opera en buffers con un directorio remoto por defecto. Piense en el shell que debe aplicarse al llamar al shell, puede ser /bin/bash en su máquina local, y /bin/ksh en una máquina remota.

Esto puede lograrse con variables locales de conexión. Las variables locales de directorio y archivo anulan las variables locales de conexión. Las variables locales de conexión inseguras se manejan de la misma manera que las variables locales de archivo inseguras (ver Seguridad de las variables de archivo).

Las variables locales de conexión se declaran como un grupo de pares de variables/valores en un perfil, utilizando la función connection-local-set-profile-variables. La función connection-local-set-profiles activa los perfiles para un criterio dado, identificando una máquina remota:

(connection-local-set-profile-variables 'remote-ksh
   '((shell-file-name . "/bin/ksh")
     (shell-command-switch . "-c")))

(connection-local-set-profile-variables 'remote-bash
   '  ((shell-file-name . "/bin/bash")
     (shell-command-switch . "-c")))

(connection-local-set-profiles
   '(:application tramp :machine "remotemachine") 'remote-ksh)

Este código declara dos perfiles diferentes, remote-ksh y remote-bash. El perfil remote-ksh se aplica a todos los buffers que tienen un directorio remoto por defecto que coincide con la regexp "remotemachine" como nombre de host. Este criterio también puede discriminar por las propiedades :protocol (este es el método Tramp) o :user (un nombre de usuario remoto). El criterio nil coincide con todos los buffers con un directorio remoto por defecto.

Personalización de las combinaciones de teclas

Esta sección describe las combinaciones de teclas (key bindings), que asignan teclas a comandos, y los mapas de teclas (keymaps), que registran las combinaciones de teclas. También se explica cómo personalizar las combinaciones de teclas, lo que se hace editando el archivo init (ver Reencuadrar las teclas en el archivo init).

Dado que la mayoría de los modos definen sus propias combinaciones de teclas, la activación de un modo puede anular sus combinaciones de teclas personalizadas. Un pequeño número de teclas están reservadas para las combinaciones definidas por el Usuario, y no deberían ser utilizadas por los modos, por lo que las combinaciones de teclas que utilizan esas teclas son más seguras en este sentido. Las secuencias de teclas reservadas son las que consisten en Ctrl-c (C-c) seguida de una letra (ya sea mayúscula o minúscula), y las teclas de función F5 a F9 sin modificadores (ver Teclas modificadoras).

Mapas de teclas

Como se ha descrito en Teclas y Comandos, cada comando de Emacs es una función Lisp cuya definición permite su uso interactivo. Como toda función Lisp, un comando tiene un nombre de función, que normalmente consiste en letras minúsculas y guiones.

Una secuencia de teclas (clave (key), para abreviar) es una secuencia de eventos de entrada que tienen un significado como unidad. Los eventos de entrada incluyen caracteres, teclas de función y botones del ratón: todas las entradas que se pueden enviar al ordenador. Una secuencia de teclas adquiere su significado a partir de su vinculación (binding) que dice qué comando ejecuta.

Los enlaces entre las secuencias de teclas y las funciones de los comandos se registran en estructuras de datos llamadas mapas de teclas (keymaps). Emacs tiene muchos de ellos, cada uno utilizado en ocasiones particulares.

El mapa de teclado global (global keymap) es el más importante porque siempre está en vigor. El mapa de teclado global define las teclas para el modo fundamental (ver Modos Mayores); la mayoría de estas definiciones son comunes a la mayoría o a todos los modos mayores. Cada modo mayor o menor puede tener su propio mapa de teclas que anula las definiciones globales de algunas teclas.

Por ejemplo, un carácter de autoinserción como la g se autoinserta porque el mapa de teclas global lo vincula con el comando self-insert-command. Los caracteres de edición estándar de Emacs, como Ctrl-a (C-a), también obtienen sus significados estándar del mapa de teclas global. Los comandos para volver a vincular las teclas, como Alt-x global-set-key (M-x global-set-key), funcionan almacenando la nueva vinculación en el lugar apropiado del mapa global (ver Cambiar las vinculaciones de las teclas de forma interactiva). Para ver las combinaciones de teclas actuales, utilice el comando Ctrl-h b (C-h b).

La mayoría de los teclados modernos tienen teclas de función además de las de carácter. Las teclas de función envían eventos de entrada al igual que las teclas de carácter, y los mapas de teclado pueden tener enlaces para ellas. Las secuencias de teclas pueden mezclar teclas de función y caracteres. Por ejemplo, si su teclado tiene una tecla de función Home (Home), Emacs puede reconocer secuencias de teclas como Ctrl-x Home (C-x Home). Incluso puede mezclar eventos del ratón con eventos del teclado, como Shift-- (S-down-ratón-1).

En los terminales de texto, tipear una tecla de función envía al ordenador una secuencia de caracteres; los detalles precisos de la secuencia dependen de la tecla de función y del tipo de terminal. (A menudo la secuencia comienza con ESC[. (ESC [.)) Si Emacs entiende su tipo de terminal correctamente, automáticamente maneja tales secuencias como eventos de entrada individuales.

Las secuencias de teclas que consisten en Ctrl-c (C-c) seguidas de una letra (mayúscula o minúscula; ASCII o no ASCII) están reservadas para los Usuarios. El propio Emacs nunca enlazará esas secuencias de teclas, y las extensiones del Editor deberían evitar enlazarlas. En otras palabras, los Usuarios pueden enlazar secuencias de teclas como Ctrl-c a (C-c a) o Ctrl-c ç (C-c ç) y confiar en que éstas nunca serán ensombrecidas por otros enlaces de Emacs.

Mapas de teclas con prefijo

Internamente, Emacs registra sólo eventos individuales en cada mapa de teclas (keymaps). Interpretar una secuencia de teclas de múltiples eventos implica una cadena de mapas de teclas: el primer mapa de teclas da una definición para el primer evento, que es otro mapa de teclas, que se usa para buscar el segundo evento en la secuencia, y así sucesivamente. Así, una tecla de prefijo como Ctrl-x (C-x) o ESC (ESC) tiene su propio mapa de teclas, que contiene la definición del evento que sigue inmediatamente a ese prefijo.

La definición de una tecla de prefijo suele ser el mapa de teclas que se utiliza para buscar el siguiente evento. La definición también puede ser un símbolo Lisp cuya definición de función es el siguiente mapa de teclas; el efecto es el mismo, pero proporciona un nombre de comando para la tecla de prefijo que puede usarse como una descripción de para qué sirve la tecla de prefijo. Así, el enlace de Ctrl-x (C-x) es el símbolo Control-X-prefix, cuya definición de función es el mapa de teclas para los comandos Ctrl-x (C-x). Las definiciones de Ctrl-c (C-c), Ctrl-x (C-x), Ctrl-h (C-h) y ESC (ESC) como teclas de prefijo aparecen en el mapa global, por lo que estas teclas de prefijo están siempre disponibles.

Aparte de las teclas de prefijo ordinarias, hay una "tecla de prefijo" ficticia que representa la barra de menús; véase Barra de menús en el Manual de referencia de Emacs Lisp, para información especial sobre los enlaces de las teclas de la barra de menús. Los eventos de los botones del ratón que invocan menús emergentes son también teclas de prefijo; vea Menu Keymaps en The Emacs Lisp Reference Manual, para más detalles.

Algunos mapas de teclas de prefijo se almacenan en variables con nombres:

  • ctl-x-map es el nombre de la variable para el mapa utilizado para los caracteres que siguen a Ctrl-x (C-x).
  • help-map es para los caracteres que siguen a Ctrl-h (C-h).
  • esc-map es para los caracteres que siguen a ESC (ESC). Por lo tanto, todos los caracteres Meta están definidos por este mapa.
  • ctl-x-4-map es para los caracteres que siguen a Ctrl-x 4 (C-x 4).
  • mode-specific-map es para los caracteres que siguen a Ctrl-c (C-c).
  • project-prefix-map es para los caracteres que siguen a Ctrl-x p (C-x p), y se utiliza para los comandos relacionados con los proyectos (véase Trabajar con proyectos).

Mapas clave locales

Hasta ahora, hemos explicado los entresijos del mapa global. Los principales modos personalizan Emacs proporcionando sus propias combinaciones de teclas en mapas de teclado locales. Por ejemplo, el modo C sobreescribe TAB (TAB) para hacer la sangría de la línea actual para el código C. Los modos menores también pueden tener mapas de teclado locales; siempre que un modo menor esté en efecto, las definiciones de su mapa de teclado anulan tanto el mapa de teclado local del modo mayor como el mapa de teclado global. Además, las porciones de texto en el buffer pueden especificar sus propios mapas de teclado, que anulan todos los demás mapas de teclado.

Un mapa de teclado local puede redefinir una clave como clave de prefijo definiéndola como mapa de teclado de prefijo. Si la tecla también se define globalmente como prefijo, sus definiciones local y global (ambos mapas de teclas) se combinan efectivamente: ambas definiciones se utilizan para buscar el evento que sigue a la tecla de prefijo. Por ejemplo, si un mapa de teclado local define Ctrl-c (C-c) como prefijo, y ese mapa de teclado define Ctrl-z (C-z) como comando, esto proporciona un significado local para Ctrl-c Ctrl-z (C-c C-z). Esto no afecta a otras secuencias que empiecen por Ctrl-c (C-c); si esas secuencias no tienen sus propios enlaces locales, sus enlaces globales siguen vigentes.

Otra forma de pensar en esto es que Emacs maneja una secuencia de teclas de múltiples eventos buscando en varios mapas de teclas, uno por uno, un enlace de toda la secuencia de teclas. Primero comprueba los mapas de teclado de los modos menores que están activados, luego comprueba el mapa de teclado del modo mayor, y luego comprueba el mapa de teclado global. Esto no es exactamente como funciona la búsqueda de teclas, pero es suficiente para entender los resultados en circunstancias ordinarias.

Mapas de teclas del minibuffer

El minibuffer tiene su propio conjunto de mapas de teclas locales; contienen varios comandos de finalización y salida.

  • minibuffer-local-map se utiliza para la entrada ordinaria (sin finalización).
  • minibuffer-local-ns-map es similar, excepto que SPACE (SPC) sale igual que RETURN (RET).
  • minibuffer-local-completion-map es para la finalización permisiva.
  • minibuffer-local-must-map es para la terminación estricta y para la terminación cautelosa.
  • minibuffer-local-filename-completion-map es como los dos anteriores, pero específicamente para la finalización del nombre del archivo. No vincula SPC (SPC).

Por defecto, TAB (TAB), SPACE (SPC) y ? (?) completan en minibuffer-local-completion-map. Si suele completar sobre colecciones que tienen elementos con espacios o signos de interrogación, puede ser conveniente deshabilitar la compleción en esas teclas poniendo esto en su archivo init:

(define-key minibuffer-local-completion-map " " 'self-insert-command)
(define-key minibuffer-local-completion-map "?" 'self-insert-command)

Cambiar los enlaces de las teclas de forma interactiva

La forma de redefinir una tecla de Emacs es cambiar su entrada en un mapa de teclas. Puede cambiar el mapa de teclado global, en cuyo caso el cambio es efectivo en todos los modos principales (excepto en aquellos que tienen sus propios enlaces locales para la misma tecla). O puede cambiar un mapa de teclado local, que afecta a todos los buffers que utilizan el mismo modo principal.

En esta sección, describimos cómo volver a enlazar las teclas para la sesión actual de Emacs. Ver Rebinding Keys in Your Init File, para una descripción de cómo hacer que los rebindings de teclas afecten a futuras sesiones de Emacs.

Alt-x global-set-key RETURN clave cmd RETURN
(M-x global-set-key RET clave cmd RET)
Define la clave globalmente para ejecutar cmd.
Alt-x local-set-key RETURN clave cmd RETURN
(M-x local-set-key RET clave cmd RET)
Define la clave localmente (en el modo mayor ahora en efecto) para ejecutar cmd.
Alt-x global-unset-key RETURN clave
(M-x global-unset-key RET clave)
Hace que la clave no esté definida en el mapa global.
Alt-x local-unset-key RETURN clave
(M-x local-unset-key RET clave)
Hace que la clave no esté definida localmente (en el modo principal ahora en efecto).

Por ejemplo, lo siguiente vincula Ctrl-z (C-z) al comando del shell (ver Subshell Interactivo), reemplazando la definición global normal de Ctrl-z (C-z):

M-x global-set-key RET C-z shell RET

El comando global-set-key lee el nombre del comando después de la tecla. Después de pulsar la tecla, aparece un mensaje como éste para que pueda confirmar que está vinculando la tecla que desea:

Set key C-z to command:

Puede redefinir las teclas de función y los eventos del ratón de la misma manera; sólo tiene que escribir la tecla de función o hacer clic en el ratón cuando sea el momento de especificar la tecla a revincular.

Puede redefinir una tecla que contenga más de un evento de la misma manera. Emacs sigue leyendo la tecla a re-enlazar hasta que sea una tecla completa (es decir, no una tecla prefijada). Así, si escribe Ctrl-f (C-f) para la clave, eso es el final; entra en el minibuffer inmediatamente para leer cmd. Pero si escribe Ctrl-x (C-x), como es un prefijo, lee otro carácter; si es 4, otro carácter de prefijo, lee un carácter más, y así sucesivamente. Por ejemplo:

M-x global-set-key RET C-x 4 $ spell-other-window RET

redefine Ctrl-x 4$ (C-x 4 $) para ejecutar el comando (ficticio) spell-other-window.

Puede eliminar la definición global de una tecla con global-unset-key. Esto hace que la tecla no esté definida; si la escribe, Emacs sólo emitirá un pitido. Del mismo modo, local-unset-key hace que una tecla no esté definida en el mapa de teclas del modo principal actual, lo que hace que la definición global (o la falta de ella) vuelva a tener efecto en ese modo principal.

Si ha redefinido (o indefinido) una tecla y posteriormente desea retractarse del cambio, la redefinición de la tecla no servirá de nada: tendrá que redefinir la tecla con su definición estándar. Para encontrar el nombre de la definición estándar de una tecla, vaya a un búfer del modo Fundamental en un Emacs nuevo y utilice Ctrl-h c (C-h c). La documentación de las teclas en este manual también enumera sus nombres de comando.

Si quiere evitar invocar un comando por error, es mejor deshabilitar el comando que indefinir la tecla. Un comando desactivado es menos trabajoso de invocar cuando realmente se quiere. Véase Desactivación de comandos.

Revinculación de teclas en su fichero de inicialización

Si tiene un conjunto de combinaciones de teclas que le gusta usar todo el tiempo, puede especificarlas en su fichero de inicialización escribiendo código Lisp. Vea El fichero de inicialización de Emacs, para una descripción del fichero de inicialización.

Hay varias formas de escribir un enlace de teclas usando Lisp. La más sencilla es usar la función kbd, que convierte una representación textual de una secuencia de teclas -similar a cómo hemos escrito las secuencias de teclas en este manual- en una forma que puede pasarse como argumento a global-set-key. Por ejemplo, así es como se vincula Ctrl-z (C-z) al comando de la shell (ver Subshell Interactivo):

(global-set-key (kbd "C-z") 'shell)

La comilla simple antes del nombre del comando, shell, lo marca como un símbolo constante en lugar de una variable. Si omite las comillas, Emacs intentará evaluar shell como una variable. Esto probablemente cause un error; ciertamente no es lo que quiere.

Aquí hay algunos ejemplos adicionales, incluyendo la vinculación de teclas de función y eventos del ratón:

(global-set-key (kbd "C-c y") 'clipboard-yank)
(global-set-key (kbd "C-M-q") 'query-replace)
(global-set-key (kbd "<f5>") 'flyspell-mode)
(global-set-key (kbd "C-<f5>") 'display-line-numbers-mode)
(global-set-key (kbd "C-<right>") 'forward-sentence)
(global-set-key (kbd "<mouse-2>") 'mouse-save-then-kill)5

En lugar de usar kbd, puede usar una cadena o vector Lisp para especificar la secuencia de teclas. Usar una cadena es más sencillo, pero sólo funciona para caracteres ASCII y caracteres ASCII metamodificados. Por ejemplo, así es como se vincula Ctrl-x Alt-l (C-x M-l) a make-symbolic-link (véase Copiar, nombrar y renombrar archivos):

(global-set-key "\C-x\M-l" 'make-symbolic-link)

Para enlazar una secuencia de teclas que incluya TAB (TAB), RET (RET), ESC (ESC) o DEL (DEL), la cadena debe contener la secuencia de escape de Emacs Lisp ‘\t’, ‘\r’, ‘\e’ o ‘\d’ respectivamente. He aquí un ejemplo que vincula Ctrl-x TAB (C-x TAB) a la sangría (véase Sangría):

(global-set-key "\C-x\t" 'indent-rigidly)

Cuando la secuencia de teclas incluye teclas de función o eventos de botones del ratón, o caracteres no ASCII como Ctrl-= (C-=) o H-a (H-a), puede utilizar un vector para especificar la secuencia de teclas. Cada elemento del vector representa un evento de entrada; los elementos están separados por espacios y rodeados por un par de corchetes. Si un elemento del vector es un carácter, escríbalo como una constante de carácter Lisp: ‘?’ seguido del carácter tal y como aparecería en una cadena. Las teclas de función se representan mediante símbolos (véase Revinculación de teclas de función); simplemente escriba el nombre del símbolo, sin otros delimitadores o signos de puntuación. He aquí algunos ejemplos:

(global-set-key [?\C-=] 'make-symbolic-link)
(global-set-key [?\M-\C-=] 'make-symbolic-link)
(global-set-key [?\H-a] 'make-symbolic-link)
(global-set-key [f7] 'make-symbolic-link)
(global-set-key [C-mouse-1] 'make-symbolic-link)

También puede utilizar un vector para los casos sencillos:

(global-set-key [?\C-z ?\M-l] 'make-symbolic-link)

Los sistemas de lenguaje y codificación pueden causar problemas con los enlaces de las teclas para los caracteres no ASCII. Véase Caracteres no ASCII en archivos Init.

Como se describe en Mapas de teclas locales, los modos mayores y menores pueden definir mapas de teclas locales. Estos mapas de teclado se construyen cuando el modo se carga por primera vez en una sesión. La función define-key se puede utilizar para realizar cambios en un mapa de teclado específico. Esta función también puede desarmar claves, cuando se le pasa nil como enlace.

Dado que los mapas de teclado de un modo no se construyen hasta que se ha cargado, debe retrasar la ejecución del código que los modifica, por ejemplo, poniéndolo en un gancho de modo (ver Ganchos). Por ejemplo, el modo Texinfo ejecuta el gancho texinfo-mode-hook. Así es como puede usar el gancho para añadir enlaces locales para Ctrl-c n (C-c n) y Ctrl-c p (C-c p), y eliminar el de Ctrl-c Ctrl-x x (C-c C-x x) en modo Texinfo:

(add-hook 'texinfo-mode-hook
          (lambda ()
            (define-key texinfo-mode-map "\C-cp"
                        'backward-paragraph)
            (define-key texinfo-mode-map "\C-cn"
                        'forward-paragraph)))
            (define-key texinfo-mode-map "\C-c\C-xx" nil)

Teclas modificadoras

Las combinaciones de teclas por defecto en Emacs están configuradas para que los caracteres alfabéticos modificados no distingan entre mayúsculas y minúsculas. En otras palabras, Ctrl-A (C-A) hace lo mismo que Ctrl-a (C-a), y Alt-A (M-A) hace lo mismo que Alt-a (M-a). Esto sólo afecta a los caracteres alfabéticos y no se aplica a las versiones modificadas de otras teclas; por ejemplo, Ctrl-@ (C-@) no es lo mismo que Ctrl-2 (C-2).

Un carácter alfabético modificado por Control se considera generalmente insensible a las mayúsculas y minúsculas: Emacs siempre trata Ctrl-A (C-A) como Ctrl-a (C-a), Ctrl-B (C-B) como Ctrl-b (C-b), y así sucesivamente. La razón de esto es histórica: en entornos no gráficos no hay distinción entre esas pulsaciones. Sin embargo, se pueden enlazar las pulsaciones alfabéticas de Control desplazado en los marcos de la GUI:

(global-set-key (kbd "C-S-n") #'previous-line)

Para todos los demás modificadores, puede hacer que los caracteres alfabéticos modificados distingan entre mayúsculas y minúsculas (incluso en marcos no gráficos) cuando personalices Emacs. Por ejemplo, puede hacer que Alt-x (M-a) y Alt-A (M-A) ejecuten comandos diferentes.

Aunque sólo las teclas modificadoras Control y Meta se utilizan comúnmente, Emacs soporta otras tres teclas modificadoras. Se llaman Super, Hyper y Alt. Pocos terminales proporcionan formas de utilizar estos modificadores; la tecla etiquetada como Alt en la mayoría de los teclados suele emitir el modificador Meta, no Alt. Las combinaciones de teclas estándar en Emacs no incluyen ningún carácter con los modificadores Super e Hyper, y sólo un pequeño número de combinaciones de teclas estándar utilizan Alt. Sin embargo, puede personalizar Emacs para asignar significados a las combinaciones de teclas que utilizan estos modificadores. Los bits modificadores están etiquetados como ‘s-’, ‘H-‘ y ‘A-’ respectivamente.

Incluso si su teclado carece de estas teclas modificadoras adicionales, puede introducirlas utilizando Ctrl-x @: Ctrl-x @h (C-x @: C-x @ h) añade la bandera Hyper al siguiente carácter, Ctrl-x @s (C-x @ s) añade la bandera Super, y Ctrl-x @a (C-x @ a) añade la bandera Alt. Por ejemplo, Ctrl-x @h Ctrl-a (C-x @ h C-a) es una forma de introducir Hiper-Control-a. (Desgraciadamente, no hay forma de añadir dos modificadores usando Ctrl-x @ (C-x @) dos veces para el mismo carácter, porque el primero va a trabajar en la Ctrl-x (C-x)).

Revinculación de las teclas de función

Las secuencias de teclas pueden contener teclas de función además de caracteres ordinarios. Al igual que los caracteres Lisp (en realidad, enteros) representan los caracteres del teclado, los símbolos Lisp representan las teclas de función. Si la tecla de función tiene una palabra como etiqueta, esa palabra es también el nombre del símbolo Lisp correspondiente. Estos son los nombres convencionales de Lisp para las teclas de función más comunes:

left, up, right, down (, , , )
Teclas de flecha del cursor.
begin, end, home, next, prior
Otras teclas de reposicionamiento del cursor.
select, print, execute, backtab
insert, undo, redo, clearline
insertline, deleteline, insertchar, deletechar
Diversas teclas de función.
f1, f2, … f35
Teclas de función numeradas (en la parte superior del teclado).
kp-add, kp-subtract, kp-multiply, kp-divide
kp-backtab, kp-space, kp-tab, kp-enter
kp-separator, kp-decimal, kp-equal
kp-prior, kp-next, kp-end, kp-home
kp-left, kp-up, kp-right, kp-down
kp-insert , kp-delete
Teclas del teclado (a la derecha del teclado normal), con nombres o signos de puntuación.
kp-0, kp-1, … kp-9
Teclas del teclado con dígitos.
kp-f1, kp-f2, kp-f3, kp-f4
Teclas Fx del teclado.

Estos nombres son convencionales, pero algunos sistemas (especialmente cuando se utiliza X) pueden utilizar nombres diferentes. Para asegurarse de qué símbolo se utiliza para una determinada tecla de función en su terminal, escriba Ctrl-h c (C-h c) seguido de esa tecla.

Vea Revinculación de Teclas en su Archivo Init, para ver ejemplos de vinculación de teclas de función.

Muchos teclados tienen un teclado numérico en el lado derecho. Las teclas numéricas en el teclado se duplican como teclas de movimiento del cursor, conmutadas por una tecla llamada ‘Num Lock’. Por defecto, Emacs traduce estas teclas a las correspondientes del teclado principal. Por ejemplo, cuando ‘Num Lock’ está activado, la tecla etiquetada como ‘8‘ en el teclado numérico produce kp-8, que se traduce a 8; cuando ‘Num Lock’ está desactivado, la misma tecla produce kp-up, que se traduce a UP (ARRIBA). Si se vuelve a vincular una tecla como 8 o UP, esto afecta también a la tecla equivalente del teclado numérico. Sin embargo, si se vuelve a vincular una tecla ‘kp-’ directamente, no afectará a su equivalente que no está en el teclado. Ten en cuenta que las teclas modificadas no se traducen: por ejemplo, si mantiene pulsada la tecla Meta mientras presiona la tecla ‘8’ del teclado numérico, eso genera M-kp-8.

Emacs proporciona un método conveniente para vincular las teclas del teclado numérico, usando las variables keypad-setup, keypad-numlock-setup, keypad-shifted-setup, y keypad-numlock-shifted-setup. Éstas se encuentran en el grupo de personalización ‘keyboard’ (‘teclado’) (ver Interfaz de Personalización Fácil). Puede volver a vincular las teclas para realizar otras tareas, como la emisión de argumentos de prefijo numérico.

Caracteres de control ASCII con nombre

TAB, RET, BS, LFD, ESC y DEL empezaron como nombres para ciertos caracteres de control ASCII, utilizados tan a menudo que tienen teclas especiales propias. Por ejemplo, TAB era otro nombre para Ctrl-i (C-i). Más tarde, los Usuarios encontraron conveniente distinguir en Emacs entre estas teclas y los correspondientes caracteres de control tecleados con la tecla Ctrl (Ctrl). Por lo tanto, en la mayoría de los terminales modernos, ya no son lo mismo: TAB (TAB) es diferente de Ctrl-i (C-i).

Emacs puede distinguir estos dos tipos de entrada si el teclado lo hace. Trata las teclas especiales como teclas de función llamadas tab (tabulador), return (retorno), backspace (retroceso), linefeed (salto de línea), escape y delete (borrado). Estas teclas de función se traducen automáticamente en los caracteres ASCII correspondientes si no tienen sus propios enlaces. Por lo tanto, ni los Usuarios ni los programas Lisp tienen que prestar atención a la distinción, a menos que les interese.

Si no quiere distinguir entre (por ejemplo) TAB (TAB) y Ctrl-i (C-i), haga un solo enlace, para el carácter ASCII TAB (código octal 011). Si quiere distinguir, haga un enlace para este carácter ASCII, y otro para la tecla de función tab.

Con un terminal ASCII ordinario, no hay manera de distinguir entre TAB (TAB) y Ctrl-i (C-i) (y lo mismo para otros pares de este tipo), porque el terminal envía el mismo carácter en ambos casos.

Revinculación de los botones del ratón

Emacs también utiliza símbolos Lisp para designar los botones del ratón. Los eventos ordinarios del ratón en el Editor son los eventos de clic; estos ocurren cuando se presiona un botón y se suelta sin mover el ratón. También puede obtener eventos de arrastre, cuando mueve el ratón mientras mantiene el botón pulsado. Los eventos de arrastre ocurren cuando finalmente suelta el botón.

Los símbolos para los eventos de clic básicos son ratón-1 () para el botón más a la izquierda, ratón-2 () para el siguiente, y así sucesivamente. Así es como puede redefinir el segundo botón del ratón para dividir la ventana actual:

(global-set-key [mouse-2] 'split-window-below)

Los símbolos para los eventos de arrastre son similares, pero tienen el prefijo ‘drag-’ antes de la palabra ‘mouse’. Por ejemplo, arrastrar el primer botón genera un evento drag-mouse-1.

También puede definir los eventos que se producen cuando se pulsa el botón del ratón. Estos eventos comienzan con ‘down-’ en lugar de ‘drag-’. Estos eventos se generan sólo si tienen enlaces de teclas. Cuando se obtiene un evento de botón pulsado, siempre le seguirá un evento de clic o de arrastre correspondiente.

Si lo desea, puede distinguir entre clics simples, dobles y triples. Un doble clic significa pulsar el botón del ratón dos veces aproximadamente en el mismo lugar. El primer clic genera un evento de clic ordinario. El segundo clic, si llega lo suficientemente pronto, genera un evento de doble clic en su lugar. El tipo de evento para un doble clic comienza con ‘double-’: por ejemplo, double-mouse-3.

Esto significa que puede dar un significado especial al segundo clic en el mismo lugar, pero debe actuar asumiendo que la definición ordinaria de clic simple se ha ejecutado cuando se recibió el primer clic.

Esto limita lo que se puede hacer con los dobles clics, pero los diseñadores de interfaces de Usuario dicen que esta restricción debe seguirse en cualquier caso. Un doble clic debería hacer algo similar al clic simple, sólo que más. El comando para el evento de doble clic debería realizar el trabajo extra para el doble clic.

Si un evento de doble clic no tiene enlace, cambia al evento de clic simple correspondiente. Por lo tanto, si no se define un doble clic en particular, se ejecuta el comando de un solo clic dos veces.

Emacs también admite eventos de triple clic cuyos nombres empiezan por ‘triple-’. El Editor no distingue los cuádruples clics como tipos de eventos; los clics más allá del tercero generan eventos adicionales de triple clic. Sin embargo, el número completo de clics se registra en la lista de eventos, así que si conoce Emacs Lisp puede distinguirlos si realmente quiere (ver Click Events en The Emacs Lisp Reference Manual). No recomendamos significados distintos para más de tres clics, pero a veces es útil que los clics subsiguientes pasen por el mismo conjunto de tres significados, de modo que cuatro clics equivalen a un clic, cinco equivalen a dos y seis equivalen a tres.

Emacs también registra las pulsaciones múltiples en los eventos de arrastrar y pulsar botones. Por ejemplo, cuando pulsa un botón dos veces, y luego mueve el ratón mientras mantiene el botón pulsado, el Editor recibe un evento de ‘double-drag’ (‘doble arrastre‘). Y en el momento en que lo pulsa por segunda vez, Emacs obtiene un evento ‘double-down-’ (que se ignora, como todos los eventos de botón-abajo (button-down), si no tiene enlace).

La variable double-click-time (tiempo de doble clic) especifica cuánto tiempo puede transcurrir entre los clics y permitir que se agrupen como un clic múltiple. Su valor está en unidades de milisegundos. Si el valor es nulo, no se detectan los dobles clics. Si el valor es t, entonces no hay límite de tiempo. El valor por defecto es 500.

La variable double-click-fuzz especifica cuánto puede moverse el ratón entre los clics y permitir que se agrupen como un clic múltiple. Su valor está en unidades de píxeles en pantallas con ventanas y en unidades de 1/8 de una celda de caracteres en terminales en modo texto; el valor por defecto es 3.

Los símbolos para los eventos del ratón también indican el estado de las teclas modificadoras, con los prefijos habituales ‘C-’, ‘M-’, ‘H-‘, ‘s-’, ‘A-’ y ‘S-’. Éstas siempre preceden a ‘double-’ o ‘triple-’, que siempre preceden a ‘drag-’ o ‘down-’.

Un marco incluye áreas que no muestran texto del buffer, como la línea de modo y la barra de desplazamiento. Puede saber si un botón del ratón procede de una zona especial de la pantalla mediante teclas de prefijo ficticias. Por ejemplo, si hace clic con el ratón en la línea de modo, obtienes el prefijo clave mode-line antes del símbolo ordinario del botón del ratón. Por lo tanto, aquí es cómo definir el comando para hacer clic en el primer botón en una línea de modo para ejecutar el comando scroll-up-command:

(global-set-key [mode-line mouse-1] 'scroll-up-command)

Aquí está la lista completa de estas teclas de prefijo ficticias y sus significados:

mode-line
El ratón estaba en la línea de modo de una ventana.
vertical-line
El ratón estaba en la línea vertical que separa las ventanas contiguas. (Si utiliza barras de desplazamiento, éstas aparecen en lugar de estas líneas verticales).
vertical-scroll-bar
El ratón estaba en una barra de desplazamiento vertical. (Este es el único tipo de barra de desplazamiento que Emacs soporta actualmente).
menu-bar
El ratón estaba en la barra de menús.
tab-bar
El ratón estaba en una barra de pestañas.
tab-line
El ratón estaba en una línea de pestañas.
header-line
El ratón estaba en una línea de cabecera.

Se puede poner más de un botón del ratón en una secuencia de teclas, pero no es habitual hacerlo.

Deshabilitar comandos

Desactivar un comando significa que al invocarlo interactivamente se pide confirmación al Usuario. El propósito de deshabilitar un comando es evitar que los usuarios lo ejecuten por`accidente; lo hacemos para los comandos que podrían ser confusos para los no iniciados.

Al intentar invocar un comando deshabilitado de forma interactiva en Emacs, se muestra una ventana que contiene el nombre del comando, su documentación y algunas instrucciones sobre lo que se debe hacer inmediatamente; luego el Editor pide que se diga si se debe ejecutar el comando como se solicita, habilitarlo y ejecutarlo, o cancelar. Si decide habilitar el comando, debe responder a otra pregunta: si desea hacerlo permanentemente o sólo para la sesión actual. (La habilitación permanente funciona editando automáticamente su archivo de inicialización). También puede escribir ! (!) para habilitar todos los comandos, sólo para la sesión actual.

El mecanismo directo para deshabilitar un comando es poner una propiedad disabled no nula en el símbolo Lisp del comando. Aquí está el programa Lisp para hacer esto:

(put 'delete-region 'disabled t)

Si el valor de la propiedad disabled es una cadena, esa cadena se incluye en el mensaje que se muestra cuando se utiliza el comando:

(put 'delete-region 'disabled
     "It's better to use `kill-region' instead.\n")

Puede desactivar un comando editando el archivo de inicialización directamente, o con el comando Alt-x disable-command (M-x disable-command), que edita el archivo de inicialización por Usted. Del mismo modo, Alt-x enable-command (M-x enable-command) edita el fichero de inicialización para habilitar un comando permanentemente. Ver El archivo de inicialización de Emacs.

Si Emacs fue invocado con las opciones -q o --no-init-file (ver Opciones iniciales), no editará su fichero de inicialización. Hacerlo podría perder información porque el Editor no ha leído su fichero de inicialización.

La desactivación de un comando es independiente de la tecla que se utilice para invocarlo; la desactivación también se aplica si el comando se invoca utilizando Alt-x (M-x). Sin embargo, deshabilitar un comando no tiene ningún efecto sobre la llamada a éste como función desde los programas Lisp.

El fichero de inicialización de Emacs

Cuando Emacs se inicia, normalmente intenta cargar un programa Lisp desde un fichero de inicialización, o fichero init para abreviar. Este archivo, si existe, especifica cómo inicializar Emacs por Usted. Tradicionalmente, el archivo ~/.emacs se usa como archivo de init, aunque el Editor también busca en ~/.emacs.el, ~/.emacs.d/init.el, ~/.config/emacs/init.el, u otras ubicaciones. Ver Cómo Emacs encuentra tu archivo de inicio.

Puede encontrar conveniente tener toda la configuración de Emacs en un solo directorio, en cuyo caso debería usar ~/.emacs.d/init.el o el compatible con XDG ~/.config/emacs/init.el.

Puede utilizar el modificador de línea de comandos ‘-q’ para evitar que se cargue su archivo de init, y ‘-u’ (o ‘--user’) para especificar el archivo de init de un usuario diferente (ver Opciones iniciales).

También puede haber un archivo de init por defecto, que es la biblioteca llamada default.el, encontrada a través de la ruta de búsqueda estándar de bibliotecas. La distribución de Emacs no contiene tal biblioteca; su sitio puede crear una para las personalizaciones locales. Si esta biblioteca existe, se carga cada vez que se inicia el Editor (excepto cuando se especifica ‘-q’). Pero su archivo init, si lo hay, se carga primero; si establece inhibit-default-init no-nil, entonces no se carga default.

Su sitio también puede tener un archivo de inicio del sitio; este se llama site-start.el, si existe. Al igual que default.el, Emacs encuentra este archivo a través de la ruta de búsqueda estándar para las bibliotecas Lisp. El Editor carga esta biblioteca antes de cargar su archivo de inicio. Para inhibir la carga de esta biblioteca, utilice la opción ‘--no-site-file’. Vea las opciones iniciales. Recomendamos no usar site-start.el para los cambios que a algunos Usuarios no les gusten. Es mejor ponerlos en default.el, para que los Usuarios puedan anularlos más fácilmente.

Puede colocar default.el y site-start.el en cualquiera de los directorios en los que Emacs busca bibliotecas Lisp. La variable load-path (ver Bibliotecas de código Lisp para Emacs) especifica estos directorios. Muchos sitios ponen estos archivos en un subdirectorio llamado site-lisp en el directorio de instalación de Emacs, como /usr/local/share/emacs/site-lisp.

No se recomienda la compilación de bytes de tu archivo init (ver Compilación de bytes en el Manual de Referencia de Emacs Lisp). Generalmente no acelera mucho el arranque, y a menudo conduce a problemas cuando se olvida de recompilar el fichero. Una mejor solución es usar el servidor de Emacs para reducir el número de veces que tiene que iniciar el Editor (ver Uso de Emacs como servidor). Si su archivo init define muchas funciones, considera moverlas a un archivo separado (compilado en bytes) que cargas en tu archivo init.

Si va a escribir programas Emacs Lisp reales que vayan más allá de una personalización menor, debería leer el Manual de Referencia de Emacs Lisp. Vea Emacs Lisp en el Manual de referencia de Emacs Lisp.

Sintaxis del archivo Init

El archivo init contiene una o varias expresiones Lisp. Cada una de ellas consiste en un nombre de función seguido de argumentos, todos ellos rodeados de paréntesis. Por ejemplo, (setq fill-column 60) llama a la función setq para establecer la variable fill-column (ver Texto de Relleno) a 60.

Puede establecer cualquier variable Lisp con setq, pero con ciertas variables setq no hará lo que probablemente quiera en el archivo init. Algunas variables se convierten automáticamente en buffer-local cuando se establecen con setq; lo que se quiere en el fichero init es establecer el valor por defecto, usando setq-default. (La siguiente sección tiene ejemplos de ambos métodos).

Algunas variables personalizables de modo menor hacen cosas especiales para habilitar el modo cuando las establece con Customize, pero el setq ordinario no lo hará; para habilitar el modo en su archivo init, llame al comando de modo menor. Por último, algunas opciones de Usuario personalizables se inicializan de manera compleja, y éstas tienen que ser establecidas a través de la interfaz de personalización (ver Personalización) o mediante el uso de customize-set-variable (ver Examinar y establecer variables).

El segundo argumento de setq es una expresión para el nuevo valor de la variable. Puede ser una constante, una variable o una expresión de llamada a una función. En el archivo init, las constantes se utilizan la mayoría de las veces. Pueden ser:

Números
Los números se escriben en decimal, con un signo menos inicial opcional.
Cadenas
La sintaxis de cadenas de Lisp es la misma que la de C, con algunas características adicionales. Utilice un carácter de comillas dobles para comenzar y terminar una constante de cadena.
En una cadena, puede incluir literalmente nuevas líneas y caracteres especiales. Pero a menudo es más limpio utilizar secuencias de barras invertidas para ellos: ‘\n’ para la línea nueva, ‘\b’ para el retroceso, ‘\r’ para el retorno de carro, ‘\t’ para el tabulador, ‘\f’ para el salto de página (control-L), ‘\e’ para escape, ‘\\\t’ para la barra invertida, ‘\"’ para la comilla doble, o ‘\ooo’ para el carácter cuyo código octal es ooo. La barra invertida y la comilla doble son los únicos caracteres para los que las secuencias de barra invertida son obligatorias.
\C-’ puede usarse como prefijo para un carácter de control, como en ‘\C-s’ para control-S ASCII, y ‘\M-’ puede usarse como prefijo para un carácter Meta, como en ‘\M-a’ para Meta-A o ‘\M-\C-a’ para Ctrl-Meta-A.
Consulte Caracteres no ASCII en archivos init, para obtener información sobre la inclusión de caracteres no ASCII en su archivo init.
Caracteres
La sintaxis de las constantes de caracteres de Lisp consiste en un ‘?’ seguido de un carácter o una secuencia de escape que comienza con ‘\’. Ejemplos: ?x, ?\n, ?\", ?\). Tenga en cuenta que las cadenas y los caracteres no son intercambiables en Lisp; algunos contextos requieren uno y otros requieren el otro.
Consulte Caracteres no ASCII en archivos Init, para obtener información sobre la vinculación de comandos a teclas que envían caracteres no ASCII.
True
t significa "verdadero".
False
nil significa "falso".
Otros objetos de Lisp
Escriba una comilla simple (') seguida del objeto Lisp que desee.

Para más información sobre la sintaxis de Emacs Lisp, véase Introduction en The Emacs Lisp Reference Manual.

Ejemplos de archivos de inicio

Aquí hay algunos ejemplos de cómo hacer ciertas cosas comúnmente deseadas con expresiones Lisp:

  • Añadir un directorio a la variable load-path. Entonces puede poner las bibliotecas Lisp que no están incluidas con Emacs en este directorio, y cargarlas con Alt-x load-library (M-x load-library). Vea Bibliotecas de código Lisp para Emacs.
    (add-to-list 'load-path "/path/to/lisp/libraries")
    	
  • Hacer TAB (TAB) en modo C sólo inserta un tabulador si el punto está en medio de una línea.
    (setq c-tab-always-indent nil)
    	
    Aquí tenemos una variable cuyo valor es normalmente t para "verdadero" y la alternativa es nil para "falso".

  • Hacer que las búsquedas distingan entre mayúsculas y minúsculas por defecto (en todos los buffers que no anulen esto).
    (setq-default case-fold-search nil)
    	
    Esto establece el valor por defecto, que es efectivo en todos los buffers que no tienen valores locales para la variable (ver Variables Locales). Establecer case-fold-search con setq afecta sólo al valor local del buffer actual, que probablemente no es lo que quieres hacer en un fichero init.

  • Especificar su propia dirección de correo electrónico, si Emacs no puede averiguarlo correctamente.
    (setq user-mail-address "cheney@torture.gov")
    	
    Varios paquetes de Emacs, como el modo Mensaje, consultan user-mail-address cuando necesitan saber su dirección de correo electrónico. Ver Campos de la cabecera del correo.

  • Hacer que el modo Texto sea el modo por defecto para los nuevos buffers.
    (setq-default major-mode 'text-mode)
    	
    Tenga en cuenta que se utiliza text-mode porque es el comando para entrar en el modo Texto. La comilla simple que le precede hace que el símbolo sea una constante; de lo contrario, text-mode se trataría como un nombre de variable.

  • Configurar por defecto el juego de caracteres Latin-1, que soporta la mayoría de los idiomas de Europa Occidental.
    (set-language-environment "Latin-1")
    	
  • Desactivar el modo de número de línea, un modo global menor.
    (line-number-mode 0)
    	
  • Activar automáticamente el modo de Relleno Automático en el modo Texto y los modos relacionados (ver Ganchos).
    (add-hook 'text-mode-hook 'auto-fill-mode)
    	
  • Cambiar el sistema de codificación utilizado cuando se utiliza el portapapeles (ver Sistemas de codificación para la comunicación entre procesos).
    (customize-set-variable 'selection-coding-system 'utf-8)
    	
  • Cargar la biblioteca Lisp instalada llamada foo (en realidad un archivo foo.elc o foo.el en un directorio Emacs estándar).
    (load "foo")(load "foo")
    	
    Cuando el argumento a cargar es un nombre de archivo relativo, que no empieza por ‘/‘ o ‘~’, load busca en los directorios de load-path (ver Bibliotecas de código Lisp para Emacs).

  • Cargar el archivo Lisp compilado foo.elc desde su directorio personal.
    (load "~/foo.elc")
    	
    Aquí se utiliza un nombre de archivo completo, por lo que no se realiza ninguna búsqueda.

  • Dígale a Emacs que encuentre la definición de la función mifunción cargando una biblioteca Lisp llamada mipaquete (es decir, un archivo mipaquete.elc o mipaquete.el):
    (autoload 'mifuncion "mipaquete" "Haz lo que te digo." t)
    	
    Aquí la cadena "Haz lo que te diga" es la cadena de documentación de la función. Se especifica en la definición de autocarga para que esté disponible para los comandos de ayuda incluso cuando el paquete no esté cargado. El último argumento, t, indica que esta función es interactiva; es decir, puede ser invocada interactivamente escribiendo Alt-x mifunción RETURN (M-x mifunción RET) o vinculándola a una tecla. Si la función no es interactiva, omita la t o utilice nil.

  • Vuelva a vincular la tecla Ctrl-x l (C-x l) para ejecutar la función make-symbolic-link (vea Vinculación de teclas en su archivo de inicio).
    (global-set-key "\C-xl" 'make-symbolic-link)
    	
    o
    (define-key global-map "\C-xl" 'make-symbolic-link)
    	
    Observe de nuevo la comilla simple utilizada para referirse al símbolo make-symbolic-link en lugar de su valor como variable.
  • Haga lo mismo sólo para el modo Lisp.
    (define-key lisp-mode-map "\C-xl" 'make-symbolic-link)
    	
  • Redefine todas las teclas que ahora se ejecutan en la línea siguiente en el modo Fundamental para que se ejecuten en la línea anterior.
    (substitute-key-definition 'next-line 'forward-line
                                       global-map)
    	
  • Hacer Ctrl-x Ctrl-v (C-x C-v) indefinido.
    (global-unset-key "\C-x\C-v")
    	
    Una de las razones para indefinir una clave es para poder convertirla en un prefijo. Simplemente definiendo Ctrl-x Ctrl-v (C-x C-v) cualquier cosa hará que Ctrl-x Ctrl-v C-x C-v sea un prefijo, pero (C-x C-v) debe ser liberado primero de su definición habitual de no prefijo.
  • Hacer que ‘$’ tenga la sintaxis de la puntuación en el modo Texto. Nótese el uso de una constante de carácter para ‘$’.
    (modify-syntax-entry ?\$ "." text-mode-syntax-table)
    	

  • Permitir el uso del comando narrow-to-region sin confirmación.
    (put 'narrow-to-region 'disabled nil)
    	
  • Ajustar la configuración a varias plataformas y versiones de Emacs.

    Los Usuarios normalmente quieren que Emacs se comporte igual en todos los sistemas, por lo que el mismo fichero init es el adecuado para todas las plataformas. Sin embargo, a veces ocurre que una función que usa para personalizar el Editor no está disponible en algunas plataformas o en versiones antiguas de Emacs. Para lidiar con esa situación, ponga la personalización dentro de una condicional que compruebe si la función o facilidad está disponible, así:
    (if (fboundp 'blink-cursor-mode)
        (blink-cursor-mode 0))
    
    (if (boundp 'coding-category-utf-8)
        (set-coding-priority '(coding-category-utf-8)))
    	
    También puede simplemente ignorar los errores que se producen si la función no está definida.

    (ignore-errors (set-face-background 'region "grey75"))
    	
    Un setq en una variable que no existe es generalmente inofensivo, por lo que estos no necesitan un condicional.

Inicialización específica del terminal

Cada tipo de terminal puede tener una biblioteca Lisp que se carga en Emacs cuando se ejecuta en ese tipo de terminal. Para un tipo de terminal llamado termtype, la biblioteca se llama term/termtype. (Si hay una entrada de la forma (termtype . alias) en la lista de asociación term-file-aliases, el Editor utiliza alias en lugar de termtype). La biblioteca se encuentra buscando en los directorios load-path como es habitual y probando los sufijos ‘.elc’ y ‘.el‘. Normalmente aparece en el subdirectorio term del directorio donde se guardan la mayoría de las bibliotecas de Emacs.

El propósito habitual de la biblioteca específica del terminal es mapear las secuencias de escape utilizadas por las teclas de función del terminal en nombres más significativos, utilizando input-decode-map. Vea el archivo term/lk201.el para un ejemplo de cómo se hace esto. Muchas teclas de función se mapean automáticamente de acuerdo con la información de la base de datos Termcap; la biblioteca específica del terminal necesita mapear sólo las teclas de función que Termcap no especifica.

Cuando el tipo de terminal contiene un guión, sólo la parte del nombre antes del primer guión es significativo para elegir el nombre de la biblioteca. Así, los tipos de terminal ‘aaa-48’ y ‘aaa-30-rv’ utilizan ambos la librería term/aaa. El código de la biblioteca puede utilizar (getenv "TERM") para encontrar el nombre completo del tipo de terminal.

El nombre de la biblioteca se construye concatenando el valor de la variable term-file-prefix y el tipo de terminal. Su archivo .emacs puede evitar la carga de la biblioteca específica del terminal estableciendo term-file-prefix a nil.

Emacs ejecuta el gancho (hook) tty-setup-hook al final de la inicialización, después de que su archivo .emacs y cualquier biblioteca específica del terminal hayan sido leídos. Añade funciones de gancho a este gancho si desea anular parte de cualquiera de las bibliotecas específicas del terminal y definir inicializaciones para terminales que no tienen una biblioteca. Ver Hooks.

Cómo encuentra Emacs su fichero de inicio

Emacs normalmente encuentra su fichero de init en una ubicación bajo tu su directorio home. Ver El archivo de inicialización de Emacs.

Emacs busca su fichero de inicio usando los nombres de fichero ~/.emacs.el, ~/.emacs, o ~/.emacs.d/init.el en ese orden; puede elegir usar cualquiera de estos nombres. (Tenga en cuenta que sólo las ubicaciones directamente en su directorio personal tienen un punto inicial en el nombre base de la ubicación).

Emacs también puede buscar init.el en una ubicación compatible con XDG, el valor por defecto es el directorio ~/.config/emacs. Esto puede ser anulado estableciendo XDG_CONFIG_HOME en su entorno, su valor reemplaza a ~/.config en el nombre del fichero de init por defecto de XDG. Sin embargo ~/.emacs.d, ~/.emacs, y ~/.emacs.el son siempre preferidos si existen, lo que significa que debe borrarlos o renombrarlos para poder usar la ubicación XDG.

Tenga en cuenta también que si no existen ni la ubicación XDG ni ~/.emacs.d, entonces Emacs creará ~/.emacs.d (y por lo tanto lo utilizará durante las siguientes invocaciones).

Emacs establecerá user-emacs-directory al directorio que decida utilizar.

Aunque esto es compatible con versiones anteriores de Emacs, las plataformas POSIX modernas prefieren poner sus ficheros de inicialización bajo ~/.config para que la resolución de un problema que pueda deberse a un fichero de init erróneo, o el archivo de una colección de ficheros de init, pueda hacerse renombrando ese directorio. Para ayudar a las versiones antiguas de Emacs a encontrar los archivos de configuración en sus ubicaciones actuales por defecto, puede ejecutar el siguiente código Emacs Lisp:

(make-symbolic-link ".config/emacs" "~/.emacs.d")

Sin embargo, si ejecuta Emacs desde una shell iniciada por ‘su’ y XDG_CONFIG_HOME no está configurado en tu entorno, este intenta encontrar sus propios ficheros de inicialización, no los del Usuario que está pretendiendo ser en ese momento. La idea es que obtengas sus propias personalizaciones del editor incluso si está ejecutando como el superusuario.

Más precisamente, Emacs primero determina qué archivo de init del Usuario debe usar. Obtiene su nombre de Usuario de las variables de entorno LOGNAME y USER; si ninguna de ellas existe, utiliza el ID de Usuario efectivo. Si ese nombre de Usuario coincide con el ID de Usuario real, entonces Emacs utiliza HOME; en caso contrario, busca el directorio de inicio correspondiente a ese nombre de Usuario en la base de datos de usuarios del sistema.

Por razones de brevedad, el resto de la documentación de Emacs generalmente utiliza sólo la ubicación actual por defecto ~/.emacs.d/init.el para el archivo init.

Caracteres no ASCII en los archivos de inicio

Los sistemas de lenguaje y codificación pueden causar problemas si su archivo de init contiene caracteres no ASCII, como letras acentuadas, en las cadenas o en las combinaciones de teclas.

Si desea utilizar caracteres no ASCII en su archivo de init, debe poner una etiqueta ‘-*-coding: coding-system-*-’ la primera línea del archivo de init, y especificar un sistema de codificación que admita los caracteres en cuestión. Véase Reconocer los sistemas de codificación. Esto se debe a que los valores por defecto para decodificar texto no ASCII podrían no estar aún configurados en el momento en que Emacs lea las partes de su fichero init que utilizan dichas cadenas, lo que podría llevar al Editor a decodificar dichas cadenas de forma incorrecta. Entonces debería evitar añadir código Emacs Lisp que modifique el sistema de codificación de otras maneras, como las llamadas a set-language-environment.

Para vincular claves no ASCII, debe utilizar un vector (vea Revinculación de claves en su fichero Init). No se puede utilizar la sintaxis de cadena, ya que los caracteres no ASCII se interpretarán como meta claves. Por ejemplo:

(global-set-key [?char] 'some-function)

Escriba Ctrl-q (C-q), seguido de la tecla que desea vincular, para insertar el carácter.

El archivo init inicial

La mayoría de las personalizaciones para Emacs deberían ponerse en el fichero de init normal. Ver El fichero de inicialización del Editor. Sin embargo, a veces es necesario que las personalizaciones tengan efecto durante el inicio de Emacs antes de que se procese el fichero de init normal. Tales personalizaciones pueden ser puestas en el archivo de init inicial, ~/.config/emacs/early-init.el o ~/.emacs.d/early-init.el. Este archivo se carga antes de que se inicialice el sistema de paquetes y la interfaz gráfica de Usuario, por lo que en él se pueden personalizar variables que afectan al proceso de inicialización de los paquetes, como package-enable-at-startup, package-load-list y package-user-dir. Tenga en cuenta que las variables como package-archives que sólo afectan a la instalación de nuevos paquetes, y no al proceso de hacer que los paquetes ya instalados estén disponibles, pueden personalizarse en el archivo init normal. Vea Instalación de paquetes.

No recomendamos que traslade a early-init.el las personalizaciones que pueden dejarse en los archivos init normales. Esto se debe a que el archivo early init se lee antes de que se inicialice la GUI, por lo que las personalizaciones relacionadas con las características de la GUI no funcionarán de forma fiable en early-init.el. Por el contrario, los archivos init normales se leen después de que se inicialice la interfaz gráfica de usuario. Si debe tener personalizaciones en el archivo early init que dependen de las características de la GUI, haga que se ejecuten con los ganchos proporcionados por el inicio de Emacs, como window-setup-hook o tty-setup-hook. Ver Hooks.

Para más información sobre el fichero de init temprano, vea Init File en The Emacs Lisp Reference Manual.

Mantener la información de autenticación persistente

Algunos paquetes de Emacs, que se conectan a otros servicios, requieren autenticación (ver Introducción de contraseñas), por ejemplo, ver Gnus en El Manual de Gnus, o Tramp en El Manual de Tramp. Como puede ser molesto proporcionar el mismo nombre de usuario y contraseña una y otra vez, Emacs ofrece mantener esta información persistente a través de la biblioteca auth-source.

Por defecto, la información de autenticación se toma del archivo ~/.authinfo o ~/.authinfo.gpg o ~/.netrc. Estos archivos tienen una sintaxis similar a la de los archivos netrc conocidos por el programa ftp, así

machine mymachine login myloginname password mypassword port myport

Del mismo modo, la biblioteca auth-source soporta múltiples backend de almacenamiento, actualmente el clásico backend netrc, archivos JSON, la API del Servicio Secreto, y pass, el gestor de contraseñas estándar de unix.

Todas estas alternativas se pueden personalizar a través de la opción de usuario auth-sources, ver Emacs auth-source en Emacs auth-source.

Cuando se introduce una contraseña de forma interactiva, que no se encuentra a través del backend configurado, algunos de los backends ofrecen guardarla de forma persistente. Esto puede cambiarse personalizando la opción de usuario auth-source-save-behavior.



Salir y abortar

Ctrl-g (C-g)
C-break (Sólo MS-DOS)
Salir: cancela un comando en ejecución o parcialmente escrito.
Ctrl-] (C-])
Aborta el nivel de edición recursivo más interno y cancelar el comando que lo invocó (abort-recursive-edit).
ESCESCESC (ESC ESC ESC)
Sale o aborta, lo que tenga sentido (keyboard-escape-quit).
Alt-x top-level (M-x top-level)
Aborta todos los niveles de edición recursiva que se estén ejecutando en ese momento.
Ctrl-/ (C-/ )
Ctrl-x u (C-x u)
Ctrl-_ (C-_ )
Cancela un cambio realizado previamente en el contenido del buffer (undo (deshacer)).

Hay dos formas de cancelar un comando antes de que haya terminado: salir con Ctrl-g (C-g), y abortar con Ctrl-] (C-]) o Alt-x (M-x) de nivel superior. Salir cancela un comando parcialmente escrito, o uno que todavía se está ejecutando. Abortar sale de un nivel de edición recursiva y cancela el comando que invocó la edición recursiva (ver Niveles de edición recursiva).

Abortar con Ctrl-g (C-g) es la forma de deshacerse de un comando parcialmente escrito, o de un argumento numérico que no desea. Además, si está en medio de un comando que se está ejecutando, Ctrl-g (C-g) detiene el comando de una manera relativamente segura. Por ejemplo, si sale de un comando de matar que está tardando mucho, o bien todo su texto seguirá en el buffer, o bien todo estará en el anillo de matar, o quizás ambos. Si la región está activa, Ctrl-g (C-g) desactiva la marca, a menos que el modo de marca transitoria esté desactivado (ver Desactivación del modo de marca transitoria). Si se encuentra en medio de una búsqueda incremental, Ctrl-g (C-g) se comporta de forma especial; pueden ser necesarios dos caracteres Ctrl-g (C-g) sucesivos para salir de una búsqueda. Véase Búsqueda incremental, para más detalles.

Si escribe Ctrl-g (C-g) en un minibuffer, esto cierra el comando que abrió ese minibuffer, cerrándolo. Si ese minibuffer no es el más recientemente abierto (lo que puede ocurrir cuando minibuffer-follows-selected-frame es nulo (ver Uso del Minibuffer)), Ctrl-g (C-g) también cierra los más recientemente abiertos, saliendo de sus comandos asociados, después de pedirte confirmación.

En MS-DOS, el carácter C-Break sirve como carácter de salida como Ctrl-g (C-g). La razón es que no es factible, en MS-DOS, reconocer Ctrl-g mientras se ejecuta un comando, entre las interacciones con el Usuario. Por el contrario, es factible reconocer C-Break en todo momento. Ver Uso del teclado en MS-DOS.

Ctrl-g (C-g) funciona estableciendo la variable quit-flag a t en el instante en que se teclea Ctrl-g; Emacs Lisp comprueba esta variable frecuentemente, y sale si no es nula. Ctrl-g sólo se ejecuta realmente como un comando si lo escribe mientras Emacs está esperando la entrada. En ese caso, el comando que se ejecuta es keyboard-quit.

En un terminal de texto, si se sale con Ctrl-g (C-g) por segunda vez antes de que se reconozca el primer Ctrl-g, se activa la función de escape de emergencia y se vuelve al shell. Ver Escape de emergencia.

Hay algunas situaciones en las que no se puede salir. Cuando Emacs está esperando a que el sistema operativo haga algo, salir es imposible a menos que se tomen medidas especiales para la llamada de sistema particular dentro del Editor donde se produce la espera. Hemos hecho esto para las llamadas del sistema de las que probablemente los Usuarios quieran salir, pero es posible que se encuentre con un caso no tratado. En un caso muy común -esperar la entrada o salida de un fichero usando NFS- el propio Emacs sabe cómo salir, pero muchas implementaciones de NFS simplemente no permiten que los programas de Usuario dejen de esperar por NFS cuando el servidor NFS está colgado.

Abortar con Ctrl-] (C-], abort-recursive-edit) se utiliza para salir de un nivel de edición recursivo y cancelar el comando que lo invocó. Abortar con Ctrl-g (C-g) no hace esto, y no podría hacerlo, porque se utiliza para cancelar un comando parcialmente escrito dentro del nivel de edición recursivo. Ambas operaciones son útiles. Por ejemplo, si está en una edición recursiva y escribe Ctrl-u 8 (C-u 8) para introducir un argumento numérico, puede cancelar ese argumento con Ctrl-g y permanecer en la edición recursiva.

La secuencia ESC ESC ESC (ESC ESC ESC, keyboard-escape-quit) puede salir o abortar. (Lo definimos así porque ESC (ESC) significa "salir" en muchos programas de PC.) Puede cancelar un argumento del prefijo, borrar una región seleccionada, o salir de un Reemplazo de Consulta, como Ctrl-g (C-g). Puede salir del minibuffer o de una edición recursiva, como Ctrl-] (C-]). También puede salir de la división del cuadro en múltiples ventanas, como con Ctrl-x 1 (C-x 1). Una cosa que no puede hacer, sin embargo, es detener un comando que se está ejecutando. Eso es porque se ejecuta como un comando ordinario, y Emacs no lo nota hasta que está listo para el siguiente comando.

El comando Alt-x top-level (M-x top-level) equivale a suficientes comandos Ctrl-] (C-]) para sacarlos de todos los niveles de edición recursiva en los que está; también sale del minibuffer si está activo. Ctrl-] le saca de un nivel a la vez, pero Alt-x top-level (M-x top-level) sale de todos los niveles a la vez. Tanto Ctrl-] como Alt-x top-level son como todos los demás comandos, y a diferencia de Ctrl-g, en que sólo tienen efecto cuando Emacs está preparado para un comando. Ctrl-] es una tecla ordinaria y tiene su significado sólo por su vinculación en el mapa de teclas. Ver Niveles de edición recursiva.

Ctrl-/ (C-/, undo (deshacer)) no es estrictamente una forma de cancelar un comando, pero puede pensar en ello como la cancelación de un comando que ya terminó de ejecutarse. Ver Deshacer, para más información sobre la facilidad de deshacer.



Solución de problemas con Emacs

Esta sección describe cómo reconocer y tratar situaciones en las que Emacs no funciona como esperaba, como confusiones de código de teclado, pantallas confusas, quedarse sin memoria y cuelgues.

Ver Bugs, para saber qué hacer cuando cree que ha encontrado un bug en Emacs.

Si la tecla Del no logra borrar

Todos los teclados tienen una tecla grande, normalmente llamada RETROCESO (BACKSPACE), que se usa normalmente para borrar el último carácter que ha escrito. En Emacs, se supone que esta tecla equivale a Supr (Supr).

Cuando Emacs arranca en una pantalla gráfica, determina automáticamente qué tecla debe ser DEL (DEL). En algunos casos inusuales, Emacs recibe la información incorrecta del sistema, y RETROCESO (BACKSPACE) acaba borrando hacia delante en lugar de hacia atrás.

Algunos teclados también tienen una tecla Supr (Supr), que normalmente se usa para borrar hacia delante. Si esta tecla borra hacia atrás en Emacs, eso también sugiere que Emacs obtuvo la información equivocada, pero en el sentido opuesto.

En un terminal de texto, si encuentras que RETROCESO pide un comando de ayuda, como Ctrl-h (Control-h), en lugar de borrar un carácter, significa que esa tecla está enviando el carácter ‘BS’. Emacs debería tratar BS como DEL, pero no lo hace.

En todos estos casos, el remedio inmediato es el mismo: use el comando Alt-x normal-erase-is-backspace-mode (M-x normal-erase-is-backspace-mode). Esto alterna entre los dos modos que Emacs soporta para manejar DEL (DEL), así que si Emacs se inicia en el modo equivocado, esto debería cambiar al modo correcto. En un terminal de texto, si quiere pedir ayuda cuando BS es tratado como DEL, use F1 (F1) en lugar de Ctrl-h (C-h); Ctrl-? (C-?) también puede funcionar, si envía el código de carácter 127.

Para solucionar el problema en cada sesión de Emacs, escriba una de las siguientes líneas en su fichero de inicialización (ver Fichero Init). Para el primer caso anterior, donde RETROCESO borra hacia delante en lugar de hacia atrás, use esta línea para hacer que RETROCESO actúe como DEL:

(normal-erase-is-backspace-mode 0)

Para los otros dos casos, use esta línea:

(normal-erase-is-backspace-mode 1)

Otra forma de arreglar el problema para cada sesión de Emacs es personalizar la variable normal-erase-is-backspace: el valor t especifica el modo donde BS o BACKSPACE es DEL, y nil especifica el otro modo. Ver Personalización fácil.

Niveles de edición recursivos

Los niveles de edición recursivos son características importantes y útiles de Emacs, pero pueden parecer fallos de funcionamiento si no los entiendes.

Si la línea de modo tiene corchetes ‘[...]’ alrededor de los paréntesis que contienen los nombres de los modos mayor y menor, has entrado en un nivel de edición recursivo. Si no lo ha hecho a propósito, o si no entiende lo que significa, debería salir del nivel de edición recursivo. Para ello, escriba Alt-x top-level (M-x top-level). Véase Edición recursiva.

Basura en la pantalla

Si el texto de un terminal de texto parece incorrecto, lo primero que hay que hacer es ver si está mal en la memoria intermedia. Escriba Ctrl-l (C-l ,es la instrucción recenter-top-bottom) para volver a mostrar toda la pantalla. Si después de esto la pantalla se muestra correctamente, el problema estaba enteramente en la actualización anterior de la pantalla. (En caso contrario, consulte la sección siguiente).

Los problemas de actualización de pantalla a menudo son el resultado de una entrada terminfo incorrecta para el terminal que está utilizando. El fichero etc/TERMS en la distribución de Emacs da las soluciones para problemas conocidos de este tipo. INSTALL contiene consejos generales para estos problemas en una de sus secciones. Si parece que está usando la entrada terminfo correcta, es posible que haya un error en la entrada terminfo, o un error en Emacs que aparece para ciertos tipos de terminal.

Basura en el texto

Si Ctrl-l (C-l) muestra el texto incorrectamente, escriba primero Ctrl-h l (C-h l) (ver-perdida) para ver qué comandos ha escrito para producir los resultados observados. A continuación, intente deshacer los cambios paso a paso utilizando Ctrl-x u (C-x u, es el comando undo, deshacer), hasta que vuelva a un estado que considere correcto.

Si parece que falta una gran parte del texto al principio o al final de la memoria intermedia, compruebe si aparece la palabra ‘Narrow’ (Estrecho) en la línea de modo. Si aparece, es probable que el texto que no ve aún esté presente, pero temporalmente fuera de los límites. Para que vuelva a ser accesible, escriba Ctrl-x n w (C-x n w, es el comando widen, ampliar). Véase Estrechar.

Quedarse sin memoria

Si recibe el mensaje de error ‘Virtual memory exceeded’ (‘Memoria virtual excedida’), guarde sus buffers modificados con Ctrl-x s (C-x s, es la combinación de teclas para el comando save-some-buffers) . Este método de guardarlos es el que menos memoria adicional necesita. Emacs mantiene una reserva de memoria que hace disponible cuando ocurre este error; eso debería ser suficiente para permitir a Ctrl-x s completar su trabajo. Cuando se ha utilizado la reserva, aparece ‘¡MEM-FULL!’ (‘!MEM-LLENA!’) al principio de la línea de modo, indicando que no hay más reserva.

Una vez que haya guardado sus buffers modificados, puede salir de esta sesión de Emacs y empezar otra, o puede usar Alt-x kill-some-buffers (M-x kill-some-buffers) para liberar espacio en el trabajo actual de Emacs. Si esto libera suficiente espacio, el Editor rellenará su reserva de memoria, y ‘!MEM FULL!’ desaparecerá de la línea de modo. Esto significa que puede seguir editando con seguridad en la misma sesión de Emacs.

No use Alt-x buffer-menu (M-x buffer-menu) para guardar o matar buffers cuando se quede sin memoria, porque el Buffer Menu necesita una buena cantidad de memoria por sí mismo, y la reserva de suministro puede no ser suficiente.

Cuando Emacs se bloquea

Se supone que Emacs no se bloquea, pero si lo hace, produce un informe de bloqueo antes de salir. El informe de fallo se imprime en el flujo de error estándar. Si inició el Editor desde un escritorio gráfico en un sistema GNU o Unix, el flujo de error estándar se redirige normalmente a un fichero como ~/.xsession-errors, por lo que puede buscar el informe de fallo allí. En MS-Windows, el informe de fallo se escribe en un fichero llamado emacs_backtrace.txt en el directorio actual del proceso Emacs, además del flujo de error estándar.

El formato del informe de error depende de la plataforma. En algunas plataformas, como las que usan la librería GNU C, el informe de fallo incluye un backtrace (informe de los elementos activos en la pila de ejecución en un momento determinado durante la ejecución de un programa) que describe el estado de ejecución previo al fallo, que puede usarse para ayudar a depurar el fallo. He aquí un ejemplo para un sistema GNU:

Fatal error 11: Segmentation fault
Backtrace:
emacs[0x5094e4]
emacs[0x4ed3e6]
emacs[0x4ed504]
/lib64/libpthread.so.0[0x375220efe0]
/lib64/libpthread.so.0(read+0xe)[0x375220e08e]
emacs[0x509af6]
emacs[0x5acc26]
…

El número ‘11’ es el número de señal del sistema correspondiente al fallo, en este caso un fallo de segmentación. Los números hexadecimales son direcciones de programa, que pueden asociarse a líneas de código fuente utilizando una herramienta de depuración. Por ejemplo, el comando de GDB ‘list *0x509af6’ imprime las líneas de código fuente correspondientes a la entrada ‘emacs[0x509af6]’. Si su sistema tiene la utilidad addr2line, el siguiente comando de shell muestra un backtrace con los números de línea del código fuente:

sed -n 's/.*\[\(.*\)]$/\1/p' backtrace |
  addr2line -C -f -i -p -e bindir/emacs-binary

Aquí, backtrace es el nombre de un fichero de texto que contiene una copia de la traza de errores, bindir es el nombre del directorio que contiene el ejecutable de Emacs, y emacs-binary es el nombre del fichero ejecutable de Emacs, normalmente emacs en sistemas GNU y Unix y emacs.exe en MS-Windows y MS-DOS. Omita la opción -p si su versión de addr2line es demasiado antigua para tenerla.

Opcionalmente, Emacs puede generar un volcado del núcleo (core-dump) cuando se bloquea, en sistemas que soporten ficheros de núcleo. Un volcado del núcleo es un fichero que contiene datos voluminosos sobre el estado del programa antes del fallo, normalmente examinado cargándolo en un depurador como GDB. En muchas plataformas, los volcados de memoria están deshabilitados por defecto, y debe habilitarlos explícitamente ejecutando el comando de shell ‘ulimit -c unlimited’ (por ejemplo, en su script de inicio de shell).

Recuperación tras un fallo

Si Emacs o el ordenador se bloquean, puede recuperar los ficheros que estaba editando en el momento del bloqueo desde sus ficheros de autoguardado. Para ello, inicie Emacs de nuevo y escriba el comando Alt-x recover-session (M-x recover-session).

Este comando muestra inicialmente un buffer que lista los archivos de sesión interrumpidos, cada uno con su fecha. Debe elegir de qué sesión quieres recuperarse. Normalmente la que quiere es la más reciente. Mueva el punto a la que elija y escriba Ctrl-c Ctrl-c (C-c C-c).

A continuación, recover-session considera cada uno de los archivos que estaba editando durante esa sesión; para cada uno de esos archivos, le pregunta si desea recuperarlo. Si la respuesta es sí para un fichero, se muestran las fechas de ese fichero y de su fichero de autoguardado, y se vuelve a preguntar si se desea recuperar ese fichero. Para la segunda pregunta, debes confirmar con yes (sí). Si lo hace, Emacs visita el fichero pero obtiene el texto del fichero de autoguardado.

Cuando recover-session termina, los archivos que ha elegido recuperar están presentes en los buffers de Emacs. A continuación, debe guardarlos. Sólo así -guardándolos- se actualizan los propios ficheros.

Como último recurso, si tuviera buffers con contenido que no estuviera asociado a ningún fichero, o si el autoguardado no fuera lo suficientemente reciente como para haber registrado cambios importantes, puede usar el script etc/emacs-buffer.gdb GDB (el depurador de GNU) para recuperarlos de un volcado del núcleo-siempre que se haya guardado un volcado del núcleo, y que el ejecutable de Emacs no haya sido despojado de sus símbolos de depuración.

Tan pronto como obtenga el volcado del núcleo (core-dump),renómbrelo a otro nombre como core.emacs, para que otro fallo no lo sobrescriba.

Para usar este script, ejecute gdb con el nombre de archivo de su ejecutable Emacs y el nombre de archivo del volcado del núcleo, por ejemplo, ‘gdb /usr/bin/emacs core.emacs’. En el prompt (gdb), carga el script de recuperación: ‘source /usr/src/emacs/etc/emacs-buffer.gdb’. A continuación, escriba el comando ybuffer-list para ver qué búferes están disponibles. Para cada búfer, liste un número de búfer. Para guardar un búfer, use ysave-buffer; especifique el número de búfer y el nombre de archivo en el que escribirlo. Debe usar un nombre de fichero que no exista ya; si el fichero existe, el script no hace una copia de seguridad de su contenido antiguo.

Escape de emergencia

En terminales de texto, la característica de escape de emergencia suspende Emacs inmediatamente si teclea Ctrl-g (C-g) una segunda vez antes de que Emacs pueda responder a la primera saliendo. Esto es para que siempre pueda salir de GNU Emacs sin importar lo mal que pueda estar colgado. Cuando las cosas funcionan correctamente, Emacs reconoce y maneja la primera Ctrl-g tan rápido que la segunda no disparará la salida de emergencia. Sin embargo, si algún problema impide que Emacs maneje la primera Ctrl-g correctamente, entonces la segunda te devolverá al shell.

Cuando reanuda Emacs después de una suspensión causada por un escape de emergencia, informa de la reanudación y hace una pregunta o dos antes de volver a lo que había estado haciendo:

Emacs is resuming after an emergency escape.
Auto-save? (y or n)
Abort (and dump core)? (y or n)

Responda a cada pregunta con y o n seguido de RET.

Si se responde y a ‘Auto-save?’ (‘¿Autoguardar?’), se guardarán inmediatamente todos los búferes modificados en los que esté activado el autoguardado. La respuesta n omite esta opción. Esta pregunta se omite si Emacs está en un estado en el que el auto-guardado no puede hacerse de forma segura.

Decir y a ‘Abort (and dump core)?’ ‘(¿Abortar (y volcar el núcleo)?)’ hace que Emacs se bloquee, volcando el núcleo. Esto es para permitir a un asistente averiguar por qué Emacs estaba fallando al salir en primer lugar. La ejecución no continúa después de un volcado del núcleo.

Si responde a esta pregunta n, la ejecución de Emacs se reanuda. Con suerte, Emacs finalmente hará el abandono solicitado. Si no, cada Ctrl-g (C-g) subsiguiente invoca de nuevo el escape de emergencia.

Si Emacs no está realmente colgado, sólo lento, puedes invocar la doble función Ctrl-g sin quererlo realmente. Entonces reanude y responda n a ambas preguntas, y volverá al estado anterior. La salida solicitada se producirá de forma inmediata.

La salida de emergencia sólo está activa en los terminales de texto. En pantallas gráficas, puede usar el ratón para matar Emacs o cambiar a otro programa.

En MS-DOS, debe teclear C-Break (dos veces) para provocar el escape de emergencia, pero hay casos en los que no funcionará, cuando se cuelgue una llamada al sistema o cuando Emacs se quede atascado en un bucle cerrado en código C.

Líneas largas

Por varias razones (algunas de las cuales son fundamentales para el código de redistribución de Emacs y el complejo rango de posibilidades que maneja; otras se deben a modos y características que no escalan bien en circunstancias inusuales), Emacs puede funcionar mal cuando hay líneas extremadamente largas (donde "extremadamente largas" normalmente significa al menos muchos miles de caracteres).

Un problema particular es que Emacs puede "colgarse" durante mucho tiempo en el momento de visitar un fichero con líneas extremadamente largas. Esto se puede mitigar activando la biblioteca so-long, que detecta cuando un fichero visitado contiene líneas anormalmente largas, y toma medidas para desactivar las características que pueden causar lentitud en esa situación. Para activar esta biblioteca, escriba Alt-x global-so-long-mode RET (M-x global-so-long-mode RET), o active el modo global-so-long en su archivo de inicio (véase Archivo de inicio), o personalice la opción global-so-long-mode. Puede adaptar el funcionamiento de este modo personalizando la variable so-long-action.

La librería so-long también puede mejorar significativamente el rendimiento cuando se mueve y edita en un buffer con líneas largas. Es probable que el rendimiento siga disminuyendo a medida que se profundiza en las líneas largas, pero las mejoras derivadas del uso de esta biblioteca pueden ser, no obstante, sustanciales.

Utilice Alt- so-long-commentary (M-x so-long-commentary) para ver la documentación de esta biblioteca y obtener más información sobre cómo activarla y configurarla.



Informar Errores

Si cree que ha encontrado un error en Emacs, por favor, notifícalo. No podemos prometer que lo arreglaremos, o que siempre estaremos de acuerdo en que es un fallo, pero desde luego queremos oír hablar de él. Lo mismo se aplica a las nuevas características que le gustaría ver añadidas. Las siguientes secciones le ayudarán a construir un informe de error efectivo.

Lectura de los informes de errores y problemas conocidos existentes

Antes de informar de un fallo, si es posible, comprueba si ya se conoce. De hecho, puede que ya se haya solucionado en una versión posterior de Emacs, o en la versión de desarrollo. Aquí tienes una lista de los principales lugares donde puedes leer sobre problemas conocidos:

  • El archivo etc/PROBLEMS; escriba Ctrl-h Ctrl-p (C-h C-p) para leerlo. Este archivo contiene una lista de problemas particularmente conocidos que se han encontrado al compilar, instalar y ejecutar Emacs. A menudo, hay sugerencias de soluciones y arreglos.

  • El rastreador de errores de GNU en https://debbugs.gnu.org. Los errores de Emacs se archivan en el rastreador bajo el paquete ‘emacs’. El rastreador registra información sobre el estado de cada fallo, el informe inicial del fallo y los mensajes de seguimiento del informador del fallo y de los desarrolladores de Emacs. Puedes buscar fallos por tema, gravedad y otros criterios.

    En lugar de navegar por el rastreador de fallos como una página web, puede hacerlo desde Emacs usando el paquete debbugs, que puede descargarse a través del menú de paquetes (ver Paquetes Emacs Lisp). Este paquete proporciona el comando Alt-x debbugs-gnu (M-x debbugs-gnu) para listar los fallos, y Alt-x debbugs-gnu-search (M-x debbugs-gnu-search) para buscar un fallo específico. Las etiquetas de Usuario, aplicadas por los mantenedores de Emacs, se muestran con Alt-x debbugs-gnu-usertags (M-x debbugs-gnu-usertags).

  • La lista de correo ‘bug-gnu-emacs’ (también disponible como grupo de noticias ‘gnu.emacs.bug’). Puede leer los archivos de la lista en https://lists.gnu.org/mailman/listinfo/bug-gnu-emacs. Esta lista funciona como un espejo de los informes de errores de Emacs y de los mensajes de seguimiento que se envían al rastreador de errores. También contiene antiguos informes de errores de antes de que se introdujera el rastreador de errores (a principios de 2008).

    Si quiere, puede suscribirse a la lista. Tenga en cuenta que su propósito es proporcionar a los mantenedores de Emacs información sobre errores y peticiones de características, por lo que los informes pueden contener cantidades bastante grandes de datos; los espectadores no deberían quejarse de esto.

  • La lista de correo ‘emacs-pretest-bug’. Esta lista ya no se utiliza, y es principalmente de interés histórico. En un tiempo, se utilizaba para los informes de errores en las versiones de desarrollo (es decir, aún no liberadas) de Emacs. Puede leer los archivos desde 2003 hasta mediados de 2007 en https://lists.gnu.org/r/emacs-pretest-bug/. Actualmente, es un alias de ‘bug-gnu-emacs’.

  • La lista de correo ‘emacs-devel’. A veces la gente informa de errores en esta lista de correo. Sin embargo, este no es el objetivo principal de la lista, y es mucho mejor enviar los informes de errores a la lista de errores. No debería sentirte obligado a leer esta lista antes de informar de un fallo.

Cuándo hay un error

Si Emacs accede a una posición de memoria no válida (también conocido como "segmentation fault" ("fallo de segmentación")) o sale con un mensaje de error del sistema operativo que indica un problema en el programa (en lugar de algo como "disk full" ("disco lleno")), entonces es ciertamente un bug.

Si la pantalla de Emacs no se corresponde correctamente con el contenido del buffer, entonces es un bug. Pero debería comprobar que características como el estrechamiento del búfer (ver Estrechamiento), que pueden ocultar partes del búfer o cambiar su visualización, no son responsables.

Tardar una eternidad en completar un comando puede ser un error, pero debe asegurarse de que es realmente culpa de Emacs. Algunos comandos simplemente tardan mucho. Teclee Ctrl-g (C-g) (C-Break en MS-DOS) y luego Ctrl-h l (C-h l) para ver si la entrada que el Editor recibió fue la que pretendía escribir; si la entrada fue tal que sabe que debería haber sido procesada rápidamente, reporta un error. Si no sabe si el comando debería tardar mucho, averígualo buscando en el manual o pidiendo ayuda.

Si un comando con el que está familiarizado provoca un mensaje de error de Emacs en un caso en el que su definición habitual debería ser razonable, probablemente se trate de un error.

Si un comando hace algo incorrecto, es un error. Pero asegúrese de saber con certeza lo que debería haber hecho. Si no está familiarizado con el comando, puede que funcione correctamente. En caso de duda, lea la documentación del comando (vea la ayuda por comando o nombre de variable).

La definición prevista de un comando puede no ser la mejor definición posible para editarlo. Este es un tipo de problema muy importante, pero también es una cuestión de criterio. Además, es fácil llegar a esa conclusión por desconocimiento de algunas de las funciones existentes. Probablemente es mejor no quejarse de un problema de este tipo hasta que haya comprobado la documentación de la forma habitual, se sienta seguro de que la entiende y sepa con certeza que lo que quiere no está disponible. Pregunta también a otros Usuarios de Emacs. Si no está seguro de lo que se supone que hace el comando después de una lectura cuidadosa del manual, revise el índice y el glosario para cualquier término que pueda ser poco claro.

Si después de releer detenidamente el manual sigue sin entender lo que debe hacer el comando, eso indica que hay un error en el manual, que Ud. debe reportar. El trabajo del manual es hacer que todo sea claro para la gente que no es experta en Emacs, incluido Ud. Es tan importante reportar los errores de la documentación como los del programa.

Si la documentación incorporada para una función o variable no coincide con el manual, uno de ellos debe estar equivocado; eso es un error.

Para problemas con paquetes que no son parte de Emacs, es mejor empezar informando a los desarrolladores del paquete.

Entender la notificación de errores

Cuando decida que hay un fallo, es importante informar de él y hacerlo de forma útil. Lo más útil es una descripción exacta de los comandos que escribe, empezando por el comando del shell para ejecutar Emacs, hasta que se produce el problema.

El principio más importante a la hora de informar de un fallo es informar de los hechos. Las hipótesis y las descripciones verbales no sustituyen a los datos brutos detallados. Informar de los hechos es sencillo, pero mucha gente se esfuerza en plantear explicaciones e informar de ellas en lugar de los hechos. Si las explicaciones se basan en conjeturas sobre cómo está implementado Emacs, serán inútiles; mientras tanto, a falta de los hechos, no tendremos información real sobre el fallo. Si realmente quiere depurar el problema, y reportar explicaciones que sean más que conjeturas, eso es útil, pero por favor incluya también los hechos en bruto.

Por ejemplo, suponga que teclea Ctrl-x Ctrl-f /glorp/baz.ugh RETURN (C-x C-f /glorp/baz.ugh RET), visitando un archivo que (Usted sabe) resulta ser bastante grande, y Emacs muestra ‘Hoy me siento bonito’. El informe de error tendría que proporcionar toda esa información. No debería suponer que el problema se debe al tamaño del archivo y decir: "He visitado un archivo grande y Emacs ha mostrado ‘Hoy me siento bonito’". Esto es lo que queremos decir con "adivinar explicaciones". El problema puede deberse a que hay una ‘z’ en el nombre del archivo. Si esto es así, cuando recibimos su informe, probamos el problema con algún archivo grande, probablemente sin ‘z’ en su nombre, y no vimos ningún problema. No hay manera de adivinar que debemos intentar visitar un archivo con una 'z’ en su nombre.

Ni siquiera debe decir "visitar un archivo" en lugar de Ctrl-x Ctrl-f (C-x C-f). Del mismo modo, en lugar de decir "si tengo tres caracteres en la línea", diga "después de teclear RETURNABCRETURN Ctrl-p (RET A B C RET C-p)", si esa es la forma en que introdujo el texto.

Si es posible, intente reproducir rápidamente el fallo invocando Emacs con emacs -Q (para que el Editor se inicie sin personalizaciones iniciales; vea Opciones iniciales), y repitiendo los pasos que dio para provocar el fallo. Si puede reproducir el error de esta manera, eso descarta errores en sus personalizaciones. Entonces su informe de error debería comenzar indicando que inició Emacs con emacs -Q, seguido de la secuencia exacta de pasos para reproducir el error. Si es posible, infórmenos del contenido exacto de cualquier archivo que sea necesario para reproducir el fallo.

Algunos errores no son reproducibles desde emacs -Q; algunos no son fácilmente reproducibles en absoluto. En ese caso, debería informar de lo que tiene, pero, como antes, por favor, cíñase a los hechos brutos sobre lo que hizo para desencadenar el fallo la primera vez.

Si tiene varios problemas de los que quiere informar, por favor haga un informe de error separado para cada uno.

Lista de comprobación para los informes de errores

Antes de informar de un error, primero intente ver si el problema ya ha sido informado (ver Lectura de informes de errores existentes y problemas conocidos).

Si puede, pruebe la última versión de Emacs para ver si el problema ya ha sido solucionado. Aún mejor es probar la última versión de desarrollo. Reconocemos que esto no es fácil para algunas Personas, así que no sienta que debe hacer esto absolutamente antes de hacer un informe.

La mejor manera de escribir un informe de error para Emacs es utilizar el comando Alt-x report-emacs-bug (M-x report-emacs-bug). Esto configura un búfer de correo (ver Envío de correo) y automáticamente inserta parte de la información esencial. Sin embargo, no puede suministrar toda la información necesaria; aún así, debería leer y seguir las directrices que aparecen a continuación, para poder introducir a mano el resto de la información crucial antes de enviar el mensaje. Puede pensar que parte de la información insertada por M-x report-emacs-bug no es relevante, pero a menos que esté absolutamente seguro es mejor dejarla, para que los desarrolladores puedan decidir por sí mismos.

Cuando haya terminado de escribir su informe, escriba Ctrl-c Ctrl-c (C-c C-c) y será enviado a los mantenedores de Emacs en bug-gnu-emacs. Si no puede enviar el correo desde Emacs, puede copiar el texto de su informe en su cliente de correo normal (si su sistema lo soporta, puede escribir Ctrl-c Alt-i (C-c M-i) para que el Editor lo haga por Ud.) y enviarlo a esa dirección. O simplemente puede enviar un correo electrónico a esa dirección describiendo el problema.

Si quiere enviar código a Emacs (para arreglar un problema o implementar una nueva característica), la forma más fácil de hacerlo es enviar un parche al issue tracker de el Editor. Esto se hace con el comando Alt-x submit-emacs-patch (M-x submit-emacs-patch), y funciona de forma muy parecida a cuando se informa de errores.

En cualquier caso, su informe se enviará a la lista de correo ‘bug-gnu-emacs’, y se almacenará en el GNU Bug Tracker en https://debbugs.gnu.org. Por favor, incluya una dirección de correo electrónico de respuesta válida, en caso de que necesitemos pedirle más información sobre su informe. Los envíos son moderados, por lo que puede haber un retraso antes de que su informe aparezca.

No necesita saber cómo funciona el Rastreador de Fallos de GNU para informar de un fallo, pero si lo desea, puede leer la documentación en línea del rastreador para ver las diversas características que puede utilizar.

Todo el correo enviado a la lista de correo 'bug-gnu-emacs’ se envía también al grupo de noticias ‘gnu.emacs.bug’. Lo mismo ocurre a la inversa, pero le pedimos que no envíe informes de errores (o respuestas) a través del grupo de noticias. Puede hacer mucho más difícil contactar con Usted si necesitamos pedir más información, y no se integra bien con el rastreador de errores.

Si sus datos son de más de 500.000 bytes, por favor, no los incluya directamente en el informe de fallo; en su lugar, ofrézcase a enviarlo a petición, o hágalo disponible en línea y diga dónde.

El Rastreador de fallos de GNU asignará un número de fallo a su informe; por favor, utilícelo en las siguientes discusiones.

Para permitir a los mantenedores investigar un fallo, su informe debería incluir todas estas cosas:

  • El número de versión de Emacs. Sin esto, no sabremos si tiene sentido buscar el fallo en la versión actual de GNU Emacs.

    Alt-x report-emacs-bug (M-x report-emacs-bug) incluye esta información automáticamente, pero si no está usando ese comando para su informe puede obtener el número de versión escribiendo Alt-x emacs-version (M-x emacs-version RET). Si ese comando no funciona, probablemente tenga algo más que GNU Emacs, así que tendrá que informar del fallo en otro sitio.

  • El tipo de máquina que está usando, y el nombre del sistema operativo y el número de versión (de nuevo, incluido automáticamente por Alt-x report-emacs-bug (M-x report-emacs-bug)). Alt-x emacs-version RETURN (M-x emacs-version RET) también proporciona esta información. Copie su salida del búfer *Messages* (*Mensajes*), para que lo obtenga todo y lo obtenga con precisión, o use Ctrl-u Alt-x emacs-version RETURN (C-u M-x emacs-version RET) para insertar la información de la versión en el búfer actual.

  • Los operandos dados al comando configure cuando se instaló Emacs (incluidos automáticamente por Alt-x report-emacs-bug (M-x report-emacs-bug)).

  • Una lista completa de cualquier modificación que haya hecho en el código fuente de Emacs. (Puede que no tengamos tiempo de investigar el fallo a menos que ocurra en un Emacs sin modificar. Pero si ha hecho modificaciones y no nos lo dices, nos está enviando a una búsqueda inútil).

    Sea preciso sobre estos cambios. Una descripción en inglés no es suficiente, envíe un diff de contexto unificado para ellos.

    Añadir archivos propios, o portarlos a otra máquina, es una modificación del código fuente.

  • Detalles de cualquier otra desviación del procedimiento estándar para instalar GNU Emacs.
  • El texto completo de cualquier archivo necesario para reproducir el error.

    Si puede decirnos una forma de causar el problema sin visitar ningún archivo, por favor hágalo. Esto hace que sea mucho más fácil de depurar. Si necesita archivos, asegúrese que puede ver su contenido exacto. Por ejemplo, puede importar si hay espacios al final de las líneas, o una nueva línea después de la última línea en el buffer (nada debería importar si la última línea está terminada, pero intenta decirle qué error).

  • Los comandos precisos que tenemos que escribir para reproducir el fallo. Si es posible, da una receta completa para un Emacs iniciado con la opción ‘-Q’ (ver Opciones iniciales). Esto evita sus personalizaciones.

    Una forma de registrar con precisión la entrada a Emacs es escribir un archivo de regateo. Para iniciar el archivo, utilice el comando Alt-x open-dribble-file (M-x open-dribble-file). A partir de ese momento, Emacs copiará toda su entrada en el archivo dribble (archivo de regateo) especificado hasta que el proceso del Editor sea eliminado. Tenga en cuenta que la información sensible (como las contraseñas) puede acabar grabada en este archivo.

  • Para posibles errores de visualización en terminales en modo texto, el tipo de terminal (el valor de la variable de entorno TERM), la entrada completa de termcap para el terminal desde /etc/termcap (ya que ese fichero no es idéntico en todas las máquinas), y la salida que Emacs envió realmente al terminal.

    La forma de recoger la salida del terminal es ejecutar la expresión Lisp:
    (open-termscript "~/termscript")
    	
  • usando Alt-: (M-:) o desde el buffer *scratch* justo después de iniciar Emacs. A partir de ese momento, el Editor copia toda la salida del terminal al archivo termscript especificado, hasta que el proceso de Emacs sea eliminado. Si el problema ocurre cuando el Editor se inicia, escriba esta expresión en su fichero de inicialización de Emacs para que el fichero termscript esté abierto cuando el Editor muestre la pantalla por primera vez.

    Tenga cuidado: a menudo es difícil, y a veces imposible, arreglar un fallo dependiente del terminal sin tener acceso a un terminal del tipo que estimula el fallo.

  • Si el texto no ASCII o la internacionalización es relevante, la configuración regional que estaba vigente cuando inició Emacs. En los sistemas GNU/Linux y Unix, o si usa un shell estilo POSIX como Bash, puedes usar este comando del shell para ver los valores relevantes:
    echo LC_ALL=$LC_ALL LC_COLLATE=$LC_COLLATE LC_CTYPE=$LC_CTYPE \
      LC_MESSAGES=$LC_MESSAGES LC_TIME=$LC_TIME LANG=$LANG
    	
    Alternativamente, utilice el comando locale, si su sistema lo tiene, para mostrar su configuración regional.

    Puede utilizar el comando Alt-! (M-!) para ejecutar estos comandos desde Emacs, y luego copiar la salida del búfer *Messages* en el informe de errores. Alternativamente, Alt-x getenv RETURN LC_ALL RETURN (M-x getenv RET LC_ALL RET) mostrará el valor de LC_ALL en el área de eco, y puede copiar su salida del buffer *Messages*.

  • Una descripción del comportamiento que observa y que cree que es incorrecto. Por ejemplo, "El proceso de Emacs recibe una señal fatal" (“The Emacs process gets a fatal signal”), o, "El texto resultante es el siguiente, que creo que es incorrecto" (“The resulting text is as follows, which I think is wrong.”).

    Por supuesto, si el fallo es que Emacs recibe una señal fatal, entonces no se puede pasar por alto. Pero si el fallo es un texto incorrecto, el mantenedor puede no darse cuenta de lo que está mal. ¿Por qué dejarlo al azar?

    Incluso si el problema que experimenta es una señal fatal, debería decirlo explícitamente. Supongamos que ocurre algo extraño, como que su copia del código fuente está desincronizada, o que ha encontrado un error en la biblioteca C de su sistema. (¡Esto ha sucedido!) Su copia podría bloquearse y la copia de aquí podría no hacerlo. Si dice que espere un fallo, entonces cuando Emacs aquí no se cuelgue, sabremos que el fallo no está ocurriendo. Si no dice que espere un fallo, entonces no sabremos si el fallo está ocurriendo, no podremos sacar ninguna conclusión de nuestras observaciones.

  • Si el fallo es que el Manual de Emacs o el Manual de Referencia de Emacs Lisp no describe el comportamiento real de Emacs, o que el texto es confuso, copie el texto del manual que cree que es el que falla. Si la sección es pequeña, basta con el nombre de la sección.

  • Si la manifestación del fallo es un mensaje de error de Emacs, es importante reportar el texto preciso del mensaje de error, y un backtrace que muestre cómo el programa Lisp en Emacs llegó al error.

    Para obtener el texto del mensaje de error con precisión, cópielo del búfer *Messages* en el informe de error. Cópielo todo, no sólo una parte.

    Para hacer un backtrace del error, use Alt-x toggle-debug-on-error (M-x toggle-debug-on-error) antes de que ocurra el error (es decir, debe dar ese comando y luego hacer que ocurra el error). Esto hace que el error inicie el depurador de Lisp, que le muestra un backtrace. Copie el texto del backtrace del depurador en el informe de error. Vea Edebug en el Manual de Referencia de Emacs Lisp, para información sobre la depuración de programas Emacs Lisp con el paquete Edebug.

    Este uso del depurador sólo es posible si sabe cómo hacer que el fallo se repita. Si no puede hacer que ocurra de nuevo, al menos copie el mensaje de error completo.

    Si Emacs parece estar atascado en un bucle infinito o en una operación muy larga, al teclear Ctrl-g (C-g) con la variable debug-on-quit no nil se iniciará el depurador de Lisp y se mostrará un backtrace. Este backtrace es útil para depurar esos bucles largos, así que si puede producirlo, cópielo en el informe de error.

    Si no puede hacer que Emacs responda a Ctrl-g (C-g) (por ejemplo, porque inhibit-quit está activado), entonces puede intentar enviar la señal especificada por debug-on-event (por defecto SIGUSR2) desde fuera del Editor para hacer que entre en el depurador.

  • Compruebe si algún programa que haya cargado en el mundo Lisp, incluyendo su fichero de inicialización, establece alguna variable que pueda afectar al funcionamiento de Emacs. Además, compruebe si el problema se produce en un Emacs recién iniciado sin cargar su fichero de inicialización (inicie el Editor con el modificador -Q para evitar la carga de los ficheros init). Si el problema no se produce entonces, debe informar del contenido preciso de cualquier programa que deba cargar en el mundo Lisp para que se produzca el problema.

  • Si el problema depende de un fichero init o de otros programas Lisp que no forman parte del sistema estándar de Emacs, entonces debe asegurarse de que no es un error de esos programas quejándose primero a sus mantenedores. Después de que verifiquen que están usando Emacs de una manera que se supone que funciona, deberían informar del fallo.

  • Si desea mencionar algo en el código fuente de GNU Emacs, muestre la línea de código con algunas líneas de contexto. No se limites a dar un número de línea.

    Los números de línea en los fuentes de desarrollo no coinciden con los de sus fuentes. Llevaría un trabajo extra para los mantenedores determinar qué código está en su versión en un número de línea dado, y no podríamos estar seguros.

  • La información adicional de un depurador de C como GDB podría permitir a alguien encontrar un problema en una máquina que no tiene disponible. Si no sabe cómo usar GDB, por favor lea el manual de GDB, no es muy largo, y usar GDB es fácil. Puede encontrar la distribución de GDB, incluyendo el manual de GDB en forma online, en la mayoría de los mismos lugares donde puede encontrar la distribución del Editor. Para ejecutar Emacs bajo GDB, debe cambiar al subdirectorio src en el que se compiló Emacs, y luego hacer ‘gdb emacs’. Es importante que el directorio src sea actual para que GDB lea el archivo .gdbinit en este directorio. Sin embargo, tiene que pensar cuando recoge la información adicional si quiere que muestre la causa del fallo.

    Por ejemplo, mucha gente envía sólo un backtrace a nivel de C, pero eso no es muy útil por sí mismo. Un simple backtrace con argumentos a menudo transmite poco sobre lo que está ocurriendo dentro de GNU Emacs, porque la mayoría de los argumentos listados en el backtrace son punteros a objetos Lisp. Los valores numéricos de estos punteros no tienen ningún significado; todo lo que importa es el contenido de los objetos a los que apuntan (y la mayoría de los contenidos son ellos mismos punteros).

    Para proporcionar información útil, es necesario mostrar los valores de los objetos Lisp en notación Lisp. Haga esto para cada variable que sea un objeto Lisp, en varios marcos de pila cerca del fondo de la pila. Mire el código fuente para ver qué variables son objetos Lisp, porque el depurador las considera enteras.

    Para mostrar el valor de una variable en sintaxis Lisp, primero imprima su valor, luego use el comando pr de GDB definido por el Usuario para imprimir el objeto Lisp en sintaxis Lisp. (Si debe utilizar otro depurador, llame a la función debug_print con el objeto como argumento). El comando pr está definido por el archivo .gdbinit, y sólo funciona si está depurando un proceso en ejecución (no con un volcado del núcleo).

    Para hacer que los errores de Lisp detengan Emacs y vuelvan a GDB, ponga un punto de interrupción en Fsignal.

    Para obtener un breve listado de las funciones Lisp en ejecución, escriba el comando GDB xbacktrace.

    El archivo .gdbinit define varios otros comandos que son útiles para examinar los tipos de datos y contenidos de los objetos Lisp. Sus nombres comienzan con ‘x’. Estos comandos trabajan a un nivel más bajo que pr, y son menos convenientes, pero pueden funcionar incluso cuando pr no lo hace, como cuando se depura un volcado del núcleo o cuando Emacs ha tenido una señal fatal.

    Consejos más detallados y otras técnicas útiles para depurar Emacs están disponibles en el archivo etc/DEBUG en la distribución del Editor. Ese archivo también incluye instrucciones para investigar problemas por los que Emacs deja de responder (mucha gente asume que el Editor está "colgado", cuando en realidad podría estar en un bucle infinito).

    Para encontrar el archivo etc/DEBUG en su instalación de Emacs, utiliza el nombre del directorio almacenado en la variable data-directory.

Aquí hay algunas cosas que no son necesarias en un informe de error:

  • Una descripción de la envoltura del fallo, esto no es necesario para un fallo reproducible.

    A menudo la gente que encuentra un fallo pasa mucho tiempo investigando qué cambios en el archivo de entrada harán que el fallo desaparezca y qué cambios no lo afectarán.

    Esto suele llevar mucho tiempo y no es muy útil, porque la forma de encontrar el fallo es ejecutando un solo ejemplo bajo el depurador con puntos de interrupción, no por pura deducción de una serie de ejemplos. Es mejor ahorrar tiempo no buscando ejemplos adicionales. Es mejor enviar el informe de error de inmediato, volver a la edición, y encontrar otro error para informar.

    Por supuesto, si puede encontrar un ejemplo más simple para informar en lugar del original, eso es una conveniencia. Los errores en la salida serán más fáciles de detectar, la ejecución bajo el depurador llevará menos tiempo, etc.

    Sin embargo, la simplificación no es vital; si no puede hacer esto o no tiene tiempo para intentarlo, por favor reporte el error con su caso de prueba original.

  • Un archivo de volcado del núcleo.

    Depurar el volcado del núcleo puede ser útil, pero sólo puede hacerse en su máquina, con su ejecutable de Emacs. Por lo tanto, enviar el archivo de volcado del núcleo a los mantenedores de Emacs no será útil. Sobre todo, ¡No incluya el archivo del núcleo en un informe de error por correo electrónico! Un mensaje tan grande puede ser extremadamente incómodo.

  • Un rastreo de llamadas al sistema de la ejecución de Emacs.

    Las trazas de llamadas al sistema son muy útiles para ciertos tipos especiales de depuración, pero en la mayoría de los casos dan poca información útil. Por eso es extraño que mucha gente parezca pensar que la forma de informar sobre un fallo es enviar una traza de llamada al sistema. Tal vez sea un hábito formado por la experiencia de depurar programas que no tienen código fuente o símbolos de depuración.

    En la mayoría de los programas, un backtrace es normalmente mucho, mucho más informativo que un trazado de llamada al sistema. Incluso en Emacs, un simple backtrace es generalmente más informativo, aunque para dar una información completa debería complementar el backtrace mostrando los valores de las variables e imprimiéndolos como objetos Lisp con pr (ver arriba).

  • Un parche para el error.

    Un parche para el error es útil si es bueno. Pero no omita el resto de la información que necesita un informe de fallo, como el caso de prueba, asumiendo que un parche es suficiente. Puede que veamos problemas con tu parche y decidamos solucionar el problema de otra manera, o puede que no lo entendamos en absoluto. Y si no podemos entender qué error está tratando de arreglar, o por qué su parche debería ser una mejora, no debemos instalarlo.

    Vea Envío de parches para GNU Emacs, para las directrices sobre cómo hacer que sea fácil para nosotros entender e instalar sus parches.

  • Una suposición sobre cuál es el fallo o de qué depende.

    Estas suposiciones suelen ser erróneas. Incluso los expertos no pueden adivinar estas cosas sin usar primero el depurador para encontrar los hechos.

Envío de parches para GNU Emacs

Si quiere escribir correcciones de errores o mejoras para GNU Emacs, es muy útil. Cuando envíe sus cambios, por favor, siga estas directrices para facilitar su uso por parte de los mantenedores. Si no sigue estas directrices, su información puede seguir siendo útil, pero su uso llevará un trabajo extra. Mantener GNU Emacs es mucho trabajo en el mejor de los casos, y no podemos seguir el ritmo a menos que haga lo posible por ayudar.

Cada parche debe tener varias piezas de información antes de que podamos evaluarlo adecuadamente.

Cuando tenga todas estas piezas, agrégelas en un mensaje de correo y envíelo a los desarrolladores. Se recomienda enviarlo a bug-gnu-emacs@gnu.org (que es la lista de errores y características), porque esa lista está acoplada a un sistema de seguimiento que facilita la localización de los parches. Si su parche no está completo y cree que necesita más discusión, puede enviarlo a emacs-devel@gnu.org. Si revisa su parche, envíelo como seguimiento del tema inicial.

Preferimos recibir los parches como texto plano, ya sea en línea (tenga cuidado de que su cliente de correo no cambie los saltos de línea) o como archivos adjuntos MIME.

  • Incluya una explicación con sus cambios sobre el problema que solucionan o la mejora que aportan.
    • Para arreglar un error existente, es mejor responder a la discusión relevante en la lista ‘bug-gnu-emacs‘, o a la entrada del error en el GNU Bug Tracker en https://debbugs.gnu.org. Explique por qué su cambio soluciona el fallo.
    • Para una nueva característica, incluya una descripción de la característica y su implementación.
    • Para un nuevo error, incluya un informe de error adecuado para el problema que cree que ha solucionado. Tenemos que convencernos de que el cambio es correcto antes de instalarlo. Incluso si es correcto, podríamos tener problemas para entenderlo si no tenemos una forma de reproducir el problema.


  • Incluya todos los comentarios que sean apropiados para ayudar a la gente que lea el código fuente en el futuro a entender por qué era necesario este cambio.

  • No mezcle los cambios realizados por diferentes motivos. Envíelos por separado.

    Si hace dos cambios por razones distintas, puede que no queramos instalar ambos. Es posible que queramos instalar sólo uno. Si los envía todos mezclados en un solo conjunto de diffs, tenemos que hacer un trabajo extra para desentrañarlos, para averiguar qué partes del cambio sirven para cada propósito. Si no tenemos tiempo para esto, puede que tengamos que ignorar sus cambios por completo.

    Si envía cada cambio tan pronto como lo haya escrito, con su propia explicación, entonces dos cambios nunca se enredan, y podemos considerar cada uno adecuadamente sin ningún trabajo extra para desenredarlos.


  • Envíe cada cambio tan pronto como esté terminado. A veces la gente cree que nos está ayudando al acumular muchos cambios para enviarlos todos juntos. Como se ha explicado anteriormente, esto es absolutamente lo peor que se puede hacer.

    Ya que debe enviar cada cambio por separado, es mejor que lo envíe de inmediato. Eso nos da la opción de instalarlo inmediatamente si es importante.

  • El parche en sí.

    Use ‘diff -u’ para hacer sus diffs. Los diffs sin contexto son difíciles de instalar de forma fiable. Más que eso, son difíciles de estudiar; siempre debemos estudiar un parche para decidir si queremos instalarlo. El formato con contexto es mejor que los diffs sin contexto, pero preferimos el formato unificado.

    Si tiene GNU diff, use ‘diff -u -F'^[_a-zA-Z0-9$]\('’ cuando haga diffs de código C. Esto muestra el nombre de la función en la que se produce cada cambio.

    Si está usando el repositorio de Emacs, asegúrese de que su copia está actualizada (por ejemplo, con git pull). Puede confirmar sus cambios en una rama privada y generar un parche desde la versión maestra usando git format-patch master. O puede dejar sus cambios sin confirmar y usar git diff.

  • Evita cualquier ambigüedad sobre cuál es la versión antigua y cuál es la nueva. Por favor, haga que la versión antigua sea el primer argumento de diff, y la nueva versión el segundo argumento. Y por favor, dele a una versión o a la otra un nombre que indique si es la versión antigua o su nueva versión cambiada.

  • Escriba las entradas de registro de sus cambios. Esto es tanto para ahorrarnos el trabajo extra de escribirlas, como para ayudar a explicar tus cambios para que podamos entenderlos.

    Por otro lado, una vez que haya mostrado a la gente dónde encontrar el cambio, no necesita explicar su propósito en el registro de cambios. Así, si añade una nueva función, todo lo que tiene que decir sobre ella es que es nueva. Si cree que el propósito necesita ser explicado, probablemente sí, pero pon la explicación en los comentarios del código. Allí será más útil

    Por favor, mire las entradas del registro de confirmaciones recientes para ver qué tipo de información poner, y para aprender el estilo que usamos. Tenga en cuenta que, a diferencia de otros proyectos, requerimos registros de cambios para la documentación, es decir, archivos Texinfo. Vea los registros de cambios, vea https://www.gnu.org/prep/standards/html_node/Change-Log-Concepts.html, vea los conceptos de registro de cambios en los estándares de codificación de GNU.

  • Cuando escriba la corrección, tenga en cuenta que no podemos instalar un cambio que rompa otros sistemas. Por favor, piense en el efecto que tendrá su cambio si se compila en otro tipo de sistema.

    A veces la gente envía correcciones que podrían ser una mejora en general, pero es difícil estar seguro de ello. Es difícil instalar tales cambios porque tenemos que estudiarlos muy cuidadosamente. Por supuesto, una buena explicación del razonamiento por el que ha llegado a la conclusión de que el cambio es correcto puede ayudar a convencernos.

    Los cambios más seguros son los cambios en los archivos de configuración de una máquina en particular. Estos son seguros porque no pueden crear nuevos errores en otras máquinas.

    Por favor, ayúdanos a mantener la carga de trabajo diseñando el parche de una forma que sea claramente segura de instalar.


Cómo contribuir al desarrollo de Emacs

Emacs es un proyecto colaborativo y fomentamos las contribuciones de todo el mundo.

Hay muchas formas de contribuir a Emacs:

  • Encontrar e informar de errores; ver Errores.
  • Responder preguntas en la lista de correo de Usuarios de Emacs https://lists.gnu.org/mailman/listinfo/help-gnu-emacs.
  • Escribir documentación, ya sea en el wiki, o en el repositorio de fuentes de Emacs (ver Envío de parches).
  • Comprobar si los informes de fallos existentes están corregidos en las nuevas versiones de Emacs https://debbugs.gnu.org/cgi/pkgreport.cgi?which=pkg&data=emacs.
  • Arreglar informes de errores existentes.
  • Implementar una característica listada en el archivo etc/TODO en la distribución de Emacs, y envíe un parche.
  • Implementar una nueva característica y envíe un parche.
  • Desarrollar un paquete que funcione con Emacs y publícarlo por su cuenta o en GNU ELPA (https://elpa.gnu.org/).
  • Portar Emacs a una nueva plataforma, pero esto no es común hoy en día.

Si quiere trabajar en la mejora de Emacs, pongase en contacto con los mantenedores en la lista de correo emacs-devel. Puede pedir que te sugieran proyectos o sugerir tus propias ideas.

Si tiene una petición de funcionalidad o una sugerencia sobre cómo mejorar Emacs, el mejor lugar para enviarla es a bug-gnu-emacs . Por favor, explique lo más claramente posible qué cambio le gustaría ver, y por qué y cómo cree que mejoraría al Editor.

Si ya ha escrito una mejora, por favor, cuéntenoslo. Si aún no ha empezado a trabajar, es útil que contacte con emacs-devel antes de empezar; podría ser posible sugerirle formas de hacer que su extensión encaje mejor con el resto de Emacs.

Cuando implemente una característica, por favor, siga los estándares de codificación de Emacs; vea Estándares de codificación. Además, las contribuciones no triviales requieren una cesión de derechos de autor a la FSF; véase Cesión de derechos de autor.

La versión de desarrollo del Editor puede descargarse desde el repositorio donde es mantenido activamente por un grupo de desarrolladores. Consulte la página del proyecto Emacs https://savannah.gnu.org/projects/emacs/ para conocer los detalles de acceso.

Es importante que escriba su parche basándote en la versión de trabajo actual. Si empieza desde una versión anterior, su parche puede estar desactualizado (por lo que los mantenedores tendrán dificultades para aplicarlo), o los cambios en Emacs pueden haber hecho que su parche sea innecesario. Después de haber descargado el código fuente del repositorio, debería leer el archivo INSTALL.REPO para las instrucciones de compilación (difieren en cierta medida de una compilación normal).

Si quiere hacer contribuciones más extensas, consulte el archivo CONTRIBUTE en el árbol de código fuente de Emacs para obtener información sobre cómo ser un desarrollador del Editor. Ese archivo se distribuye como parte del tarball de código fuente de cada versión de Emacs, y también puede encontrarse en línea en el repositorio de código fuente del Editor. Si ha clonado el repositorio de Emacs, siguiendo las instrucciones de https://savannah.gnu.org/projects/emacs/, encontrará este archivo en el directorio superior del árbol de Emacs fuente.

Para documentación sobre Emacs (para entender cómo implementar el cambio deseado), consulte:

Estándares de codificación

El código contribuido debe seguir los Estándares de Codificación GNU https://www.gnu.org/prep/standards/. Esto también puede estar disponible en info en su sistema.

Si no es así, necesitaremos encontrar a alguien que arregle el código antes de poder usarlo.

Emacs tiene convenciones de estilo y codificación adicionales:

  • El apéndice "Consejos y convenciones" de Emacs Lisp Reference https://www.gnu.org/software/emacs/manual/html_node/elisp/Tips.html.
  • Evite usar defadvice o with-eval-after-load para el código Lisp que vaya a incluirse en Emacs.
  • Elimine todos los espacios en blanco al final de los archivos fuente y de texto.
  • Emacs no tiene ninguna convención sobre el uso de tabuladores en el código fuente; por favor, no cambie los espacios en blanco en los archivos que edite.
  • Use ?\s en lugar de ? en el código Lisp para un carácter de espacio.

Cesión del derecho de autor

La FSF (Free Software Foundation) es la titular de los derechos de autor de GNU Emacs. La FSF es una organización sin ánimo de lucro con la misión mundial de promover la libertad de los Usuarios de ordenadores y defender los derechos de todos los Usuarios de software libre. Para obtener información general, consulte el sitio web https://www.fsf.org/.

En general, para contribuciones no triviales a GNU Emacs y paquetes almacenados en GNU ELPA, requerimos que el copyright sea asignado a la FSF. Para las razones detrás de esto, vea https://www.gnu.org/licenses/why-assign.html.

La asignación del copyright es un proceso sencillo. Los residentes de algunos países pueden hacerlo completamente de forma electrónica. Podemos ayudarle a empezar, incluyendo el envío de los formularios que debe rellenar, y responder a cualquier pregunta que pueda tener (o dirigirle a las personas con las respuestas), en la lista de correo emacs-devel@gnu.org.

(Nota: la discusión general sobre por qué algunos proyectos GNU piden una cesión de copyright está fuera del tema de emacs-devel. Vea gnu-misc-discuss en su lugar).

Una renuncia al copyright también es una posibilidad, pero preferimos una cesión. Tenga en cuenta que la renuncia, al igual que la cesión, implica el envío de documentación firmada a la FSF (decir simplemente "esto es de dominio público" no es suficiente). Además, un descargo de responsabilidad no puede aplicarse a trabajos futuros, tiene que repetirse cada vez que quiera enviar algo nuevo.

Podemos aceptar pequeños cambios (aproximadamente, menos de 15 líneas) sin que medie un encargo. Se trata de un límite acumulativo (por ejemplo, tres parches separados de 5 líneas) sobre todas sus contribuciones



APÉNDICE A LICENCIA PÚBLICA GENERAL DE GNU

Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. https://fsf.org/

Todo el mundo está autorizado a copiar y distribuir
copias literales de este documento de licencia,
pero no está permitido modificarlo.

Preámbulo

La Licencia Pública General GNU es una licencia libre con copyleft para software y otros tipos de obras.

Las licencias de la mayoría del software y otras obras prácticas están diseñadas para privarle de la libertad de compartir y modificar las obras. Por el contrario, la Licencia Pública General de GNU está pensada para garantizar su libertad de compartir y cambiar todas las versiones de un programa, para asegurarse de que sigue siendo software libre para todos sus Usuarios. Nosotros, la Free Software Foundation, usamos la Licencia Pública General de GNU para la mayoría de nuestro software; se aplica también a cualquier otro trabajo publicado de esta forma por sus Autores. Usted también puede aplicarla a sus programas.

Cuando hablamos de Software Libre, nos referimos a la libertad, no al precio. Nuestras Licencias Públicas Generales están diseñadas para garantizar que Usted tenga la libertad de distribuir copias de Software Libre (y cobrar por ellas si lo desea), que reciba el código fuente o que pueda obtenerlo si lo desea, que pueda cambiar el software o usar partes de él en nuevos programas gratuitos, y que sepa que puede hacer estas cosas.

Para proteger sus derechos, debemos evitar que otros le nieguen estos derechos o le pidan que los renuncie. Por lo tanto, tiene ciertas responsabilidades si distribuye copias del software o si lo modifica: responsabilidades de respetar la libertad de los demás.

Por ejemplo, si distribuye copias de dicho programa, ya sea gratis o pagando una tarifa, debe transmitir a los destinatarios las mismas libertades que recibió. Debe asegurarse de que ellos también reciban o puedan obtener el código fuente. Y debe mostrarles estos términos para que conozcan sus derechos.

Los desarrolladores que usan GNU GPL protegen sus derechos con dos pasos: (1) hacer valer los derechos de Autor sobre el software y (2) ofrecerle esta Licencia que le otorga permiso legal para copiarla, distribuirla y/o modificarla.

Para la protección de los Desarrolladores y Autores, la GPL explica claramente que no hay garantía para este software gratuito. Tanto por el bien de los Usuarios como de los Autores, la GPL exige que las versiones modificadas se marquen como cambiadas, de modo que sus problemas no se atribuyan erróneamente a los Autores de versiones anteriores.

Algunos dispositivos están diseñados para denegar a los Usuarios el acceso para instalar o ejecutar versiones modificadas del software que contienen, aunque el fabricante puede hacerlo. Esto es fundamentalmente incompatible con el objetivo de proteger la libertad de los Usuarios para cambiar el software. El patrón sistemático de tal abuso se da en el área de productos para uso individual, que es precisamente donde es más inaceptable. Por lo tanto, hemos diseñado esta versión de la GPL para prohibir la práctica de esos productos. Si tales problemas surgen sustancialmente en otros dominios, estamos listos para extender esta disposición a esos dominios en versiones futuras de la GPL, según sea necesario para proteger la libertad de los usuarios.

Por último, cada programa está constantemente amenazado por las patentes de software. Los estados no deben permitir que las patentes restrinjan el desarrollo y uso de software en computadoras de propósito general, pero en aquellos que lo hacen, deseamos evitar el peligro especial de que las patentes aplicadas a un programa libre puedan convertirlo efectivamente en propietario. Para evitar esto, la GPL asegura que las patentes no se pueden usar para hacer que el programa no sea libre.

A continuación se describen los términos y condiciones precisos para la copia, distribución y modificación.

TÉRMINOS Y CONDICIONES

0. Definiciones
“Esta Licencia” se refiere a la versión 3 de la Licencia Pública General GNU.

“Derechos de Autor” también significa leyes similares a las de los derechos de Autor que se aplican a otros tipos de obras, como las máscaras de semiconductores.

“El Programa” se refiere a cualquier trabajo protegido por derechos de Autor bajo esta Licencia. Cada licenciatario se trata como "Usted". Los "Licenciatarios" y los "Destinatarios" pueden ser Personas u organizaciones.

“Modificar” un trabajo significa copiar o adaptar todo o parte del trabajo de una manera que requiera permiso de derechos de Autor, que no sea la realización de una copia exacta. La obra resultante se denomina “versión modificada” de la obra anterior o obra “basada en” la obra anterior.

Una “obra cubierta” significa el Programa sin modificar o una obra basada en el Programa.

“Propagar” un trabajo significa hacer cualquier cosa con él que, sin permiso, lo haría directa o secundariamente responsable de una infracción según la ley de derechos de Autor aplicable, excepto ejecutarlo en una computadora o modificar una copia privada. La propagación incluye la copia, la distribución (con o sin modificación), la puesta a disposición del público y, en algunos países, también otras actividades.

Por “transmitir” una obra se entiende cualquier tipo de propagación que permita a Terceros hacer o recibir copias. La mera interacción con un Usuario a través de una red informática, sin transferencia de una copia, no es transmisión.

Una interfaz de Usuario interactiva muestra "Avisos legales apropiados" en la medida en que incluye una función conveniente y bien visible que (1) muestra un aviso de derechos de Autor apropiado y (2) le dice al Usuario que no hay garantía para el trabajo (excepto para en la medida en que se proporcionen garantías), que los licenciatarios pueden transmitir el trabajo bajo esta Licencia, y cómo ver una copia de esta Licencia. Si la interfaz presenta una lista de comandos u opciones de Usuario, como un menú, un elemento destacado en la lista cumple con este criterio.
1. Código Fuente
El “código fuente” de una obra significa la forma preferida de la obra para hacerle modificaciones. “Código Objeto” significa cualquier forma no fuente de una obra.

Una "Interfaz Estándar" significa una interfaz que es un estándar oficial definido por un organismo de estándares reconocido o, en el caso de interfaces especificadas para un lenguaje de programación en particular, una que se usa ampliamente entre los desarrolladores que trabajan en ese lenguaje.

Las "Bibliotecas del Sistema" de un trabajo ejecutable incluyen todo lo que no sea el trabajo como un todo, que (a) se incluye en la forma normal de empaquetar un Componente principal, pero que no forma parte de ese Componente principal, y (b) solo sirve para habilitar el uso del trabajo con ese componente principal, o para implementar una interfaz estándar para la cual una implementación está disponible para el público en forma de código fuente. Un "Componente Principal", en este contexto, significa un componente esencial principal (núcleo, sistema de ventanas, etc.) del sistema operativo específico (si lo hay) en el que se ejecuta el trabajo ejecutable, o un compilador utilizado para producir el trabajo, o un intérprete de código objeto utilizado para ejecutarlo.

La "Fuente Correspondiente" para un trabajo en forma de código objeto significa todo el código fuente necesario para generar, instalar y (para un trabajo ejecutable) ejecutar el código objeto y modificar el trabajo, incluidos los scripts para controlar esas actividades. Sin embargo, no incluye las bibliotecas del sistema de la obra, ni las herramientas de uso general ni los programas gratuitos generalmente disponibles que se utilizan sin modificar para realizar esas actividades pero que no forman parte de la obra. Por ejemplo, Fuente correspondiente incluye archivos de definición de interfaz asociados con archivos fuente para el trabajo, y el código fuente para bibliotecas compartidas y subprogramas vinculados dinámicamente que el trabajo está específicamente diseñado para requerir, como por ejemplo mediante comunicación íntima de datos o flujo de control entre esos subprogramas y otras partes de la obra.

La Fuente correspondiente no necesita incluir nada que los Usuarios puedan regenerar automáticamente desde otras partes de la Fuente correspondiente.

La fuente correspondiente para un trabajo en forma de código fuente es ese mismo trabajo.
2. Permisos básicos.
Todos los derechos otorgados bajo esta Licencia se otorgan por el término de los derechos de Autor sobre el Programa y son irrevocables siempre que se cumplan las condiciones establecidas. Esta Licencia afirma explícitamente su permiso ilimitado para ejecutar el Programa sin modificar. El resultado de ejecutar un trabajo amparado está cubierto por esta Licencia solo si el resultado, dado su contenido, constituye un trabajo amparado. Esta Licencia reconoce sus derechos de uso justo u otros equivalentes, según lo dispuesto por la ley de derechos de Autor.

Puede realizar, ejecutar y propagar obras amparadas que no transmita, sin condiciones, siempre y cuando su licencia permanezca en vigor. Puede transmitir trabajos cubiertos a otros con el único fin de que realicen modificaciones exclusivamente para Usted, o proporcionarle instalaciones para ejecutar esos trabajos, siempre que cumpla con los términos de esta Licencia al transmitir todo el material sobre el cual no tiene control. derechos de Autor. Aquellos que hagan o ejecuten los trabajos cubiertos para Usted deben hacerlo exclusivamente en su nombre, bajo su dirección y control, en términos que les prohíban hacer copias de su material protegido por derechos de Autor fuera de su relación con Usted.

El transporte en cualquier otra circunstancia está permitido únicamente bajo las condiciones establecidas a continuación. No se permiten sublicencias; la sección 10 lo hace innecesario.
3. Protección de los derechos legales de los Usuarios contra la ley contra la elusión.
Ningún trabajo amparado se considerará parte de una medida tecnológica efectiva bajo ninguna ley aplicable que cumpla con las obligaciones del artículo 11 del tratado de derechos de Autor de la OMPI adoptado el 20 de diciembre de 1996, o leyes similares que prohíban o restrinjan la elusión de tales medidas.

Cuando transmite un trabajo amparado, renuncia a cualquier poder legal para prohibir la elusión de las medidas tecnológicas en la medida en que dicha elusión se efectúe mediante el ejercicio de los derechos bajo esta Licencia con respecto al trabajo amparado, y renuncia a cualquier intención de limitar la operación o modificación del trabajo como un medio para hacer valer, contra los Usuarios del trabajo, sus derechos legales o los de terceros para prohibir la elusión de las medidas tecnológicas.
4. Transporte de copias literales.
Puede transmitir copias textuales del código fuente del Programa tal como lo recibe, en cualquier medio, siempre que publique de manera visible y adecuada en cada copia un aviso de derechos de Autor apropiado; mantener intactos todos los avisos que indiquen que esta Licencia y cualquier término no permisivo agregado de acuerdo con la sección 7 se aplican al código; mantener intactos todos los avisos de ausencia de cualquier garantía; y entregue a todos los destinatarios una copia de esta Licencia junto con el Programa.

Puede cobrar cualquier precio o ningún precio por cada copia que envíe, y puede ofrecer soporte o protección de garantía por una tarifa.
5. Transmisión de versiones de origen modificadas.
Puede transmitir un trabajo basado en el Programa, o las modificaciones para producirlo a partir del Programa, en forma de código fuente según los términos de la sección 4, siempre que también cumpla con todas estas condiciones:

  1. El trabajo debe llevar avisos destacados que indiquen que lo modificó y que proporcione una fecha relevante.

  2. El trabajo debe llevar avisos prominentes que indiquen que se publica bajo esta Licencia y cualquier condición agregada en la sección 7. Este requisito modifica el requisito de la sección 4 para "mantener intactos todos los avisos".

  3. Debe licenciar el trabajo completo, como un todo, bajo esta Licencia a cualquier Persona que tenga una copia. Por lo tanto, esta Licencia se aplicará, junto con los términos e adicionales aplicables de la sección 7, a la totalidad del trabajo y todas sus partes, independientemente de cómo estén empaquetadas. Esta Licencia no otorga permiso para licenciar el trabajo de ninguna otra manera, pero no invalida dicho permiso si lo ha recibido por separado.

  4. Si el trabajo tiene interfaces de Usuario interactivas, cada una debe mostrar Avisos Legales Apropiados; sin embargo, si el Programa tiene interfaces interactivas que no muestran Avisos Legales Apropiados, su trabajo no necesita hacer que lo hagan.

Una compilación de una obra amparada con otras obras separadas e independientes, que por su naturaleza no son extensiones de la obra amparada y que no se combinan con ella para formar un programa mayor, en o sobre un volumen de almacenamiento o distribución medio, se denomina “agregado” si la compilación y los derechos de Autor resultantes no se utilizan para limitar el acceso o los derechos legales de los Usuarios de la compilación más allá de lo que permiten las obras individuales. La inclusión de un trabajo amparado en un agregado no hace que esta Licencia se aplique a las otras partes del agregado.

6. Transporte de formularios que no son de origen.
Puede transmitir un trabajo cubierto en forma de código de objeto según los términos de las secciones 4 y 5, siempre que también transmita la Fuente correspondiente legible por máquina según los términos de esta Licencia, de una de estas maneras:

  1. Transmitir el código de objeto en, o incorporado en, un producto físico (incluido un medio de distribución físico), acompañado de la Fuente correspondiente fijada en un medio físico duradero que se usa habitualmente para el intercambio de software.

  2. Transmitir el código objeto en un producto físico (incluido un medio de distribución física), o incorporado en él, acompañado de una oferta por escrito, válida durante al menos tres años y mientras ofrezca piezas de repuesto o atención al cliente para ese modelo de producto. , para dar a cualquier persona que posea el código de objeto (1) una copia de la Fuente correspondiente para todo el software del producto que está cubierto por esta Licencia, en un medio físico duradero usado habitualmente para el intercambio de software, por un precio no mayor a su costo razonable de realizar físicamente esta transmisión de la fuente, o (2) acceso para copiar la Fuente correspondiente desde un servidor de red sin cargo.

  3. Transmitir copias individuales del código objeto con una copia de la oferta escrita para proporcionar la Fuente correspondiente. Esta alternativa solo se permite de manera ocasional y no comercial, y solo si recibió el código de objeto con dicha oferta, de acuerdo con la subsección 6b.

  4. Transmitir el código objeto ofreciendo acceso desde un lugar designado (gratis o por un cargo), y ofrecer acceso equivalente a la Fuente correspondiente de la misma manera a través del mismo lugar sin cargo adicional. No es necesario que los destinatarios copien la fuente correspondiente junto con el código objeto. Si el lugar para copiar el código objeto es un servidor de red, la Fuente correspondiente puede estar en un servidor diferente (operado por Usted o por un Tercero) que admita instalaciones de copia equivalentes, siempre que mantenga instrucciones claras junto al código objeto que indiquen dónde encontrar la fuente correspondiente. Independientemente del servidor que aloje la Fuente correspondiente, Usted sigue estando obligado a asegurarse de que esté disponible durante el tiempo que sea necesario para satisfacer estos requisitos.

  5. Transmitir el código de objeto utilizando la transmisión de igual a igual, siempre que informe a otros pares donde el código de objeto y la Fuente correspondiente del trabajo se ofrecen al público en general sin cargo según la subsección 6d.

Una parte separable del código objeto, cuyo código fuente está excluido de la Fuente correspondiente como una biblioteca del sistema, no necesita incluirse en la transmisión del trabajo del código objeto.

Un "Producto de Usuario" es (1) un "producto de consumo", lo que significa cualquier propiedad personal tangible que normalmente se usa para fines personales, familiares o domésticos, o (2) cualquier cosa diseñada o vendida para incorporarla a una vivienda. Para determinar si un producto es de consumo, los casos dudosos se resolverán a favor de la cobertura. Para un producto en particular recibido por un Usuario en particular, "usado normalmente" se refiere a un uso típico o común de esa clase de producto, independientemente del estado del Usuario en particular o de la forma en que el Usuario en particular realmente usa, o espera o se espera utilizar, el producto. Un producto es un producto de consumo independientemente de si el producto tiene usos sustanciales comerciales, industriales o de no consumo, a menos que dichos usos representen el único modo significativo de uso del producto.

“Información de Instalación” para un Producto de Usuario significa cualquier método, procedimiento, clave de autorización u otra información requerida para instalar y ejecutar versiones modificadas de un trabajo cubierto en ese Producto de Usuario desde una versión modificada de su Fuente correspondiente. La información debe ser suficiente para garantizar que el funcionamiento continuo del código objeto modificado no se impida o interfiera en ningún caso únicamente porque se haya realizado una modificación.

Si transmite un trabajo de código de objeto bajo esta sección en, o con, o específicamente para su uso en un Producto de Usuario, y la transmisión ocurre como parte de una transacción en la que el derecho de posesión y uso del Producto de Usuario se transfiere al destinatario a perpetuidad o por un término fijo (independientemente de cómo se caracterice la transacción), la Fuente Correspondiente transmitida bajo esta sección deberá acompañarse con la Información de Instalación. Pero este requisito no se aplica si ni Usted ni ningún Tercero conservan la capacidad de instalar código de objeto modificado en el Producto de Usuario (por ejemplo, el trabajo se ha instalado en ROM).

El requisito de proporcionar Información de Instalación no incluye el requisito de continuar brindando servicio de soporte, garantía o actualizaciones para un trabajo que haya sido modificado o instalado por el destinatario, o para el Producto de Usuario en el que se haya modificado o instalado. Se puede denegar el acceso a una red cuando la modificación en sí afecta material y adversamente el funcionamiento de la red o viola las reglas y protocolos para la comunicación a través de la red.

La Fuente correspondiente transmitida y la Información de instalación proporcionada, de acuerdo con esta sección, debe estar en un formato que esté documentado públicamente (y con una implementación disponible para el público en forma de código fuente), y no debe requerir una contraseña o clave especial para desempaquetar, leer o copiando.

7. Terminos adicionales.
Los "permisos adicionales" son términos que complementan los términos de esta Licencia al hacer excepciones a una o más de sus condiciones. Los permisos adicionales que sean aplicables a todo el Programa se tratarán como si estuvieran incluidos en esta Licencia, en la medida en que sean válidos según la ley aplicable. Si los permisos adicionales se aplican solo a una parte del Programa, esa parte se puede usar por separado bajo esos permisos, pero el Programa completo permanece regido por esta Licencia sin tener en cuenta los permisos adicionales.
Cuando transmite una copia de un trabajo cubierto, puede, a su elección, eliminar cualquier permiso adicional de esa copia o de cualquier parte de ella. (Se pueden escribir permisos adicionales para requerir su propia eliminación en ciertos casos cuando modifica el trabajo). Puede otorgar permisos adicionales sobre el material, agregado por Usted a un trabajo cubierto, para el cual tiene o puede otorgar el permiso de derechos de Autor apropiado.
Sin perjuicio de cualquier otra disposición de esta Licencia, para el material que agregue a un trabajo cubierto, puede (si lo autorizan los titulares de los derechos de Autor de ese material) complementar los términos de esta Licencia con los términos:
  1. Renunciar a la garantía o limitar la responsabilidad de manera diferente a los términos de las secciones 15 y 16 de esta Licencia; o

  2. Exigir la conservación de avisos legales razonables especificados o atribuciones de Autor en ese material o en los Avisos legales apropiados que se muestran en las obras que lo contienen; o

  3. Prohibir la tergiversación del origen de ese material, o exigir que las versiones modificadas de dicho material se marquen de manera razonable como diferentes de la versión original; o

  4. Limitar el uso con fines publicitarios de los nombres de los licenciantes o Autores del material; o

  5. Negarse a otorgar derechos bajo la ley de marcas registradas para el uso de algunos nombres comerciales, marcas registradas o marcas de servicio; o

  6. Requerir la indemnización de los licenciantes y Autores de ese material por parte de cualquier persona que transmita el material (o versiones modificadas del mismo) con supuestos contractuales de responsabilidad hacia el destinatario, por cualquier responsabilidad que estos supuestos contractuales impongan directamente a esos licenciantes y Autores.
Todos los demás términos adicionales no permisivos se consideran "restricciones adicionales" en el sentido de la sección 10. Si el Programa tal como lo recibió, o cualquier parte del mismo, contiene un aviso que indica que se rige por esta Licencia junto con un término que es una restricción adicional, puede eliminar ese término. Si un documento de licencia contiene una restricción adicional pero permite volver a otorgar la licencia o transferirla en virtud de esta Licencia, puede agregar a un material de trabajo cubierto regido por los términos de ese documento de licencia, siempre que la restricción adicional no sobreviva a dicha actualización o transferencia.
Si agrega términos a un trabajo cubierto de acuerdo con esta sección, debe colocar, en los archivos de origen correspondientes, una declaración de los términos adicionales que se aplican a esos archivos, o un aviso que indique dónde encontrar los términos aplicables.
Los términos adicionales, permisivos o no permisivos, pueden establecerse en forma de una licencia por escrito por separado, o establecerse como excepciones; los requisitos anteriores se aplican de cualquier manera.
8. Terminación.
No puede propagar ni modificar un trabajo cubierto, excepto según lo dispuesto expresamente en esta Licencia. Cualquier intento de propagarlo o modificarlo de otro modo es nulo y automáticamente rescindirá sus derechos en virtud de esta Licencia (incluidas las licencias de patente otorgadas en virtud del tercer párrafo de la sección 11).
Sin embargo, si deja de violar esta Licencia, su licencia de un titular de derechos de Autor en particular se restablece (a) provisionalmente, a menos y hasta que el titular de los derechos de Autor rescinda su licencia de manera explícita y definitiva, y (b) permanentemente, si el titular de los derechos de Autor no cumple. para notificarle de la violación por algún medio razonable antes de 60 días después del cese.
Además, su licencia de un titular de derechos de Autor en particular se restablece permanentemente si el titular de derechos de Autor le notifica la violación por algún medio razonable, esta es la primera vez que recibe un aviso de violación de esta Licencia (para cualquier trabajo) de ese titular de derechos de Autor, y subsana la infracción antes de los 30 días posteriores a la recepción de la notificación.
La rescisión de sus derechos en virtud de esta sección no rescinde las licencias de las partes que hayan recibido copias o derechos de Usted en virtud de esta Licencia. Si sus derechos han sido rescindidos y no restablecidos de forma permanente, no califica para recibir nuevas licencias para el mismo material según la sección 10.
9. No se requiere aceptación para tener copias.
No es necesario que acepte esta Licencia para recibir o ejecutar una copia del Programa. La propagación auxiliar de una obra amparada que ocurra únicamente como consecuencia del uso de la transmisión entre pares para recibir una copia tampoco requiere aceptación. Sin embargo, nada más que esta Licencia le otorga permiso para propagar o modificar cualquier trabajo cubierto. Estas acciones infringen los derechos de Autor si no acepta esta Licencia. Por lo tanto, al modificar o propagar un trabajo cubierto, Usted indica que acepta esta Licencia para hacerlo.
10. Licencias automáticas de destinatarios intermedios.
Cada vez que transmite un trabajo cubierto, el destinatario recibe automáticamente una licencia de los licenciantes originales para ejecutar, modificar y propagar ese trabajo, sujeto a esta Licencia. Usted no es responsable de exigir el cumplimiento de esta Licencia por parte de terceros.
Una “transacción de entidad” es una transacción que transfiere el control de una organización, o sustancialmente todos los activos de una, o subdivide una organización, o fusiona organizaciones. Si la propagación de una obra cubierta resulta de una transacción de entidad, cada parte de esa transacción que recibe una copia de la obra también recibe las licencias de la obra que el antecesor de la parte en interés tenía o podría otorgar según el párrafo anterior, más un derecho de posesión de la Fuente correspondiente de la obra del antecesor en interés, si el antecesor la tiene o puede obtenerla con esfuerzos razonables.
No puede imponer ninguna otra restricción al ejercicio de los derechos otorgados o afirmados en virtud de esta Licencia. Por ejemplo, no puede imponer una tarifa de licencia, regalía u otro cargo por el ejercicio de los derechos otorgados en virtud de esta Licencia, y no puede iniciar un litigio (incluida una contrademanda o reconvención en una demanda) alegando que se ha infringido cualquier reclamación de patente. al hacer, usar, vender, ofrecer para la venta o importar el Programa o cualquier parte del mismo.
11. Patentes.
Un “colaborador” es un titular de derechos de Autor que autoriza el uso bajo esta Licencia del Programa o un trabajo en el que se basa el Programa. La obra así licenciada se denomina “versión de colaborador” del colaborador.
Las "reclamaciones de patentes esenciales" de un contribuyente son todas las reclamaciones de patentes que pertenecen o están controladas por el contribuyente, ya sean adquiridas o adquiridas en el futuro, que se infringirían de alguna manera, permitida por esta Licencia, al hacer, usar o vender su versión de colaborador, pero no incluya reclamos que se infringirían solo como consecuencia de una modificación adicional de la versión del colaborador. A los efectos de esta definición, "control" incluye el derecho a otorgar sublicencias de patentes de manera consistente con los requisitos de esta Licencia.
Cada colaborador le otorga una licencia de patente no exclusiva, mundial y libre de regalías según las reivindicaciones de patentes esenciales del colaborador, para hacer, usar, vender, ofrecer para la venta, importar y ejecutar, modificar y propagar el contenido de su versión de colaborador.
En los siguientes tres párrafos, una "licencia de patente" es cualquier acuerdo o compromiso expreso, como quiera que se denomine, de no hacer cumplir una patente (como un permiso expreso para practicar una patente o un pacto de no demandar por infracción de patente). “Otorgar” tal licencia de patente a una parte significa hacer tal acuerdo o compromiso de no hacer valer una patente contra la parte.
Si transmite un trabajo amparado, confiando a sabiendas en una licencia de patente, y la Fuente correspondiente del trabajo no está disponible para que nadie la copie, de forma gratuita y según los términos de esta Licencia, a través de un servidor de red disponible públicamente u otro significa, entonces Usted debe (1) hacer que la Fuente correspondiente esté disponible, o (2) hacer arreglos para privarse del beneficio de la licencia de patente para este trabajo en particular, o (3) hacer arreglos, de una manera consistente con el requisitos de esta Licencia, para extender la licencia de patente a destinatarios intermedios. “Confiar a sabiendas” significa que tiene conocimiento real de que, de no ser por la licencia de la patente, la transmisión del trabajo amparado en un país, o el uso del trabajo amparado por parte de su destinatario en un país, infringiría una o más patentes identificables en ese país que Usted tener motivos para creer que son válidos.
Si, en virtud de o en relación con una sola transacción o acuerdo, transmite o propaga mediante la obtención de la transmisión de una obra amparada y otorga una licencia de patente a algunas de las partes que reciben la obra amparada autorizándolas a usar, propagar, modificar o transmitir una copia específica del trabajo amparado, la licencia de patente que otorga se extiende automáticamente a todos los destinatarios del trabajo amparado y los trabajos basados en él.
Una licencia de patente es “discriminatoria” si no incluye dentro del alcance de su cobertura, prohíbe el ejercicio o está condicionada al no ejercicio de uno o más de los derechos que se otorgan específicamente bajo esta Licencia. No puede transmitir un trabajo cubierto si es parte de un acuerdo con un tercero que está en el negocio de distribución de software, en virtud del cual realiza un pago al tercero en función del alcance de su actividad de transmisión del trabajo, y en virtud del cual el Tercero otorga, a cualquiera de las partes que recibirían de Usted la obra amparada, una licencia de patente discriminatoria (a) en relación con las copias de la obra amparada transmitida por Usted (o las copias realizadas a partir de esas copias), o ( b) principalmente para y en relación con productos específicos o compilaciones que contienen el trabajo amparado, a menos que haya celebrado ese acuerdo o se haya otorgado la licencia de patente antes del 28 de marzo de 2007.
Nada en esta Licencia se interpretará como una exclusión o limitación de cualquier licencia implícita u otras defensas frente a infracciones que, de otro modo, podrían estar disponibles para Usted en virtud de la ley de patentes aplicable.
12. Sin renuncia a la libertad de los demás.
Si se le imponen condiciones (ya sea por orden judicial, acuerdo o de otro modo) que contradigan las condiciones de esta Licencia, no lo eximirán de las condiciones de esta Licencia. Si no puede transmitir un trabajo cubierto para satisfacer simultáneamente sus obligaciones en virtud de esta Licencia y cualquier otra obligación pertinente, entonces, como consecuencia, no podrá transmitirlo en absoluto. Por ejemplo, si acepta los términos que lo obligan a cobrar una regalía por la transmisión posterior de aquellos a quienes transmite el Programa, la única forma en que podría satisfacer tanto esos términos como esta Licencia sería abstenerse por completo de transmitir el Programa.
13. Usar con la Licencia Pública General GNU Affero.
Sin perjuicio de cualquier otra disposición de esta Licencia, Usted tiene permiso para vincular o combinar cualquier trabajo cubierto con un trabajo licenciado bajo la versión 3 de la Licencia Pública General GNU Affero en un solo trabajo combinado y transmitir el trabajo resultante. Los términos de esta Licencia continuarán aplicándose a la parte que es el trabajo cubierto, pero los requisitos especiales de la Licencia pública general GNU Affero, sección 13, con respecto a la interacción a través de una red, se aplicarán a la combinación como tal.
14. Versiones revisadas de esta Licencia.
La Free Software Foundation puede publicar versiones revisadas y/o nuevas de la Licencia Pública General GNU de vez en cuando. Estas nuevas versiones serán similares en espíritu a la versión actual, pero pueden diferir en detalles para abordar nuevos problemas o inquietudes.
A cada versión se le asigna un número de versión distintivo. Si el Programa especifica que se le aplica una determinada versión numerada de la Licencia Pública General de GNU “o cualquier versión posterior”, tiene la opción de seguir los términos y condiciones de esa versión numerada o de cualquier versión posterior publicada por el Software Libre. Base. Si el Programa no especifica un número de versión de la Licencia pública general de GNU, puede elegir cualquier versión publicada por la Free Software Foundation.
Si el Programa especifica que un apoderado puede decidir qué versiones futuras de la Licencia pública general de GNU se pueden usar, la declaración pública de aceptación de una versión de ese apoderado lo autoriza permanentemente a elegir esa versión para el Programa.
Las versiones posteriores de la licencia pueden otorgarle permisos adicionales o diferentes. Sin embargo, no se imponen obligaciones adicionales a ningún Autor o titular de derechos de Autor como resultado de su elección de seguir una versión posterior.
15. Renuncia de garantía.
NO HAY GARANTÍA PARA EL PROGRAMA, EN LA MEDIDA EN QUE LO PERMITA LA LEY APLICABLE. EXCEPTO CUANDO SE ESTABLEZCA LO CONTRARIO POR ESCRITO, LOS TITULARES DE LOS DERECHOS DE AUTOR Y/U OTRAS PARTES PROPORCIONAN EL PROGRAMA "TAL CUAL" SIN GARANTÍA DE NINGÚN TIPO, YA SEA EXPRESA O IMPLÍCITA, INCLUYENDO, ENTRE OTRAS, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD E IDONEIDAD PARA UN FIN DETERMINADO . TODO EL RIESGO EN RELACIÓN CON LA CALIDAD Y EL RENDIMIENTO DEL PROGRAMA ES CON USTED. SI EL PROGRAMA RESULTA DEFECTUOSO, USTED ASUME EL COSTO DE TODO EL SERVICIO, REPARACIÓN O CORRECCIÓN NECESARIOS.
16. Limitación de responsabilidad.
EN NINGÚN CASO, A MENOS QUE LO EXIJA LA LEY APLICABLE O SE ACORDE POR ESCRITO, CUALQUIER TITULAR DE LOS DERECHOS DE AUTOR O CUALQUIER OTRA PARTE QUE MODIFIQUE Y/O TRANSMITA EL PROGRAMA SEGÚN LO PERMITIDO ANTERIORMENTE, SERÁ RESPONSABLE ANTE USTED POR DAÑOS, INCLUYENDO CUALQUIER DAÑO GENERAL, ESPECIAL, INCIDENTAL O CONSECUENTE DAÑOS QUE SURJAN DEL USO O LA IMPOSIBILIDAD DE UTILIZAR EL PROGRAMA (INCLUYENDO, ENTRE OTROS, LA PÉRDIDA DE DATOS O QUE LOS DATOS SEAN INEXACTOS O LAS PÉRDIDAS SOSTENIDAS POR USTED O TERCEROS O UNA FALLA DEL PROGRAMA PARA FUNCIONAR CON CUALQUIER OTRO PROGRAMA), INCLUSO SI DICHO TITULAR U OTRA PARTE HA SIDO ADVERTIDO DE LA POSIBILIDAD DE DICHOS DAÑOS.
17. Interpretación de los artículos 15 y 16.
Si la renuncia de garantía y la limitación de responsabilidad provistas anteriormente no pueden tener efecto legal local de acuerdo con sus términos, los tribunales de revisión aplicarán la ley local que más se aproxime a una renuncia absoluta de toda responsabilidad civil en relación con el Programa, a menos que una garantía o asunción de responsabilidad acompaña una copia del Programa a cambio de una tarifa.
FIN DE LOS TÉRMINOS Y CONDICIONES

Cómo aplicar estos términos a sus nuevos programas

Si desarrolla un nuevo programa y desea que sea de la mayor utilidad posible para el público, la mejor manera de lograrlo es convertirlo en software libre que todos puedan redistribuir y cambiar bajo estos términos.

Para ello, adjunte los siguientes avisos al programa. Es más seguro adjuntarlos al inicio de cada archivo de origen para establecer de manera más efectiva la exclusión de la garantía; y cada archivo debe tener al menos la línea de "derechos de Autor" y un indicador de dónde se encuentra el aviso completo.

una línea para dar el nombre del programa y una breve idea de lo que hace.
Copyright (C) año nombre del Autor

Este programa es software libre: puedes redistribuirlo y/o modificar
bajo los términos de la Licencia Pública General GNU publicada por
Free Software Foundation, ya sea la versión 3 de la Licencia, o (en
su opción) cualquier versión posterior.

Este programa se distribuye con la esperanza de que sea útil, pero
SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
COMERCIABILIDAD o IDONEIDAD PARA UN FIN DETERMINADO. Ver la GNU
Licencia Pública General para más detalles.

Debería haber recibido una copia de la Licencia Pública General GNU
junto con este programa. Si no, consulte https://www.gnu.org/licenses/.

También agregue información sobre cómo contactarlo por correo electrónico y en papel.

Si el programa interactúa con el terminal, haga que emita un breve aviso como este cuando se inicie en un modo interactivo:

programa Copyright (C) año nombre del Autor
Este programa viene SIN NINGUNA GARANTÍA EN ABSOLUTO; para obtener detalles, escriba 'mostrar w'.
Este es software gratuito, y puede redistribuirlo
bajo ciertas condiciones; escriba 'mostrar c' para más detalles.

Los comandos hipotéticos ‘show w’ (‘mostrar w’) y ‘show c’ (‘mostrar c’) deben mostrar las partes apropiadas de la Licencia Pública General. Por supuesto, los comandos de su programa pueden ser diferentes; para una interfaz GUI, usaría un "cuadro de información".

También debe hacer que su empleador (si trabaja como programador) o la escuela, si corresponde, firme una "descargo de responsabilidad de derechos de Autor" para el programa, si es necesario. Para obtener más información sobre esto y cómo aplicar y seguir la GPL de GNU, consulte https://www.gnu.org/licenses/.

La Licencia Pública General GNU no permite incorporar su programa en programas propietarios. Si su programa es una biblioteca de subrutinas, puede considerar más útil permitir la vinculación de aplicaciones propietarias con la biblioteca. Si esto es lo que desea hacer, utilice la Licencia pública general reducida de GNU en lugar de esta Licencia. Pero primero, lea https://www.gnu.org/licenses/why-not-lgpl.html .



Apéndice B Licencia de Documentación Libre GNU

Version 1.3, 3 Noviembre 2008

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
https://fsf.org/

Todo el mundo tiene permitido copiar y distribuir copias textuales
de este documento de licencia, pero no se permite cambiarlo.

0. PREÁMBULO
El propósito de esta Licencia es hacer que un manual, libro de texto u otro documento funcional y útil sea libre en el sentido de libertad: para asegurar a todos la libertad efectiva de copiarlo y redistribuirlo, con o sin modificarlo, ya sea comercial o no comercialmente. En segundo lugar, esta Licencia preserva para el Autor y el Editor una forma de obtener crédito por su trabajo, sin ser considerado responsable de las modificaciones realizadas por otros.
Esta Licencia es una especie de “copyleft”, lo que significa que los trabajos derivados del documento deben ser libres en el mismo sentido. Complementa la Licencia Pública General GNU, que es una licencia copyleft diseñada para Software Libre.
Hemos diseñado esta Licencia para usarla en manuales de Software Libre, porque el Software Libre necesita documentación libre: un programa libre debe venir con manuales que brinden las mismas libertades que el software. Pero esta Licencia no se limita a los manuales de software; se puede utilizar para cualquier trabajo textual, independientemente del tema o si se publica como un libro impreso. Recomendamos esta Licencia principalmente para trabajos cuyo propósito sea instructivo o de referencia.
1. APLICABILIDAD Y DEFINICIONES
Esta Licencia se aplica a cualquier manual u otro trabajo, en cualquier medio, que contenga un aviso colocado por el titular de los derechos de Autor que indique que puede distribuirse según los términos de esta Licencia. Dicho aviso otorga una licencia libre de regalías en todo el mundo, de duración ilimitada, para usar ese trabajo bajo las condiciones establecidas en este documento. El “Documento”, a continuación, se refiere a dicho manual o trabajo. Cualquier miembro del público es un licenciatario y se trata de "usted". Usted acepta la licencia si copia, modifica o distribuye el trabajo de una manera que requiera permiso bajo la ley de derechos de Autor.
Una “Versión Modificada” del Documento significa cualquier trabajo que contenga el Documento o una parte del mismo, ya sea copiado palabra por palabra, o con modificaciones y/o traducido a otro idioma.
Una “Sección Secundaria” es un apéndice con nombre o una sección preliminar del Documento que trata exclusivamente de la relación de los Editores o Autores del Documento con el tema general del Documento (o asuntos relacionados) y no contiene nada que pueda caer directamente dentro de ese tema general. (Por lo tanto, si el Documento es en parte un libro de texto de matemáticas, una Sección Secundaria puede no explicar ninguna matemática.) La relación podría ser una cuestión de conexión histórica con el tema o con asuntos relacionados, o de carácter legal, comercial, filosófico, ético. o posición política respecto de ellos.
Las “Secciones Invariantes” son ciertas Secciones Secundarias cuyos títulos se designan, como los de las Secciones Invariantes, en el aviso que dice que el Documento se publica bajo esta Licencia. Si una sección no se ajusta a la definición anterior de Secundaria, no se permite designarla como Invariable. El Documento puede contener cero Secciones Invariantes. Si el Documento no identifica ninguna Sección Invariable, entonces no hay ninguna.
Los “Textos de Portada” son ciertos pasajes cortos de texto que se enumeran, como Textos de Portada o Textos de Contraportada, en el aviso que dice que el Documento se publica bajo esta Licencia. Un texto de portada puede tener un máximo de 5 palabras y un texto de contraportada puede tener un máximo de 25 palabras.
Una copia "Transparente" del Documento significa una copia legible por máquina, representada en un formato cuya especificación está disponible para el público en general, que es adecuada para revisar el documento directamente con Editores de texto genéricos o (para imágenes compuestas de píxeles) pintura genérica programas o (para dibujos) algún Editor de dibujo ampliamente disponible, y que sea adecuado para la entrada a formateadores de texto o para la traducción automática a una variedad de formatos adecuados para la entrada a formateadores de texto. Una copia realizada en un formato de archivo transparente cuyo marcado, o ausencia de marcado, se ha arreglado para impedir o desalentar la modificación posterior por parte de los lectores no es transparente. Un formato de imagen no es transparente si se usa para una cantidad sustancial de texto. Una copia que no es "Transparente" se llama "Opaca".
Los ejemplos de formatos adecuados para copias transparentes incluyen ASCII simple sin marcado, formato de entrada Texinfo, formato de entrada LaTeX, SGML o XML usando un DTD disponible públicamente, y HTML, PostScript o PDF simple que cumple con los estándares y está diseñado para la modificación humana. Los ejemplos de formatos de imagen transparente incluyen PNG, XCF y JPG. Los formatos opacos incluyen formatos propietarios que pueden ser leídos y editados únicamente por procesadores de texto propietarios, SGML o XML para los cuales DTD y/o herramientas de procesamiento generalmente no están disponibles, y el HTML, PostScript o PDF generado por máquina producido por algunos procesadores de texto para fines de salida únicamente.
La "Página de título" significa, para un libro impreso, la página de título en sí, más las páginas siguientes que sean necesarias para contener, de manera legible, el material que esta Licencia requiere que aparezca en la página de título. Para obras en formatos que no tienen ninguna página de título como tal, "Página de título" significa el texto cerca de la aparición más destacada del título de la obra, que precede al comienzo del cuerpo del texto.
El "Editor" significa cualquier persona o entidad que distribuya copias del Documento al público.
Una sección “Titulado XYZ” significa una subunidad nombrada del Documento cuyo título es precisamente XYZ o contiene XYZ entre paréntesis a continuación del texto que traduce XYZ en otro idioma. (Aquí XYZ representa un nombre de sección específico que se menciona a continuación, como "Agradecimientos", "Dedicatorias", "Aprobaciones" o "Historia"). "Conservar el título" de dicha sección cuando modifica el Documento significa que sigue siendo una sección “Titulado XYZ” según esta definición.
El Documento puede incluir Exenciones de garantía junto al aviso que establece que esta Licencia se aplica al Documento. Se considera que estas renuncias de garantía se incluyen por referencia en esta licencia, pero solo en lo que respecta a la renuncia de garantías: cualquier otra implicación que estas renuncias de garantía puedan tener es nula y no tiene ningún efecto sobre el significado de esta licencia.
1. COPIA LITERAL
Puede copiar y distribuir el Documento en cualquier medio, ya sea comercial o no comercial, siempre que esta Licencia, los avisos de derechos de Autor y el aviso de licencia que dice que esta Licencia se aplica al Documento se reproduzcan en todas las copias y que no agregue ninguna otra condición. a los de esta Licencia. No puede utilizar medidas técnicas para obstruir o controlar la lectura o la copia posterior de las copias que realice o distribuya. Sin embargo, usted puede aceptar compensación a cambio de las copias. Si distribuye un número suficientemente grande de copias, también debe seguir las condiciones de la sección 3.
También puede prestar copias, en las mismas condiciones establecidas anteriormente, y puede exhibir copias públicamente.
3. COPIA EN CANTIDAD
Si publica copias impresas (o copias en medios que comúnmente tienen portadas impresas) del Documento, que suman más de 100, y el aviso de licencia del Documento requiere Textos de Portada, debe adjuntar las copias en portadas que lleven, de forma clara y legible, todos estos Textos de portada: Textos de portada en la portada y Textos de contraportada en la contraportada. Ambas portadas también deben identificarlo de manera clara y legible como el Editor de estas copias. La portada debe presentar el título completo con todas las palabras del título igualmente prominentes y visibles. Además, puede agregar otro material en las portadas. La copia con cambios limitados a las cubiertas, siempre que conserven el título del Documento y cumplan con estas condiciones, puede ser tratada como copia literal en otros aspectos.
Si los textos requeridos para cualquiera de las portadas son demasiado voluminosos para caber de manera legible, debe colocar los primeros de la lista (tantos como quepan razonablemente) en la portada real y continuar con el resto en las páginas adyacentes.
Si publica o distribuye copias Opacas del Documento que suman más de 100, debe incluir una copia Transparente legible por máquina junto con cada copia Opaca, o indicar en o con cada copia Opaca una ubicación de red informática desde la cual la red general: usando public tiene acceso para descargar usando protocolos de red estándar públicos una copia transparente completa del Documento, libre de material agregado. Si utiliza la última opción, debe tomar medidas razonablemente prudentes, cuando comience a distribuir copias opacas en cantidad, para asegurarse de que esta copia transparente permanezca accesible en el lugar indicado hasta al menos un año después de la última vez que distribuya una copia. Copia opaca (directamente o a través de sus agentes o distribuidores) de esa edición al público.
Se solicita, pero no se requiere, que se comunique con los Autores del Documento mucho antes de redistribuir una gran cantidad de copias, para darles la oportunidad de brindarle una versión actualizada del Documento.
4. MODIFICACIONES
Usted puede copiar y distribuir una Versión Modificada del Documento bajo las condiciones de las secciones 2 y 3 anteriores, siempre que publique la Versión Modificada bajo precisamente esta Licencia, con la Versión Modificada desempeñando el papel del Documento, autorizando así la distribución y modificación de la Versión Modificada a quien posea una copia de la misma. Además, debe hacer estas cosas en la versión modificada:

  1. Utilizar en la Portada (y en las portadas, si las hubiere) un título distinto al del Documento, y de los de las versiones anteriores (que deberían, si las hubiere, figurar en la sección Historial del Documento). Puede usar el mismo título que una versión anterior si el Editor original de esa versión da permiso.

  2. Enumere en la Portada, como Autores, una o más personas o entidades responsables de la autoría de las modificaciones en la Versión Modificada, junto con al menos cinco de los Autores principales del Documento (todos sus Autores principales, si tiene menos de cinco), a menos que lo liberen de este requisito.

  3. Indique en la página del Título el nombre del Editor de la Versión Modificada, como el Editor.

  4. Conservar todos los avisos de copyright del Documento.

  5. Agregue un aviso de derechos de Autor apropiado para sus modificaciones junto a los demás avisos de derechos de Autor.

  6. Incluya, inmediatamente después de los avisos de derechos de Autor, un aviso de licencia que otorgue al público permiso para usar la Versión Modificada según los términos de esta Licencia, en el formato que se muestra en el Anexo a continuación.

  7. Conservar en ese aviso de licencia las listas completas de las Secciones Invariantes y los Textos de Portada requeridos que se proporcionan en el aviso de licencia del Documento.

  8. Incluya una copia inalterada de esta Licencia.

  9. Conservar la sección Titulada "Historia", Conservar su Título y agregarle un elemento que indique al menos el título, el año, los nuevos Autores y el Editor de la Versión Modificada tal como se indica en la Portada. Si no hay una sección titulada "Historia" en el Documento, cree una que indique el título, el año, los Autores y el Editor del Documento tal como se indica en su Página de título, luego agregue un elemento que describa la Versión modificada como se indica en la oración anterior.

  10. Conservar la ubicación de la red, si la hay, proporcionada en el Documento para el acceso público a una copia transparente del Documento, y de la misma manera las ubicaciones de la red proporcionadas en el Documento para las versiones anteriores en las que se basó. Estos pueden colocarse en la sección "Historial". Puede omitir una ubicación de red para un trabajo que se publicó al menos cuatro años antes que el Documento en sí, o si el Editor original de la versión a la que se refiere da permiso.

  11. Para cualquier sección Titulada “Agradecimientos” o “Dedicatorias”, Preservar el Título de la sección, y preservar en la sección toda la sustancia y el tono de cada uno de los agradecimientos y/o dedicatorias de los contribuyentes que allí se dan.

  12. Conservar todas las Secciones Invariantes del Documento, inalteradas en su texto y en sus títulos. Los números de sección o su equivalente no se consideran parte de los títulos de sección.

  13. Elimine cualquier sección titulada "Respaldos". Tal sección puede no estar incluida en la Versión Modificada.

  14. No cambie el título de ninguna sección existente para que se denomine "Aprobaciones" o entre en conflicto con el título de cualquier Sección invariable.

  15. Conserve cualquier exención de responsabilidad de la garantía.

Si la Versión modificada incluye nuevas secciones preliminares o apéndices que califican como Secciones secundarias y no contienen material copiado del Documento, puede, a su elección, designar algunas o todas estas secciones como invariantes. Para hacer esto, agregue sus títulos a la lista de Secciones Invariantes en el aviso de licencia de la Versión Modificada. Estos títulos deben ser distintos de cualquier otro título de sección.

Puede agregar una sección titulada "Aprobaciones", siempre que no contenga más que aprobaciones de su versión modificada por parte de varias partes, por ejemplo, declaraciones de revisión por pares o que el texto haya sido aprobado por una organización como la definición autorizada de un estándar.

Puede agregar un pasaje de hasta cinco palabras como Texto de portada y un pasaje de hasta 25 palabras como Texto de contraportada al final de la lista de Textos de portada en la Versión modificada. Solo un pasaje del Texto de la Portada y uno del Texto de la Contraportada pueden ser agregados por (o mediante arreglos hechos por) cualquier entidad. Si el Documento ya incluye un texto de portada para la misma portada, agregado previamente por usted o por arreglo hecho por la misma entidad en cuyo nombre está actuando, no puede agregar otro; pero puede reemplazar el anterior, con el permiso explícito del Editor anterior que agregó el anterior.

El(los) Autor(es) y Editor(es) del Documento no dan permiso por esta Licencia para usar sus nombres con fines publicitarios o para afirmar o implicar el respaldo de cualquier Versión Modificada.

5. COMBINACIÓN DE DOCUMENTOS
Puede combinar el Documento con otros documentos publicados bajo esta Licencia, según los términos definidos en la sección 4 anterior para versiones modificadas, siempre que incluya en la combinación todas las Secciones Invariantes de todos los documentos originales, sin modificar, y enumere todas como Secciones invariables de su trabajo combinado en su aviso de licencia, y que conserva todas sus Exenciones de garantía.
El trabajo combinado solo necesita contener una copia de esta Licencia, y varias Secciones Invariantes idénticas pueden reemplazarse con una sola copia. Si hay varias Secciones Invariantes con el mismo nombre pero contenido diferente, haga que el título de cada sección sea único agregando al final, entre paréntesis, el nombre del Autor o Editor original de esa sección, si se conoce, o bien un número único Haga el mismo ajuste a los títulos de las secciones en la lista de Secciones Invariantes en el aviso de licencia de la obra combinada.
En la combinación, debe combinar las secciones tituladas "Historia" en los diversos documentos originales, formando una sección titulada "Historia"; combine igualmente las secciones tituladas "Agradecimientos" y las secciones tituladas "Dedicatorias". Debe eliminar todas las secciones Tituladas "Aprobaciones".
6. COLECCIONES DE DOCUMENTOS
Puede hacer una colección que consista en el Documento y otros documentos publicados bajo esta Licencia, y reemplazar las copias individuales de esta Licencia en los diversos documentos con una sola copia que se incluye en la colección, siempre que siga las reglas de esta Licencia para copia textual de cada uno de los documentos en todo lo demás.
Puede extraer un solo documento de dicha colección y distribuirlo individualmente bajo esta Licencia, siempre que inserte una copia de esta Licencia en el documento extraído y siga esta Licencia en todos los demás aspectos con respecto a la copia literal de ese documento.
7. AGREGADO CON OBRAS INDEPENDIENTES
Una compilación del Documento o sus derivados con otros documentos u obras separados e independientes, en o sobre un volumen de un medio de almacenamiento o distribución, se denomina "agregado" si los derechos de Autor resultantes de la compilación no se utilizan para limitar los derechos legales. de los Usuarios de la compilación más allá de lo que permiten las obras individuales. Cuando el Documento se incluye en un agregado, esta Licencia no se aplica a los otros trabajos en el agregado que no son en sí mismos trabajos derivados del Documento.
Si el requisito del Texto de Portada de la sección 3 es aplicable a estas copias del Documento, entonces si el Documento es menos de la mitad del agregado total, los Textos de Portada del Documento pueden colocarse en portadas que encuadren el Documento dentro del agregado, o el equivalente electrónico de cubiertas si el Documento está en formato electrónico. En caso contrario, deberán aparecer en cubiertas impresas que enmarquen todo el árido.
8. TRADUCCIÓN
La traducción se considera un tipo de modificación, por lo que puede distribuir traducciones del Documento según los términos de la sección 4. Reemplazar Secciones invariantes con traducciones requiere un permiso especial de los titulares de los derechos de Autor, pero puede incluir traducciones de algunas o todas las Secciones invariantes además de las versiones originales de estas Secciones Invariantes. Puede incluir una traducción de esta Licencia y todos los avisos de licencia en el Documento, y cualquier Descargo de responsabilidad de la garantía, siempre que también incluya la versión original en inglés de esta Licencia y las versiones originales de esos avisos y descargos de responsabilidad. En caso de desacuerdo entre la traducción y la versión original de esta Licencia o un aviso o descargo de responsabilidad, prevalecerá la versión original.
Si una sección del Documento se titula "Agradecimientos", "Dedicatorias" o "Historia", el requisito (sección 4) para conservar su título (sección 1) generalmente requerirá cambiar el título real.
9. TERMINACIÓN
No puede copiar, modificar, otorgar sublicencias ni distribuir el Documento excepto según lo dispuesto expresamente en esta Licencia. Cualquier intento de copiarlo, modificarlo, otorgar sublicencias o distribuirlo de otro modo es nulo y automáticamente rescindirá sus derechos bajo esta Licencia.
Sin embargo, si deja de violar esta Licencia, su licencia de un titular de derechos de Autor en particular se restablece (a) provisionalmente, a menos y hasta que el titular de los derechos de Autor rescinda su licencia de manera explícita y definitiva, y (b) permanentemente, si el titular de los derechos de Autor no cumple. para notificarle de la violación por algún medio razonable antes de 60 días después del cese.
Además, su licencia de un titular de derechos de Autor en particular se restablece permanentemente si el titular de derechos de Autor le notifica la violación por algún medio razonable, esta es la primera vez que recibe un aviso de violación de esta Licencia (para cualquier trabajo) de ese titular de derechos de Autor, y subsana la infracción antes de los 30 días posteriores a la recepción de la notificación.
La rescisión de sus derechos en virtud de esta sección no rescinde las licencias de las partes que hayan recibido copias o derechos de usted en virtud de esta Licencia. Si sus derechos han sido rescindidos y no restablecidos de forma permanente, la recepción de una copia de parte o la totalidad del mismo material no le otorga ningún derecho a usarlo.
10. FUTURAS REVISIONES DE ESTA LICENCIA
La Free Software Foundation puede publicar versiones nuevas y revisadas de la Licencia de documentación libre GNU de vez en cuando. Estas nuevas versiones serán similares en espíritu a la versión actual, pero pueden diferir en detalles para abordar nuevos problemas o inquietudes. Consulte https://www.gnu.org/licenses/.
Cada versión de la Licencia recibe un número de versión distintivo. Si el Documento especifica que se aplica una versión numerada particular de esta Licencia "o cualquier versión posterior", tiene la opción de seguir los términos y condiciones de esa versión especificada o de cualquier versión posterior que se haya publicado (no como una borrador) de la Free Software Foundation. Si el Documento no especifica un número de versión de esta Licencia, puede elegir cualquier versión publicada (no como borrador) por la Free Software Foundation. Si el Documento especifica que un apoderado puede decidir qué versiones futuras de esta Licencia se pueden usar, la declaración pública de aceptación de una versión de ese apoderado lo Autoriza permanentemente a elegir esa versión para el Documento.
11. RELICENCIAR
“Sitio de colaboración masiva de varios Autores” (o “Sitio MMC”) se refiere a cualquier servidor de la World Wide Web que publique obras protegidas por derechos de Autor y que también proporcione instalaciones destacadas para que cualquiera pueda editar esas obras. Un wiki público que cualquiera puede editar es un ejemplo de dicho servidor. Una “Colaboración masiva de varios Autores” (o “MMC”) contenida en el sitio significa cualquier conjunto de obras protegidas por derechos de Autor publicadas en el sitio de MMC.
“CC-BY-SA” significa la licencia Creative Commons Attribution-Share Alike 3.0 publicada por Creative Commons Corporation, una corporación sin fines de lucro con sede comercial principal en San Francisco, California, así como las futuras versiones con copyleft de esa licencia publicada por esa misma organización.
“Incorporar” significa publicar o volver a publicar un Documento, en su totalidad o en parte, como parte de otro Documento.
Un MMC es "elegible para renovar la licencia" si tiene licencia bajo esta Licencia, y si todos los trabajos que se publicaron primero bajo esta Licencia en algún otro lugar que no sea este MMC, y posteriormente se incorporaron en su totalidad o en parte en el MMC, (1) no tenían cubren textos o secciones invariantes, y (2) por lo tanto se incorporaron antes del 1 de noviembre de 2008.
El operador de un Sitio MMC puede volver a publicar un MMC contenido en el sitio bajo CC-BY-SA en el mismo sitio en cualquier momento antes del 1 de agosto de 2009, siempre que el MMC sea elegible para renovar la licencia.

ANEXO: Cómo usar esta Licencia para sus documentos

Para usar esta Licencia en un documento que haya escrito, incluya una copia de la Licencia en el documento y coloque los siguientes avisos de derechos de Autor y licencia justo después de la página del título:

Copyright (C) año su nombre.
  Se otorga permiso para copiar, distribuir y/o modificar este documento.
  bajo los términos de la Licencia de Documentación Libre GNU, Versión 1.3
  o cualquier versión posterior publicada por la Free Software Foundation;
  sin secciones invariantes, sin textos de portada y sin contraportada
  Textos. Se incluye una copia de la licencia en la sección titulada ``GNU
  Licencia de Documentación Libre''.

Si tiene secciones invariantes, textos de portada y textos de contraportada, reemplace "con... Textos". línea con esto:

siendo las Secciones Invariantes enumerar sus títulos, con
    los Textos de la Portada son una lista, y con los Textos de la Contraportada
    ser lista.

Si tiene secciones invariantes sin textos de portada, o alguna otra combinación de las tres, fusione esas dos alternativas para adaptarse a la situación.

Si su documento contiene ejemplos no triviales de código de programa, recomendamos publicar estos ejemplos en paralelo bajo su elección de licencia de Software Libre, como la Licencia Pública General GNU, para permitir su uso en Software Libre.



Apéndice C Argumentos de la línea de comandos para la invocación de Emacs

Emacs soporta argumentos en la línea de comandos para solicitar varias acciones al invocarlo. Estos son para la compatibilidad con otros editores y para actividades sofisticadas. No se recomienda su uso para la edición ordinaria (ver Uso de Emacs como servidor, para una forma de acceder a un trabajo del Editor existente desde la línea de comandos).

Los argumentos que comienzan con ‘-’ son opciones, al igual que ‘+linenum’. Todos los demás argumentos especifican los archivos a visitar. Emacs visita los archivos especificados mientras se inicia. El último archivo especificado en la línea de comandos se convierte en el buffer actual; los demás archivos también se visitan en otros buffers. Como en la mayoría de los programas, el argumento especial ‘--’ dice que todos los argumentos subsiguientes son nombres de archivos, no opciones, incluso si comienzan con ‘-’.

Las opciones de los comandos de Emacs pueden especificar muchas cosas, como el tamaño y la posición de la ventana X que utiliza, sus colores, etc. Unas pocas opciones permiten un uso avanzado, como la ejecución de funciones Lisp en archivos en modo batch. Las secciones de este capítulo describen las opciones disponibles, ordenadas según su propósito.

Hay dos formas de escribir las opciones: las formas cortas que comienzan con un solo ‘-’, y las formas largas que comienzan con ‘--’. Por ejemplo, ‘-d’ es una forma corta y ‘--display’ es la forma larga correspondiente.

Las formas largas con ‘--’ son más fáciles de recordar, pero más largas de escribir. Sin embargo, no es necesario deletrear todo el nombre de la opción; cualquier abreviatura inequívoca es suficiente. Cuando una opción larga requiere un argumento, puede utilizar un espacio o un signo igual para separar el nombre de la opción y el argumento. Así, para la opción ‘--display’, puede escribir ‘--display sugar-bombs:0.0’ o ‘--display=sugar-bombs:0.0’. Recomendamos un signo de igualdad porque hace que la relación sea más clara, y las tablas de abajo siempre muestran un signo de igualdad.

La mayoría de las opciones especifican cómo inicializar Emacs, o establecer parámetros para la sesión del Editor. Las llamamos opciones iniciales. Unas pocas opciones especifican cosas que hacer, como cargar bibliotecas o llamar a funciones Lisp. Estas se llaman opciones de acción. Éstas y los nombres de los archivos se denominan argumentos de acción. Los argumentos de acción se almacenan como una lista de cadenas en la variable command-line-args. (En realidad, cuando Emacs se inicia, command-line-args contiene todos los argumentos pasados desde la línea de comandos; durante la inicialización, los argumentos iniciales se eliminan de esta lista cuando se procesan, dejando sólo los argumentos de acción).

C.1 Argumentos de la acción

Esta es una tabla de argumentos de acción:

file
file=archivo
--find-file=archivo
--visit=archivo
Visita el archivo especificado. Ver Visitar archivos.
Cuando Emacs se inicia, muestra el buffer de inicio en una ventana, y el archivo de visita del buffer en otra ventana (ver Ventanas múltiples). Si se suministra más de un argumento de archivo, el archivo que se muestra es el último especificado en la línea de comandos; los demás archivos se visitan pero no se muestran sus búferes.
Si el buffer de inicio está deshabilitado (ver Entrando en Emacs), entonces al iniciar Emacs con un argumento de archivo se muestra el archivo que visita el buffer en una sola ventana. Con dos argumentos de archivo, el Editor muestra los archivos en dos ventanas diferentes. Con más de dos argumentos de archivo, muestra el último archivo especificado en una ventana, más otra ventana con un Menú de Buffer que muestra todos los otros archivos (ver Operando en varios Bufferes). Para inhibir el uso del Menú del Buffer para esto, cambie la variable inhibit-startup-buffer-menu a t.
+linenum archivo
Visita el archivo especificado, y va a la línea número linenum en él.
+linenum:columnnum archivo
Visita el archivo especificado, luego va a la línea número linenum y pone el punto en la columna número columnnum.
-l archivo
--load-file=archivo
Carga una biblioteca Lisp llamada archivo con la función load. Si archivo no es un nombre de archivo absoluto, Emacs lo busca primero en el directorio actual, y luego en los directorios listados en load-path (ver Bibliotecas de código Lisp para Emacs).
Advertencia: Si los argumentos de línea de comandos anteriores han visitado archivos, el directorio actual es el directorio del último archivo visitado.
-L archivo
--directory=dir
Antepone el directorio dir a la variable load-path. Si especifica múltiples opciones ‘-L’, Emacs preserva el orden relativo; por ejemplo, usando ‘-L /foo -L /bar’ resulta en una ruta de carga de la forma ("/foo" "/bar" ...). Si dir comienza con ‘:’, Emacs elimina el ‘:’ y añade (en lugar de anteponer) el resto a la ruta de carga. (En MS Windows, utilice ‘;’ en lugar de ‘:’; es decir, use el valor del separador de rutas).
-f función
--funcall=función
Llama a una función Lisp. Si se trata de una función interactiva (un comando), lee los argumentos de forma interactiva como si hubiera llamado a la misma función con una secuencia de teclas. En caso contrario, llama a la función sin argumentos.
--eval=expresión
--execute=expresión
Evalúa la expresión Lisp.
--insert=archivo
Inserta el contenido de un archivo en el búfer que está en uso cuando se procesa este argumento de la línea de comandos. Normalmente, este es el búfer *scratch* (véase Lisp Interaction Buffers), pero si los argumentos anteriores en la línea de comandos visitan archivos o conmutan los búferes, podría ser un búfer diferente. El efecto de este argumento de la línea de comandos es como lo que hace M-x insert-file (véase Operaciones de archivo diversas).
--kill
Sale de Emacs sin pedir confirmación.
--help
Imprime un mensaje de uso listando todas las opciones disponibles, y luego sale con éxito.
--version
Imprime la versión de Emacs, y luego sale con éxito.

C.2 Opciones iniciales

Las opciones iniciales especifican parámetros para la sesión de Emacs. Esta sección describe las opciones iniciales más generales; algunas otras opciones específicamente relacionadas con el sistema X Window aparecen en las siguientes secciones.

Algunas opciones iniciales afectan a la carga del fichero de inicialización. Normalmente, Emacs carga primero site-start.el si existe, luego su propio fichero de inicialización si existe, y finalmente el fichero de inicialización por defecto default.el si existe (ver El fichero de inicialización de Emacs). Ciertas opciones evitan la carga de algunos de estos archivos o los sustituyen por otros.

-chdir directorio
--chdir=directorio
Cambia a directorio antes de hacer cualquier otra cosa. Esto se utiliza principalmente en la gestión de sesiones en X para que Emacs se inicie en el mismo directorio en el que se detuvo. Esto hace que guardar y restaurar el escritorio sea más fácil.
-t dispositivo
--terminal=dispositivo
Utiliza dispostivo como dispositivo para la entrada y salida del terminal. Esta opción implica ‘--no-window-system’.
-d display
--display=display
Usa el sistema de ventanas X y la pantalla llamada display para abrir el marco inicial de Emacs. Vea Especificando el nombre de la pantalla, para más detalles.
nw
--no-window-system
No se comunica directamente con el sistema de ventanas, ignorando la variable de entorno DISPLAY aunque esté establecida. Esto significa que Emacs usa la terminal desde la que se lanzó para toda su visualización y entrada.
Ejecuta Emacs en modo batch. El modo por lotes se utiliza para ejecutar programas escritos en Emacs Lisp a partir de scripts de shell, makefiles, etc. Para invocar un programa Lisp, use la opción ‘-batch’ junto con una o más de las opciones ‘-l’, ‘-f’ o ‘--eval’ (vea Argumentos de Acción). Ver Ejemplo de Argumento de Comando, para un ejemplo.
En el modo batch, Emacs no muestra el texto que se está editando, y los caracteres de interrupción estándar del terminal como Ctrl-z (C-z) y Ctrl-c (C-c) tienen su efecto habitual. Las funciones de que normalmente imprimen un mensaje en el área de eco, imprimirán en su lugar en el flujo de salida estándar (stdout) o en el flujo de error estándar (stderr). (Para ser precisos, funciones como prin1, princ y print imprimen en stdout, mientras que message y error lo hacen en stderr). Las funciones que normalmente leen la entrada del teclado desde el minibuffer toman su entrada del flujo de entrada estándar del terminal (stdin) en su lugar.
--batch’ implica ‘-q’ (no cargar un archivo de inicialización), pero site-start.el se carga de todos modos. También hace que Emacs salga después de procesar todas las opciones del comando. Además, desactiva el auto-guardado excepto en los buffers para los que se solicita explícitamente el auto-guardado, y cuando se guardan archivos omite la llamada al sistema fsync a menos que se solicite lo contrario.
Los errores que se producen al ejecutar un Emacs '--batch' darán lugar a la impresión de un backtrace de Emacs Lisp. Para desactivar este comportamiento, establezca backtrace-on-error-noninteractive a nil.
--script archivo
Ejecuta Emacs en modo batch, como ‘--batch’, y luego lee y ejecuta el código Lisp en el archivo.
El uso normal de esta opción es en archivos de script ejecutables que ejecutan Emacs. Pueden empezar con este texto en la primera línea
#!/usr/bin/emacs --script
	
que invocará a Emacs con ‘--script’ y proporcionará el nombre del archivo de script como archivo. Emacs Lisp trata entonces el ‘#!’ de esta primera línea como comentarios.
--no-build-details
Omite detalles como el nombre del sistema y el tiempo de construcción del ejecutable de Emacs, para que las construcciones sean más deterministas. Esta opción no está pensada para un uso regular (o interactivo), ya que hace que comandos como system-name devuelvan nil.
q
--no-init-file
No carga ningún fichero de inicialización (ver El fichero de inicialización de Emacs). Cuando Emacs es invocado con esta opción, la facilidad de personalización no permite guardar las opciones (ver Interfaz de personalización fácil). Esta opción no desactiva la carga de site-start.el.
--no-site-file
-nsl
No carga site-start.el (ver El archivo de inicialización de Emacs). La opción ‘-Q’ también hace esto, pero otras opciones como ‘-q’ no lo hacen.
--no-site-lisp
No incluye los directorios site-lisp en load-path (ver El fichero de inicialización de Emacs). La opción ‘-Q’ también hace esto.
--no-splash
No mostrar una pantalla de inicio. También puedes conseguir este efecto estableciendo la variable inhibit-startup-screen a un valor no nulo en tu fichero de inicialización (ver Entrando en Emacs).
--no-x-resources
No cargar los recursos X. También puede conseguir este efecto estableciendo la variable inhibit-x-resources a t en su fichero de inicialización (vea Recursos X).
-Q
--quick
Inicia Emacs con las mínimas personalizaciones. Esto es similar a usar ‘-q’, ‘--no-site-file’, ‘--no-site-lisp’, ‘--no-x-resources’, y ‘--no-splash’ juntos.
-daemon
--daemon[=nombre]
--bg-daemon[=nombre]
--fg-daemon[=nombre]
Iniciar Emacs como demonio: después de que Emacs se inicie, arranca el servidor Emacs sin abrir ningún marco. Entonces puede usar el comando emacsclient para conectarse a Emacs para editar. (Opcionalmente, puede especificar un nombre explícito para el servidor; si lo hace, necesitará especificar el mismo nombre cuando invoque a emacsclient, mediante su opción --socket-name, ver Opciones de emacsclient). Ver Uso de Emacs como servidor, para información sobre el uso de Emacs como demonio. Un demonio "de fondo" se desconecta de la terminal y se ejecuta en segundo plano (‘--daemon’ es un alias de ‘--bg-daemon’).
--no-desktop
No recarga ningún escritorio guardado. Ver Guardar sesiones de Emacs.
-u usuario
--user= usuario
Carga el archivo de inicialización del usuario en lugar del propio (23).

Nota

(23) Esta opción no tiene efecto en MS-Windows.

--debug-init
Habilita el depurador de Emacs Lisp para errores en el archivo init. Vea Entrar en el depurador en caso de error en El Manual de Referencia de Emacs Lisp de GNU.
--module-assertions
Habilita costosas comprobaciones de corrección cuando se trata de módulos cargables dinámicamente. Esto está pensado para los autores de módulos que desean verificar que su módulo se ajusta a los requisitos de la API del módulo. La opción hace que Emacs aborte si se dispara una aserción relacionada con el módulo. Vea Writing Dynamically-Loaded Modules en The GNU Emacs Lisp Reference Manual.
--dump-file=archivo
Carga el estado de Emacs volcado desde el archivo nombrado. Por defecto, un Emacs instalado buscará su estado de volcado en un fichero llamado emacs.pdmp en el directorio donde la instalación de Emacs pone los ficheros dependientes de la arquitectura; la variable exec-directory contiene el nombre de ese directorio. emacs es el nombre del fichero ejecutable de Emacs, normalmente sólo emacs. (Cuando invoque a Emacs desde el directorio src donde fue construido sin instalarlo, buscará el archivo de volcado en el directorio del ejecutable). Si renombra o mueve el archivo de volcado a un lugar diferente, puede usar esta opción para decirle a Emacs dónde encontrar ese archivo.

C.3 Ejemplo de argumento de comando

He aquí un ejemplo de uso de Emacs con argumentos y opciones. Supone que tiene un archivo de programa Lisp llamado hack-c.el que, cuando se carga, realiza alguna operación útil en el buffer actual, que se espera que sea un programa C.

emacs --batch foo.c -l hack-c -f save-buffer >& log

Esto dice que visite foo.c, cargue hack-c.el (que hace cambios en el archivo visitado), guarde foo.c (tenga en cuenta que save-buffer es la función a la que está vinculada Ctrl-x Ctrl-x (C-x C-s)), y luego salga de nuevo al shell (debido a ‘--batch’). ‘--batch’ también garantiza que no habrá problemas para redirigir la salida al log, porque Emacs no asumirá que tiene un terminal de visualización con el que trabajar.

C.4 Variables de entorno

El entorno es una característica del sistema operativo; consiste en una colección de variables con nombres y valores. Cada variable se denomina variable de entorno; los nombres de las variables de entorno distinguen entre mayúsculas y minúsculas, y lo habitual es utilizar sólo mayúsculas. Los valores son cadenas de texto.

Lo que hace que el entorno sea útil es que los subprocesos heredan el entorno automáticamente de su proceso padre. Esto significa que puede configurar una variable de entorno en tu shell de inicio de sesión, y todos los programas que ejecutes (incluyendo Emacs) la verán automáticamente. Los subprocesos de Emacs (como shells, compiladores y programas de control de versiones) también heredan el entorno de Emacs.

Dentro de Emacs, el comando Alt-x getenv (M-x getenv) lee el nombre de una variable de entorno, e imprime su valor en el área de eco. Alt-x getenv (M-x setenv) establece una variable en el entorno de Emacs, y Ctrl-u Alt-x setenv (C-u M-x setenv) elimina una variable. (Las sustituciones de variables de entorno con ‘$’ funcionan en el valor igual que en los nombres de archivo; véase Nombres de archivo con $). La variable initial-environment almacena el entorno inicial heredado por Emacs.

La forma de establecer las variables de entorno fuera de Emacs depende del sistema operativo, y especialmente del shell que estés utilizando. Por ejemplo, aquí está cómo establecer la variable de entorno ORGANIZATION (ORGANIZACIÓN) a ‘not very much’ (no mucho) usando Bash:

export ORGANIZATION="not very much"

y aquí se explica cómo hacerlo en csh o tcsh:

setenv ORGANIZATION "not very much"

Cuando Emacs utiliza el sistema X Window, varias variables de entorno que controlan X funcionan también para Emacs. Consulta la documentación de X para más información.

C 4.1 Variables generales

Aquí hay una lista alfabética de variables de entorno que tienen un significado especial en Emacs. La mayoría de estas variables también son utilizadas por otros programas. Emacs no requiere que ninguna de estas variables de entorno esté establecida, pero utiliza sus valores si están establecidos.

CDPATH
Usada por el comando cd para buscar el directorio que especifiques, cuando especifiques un directorio relativo.
COLORTHEME
Si esta variable se establece con el valor ‘truecolor’, le dice a Emacs que utilice color verdadero de 24 bits en las pantallas en modo texto, incluso si la base de datos terminfo no está instalada. Emacs utilizará los comandos incorporados para solicitar el color verdadero por valores RGB en lugar de la información terminfo que falta.
DBUS_SESSION_BUS_ADDRESS
Usado por D-Bus cuando Emacs se compila con él. Normalmente, no hay necesidad de cambiarla. Si se establece una dirección ficticia, como ‘unix:path=/dev/null’, se suprimen las conexiones al bus de sesión D-Bus, así como el lanzamiento automático del bus de sesión D-Bus si aún no se está ejecutando.
EMACSDATA
Directorio para los archivos independientes de la arquitectura que vienen con Emacs. Se utiliza para inicializar la variable data-directory.
EMACSDOC
Directorio para el fichero de cadenas de documentación, que se utiliza para inicializar la variable Lisp doc-directory.
EMACSLOADPATH
Una lista de directorios separada por dos puntos (24) para buscar archivos Emacs Lisp. Si se establece, modifica el valor inicial habitual de la variable load-path (véase Bibliotecas de código Lisp para Emacs). Un elemento vacío representa el valor por defecto de load-path; por ejemplo, usar ‘EMACSLOADPATH="/tmp:"’ añada /tmp al frente de la ruta de carga por defecto. Para especificar un elemento vacío en el medio de la lista, use dos puntos doble (::) seguidos, como en ‘EMACSLOADPATH="/tmp::/foo"’.

Nota

(24) Aquí y a continuación, cuando decimos "lista de directorios separada por dos puntos", se refiere a los sistemas Unix y GNU/Linux. En MS-DOS y MS-Windows, los directorios se separan con punto y coma, ya que los nombres de archivos de DOS/Windows pueden incluir dos puntos después de la letra de la unidad.

EMACSPATH
Una lista de directorios separada por dos puntos para buscar archivos ejecutables. Si se establece, Emacs utiliza esto además de PATH (ver más abajo) cuando se inicializa la variable exec-path (ver Ejecutar comandos de la shell desde Emacs).
EMACS
Su dirección de correo electrónico; se utiliza para inicializar la variable Lisp user-mail-address, que la interfaz de correo de Emacs pone en la cabecera ‘From’ de los mensajes salientes (ver Mail Header Fields).
ESHELL
Se usa para que el modo shell anule la variable de entorno SHELL (véase Subshell interactivo).
HISTFILE
El nombre del archivo en el que se guardan los comandos de la shell entre inicios de sesión. Esta variable tiene como valor predeterminado ~/.bash_history si usa Bash, ~/.sh_history si usa ksh, y ~/.history en caso contrario.
HOME
La ubicación de sus archivos en el árbol de directorios; se usa para la expansión de los nombres de archivo que comienzan con una tilde (~). Si se establece, debe ser un nombre de archivo absoluto. (Si se establece a un nombre de archivo relativo, Emacs lo interpreta de forma relativa al directorio donde se inició Emacs, pero no recomendamos usar esta característica). Si no se establece, HOME normalmente va al directorio de inicio del usuario dado por LOGNAME, USER o su ID de usuario, o a / si todo lo demás falla. En MS-DOS, el valor por defecto es el directorio desde el que se inició Emacs, con ‘/bin’ eliminado al final si está presente. En Windows, el valor por defecto de HOME es el subdirectorio Application Data del directorio del perfil de usuario (normalmente, es C:/Documents and Settings/nombre de usuario/Application Data, donde nombre de usuario es su nombre de usuario), aunque por compatibilidad con el pasado se usará C:/ en su lugar si ahí se encuentra un archivo .emacs.
HOSTNAME
El nombre de la máquina en la que se está ejecutando Emacs.
INFOPATH
Una lista, separada por dos puntos, de directorios en los que buscar archivos de información.
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MESSAGES
LC_MONETARY
LC_NUMERIC
LC_TYPE
LANG
La configuración regional preferida por el usuario. La configuración regional tiene seis categorías, especificadas por las variables de entorno LC_COLLATE para la ordenación, LC_CTYPE para la codificación de caracteres, LC_MESSAGES para los mensajes del sistema, LC_MONETARY para los formatos monetarios, LC_NUMERIC para los números y LC_TIME para las fechas y horas. Si una de estas variables no está establecida, la categoría se ajusta por defecto al valor de la variable de entorno LANG, o a la configuración regional ‘C’ por defecto si no se ha establecido LANG. Pero si se especifica LC_ALL, se anula la configuración de todas las demás variables de entorno de localización.
En MS-Windows y macOS, si LANG no está ya establecido en el entorno, Emacs lo establece basándose en el valor por defecto de todo el sistema. Puede establecerlo en el panel de control "Configuración regional" en algunas versiones de MS-Windows, y en la preferencia del sistema "Idioma y región" en macOS.
El valor de la categoría LC_CTYPE se compara con las entradas de locale-language-names, locale-charset-language-names y locale-preferred-coding-systems, para seleccionar un entorno de idioma y un sistema de codificación por defecto. Véase Entornos lingüísticos.
LOGNAME
El nombre de inicio de sesión del usuario. Ver también USER.
MAIL
El nombre del buzón de correo del sistema.
MH
El nombre del archivo de configuración para el sistema mh. Ver MH-E en The Emacs Interface to MH.
NAME
Su nombre en el mundo real. Se usa para inicializar la variable user-full-name (ver Mail Header Fields).
NNTPSERVER
El nombre del servidor de noticias. Usado por los paquetes mh y Gnus.
ORGANIZATION
El nombre de la organización a la que pertenece. Usado para establecer la cabecera ‘Organization:’ en sus mensajes desde el paquete Gnus.
PATH
Una lista separada por dos puntos de directorios que contienen archivos ejecutables. Se usa para inicializar la variable exec-path (ver Ejecución de comandos de la shell desde Emacs).
PWD
Si se establece, este debe ser el directorio por defecto cuando se inicia Emacs.
REPLYTO
Si se establece, especifica un valor inicial para la variable mail-default-reply-to (ver Campos de la cabecera del correo).
SAVEDIR
El nombre de un directorio en el que se guardan por defecto los artículos de noticias. Usado por el paquete Gnus.
SHELL
El nombre de un intérprete usado para analizar y ejecutar programas ejecutados desde dentro de Emacs. Se usa para inicializar la variable shell-file-name (ver Single Shell Commands).
SMTSERVER
El nombre del servidor de correo saliente. Se usa para inicializar la variable smtpmail-smtp-server (ver Envío de correo).
TERM
El tipo de terminal que Emacs está usando. Esta variable debe ser establecida a menos que Emacs se ejecute en modo batch. En MS-DOS, por defecto es ‘internal’, que especifica una emulación de terminal incorporada que maneja la propia pantalla de la máquina.
TERMCAP
El nombre del archivo de la biblioteca termcap que describe cómo programar la terminal especificada por TERM. Por defecto es /etc/termcap.
TMPDIR
TMP
TEMP
Estas variables de entorno se usan para inicializar la variable temporary-file-directory, que especifica un directorio en el que colocar los archivos temporales (véase Archivos de copia de seguridad). Emacs intenta usar primero . Si no se establece, Emacs normalmente vuelve a usar /tmp, pero en MS-Windows y MS-DOS vuelve a usar TMP, luego TEMP, y finalmente c:/temp.
TZ
Especifica la zona horaria por defecto y posiblemente también la información sobre el horario de verano. Ver Reglas de Zona Horaria en el Manual de Referencia de GNU Emacs Lisp. En MS-DOS, si TZ no está establecido en el entorno cuando Emacs se inicia, Emacs define un valor por defecto apropiado para el código de país devuelto por DOS. En MS-Windows, Emacs no usa TZ en absoluto.
USER
El nombre de inicio de sesión del usuario. Ver también LOGNAME. En MS-DOS, este nombre es por defecto ‘root’.
VERSION CONTROL
Se usa para inicializar la variable version-control (ver Copias de seguridad simples o numeradas).

C 4.2 Variables diversas

Estas variables se usan sólo en configuraciones particulares:

COMSPEC
En MS-DOS y MS-Windows, el nombre del intérprete de comandos a usar cuando se invocan archivos batch y comandos internos del shell. En MS-DOS también se usa para establecer un valor por defecto para la variable de entorno SHELL.
NAME
En MS-DOS, esta variable tiene por defecto el valor de la variable USER.
EMACSCOLORS
En MS-DOS, esto especifica los colores de la pantalla. Es útil establecerlos de esta manera, ya que de otra manera Emacs mostraría los colores por defecto momentáneamente cuando se inicia.
El valor de esta variable debe ser la codificación de dos caracteres de los colores de primer plano (el primer carácter) y de fondo (el segundo carácter) de la cara por defecto. Cada carácter debe ser el código hexadecimal del color deseado en una pantalla estándar de PC en modo texto. Por ejemplo, para obtener un texto azul sobre un fondo gris claro, especifique ‘EMACSCOLORS=17’, ya que 1 es el código del color azul y 7 es el código del color gris claro.
La pantalla del PC normalmente sólo admite ocho colores de fondo. Sin embargo, Emacs cambia la pantalla del DOS a un modo en el que se pueden usar los 16 colores para el fondo, por lo que se usan realmente los cuatro bits del color de fondo.
PRELOAD_WINSOCK
En MS-Windows, si estableces esta variable, Emacs cargará e inicializará la biblioteca de red al inicio, en lugar de esperar hasta la primera vez que se requiera.
emacs_dir
En MS-Windows, emacs_dir es una variable de entorno especial, que indica la ruta completa del directorio en el que está instalado Emacs. Si Emacs está instalado en la estructura de directorios estándar, calcula este valor automáticamente. No sirve de mucho configurar esta variable a menos que su instalación no sea estándar, ya que a diferencia de otras variables de entorno, será anulada por Emacs al iniciarse. Al establecer otras variables de entorno, como EMACSLOADPATH, puede ser útil usar emacs_dir en lugar de codificar una ruta absoluta. Esto permite que múltiples versiones de Emacs compartan la misma configuración de variables de entorno, y le permite mover el directorio de instalación de Emacs, sin cambiar ninguna configuración de entorno o del registro.

C 4.3 El registro del sistema de MS-Windows

En MS-Windows, las variables de entorno emacs_dir, EMACSLOADPATH, EMACSDATA, EMACSPATH, EMACSDOC, SHELL, TERM, HOME, LANG y PRELOAD_WINSOCK también se pueden configurar en la sección HKEY_CURRENT_USER o HKEY_LOCAL_MACHINE del registro del sistema, en la clave /Software/GNU/Emacs. Cuando se inicia Emacs, además de verificar el entorno, también verifica el registro del sistema en busca de esas variables.

Tenga en cuenta que la configuración del registro tiene un efecto global en todo el sistema: afectará a todas las sesiones de Emacs que se ejecuten en el sistema. Por lo tanto, si ejecuta diferentes versiones de Emacs, o usa ejecutables de Emacs instalados y desinstalados, o crea versiones más nuevas de Emacs, la configuración en el registro hará que todos usen los mismos directorios, lo que probablemente no sea lo que desea. . Por este motivo, recomendamos no configurar estas variables en el registro. Si tiene tales configuraciones en el registro, le recomendamos que las elimine.

Si ejecuta el programa de instalación de Emacs MS-Windows addpm.exe, actualizará cualquier configuración de registro existente de las variables emacs_dir, EMACSLOADPATH, EMACSDATA, EMACSPATH, EMACSDOC, SHELL y TERM para tener los valores adecuados para la versión de Emacs instalada con la que Llegó addpm.exe. Tenga en cuenta que addpm.exe no creará ninguna configuración de registro que no exista, solo actualizará las configuraciones existentes, que probablemente se heredan de una instalación anterior de Emacs, para que sean compatibles con la versión de Emacs recién instalada. Ya no es necesario ejecutar addpm.exe al instalar versiones recientes de Emacs, por lo que solo recomendamos hacerlo si está actualizando desde una versión anterior y no puede eliminar esta configuración del registro por algún motivo.

Además de las variables de entorno anteriores, también puede agregar configuraciones a la clave de registro /Software/GNU/Emacs para especificar recursos X (consulte Recursos X). La mayoría de las configuraciones que puede especificar en su archivo .Xdefaults se pueden establecer desde esa clave de registro.

C 5 Especificación del nombre de la pantalla

La variable de entorno DISPLAY indica a todos los clientes X, incluido Emacs, dónde mostrar sus ventanas. Su valor se establece por defecto en circunstancias ordinarias, cuando se inicia un servidor X y se ejecutan trabajos localmente. Puede especificar la pantalla Ud. mismo; una razón para hacerlo es si quiere entrar en otro sistema y ejecutar Emacs allí, y tener la ventana mostrada en su terminal local.

DISPLAY tiene la sintaxis ‘host:display.screen’, donde host es el nombre del servidor del Sistema X Window, display es un número asignado arbitrariamente que distingue su servidor (terminal X) de otros servidores en la misma máquina, y screen es un campo que permite a un servidor X controlar múltiples pantallas de terminal. El punto y el campo de pantalla son opcionales. Si se incluyen, screen suele ser cero.

Por ejemplo, si su host se llama ‘glasperle’ y su servidor es el primer (o quizás el único) servidor listado en la configuración, su DISPLAY es ‘glasperle:0.0’.

Puede especificar el nombre de la pantalla explícitamente cuando ejecute Emacs, ya sea cambiando la variable DISPLAY, o con la opción ‘-d display’ o ‘--display=display’. He aquí un ejemplo:

emacs --display=glasperle:0 &

Puede inhibir el uso del sistema de ventanas X con la opción ‘-nw’. Entonces Emacs usa su terminal de texto de control para la visualización. Vea las opciones iniciales.

A veces, los arreglos de seguridad impiden que un programa en un sistema remoto se muestre en su sistema local. En este caso, intentar ejecutar Emacs produce mensajes como este:

Xlib:  connection to "glasperle:0.0" refused by server

Podría superar este problema usando el comando xhost en el sistema local para dar permiso de acceso desde su máquina remota.

C 6 Opciones de especificación de fuentes

Puede usar la opción de línea de comandos ‘-fn font’ (o ‘--font’, que es un alias de ‘-fn’) para especificar una fuente por defecto:

-fn fuente
--font= fuente
Usa fuente como fuente por defecto.

Al pasar un nombre de fuente a Emacs en la línea de comandos, puede ser necesario citarlo, encerrándolo entre comillas, si contiene caracteres que el shell trata de forma especial (por ejemplo, espacios). Por ejemplo:

emacs -fn "DejaVu Sans Mono-12"

Consulte Fuentes, para obtener detalles sobre los nombres de las fuentes y otras formas de especificar la fuente por defecto.

C 7 Opciones de color de las ventanas

Puede usar las siguientes opciones de la línea de comandos para especificar los colores a usar para varias partes de la pantalla de Emacs. Los colores pueden ser especificados usando nombres de colores o tripletes RGB (ver Colores para Caras).

-fg color
--foreground-color=color
Especifica el color de primer plano, anulando el color especificado por la cara por defecto (default face) (ver Caras de texto).
-bg color
--background-color=color
Especifica el color de fondo, anulando el color especificado por la cara por defecto (default face).
-bd color
--border-color=color
Especifica el color del borde de la ventana X. Esto no tiene efecto si Emacs está compilado con soporte GTK+.
-cr color
--cursor-color=color
Especifica el color del cursor de Emacs que indica dónde está el punto.
-ms color
--mouse-color=color
Especifica el color del cursor del ratón cuando éste se encuentra en la ventana de Emacs.
-r
-rv
--reverse-mode
Invertir el vídeo: intercambiar los colores de primer plano y de fondo.
--color=mode
Establece el modo de soporte de color cuando Emacs se ejecuta en un terminal de texto. Esta opción anula el número de colores soportados que el terminal de caracteres anuncia en su base de datos termcap o terminfo. El parámetro mode puede ser uno de los siguientes
never
no
No usar colores aunque las capacidades de la terminal especifiquen el soporte de colores.
default
auto
Igual que cuando no se usa --color: Emacs detecta al inicio si la terminal soporta colores, y si lo hace, activa la visualización en color.
always
yes
ansi8
Activa el soporte de color incondicionalmente, y usa los comandos de color especificados por las secuencias de escape ANSI para los 8 colores estándar.
num
Usa el modo de color para num colores. Si num es -1, desactiva el soporte de color (equivalente a ‘never’); si es 0, usa el soporte de color por defecto para este terminal (equivalente a ‘auto’); en caso contrario, usa un modo estándar apropiado para los colores de num. Dependiendo de las capacidades de su terminal, Emacs podría activar un modo de color para 8, 16, 88 o 256 como valor de num. Si no hay un modo que soporte los colores de num, Emacs actúa como si num fuera 0, es decir, usa el modo de soporte de color por defecto del terminal.
Si se omite mode, se usa por defecto ansi8.

Por ejemplo, para usar un cursor de ratón coral y un cursor de texto azul pizarra, introduzca:

emacs -ms coral -cr 'slate blue' &

Puede invertir los colores de primer plano y de fondo mediante la opción ‘-rv’ o con el recurso X 'reverseVideo'.

Las opciones ‘-fg’, ‘-bg’ y ‘-rv’ funcionan tanto en terminales de texto como en pantallas gráficas.

C 8 Opciones para el tamaño y la posición de la ventana

Esta es una lista de las opciones de la línea de comandos para especificar el tamaño y la posición del marco inicial de Emacs:

-g widthxheight[{+-}xoffset{+-}yoffset]]
--geometry=widthxheight[{+-}xoffset{+-}yoffset]]
Especifica el ancho y la altura del tamaño (medidas en columnas y líneas de caracteres), y las posiciones xoffset y yoffset (medidas en píxeles). Los parámetros del ancho y altura se aplican a todos los fotogramas, mientras que xoffset y yoffset sólo al fotograma inicial.
fs
--fullscreen
Especifica que el ancho y la altura deben ser las de la pantalla. Normalmente no se muestran las decoraciones del gestor de ventanas. (Después de iniciar Emacs, puede alternar este estado usando F11, toggle-frame-fullscreen).
-mm
--maximized
Especifica que el marco de Emacs debe ser maximizado. Esto normalmente significa que el marco tiene decoraciones del gestor de ventanas. (Después de iniciar Emacs, puede cambiar este estado usando , Alt-F10 (M-F10, toggle-frame-maximized)).
-fh
--fulheight
Especifica que la altura debe ser la de la pantalla.
fw
--fullwidth
Especifica que la anchura debe ser la de la pantalla.

En ‘--geometry’, la opción {+-} significa un signo más o un signo menos. Un signo más antes de xoffset significa que es la distancia desde el lado izquierdo de la pantalla; un signo menos significa que cuenta desde el lado derecho. Un signo más antes de yoffset significa que es la distancia desde la parte superior de la pantalla, y un signo menos indica la distancia desde la parte inferior. Los valores xoffset y yoffset pueden ser positivos o negativos, pero eso no cambia su significado, sólo su dirección.

Emacs usa las mismas unidades que xterm para interpretar la geometría. El ancho y la altura se miden en caracteres, por lo que una fuente grande crea un marco más grande que una fuente pequeña. (Si se especifica una fuente proporcional, Emacs usa su anchura máxima como unidad de anchura). xoffset y el yoffset se miden en píxeles.

No es necesario especificar todos los campos en la especificación de la geometría. Si omite tanto xoffset como yoffset, el gestor de ventanas decide dónde colocar el marco de Emacs, posiblemente dejando que lo coloque con el ratón. Por ejemplo, ‘164x55’ especifica una ventana de 164 columnas de ancho, suficiente para dos ventanas de ancho normal una al lado de la otra, y 55 líneas de alto.

El ancho del marco por defecto es de 80 caracteres y la altura por defecto está entre 35 y 40 líneas, dependiendo del sistema operativo y del gestor de ventanas. Puede omitir el ancho o el alto, o ambos. Si comienza la geometría con un entero, Emacs lo interpreta como el ancho. Si empieza con una ‘x’ seguida de un entero, Emacs lo interpreta como la altura. Así, ‘81’ especifica sólo la anchura; ‘x45’ especifica sólo la altura.

Si empieza la geometría con ‘+’ o ‘-’, eso introduce un desplazamiento, lo que significa que se omiten ambos tamaños. Así, ‘-3’ especifica sólo el desplazamiento de x. (Si sólo da un desplazamiento, siempre es el de ‘x’). ‘+3-3’ especifica tanto el desplazamiento de ‘x’ como el de ‘y’, colocando el marco cerca de la parte inferior izquierda de la pantalla.

Puede especificar un valor por defecto para cualquiera o todos los campos en su archivo de recursos X (ver Recursos X), y luego anular los campos seleccionados con la opción ‘--geometry’.

Como la línea de modo y el área de eco ocupan las 2 últimas líneas del marco, la altura de la ventana de texto inicial es 2 menos que la altura especificada en su geometría. En las versiones de Emacs que no son del kit de herramientas X, la barra de menú también ocupa una línea del número especificado. Pero en la versión del kit de herramientas X, la barra de menú es adicional y no cuenta para la altura especificada. La barra de herramientas, si está presente, también es adicional.

Activar o desactivar la barra de menú o la barra de herramientas altera la cantidad de espacio disponible para el texto ordinario. Por lo tanto, si Emacs se inicia con una barra de herramientas (que es el valor por defecto), y maneja la especificación de la geometría asumiendo que hay una barra de herramientas, y luego su archivo de inicialización desactiva la barra de herramientas, Usted terminará con una geometría de marco diferente a la que pidió. Para obtener el tamaño deseado sin barra de herramientas, use un recurso X para especificar "sin barra de herramientas" (ver Tabla de recursos X para Emacs); entonces Emacs ya sabrá que no hay barra de herramientas cuando procese la geometría especificada.

Cuando se usa una de las opciones ‘--fullscreen’, ‘--maximized’, ‘--fullwidth’ o ‘--fullheight’, algunos gestores de ventanas requieren que se establezca la variable frame-resize-pixelwise a un valor no nulo para que un marco aparezca realmente maximizado o a pantalla completa.

Algunos gestores de ventanas tienen opciones que pueden hacer que ignoren tanto las posiciones especificadas por el programa como las especificadas por el Usuario. Si éstas están activadas, Emacs no posiciona la ventana correctamente.

C 9 Bordes internos y externos

Un marco Emacs tiene un borde interno y un borde externo. El borde interno es una franja extra del color de fondo alrededor de la parte del texto del marco. El propio Emacs dibuja el borde interno. El borde externo es dibujado por X fuera de las barras de herramientas y de menú del marco. También hay un borde externo que es dibujado por el gestor de ventanas. El tamaño del borde externo no se puede establecer desde Emacs.

-ib ancho
--internal-border=ancho
Especifica el ancho del borde interno (alrededor del área de texto del marco), en píxeles.
-bw ancho
--border-width=ancho
Especifica el ancho del borde exterior, en píxeles.

Cuando se especifica el tamaño del marco, éste no cuenta los bordes. La posición del marco se mide desde el borde exterior de la frontera externa.

Use la opción ‘-ib n’ para especificar un borde interno de n píxeles de ancho. El valor por defecto es 1. Utilice ‘-bw n’ para especificar el ancho del borde exterior (aunque el gestor de ventanas puede no prestar atención a lo que especifique). El ancho por defecto del borde exterior es 2.

C 10 Títulos de los marcos

Cada marco de Emacs tiene siempre un título, que aparece en las decoraciones e iconos de las ventanas como el nombre del marco. El título por defecto es de la forma ‘nombre-invocación@máquina' (si sólo hay un marco) o muestra el nombre del buffer de la ventana seleccionada (si hay más de un marco).

Puede especificar un título no predeterminado para el marco inicial de Emacs con una opción de la línea de comandos:

-T título
--title=título
Especifica el título como el título para el marco inicial de Emacs.

La opción ‘--name’ (ver Recursos X) también especifica el título para el marco Emacs inicial.

C 11 Iconos

-iconic
--iconic
Inicia Emacs en un estado iconificado.
-nbi
--no-bitmap-icon
Desactiva el uso del icono de Emacs.

La mayoría de los gestores de ventanas te permiten iconificar (o "minimizar") un marco de Emacs, ocultándolo de la vista. Algunos gestores de ventanas sustituyen las ventanas iconificadas por pequeños iconos, mientras que otros las eliminan por completo de la vista. La opción ‘-iconic’ le dice a Emacs que empiece a funcionar en un estado iconificado, en lugar de mostrar un marco inmediatamente. El marco de texto no aparece hasta que se desiconfigura (o se "desminimiza").

Por defecto, Emacs usa un icono que contiene el logo de Emacs. En entornos de escritorio como Gnome, este icono también se muestra en otros contextos, por ejemplo, al cambiar a un marco de Emacs. La opción '-nbi’ o ‘--no-bitmap-icon’ le dice a Emacs que deje que el gestor de ventanas elija el tipo de icono que quiere usar, normalmente un pequeño rectángulo que contiene el título del marco.

C 12 Otras opciones de visualización

parent-id id
Abre Emacs como una ventana X cliente a través del protocolo XEmbed, con id como el id de la ventana X padre. Actualmente, esta opción es principalmente útil para los desarrolladores.
-vb
--vertical-scroll-bars
Habilita las barras de desplazamiento vertical.
-lsp-pixels
--line-spacing=pixels
Especifica píxeles como espacio adicional para poner entre líneas, en píxeles.
-nbc
--no-blinking-cursor
Desactiva el cursor parpadeante en las pantallas gráficas.
-D
--basic-display
Desactiva la barra de menús, la barra de herramientas, las barras de desplazamiento, los consejos de las herramientas, y desactiva el modo de bloqueo de fuentes y el cursor parpadeante. Esto puede ser útil para hacer un caso de prueba que simplifique la depuración de los problemas de visualización.

La opción ‘--xrm’ (ver Recursos X) especifica valores adicionales de recursos X.



Apéndice D Opciones y recursos de X

Puede personalizar algunos aspectos del comportamiento de Emacs relacionados con X utilizando recursos X, como es habitual en los programas que utilizan X.

Cuando Emacs se compila con soporte GTK+, la apariencia de varios widgets gráficos, como la barra de menú, la barra de desplazamiento y los cuadros de diálogo, está determinada por los recursos GTK+, que también describiremos. Cuando Emacs se construye sin soporte GTK+, la apariencia de estos widgets está determinada por recursos X adicionales.

En MS-Windows, puede personalizar algunos de los mismos aspectos utilizando el registro del sistema (vea El registro del sistema de MS-Windows).

D 1 Recursos X

Los programas que se ejecutan bajo el sistema X Window organizan sus opciones de Usuario bajo una jerarquía de clases y recursos. Puede especificar valores por defecto para estas opciones en su archivo de recursos X, normalmente llamado ~/.Xdefaults o ~/.Xresources. Los cambios en este archivo no tienen efecto inmediato, porque el servidor X almacena su propia lista de recursos; para actualizarla, utilice el comando xrdb, por ejemplo, ‘xrdb ~/.Xdefaults’.

Las configuraciones especificadas a través de los recursos X en general anulan las configuraciones equivalentes en los archivos init de Emacs (ver El archivo de inicialización de Emacs), en particular para los parámetros del marco inicial (ver Parámetros del marco).

(Los sistemas MS-Windows no soportan los archivos de recursos X; en estos sistemas, Emacs busca los recursos X en el Registro de Windows, primero bajo la clave ‘HKEY_CURRENT_USER\SOFTWARE\GNU\Emacs’, que afecta sólo al usuario actual y anula la configuración de todo el sistema, y luego bajo la clave ‘HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs’, que afecta a todos los usuarios del sistema. Las barras de menú y de desplazamiento son widgets nativos de MS-Windows, por lo que sólo son personalizables a través de la configuración de todo el sistema en el Panel de Control de Pantalla. También puede configurar los recursos mediante la opción de línea de comandos ‘-xrm’, como se explica a continuación).

Cada línea del archivo de recursos X especifica un valor para una opción o para una colección de opciones relacionadas. El orden en que aparecen las líneas en el archivo no importa. Cada especificación de recurso consiste en un nombre de programa y un nombre de recurso. Las distinciones de mayúsculas y minúsculas son significativas en cada uno de estos nombres. He aquí un ejemplo:

emacs.cursorColor: dark green

El nombre del programa es el nombre del archivo ejecutable al que se aplica el recurso. En el caso de Emacs, suele ser ‘emacs’. Para especificar una definición que se aplique a todas las instancias de Emacs, independientemente del nombre del ejecutable de Emacs, use ‘Emacs’.

El nombre del recurso es el nombre de una configuración del programa. Por ejemplo, Emacs reconoce un recurso ‘cursorColor’ que controla el color del cursor de texto.

Los recursos se agrupan en clases con nombre. Por ejemplo, la clase ‘Foreground’ contiene los recursos ‘cursorColor’, ‘foreground’ y ‘pointerColor’ (ver Tabla de Recursos X para Emacs). En lugar de usar un nombre de recurso, puedes usar un nombre de clase para especificar el valor por defecto para todos los recursos de esa clase, así:

emacs.Foreground: dark green

Emacs no procesa los recursos X en absoluto si se establece la variable inhibit-x-resources a un valor no nulo. Si invoca Emacs con la opción de línea de comandos ‘-Q’ (o ‘--quick’), inhibit-x-resources se establece automáticamente en t (ver Opciones iniciales).

Además, puede utilizar las siguientes opciones de línea de comandos para anular el archivo de recursos X:

-name nombre
nombre=nombre
Esta opción establece el nombre del programa del marco inicial de Emacs a nombre. También establece el título del marco inicial a nombre. Esta opción no afecta a los marcos posteriores.
Si no se especifica esta opción, por defecto se utiliza el nombre del ejecutable de Emacs como nombre del programa.
Por consistencia, '-name' también especifica el nombre a utilizar para otros valores de recursos que no pertenecen a ningún marco en particular.
Los recursos que dan nombre a las invocaciones de Emacs también pertenecen a una clase, llamada ‘Emacs’. ‘Emacs’ en lugar de ‘emacs’, el recurso se aplica a todos los marcos de todos los trabajos de Emacs, independientemente de los títulos de los marcos e independientemente del nombre del archivo ejecutable.
-xrm recurso-valor
--xrm=recurso-valor
Esta opción especifica los valores de los recursos X para el trabajo Emacs actual.
recurso-valor debe tener el mismo formato que usaría dentro de un archivo de recursos X. Son posibles varias opciones ‘-xrm’ para incluir múltiples especificaciones de recursos. También puede usarp ‘#include "nombre de archivo"’ como recurso-valor para incluir un archivo lleno de especificaciones de recursos. Los valores de recursos especificados con ‘-xrm’ tienen prioridad sobre todas las demás especificaciones de recursos.

D 2 Tabla de recursos X para Emacs

La siguiente tabla lista los nombres de recursos X que Emacs reconoce. Tenga en cuenta que algunos de los recursos no tienen efecto en Emacs compilado con varios kits de herramientas X (GTK+, Lucid, etc.) - indicamos a continuación cuando este es el caso.

background (class Background)
Color de fondo (ver Colores para caras).
bitmapIcon (class BitmapIcon)
Indica al gestor de ventanas que muestre el icono de Emacs si está ‘on’; no lo haga si está ‘off’. Ver Iconos, para una descripción del icono.
borderColor (class BorderColor)
Color del borde externo del marco. No tiene efecto si Emacs está compilado con soporte GTK+.
borderWidth (class BorderWidth)
Ancho del borde externo del marco, en píxeles. Esto no tiene efecto si Emacs está compilado con soporte GTK+.
cursorBlink (class CursorBlink)
Si el valor de este recurso es ‘off’ o ‘false’ o ‘0’ al inicio, Emacs desactiva el modo Cursor Blink (cursor parpadeante) (ver Mostrar el Cursor).
cursorColor (class Foreground)
Color del cursor del texto. Si este recurso se especifica cuando Emacs se inicia, Emacs establece su valor como el color de fondo de la cara del cursor (ver Caras de Texto).
font (class Font)
Nombre de la fuente para la cara por defecto (ver Fuentes). También puedes especificar un nombre de conjunto de fuentes (ver Conjuntos de fuentes).
fontBackend (class FontBackend)
Lista delimitada por comas de los backend(s) a utilizar para dibujar las fuentes, en orden de precedencia. Por ejemplo, el valor ‘x,xft’ le dice a Emacs que dibuje las fuentes usando el controlador de fuentes del núcleo de X, recurriendo al controlador de fuentes Xft si éste falla. Normalmente, debería dejar este recurso sin configurar, en cuyo caso Emacs intenta usar todos los backends de fuentes disponibles.
foreground (class Foreground)
Color de primer plano por defecto para el texto.
fullscreen (class Fullscreen)
El tamaño de pantalla completa deseado. El valor puede ser uno de los siguientes: fullboth, maximized, fullwidth o fullheight, que corresponden a las opciones de la línea de comandos ‘-fs’, ‘-mm’, ‘-fw’ y ‘-fh’ (ver Opciones de tamaño y posición de la ventana). Tenga en cuenta que esto sólo se aplica al marco inicial.
geometry (class Geometry)
Tamaño y posición de la ventana. El valor debe ser una especificación de tamaño y posición, de la misma forma que en la opción de línea de comandos ‘-g’ o ‘--geometry’ (véase Opciones para el tamaño y la posición de la ventana).
El tamaño se aplica a todos los marcos de la sesión de Emacs, pero la posición se aplica sólo al marco inicial de Emacs (o, en el caso de un recurso para un nombre de marco específico, sólo a ese marco).
Tenga cuidado de no especificar este recurso como ‘emacs*geometry’, ya que eso puede afectar a los menús individuales así como al marco principal de Emacs.
horizontalScrollBars (class ScrollBars)
Si el valor de este recurso es ‘off’ o ‘false’ o ‘0’, Emacs desactiva el modo de Barra de Desplazamiento Horizontal al inicio (ver Barras de Desplazamiento).
iconName (class Title)
Nombre a mostrar en el icono.
internalBorder (class BorderWidth)
Ancho del borde interno del marco, en píxeles.
lineSpacing (class LineSpacing)
Espacio adicional entre líneas, en píxeles.
menuBackground (class Background)
El color de fondo de los menús en las versiones de Emacs que no son del toolkit. (Para las versiones del toolkit, ver Lucid Menu And Dialog X Resources, también ver Motif Menu X Resources, y ver GTK+ resources).
menuBar (class MenuBar)
Si el valor de este recurso es ‘off’ o ‘false’ o ‘0’, Emacs deshabilita el modo Barra de Menús al inicio (ver Barras de Menús).
minibuffer (class Minibuffer)
Si es ‘none’, Emacs no hará un minibuffer en este marco; en su lugar usará un marco de minibuffer separado.
paneFont (class Font)
Nombre de la fuente para los títulos de los paneles de los menús, en versiones de Emacs que no sean del toolkit. (Para las versiones del toolkit, vea Lucid Menu And Dialog X Resources, también vea Motif Menu X Resources, y vea GTK+ resources).
paneForeground (class Foreground)
Color de primer plano para los títulos de los paneles de los menús, en las versiones de Emacs que no son del toolkit. (Para las versiones del toolkit, ver Lucid Menu And Dialog X Resources, también ver Motif Menu X Resources, y ver GTK+ resources).
pointerColor (class Foreground)
Color del cursor del ratón. Esto no tiene efecto en muchos entornos gráficos de escritorio, ya que no permiten a Emacs cambiar el cursor del ratón de esta manera.
privateColormap (class PrivateColormap)
Si está ‘on’, utiliza un mapa de color privado, en el caso de que el visual por defecto de la clase PseudoColor y Emacs lo esté utilizando.
reverseVideo (class ReverseVideo)
Cambia los colores por defecto del primer plano y del fondo si está ‘on’, usa los colores como se especifican si está ‘off’.
screenGamma (class ScreenGamma)
Corrección gamma para los colores, equivalente al parámetro de marco screen-gamma.
scrollBar (class ScrollBar)
Si el valor de este recurso es ‘off’ o ‘false’ o ‘0’, Emacs desactiva el modo Scroll Bar al inicio (ver Scroll Bars).
scrollBarWidth (class ScrollBarWidth)
El ancho de la barra de desplazamiento en píxeles, equivalente al parámetro de marco scroll-bar-width. No establezcas este recurso si Emacs está compilado con soporte GTK+.
selectionFont (class SelectionFont)
Nombre de la fuente para los elementos del menú emergente, en las versiones de Emacs que no son del toolkit. (Para las versiones del toolkit, ver Recursos X de menús y diálogos lúcidos, también ver Recursos X de menús de motivos, y ver Recursos GTK+).
selectionForeground (class SelectionForeground)
Color de primer plano para los elementos del menú emergente, en las versiones de Emacs que no son del toolkit. (Para las versiones del toolkit, ver Lucid Menu And Dialog X Resources, también ver Motif Menu X Resources, y ver GTK+ resources).
selectionTimeout (class SelectionTimeout)
Número de milisegundos para esperar una respuesta de selección. Si el propietario de la selección no responde en este tiempo, nos rendimos. Un valor de 0 (cero) significa que hay que esperar el tiempo necesario.
synchronous (class Synchronous)
Ejecuta Emacs en modo sincrónico si está ‘on’. El modo sincrónico es útil para depurar problemas de X.
title (class Title)
Nombre a mostrar en la barra de título del marco inicial de Emacs.
toolBar (class ToolBar)
Si el valor de este recurso es ‘off’ o ‘false’ o ‘0’, Emacs desactiva el modo de Barra de Herramientas al inicio (ver Barras de Herramientas).
tabBar (class TabBar)
Si el valor de este recurso es ‘on’ o ‘yes’ o ‘1’. Emacs habilita el modo Barra de Herramientas al inicio (ver Barras de Herramientas).
useXIM (class UseXIM)
Desactiva el uso de los métodos de entrada X (XIM) si es ‘false’ u ‘off’. Esto sólo es relevante si su Emacs está construido con soporte para XIM. Puede ser útil para desactivar XIM en enlaces X cliente/servidor lentos.
verticalScrollBars (class ScrollBars)
Da a los marcos barras de desplazamiento a la izquierda si es ‘left’, a la derecha si es ‘right’; no tiene barras de desplazamiento si es ‘off’ (ver Scroll Bars).
visualClass (class VisualClass)
La class visual para la visualización del color X. Si se especifica, el valor debe comenzar con uno de los siguientes: ‘TrueColor’, ‘PseudoColor’, ‘DirectColor’, ‘StaticColor’, ‘GrayScale’, y ‘StaticGray’, seguido de ‘-depth’, donde depth es el número de planos de color.

También puedes usar recursos X para personalizar caras individuales de Emacs (ver Caras de texto). Por ejemplo, establecer el recurso ‘face.attributeForeground’ equivale a personalizar el atributo ‘foreground’ de la cara (face). Sin embargo, recomendamos personalizar las caras desde Emacs, en lugar de utilizar los recursos X. Ver Personalización de Caras.

D 3 Recursos X de Menús y Diálogos Lucid

Si Emacs está compilado con el soporte del kit de herramientas X usando widgets Lucid, puede usar recursos X para personalizar la apariencia de la barra de menús (ver La barra de menús), los menús emergentes y los cuadros de diálogo (ver Uso de cuadros de diálogo). Los recursos para la barra de menús caen en la clase ‘pane.menubar’ (siguiendo, como siempre, el nombre del ejecutable de Emacs o ‘Emacs’ para todas las invocaciones del Editor). Los recursos para el menú emergente están en la clase ‘menu*’. Los recursos para los cuadros de diálogo están en la clase ‘dialog*’.

Por ejemplo, para mostrar las entradas de la barra de menú con la fuente ‘Courier-12’ (ver Fuentes), escriba esto

Emacs.pane.menubar.font: Courier-12

Los widgets de Lucid pueden mostrar texto multilingüe en su configuración regional. Para activar esto, especifique un recurso fontSet en lugar de un recurso de font. Consulte Fontsets. Si se especifican los recursos font y fontSet, se utilizará el recurso fontSet.

Esta es una lista de recursos para las barras de menú, los menús emergentes y los diálogos:

Esta es una lista de recursos para las barras de menú, los menús emergentes y los diálogos:

font
Fuente para el texto de los elementos de menú.
fontSet
Conjunto de fuentes para el texto de los elementos del menú.
background
Color de fondo.
buttonForeground
Color de primer plano para un elemento seleccionado.
foreground
Color de primer plano.
horizonatalSpacing
Espacio horizontal en píxeles entre los elementos. Por defecto es 3.
verticalSpacing
Espacio vertical en píxeles entre los elementos. El valor predeterminado es 2.
shadowThickness
Grosor de las líneas de sombra para los botones 3D, flechas y otros elementos gráficos. El valor predeterminado es 1.
margin
Margen de la barra de menú, en caracteres. Por defecto es 1.

D 4 Recursos X del menú Motif

Si Emacs está compilado con el soporte del kit de herramientas X utilizando los widgets Motif o LessTif, puede utilizar recursos X para personalizar la apariencia de la barra de menús (ver La barra de menús), los menús emergentes y los cuadros de diálogo (ver Uso de cuadros de diálogo). Sin embargo, los recursos están organizados de forma diferente a los widgets Lucid.

Los nombres de los recursos para la barra de menús están en la clase ‘pane.menubar’, y deben ser especificados en esta forma:

Emacs.pane.menubar.subwidget.resource: value

Para los menús emergentes, los recursos están en la clase ‘menu*’, en lugar de ‘pane.menubar’. Para los cuadros de diálogo, están en ‘dialog’. En cada caso, cada cadena de menú individual es un subwidget; el nombre del subwidget es el mismo que la cadena del elemento de menú. Por ejemplo, el menú ‘File’ ('Archivo') en la barra de menú es un subwidget llamado ‘emacs.pane.menubar.File’.

Normalmente, se desea especificar los mismos recursos para toda la barra de menús. Para ello, use ‘*’ en lugar de un nombre específico de subwidget. Por ejemplo, para especificar la fuente ‘8x16’ para todos los elementos de la barra de menús, incluyendo los submenús, escriba esto

Emacs.pane.menubar.*.fontList: 8x16

Cada elemento de un submenú también tiene su propio nombre para los recursos X; por ejemplo, el submenú ‘File’ ('Archivo') tiene un elemento llamado ‘Save (current buffer)’ ('Guardar (buffer actual)'). Una especificación de recursos para un elemento del submenú tiene el siguiente aspecto:

Emacs.pane.menubar.popup_*.menu.item.resource: value

Por ejemplo, así es como se especifica el tipo de letra para el elemento ‘Save (current buffer)’ ('Guardar (buffer actual))':

Emacs.pane.menubar.popup_*.File.Save (current buffer).fontList: 8x16

En el caso de un elemento de un submenú de segundo nivel, como por ejemplo ‘Complete Word’ ('Palabra Completa') en ‘Spell Checking’ ('Corrección ortográfica') dentro de ‘Tools’ ('Herramientas'), el recurso se ajusta a esta plantilla:

Emacs.pane.menubar.popup_*.popup_*.menu.resource: value

Por ejemplo:

Emacs.pane.menubar.popup_*.popup_*.Spell Checking.Complete Word: value

(Esto debería ser una línea larga).

Si desea que los elementos del submenú tengan un aspecto diferente al de la propia barra de menús, debe especificar primero el recurso para todos ellos y, a continuación, anular el valor sólo para los submenús. He aquí un ejemplo:

Emacs.pane.menubar.*.fontList: 9x18
Emacs.pane.menubar.popup_*.fontList: 8x16

Para especificar los recursos del cuadro de selección de archivos de LessTif, utilice ‘fsb*’, así:

Emacs.fsb*.fontList: 8x16

Esta es una lista de recursos para las barras de menú y los menús emergentes de LessTif:

armColor
El color a mostrar en un botón armado.
fontList
La fuente a utilizar.
marginBottom
MarginHeight
marginLeft
marginRight
marginTop
marginWidth
Cantidad de espacio a dejar alrededor del elemento, dentro del borde.
borderWidth
El ancho del borde alrededor del elemento del menú, en todos los lados.
shadowThickness
El ancho de la sombra del borde.
bottomShadowColor
El color de la sombra del borde, en la parte inferior y en la derecha.
topShadowColor
El color de la sombra del borde, en la parte superior y en la izquierda.

D 5 Recursos GTK+

Si Emacs está compilado con soporte del kit de herramientas GTK+, la forma más sencilla de personalizar sus widgets GTK+ (por ejemplo, menús, diálogos, barras de herramientas y barras de desplazamiento) es elegir un tema GTK+ apropiado, por ejemplo con el selector de temas de GNOME.

En la versión 2 de GTK+, también se pueden utilizar recursos GTK+ para personalizar la apariencia de los widgets GTK+ utilizados por Emacs. Estos recursos se especifican en el archivo ~/.emacs.d/gtkrc (para recursos GTK+ específicos de Emacs), o ~/.gtkrc-2.0 (para recursos GTK+ generales). Recomendamos usar ~/.emacs.d/gtkrc, ya que GTK+ parece ignorar ~/.gtkrc-2.0 cuando se ejecuta GConf con GNOME. Tenga en cuenta, sin embargo, que algunos temas de GTK+ pueden anular las personalizaciones en ~/.emacs.d/gtkrc; no hay nada que podamos hacer al respecto. Los recursos GTK+ no afectan a los aspectos de Emacs no relacionados con los widgets GTK+, como las fuentes y los colores de la ventana principal de Emacs; éstos se rigen por los recursos X normales (ver Recursos X).

Las siguientes secciones describen cómo personalizar los recursos GTK+ para Emacs. Para más detalles sobre los recursos GTK+, consulta el documento de la API GTK+ en https://developer.gnome.org/gtk2/stable/gtk2-Resource-Files.html.

En la versión 3 de GTK+, los recursos GTK+ han sido sustituidos por un sistema completamente diferente. La apariencia de los widgets GTK+ está ahora determinada por archivos de estilo tipo CSS: gtk-3.0/gtk.css en el directorio de instalación de GTK+, y ~/.themes/theme/gtk-3.0/gtk.css para la configuración de estilo local (donde theme es el nombre del tema GTK+ actual). Por lo tanto, la descripción de los recursos GTK+ en esta sección no se aplica a GTK+ 3. Para más detalles sobre el sistema de estilos de GTK+ 3, consulte https://developer.gnome.org/gtk3/3.0/GtkCssProvider.html.

D 5.1 Conceptos básicos de los recursos GTK+

En un archivo de recursos de GTK+ 2 (normalmente ~/.emacs.d/gtkrc), el tipo más simple de configuración de recursos simplemente asigna un valor a una variable. Por ejemplo, poner la siguiente línea en el archivo de recursos cambia la fuente de todos los widgets GTK+ a ‘courier-12’:

gtk-font-name = "courier 12"

Tenga en cuenta que en este caso el nombre de la fuente debe ser suministrado como un patrón de fuente GTK (también llamado nombre de fuente Pango), no como un nombre de fuente estilo Fontconfig o XLFD. Véase Fuentes.

Para personalizar los widgets, primero se define un estilo y luego se aplica el estilo a los widgets. Este es un ejemplo que establece el tipo de letra para los menús (los caracteres ‘#’ indican comentarios):

# Definir el estilo ‘mi_estilo’.
style "mi_estilo"
{
  font_name = "helvetica bold 14"
}

# Especificar que el tipo de widget ‘*emacs-menuitem*’ utiliza ‘mi_estilo’.
widget "*emacs-menuitem*" style "mi_estilo"

El nombre del widget en este ejemplo contiene comodines, por lo que el estilo se aplica a todos los widgets que coincidan con ‘*emacs-menuitem*’. Los widgets se nombran por la forma en que están contenidos, desde el widget exterior al interior. Aquí hay otro ejemplo que aplica ‘mi_estilo’ específicamente a la barra de menú de Emacs:

widget "Emacs.pane.menubar.*" style "mi_estilo"

Aquí hay un ejemplo más elaborado, que muestra cómo cambiar las partes de la barra de desplazamiento:

style "scroll"
{
  fg[NORMAL] = "red"     # Color de la flecha.
  bg[NORMAL] = "yellow"  # Pulgar y fondo alrededor de la flecha.
  bg[ACTIVE] = "blue"    # Color de la barra.
  bg[PRELIGHT] = "white" # Color del pulgar cuando el roedor está sobre él.
}

widget "*verticalScrollBar*" style "scroll"

D 5.2 Nombres de widgets GTK+

Un widget GTK+ se especifica mediante un nombre de widget y una clase de widget. El nombre del widget se refiere a un widget específico (por ejemplo, ‘emacs-menuitem’), mientras que la clase del widget se refiere a una colección de widgets similares (por ejemplo, ‘GtkMenuItem’). Un widget siempre tiene una clase, pero no necesita tener un nombre.

Los nombres absolutos son secuencias de nombres de widgets o clases de widgets, que corresponden a jerarquías de widgets incrustados dentro de otros widgets. Por ejemplo, si una GtkWindow llamada top contiene un GtkVBox llamada box, que a su vez contiene un GtkMenuBar llamada menubar, el nombre absoluto de la clase del widget de la barra de menú es GtkWindow.GtkVBox.GtkMenuBar, y su nombre absoluto de widget es top.box.menubar.

Los archivos de recursos GTK+ pueden contener dos tipos de comandos para especificar la apariencia de los widgets:

widget
especifica un estilo para los widgets basado en el nombre de la clase, o sólo la clase
widget_class
especifica un estilo para los widgets basado en el nombre de la clase.

Consulte la subsección anterior para ver ejemplos de uso del comando widget; el comando widget_class se utiliza de forma similar. Tenga en cuenta que el nombre/clase del widget y el estilo deben ir entre comillas dobles, y estos comandos deben estar en el nivel superior del archivo de recursos GTK+.

Como se ha indicado anteriormente, se puede especificar un nombre o clase de widget con la sintaxis de comodín del shell: ‘*’ coincide con cero o más caracteres y ‘?’ con un carácter. Este ejemplo asigna un estilo a todos los widgets:

widget "*" style "mi_estilo"

D 5.3 Nombres de widgets GTK+ en Emacs

Los widgets GTK+ utilizados por un marco de Emacs se enumeran a continuación:

Emacs (class GtkWindow)
     pane (class GtkVBox)
         menubar (class GktMenuBar)
             [menu item widgets]
         [unnamed widget] (class GtkHandleBox)
             emacs-toolbar (class GtkToolbar)
                 [tool bar item widgets]
         emacs (class GtkFixed)
             verticalScrollBar (class GtkVScrollbar)

El contenido de las ventanas Emacs se dibuja en el emacs widget. Tenga en cuenta que aunque haya varias ventanas de Emacs, cada widget de barra de desplazamiento se llama verticalScrollBar.

Por ejemplo, aquí hay dos formas diferentes de establecer el estilo de la barra de menú:

widget "Emacs.pane.menubar.*" style "mi_estilo"
widget_class "GtkWindow.GtkVBox.GtkMenuBar.*" style "mi_estilo"

Para los diálogos GTK+, Emacs utiliza un widget llamado emacs-dialog, de clase GtkDialog. Para la selección de archivos, Emacs utiliza un widget llamado emacs-filedialog, de clase GtkFileSelection.

Debido a que los widgets para los menús emergentes y los diálogos son ventanas independientes y no están contenidos en el widget de Emacs, sus nombres absolutos GTK+ no comienzan con ‘Emacs’. Para personalizar estos widgets, utilice comodines como este:

widget "*emacs-dialog*" style "mi_estilo_de_diálogo"
widget "*emacs-filedialog* style "mi_estilo_de_archivo"
widget "*emacs-menuitem* style "mi_estilo_de_menú"

Si quiere aplicar un estilo a todos los menús de Emacs, use esto:

widget_class "*Menu*" style "mi_estilo_de_menu"

D 5.4 Estilos GTK+

He aquí un ejemplo de dos declaraciones de estilo GTK+:

pixmap_path "/usr/share/pixmaps:/usr/include/X11/pixmaps"

    style "default"
    {
      font_name = "helvetica 12"
    
      bg[NORMAL] = { 0.83, 0.80, 0.73 }
      bg[SELECTED] = { 0.0, 0.55, 0.55 }
      bg[INSENSITIVE] = { 0.77, 0.77, 0.66 }
      bg[ACTIVE] = { 0.0, 0.55, 0.55 }
      bg[PRELIGHT] = { 0.0, 0.55, 0.55 }
    
      fg[NORMAL] = "black"
      fg[SELECTED] = { 0.9, 0.9, 0.9 }
      fg[ACTIVE] = "black"
      fg[PRELIGHT] = { 0.9, 0.9, 0.9 }
    
      base[INSENSITIVE] = "#777766"
      text[INSENSITIVE] = { 0.60, 0.65, 0.57 }
    
      bg_pixmap[NORMAL] = "background.xpm"
      bg_pixmap[INSENSITIVE] = "background.xpm"
      bg_pixmap[ACTIVE] = "background.xpm"
      bg_pixmap[PRELIGHT] = "<none>"
    
    }
    
    style "ruler" = "default"
    {
      font_name = "helvetica 8"
    }

El estilo ‘ruler’ hereda de ‘default’. De este modo, puede basarse en estilos existentes. La sintaxis para fuentes y colores se describe a continuación.

Como muestra este ejemplo, es posible especificar varios valores para el primer plano y el fondo en función del estado del widget. Los estados posibles son:

NORMAL
Este es el estado por defecto de los widgets.
ACTIVE
Este es el estado para un widget que está listo para hacer algo. También es para el canal de una barra de desplazamiento, es decir, bg[ACTIVE] = "red" establece el canal de la barra de desplazamiento en rojo. Los botones que han sido armados (presionados pero no liberados aún) están en este estado.
PRELIGHT
Este es el estado de un widget que puede ser manipulado, cuando el puntero del ratón está sobre él, por ejemplo, cuando el ratón está sobre el pulgar en la barra de desplazamiento o sobre un elemento del menú. Cuando el ratón está sobre un botón que no está presionado, el botón está en este estado.
SELECTED
Este es el estado de los datos que han sido seleccionados por el Usuario. Puede ser un texto seleccionado o elementos seleccionados en una lista. Este estado no se utiliza en Emacs.
INSENSITIVE
Este es el estado de los widgets que son visibles, pero que no pueden ser manipulados de la manera habitual, por ejemplo, los botones que no pueden ser presionados y los elementos de Estas son las cosas que pueden ir en una declaración de estilo:

Estas son las cosas que pueden ir en una declaración de estilo:

bg[state] = color
Esto especifica el color de fondo para el widget. Ten en cuenta que el texto editable no utiliza bg; en su lugar utiliza base.
base[state] = color
Especifica el color de fondo del texto editable. En Emacs, este color se utiliza para el fondo de los campos de texto en el diálogo de archivo.
bg_pixmap[state] = "pixmax"
Especifica un fondo de imagen (en lugar de un color de fondo). pixmap debe ser el nombre del archivo de imagen. GTK+ puede usar varios formatos de archivo de imagen, incluyendo XPM, XBM, GIF, JPEG y PNG. Si quieres que un widget utilice la misma imagen que su padre, utiliza ‘<parent>’. Si no quiere ninguna imagen, use ‘<none>’. ‘<none>' es la forma de cancelar una imagen de fondo heredada de un estilo padre.
No puede especificar el archivo por su nombre absoluto. GTK+ busca el archivo pixmap en los directorios especificados en pixmap_path. pixmap_path es una lista de directorios separados por dos puntos entre comillas dobles, especificado en el nivel superior de un archivo gtkrc (es decir, no dentro de una definición de estilo; véase el ejemplo anterior):
pixmap_path "/usr/share/pixmaps:/usr/include/X11/pixmaps"
	
fg[state] = color
Esto especifica el color de primer plano para los widgets a utilizar. Es el color del texto en los menús y botones, y el color de las flechas en la barra de desplazamiento. Para el texto editable, use text.
text[state] = color
Este es el color del texto editable. En Emacs, este color se utiliza para los campos de texto en el diálogo de archivo.
font_name = "fuente"
Esto especifica la fuente para el texto en el widget. font es un nombre de fuente estilo GTK (o Pango), como ‘Sans Italic 10’. Ver Fuentes. Los nombres no distinguen entre mayúsculas y minúsculas.

Hay tres maneras de especificar un color: un nombre de color, un triplete RGB, o un triplete RGB estilo GTK. Véase Colores para caras, para una descripción de los nombres de los colores y de los tripletes RGB. Los nombres de colores deben ir entre comillas dobles, por ejemplo, ‘"red"’ (‘"rojo"’). Los tripletes RGB deben escribirse sin comillas dobles, por ejemplo, ‘#ff0000’. Las tripletas RGB al estilo GTK tienen la forma { r, g, b }, donde r, g y b son enteros en el rango 0 - 65535 o flotantes en el rango 0,0 - 1,0.

00_Emacs (541 Líneas): · Distribución - Introducción 01_Emacs