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.
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.
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.
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.
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.
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.
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.
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)
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.
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.
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.
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.
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.
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.
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).
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).
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:
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.
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.
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.
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.
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.
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.
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.
A continuación se presentan comandos y técnicas especiales para insertar y eliminar líneas en blanco.
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.
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).
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 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).
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.
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:
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 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.
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.
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.
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.
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.
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’.
Esta es una lista de los comandos de finalización definidos en el minibuffer cuando se permite la finalización.
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:
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):
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):
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.
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.
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:
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).
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 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.
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.
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).
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.
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 (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).
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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.
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).
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.
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.
A continuación se presentan algunos comandos para fijar la marca:
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.
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:
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.
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).
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.
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).
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.
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.
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:
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).
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.
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.
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.
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.
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.
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).
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.
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).
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.
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 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).
16Como 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).
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.
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.
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:
En este caso, puede usar los siguientes comandos para actuar explícitamente en el portapapeles:
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.
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:
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.
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.
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.
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.
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:
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.
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 ().
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):
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.
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.
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) 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.
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.
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.
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.
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).
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-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.
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).
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).
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.
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:
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.
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, 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).
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.
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.
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 <, 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.
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.
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.
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
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.
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).
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.
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
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.
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.
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).
Las siguientes caras controlan la apariencia de partes del marco de Emacs:
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).
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
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.
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).
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.
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:
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)).
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):
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).
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.
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.
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.
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.
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.
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.
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:
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.
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).
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).
También puede invocar la búsqueda incremental desde el menú 'Edit->Search' (Edición -> Búsqueda) de la barra de menús.
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.
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.
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.
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.
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:
I-search [im]:
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.
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.
(put 'view-lossage 'isearch-scroll t)
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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 ‘\’.
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.
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.
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:
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.
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).
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.
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).
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
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).
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:
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.
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.
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:
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.
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.
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.
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.
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.
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.
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.
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:
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).
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.
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).
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.
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.
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.
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.
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.
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:
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.
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:
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.
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).
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:
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.
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.
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).
Guardar un buffer en Emacs significa escribir su contenido en el archivo que se visitó en el buffer.
Estos son los comandos que se refieren a guardar y escribir archivos.
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:
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
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.
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:
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.
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.
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:
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.
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.
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:
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.
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).
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.
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).
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.
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.
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.
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.
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.
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.
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).
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).
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.
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"))
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.
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.
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.
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:
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.
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.
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.
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.
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).
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:
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).
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.
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:
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.
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.
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.
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.
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.
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.
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.
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.
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 (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.
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:
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.
Los siguientes comandos se utilizan para seleccionar otro búfer o búferes:
Los siguientes comandos afectan a toda 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.
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.
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.
En esta sección se describen varios modos y características que hacen más cómodo el cambio entre buffers.
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.
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).
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.
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.
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.
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.
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.
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.
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.
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).
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.
(customize-set-variable 'display-buffer-alist '(("\\*scratch\\*" (display-buffer-same-window))))
(customize-set-variable 'display-buffer-base-action '((display-buffer-reuse-window display-buffer-pop-up-frame) (reusable-frames . 0)))
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.
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.
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.
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.
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:
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.
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.
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.
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).
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.
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.
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:
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.
Los siguientes comandos se utilizan para borrar y operar sobre los marcos:
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.
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:
(add-to-list 'default-frame-alist '(font . "DejaVu Sans Mono-10"))
emacs.font: DejaVu Sans Mono-12
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:
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:
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:
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).
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.
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:
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:
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.
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).
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.
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.
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.
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.
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:
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:
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:
Se pueden utilizar los siguientes comandos para operar con las pestañas:
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.
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.
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:
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.
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:
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.
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.
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.
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:
En el resto de este capítulo se describen estas cuestiones en detalle.
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:
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' '^')
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 | árabe | bielorruso | bengalí | portugués de Brasil | búlgaro | cham |
chino-BIG5 | chino-CNS | chino-EUC-TW | chino-GB | chino-GB18030 | chino-GBK | croata |
cirílico-ALT | cirílico-ISO | cirílico-KOI8 | checo | devanagari | holandés | inglés |
esperanto | etíope | francés | georgiano | alemán | griego | gujarati |
hebreo | IPA | italiano | japonés | Canarés | jemer | coreano |
lao | latín-1 | latín-2 | latín-3 | latín-4 | latín-5 | latín-6 |
latín-7 | latín-8 | latín-9 | letón | lituano | malayalam | oriya |
persa | polaco | punjabi | rumano | ruso | cingalés | eslovaco |
esloveno | español | sueco | tayiko | tamil | telugu | tailandés |
tibetano | turco | UTF-8 | ucraniano | vietnamita | galés | Windows-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.
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 ‘pī’.
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.
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.
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-\).
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).
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:
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.
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.
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:-*-’.
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.
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.
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:
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.
Esta sección explica cómo especificar sistemas de codificación para su uso en la comunicación con otros procesos.
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).
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.
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.
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.
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.
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")
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.
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:
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).
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.
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.
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)
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:
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:
Y aquí hay algunos modos menores globales útiles:
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.
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).
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).
Aparte del comando TAB (indent-for-tab-command), Emacs proporciona una variedad de comandos para realizar la indentación de otras maneras.
C-u -999 C-x TAB
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.
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.
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).
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.
Emacs define varios comandos para desplazarse u operar sobre las palabras:
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.
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.
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.
Los comandos de Emacs para manipular párrafos también están en las teclas Meta.
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.
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) 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.
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.
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.
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).
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).
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).
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).
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.
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:
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.
Emacs tiene comandos para convertir una sola palabra o cualquier rango arbitrario de texto a mayúsculas o minúsculas.
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".
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.
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.
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.
El modo Outline proporciona comandos de movimiento especiales que se mueven hacia atrás y hacia delante en las líneas de encabezamiento.
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.
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.
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.
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.
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:
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))
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.
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.
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.
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:
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.
El modo LaTeX ofrece algunas funciones adicionales que no se aplican al TeX normal:
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.
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).
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).
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.
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>.
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.
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:
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).
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).
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.
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).
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)):
Las demás entradas del menú se describen en las siguientes secciones.
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.
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).
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:
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.
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.
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.
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.
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.
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:
Los siguientes son ejemplos de tablas no válidas:
+-----+ +--+ +-++--+ | | | | | || | | | | | | || | +--+ | +--+--+ +-++--+ | | | | | | +-++--+ | | | | | | | || | +--+--+ +--+--+ +-++--+ a b c
De izquierda a derecha:
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.
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:
Ver Conversión entre texto plano y tablas, para otra forma de reconocer una 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.
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.
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.
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.
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.
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:
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.
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:
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:
Lisp | Scheme | Ada | ASM | AWK | C | C++ | Fortran | Icon |
IDL (CORBA) | IDLWAVE | Java | Javascript | M4 | Makefiles | Modula2 | Object | Pascal |
Objetive-C | Octave | Pascal | Perl | Pike | PostScript | Prolog | Python | Ruby |
SQl | Verilog | VHDL |
El lenguaje de expresión DSSSL basado en Scheme | Metafont (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).
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.
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.
Estos comandos mueven el punto o configuran la región basándose en definiciones mayores de nivel superior, también llamadas defuns.
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.
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).
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.
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.
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.
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:
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.
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))
Aquí están las características especiales para la sangría en el modo C y los modos relacionados:
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.
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.
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.
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.
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.
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.
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.
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.
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:
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:
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:
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).
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.
Los siguientes comandos operan sobre los comentarios:
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.
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.
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.
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.
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.
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.
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:
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:
Estas variables pueden utilizarse para personalizar el modo Hideshow:
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.
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 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:
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.
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.
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.
En esta sección se describen los comandos para mover el punto, en modo C y modos relacionados.
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.
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):
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.
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.
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.
La variable c-hungry-delete-key controla si la función hungry-delete está activada.
(defun my-bind-clb () (define-key c-mode-base-map "\C-m" 'c-context-line-break)) (add-hook 'c-initialization-hook 'my-bind-clb)
El modo Asm es un modo principal para editar archivos de código ensamblador. Define estos comandos:
La variable asm-comment-char especifica qué carácter inicia los comentarios en la sintaxis del ensamblador.
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.
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.
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.
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.
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.
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.
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.
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:
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.
Varias variables adicionales controlan el funcionamiento de la sangría en Fortran:
La siguiente sección describe las variables que controlan la sangría de los comentarios.
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-;) 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:
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.
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.
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).
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.
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.
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.
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.
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.
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).
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).
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.
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).
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.
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.
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.
Existen varios comandos para iniciar un subproceso de depuración, cada uno de los cuales corresponde a un programa de depuración en particular.
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).
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.
GUD proporciona comandos para establecer y borrar puntos de interrupción, seleccionar marcos de pila y recorrer el programa.
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.
Si está utilizando GDB, estas teclas adicionales están disponibles:
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.
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):
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.
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.
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.
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):
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.
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.
Para ver la información de varios hilos simultáneamente, utilice los siguientes comandos desde el buffer de hilos de GDB.
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.
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.
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.
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.
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.
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.
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.
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.
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-:, 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.
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.
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).
Este capítulo describe las características de Emacs para mantener programas y paquetes de tamaño medio y grande. Estas características incluyen:
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).
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.
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.
Los sistemas de control de versiones le proporcionan tres capacidades importantes:
Actualmente VC trabaja con muchos sistemas de control de versiones diferentes, a los que se refiere como back ends:
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.
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.
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.
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.
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).
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.
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.
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.
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:
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
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:
Estas reglas también se aplican cuando se utiliza CVS en modo de bloqueo, excepto que CVS no soporta el robo de bloqueos.
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.
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.
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.
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:
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):
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.
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.
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.
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 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.
Emacs proporciona varios comandos para navegar por el buffer del Directorio VC, y para marcar archivos como pertenecientes al conjunto de archivos VC actual.
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:
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:
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).
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.
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.
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.
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).
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).
En esta sección se explican las funciones de VC que se utilizan con menos frecuencia.
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).
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.
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.
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.
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.
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.
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).
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.
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.
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).
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.
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.
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.
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).
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.
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.
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.
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.
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:
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.
Lo más importante que permite hacer xref es encontrar la definición de un identificador específico.
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).
Los siguientes comandos están disponibles en el búfer *xref* por el modo especial XREF:
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.
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-?) 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.
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.
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.
Así es como se define la sintaxis de las etiquetas en los lenguajes más populares:
TEXTAGS="micomando:miotrocomando" export TEXTAGS
También se admiten otros lenguajes:
También puede generar etiquetas basadas en coincidencias regexp (véase Etags Regexps) para manejar otros formatos e idiomas.
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.
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:
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.
etags --language=none \ --regex='/[ \t]*function.*=[ \t]*\([^ \t]*\)[ \t]*(/\1/' \ --regex='/###key \(.*\)/\1/' \ --regex='/[ \t]*global[ \t].*/' \ *.m
etags --language=none --regex='/proc[ \t]+\([^ \t]+\)/\1/' *.tcl
etags --language=none \ --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ ]* +OF/' \ --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\ \( BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'
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.
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.
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.
Para iniciar Emerge, ejecute uno de estos cuatro comandos:
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.
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.
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:
Estos son los comandos de fusión para el modo rápido; en el modo de edición, precedidos por C-c C-c:
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.
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"
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.
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.
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.
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 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:
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.
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)
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.
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.
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.
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:
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.
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.
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.
Estos comandos le permiten guardar las definiciones de abreviaturas entre sesiones de edición.
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.
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.
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.
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 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.
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.
Uno de los usos más frecuentes de Dired es marcar primero los archivos para su eliminación y luego borrar los archivos marcados.
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.
Los comandos # (#), ~ (~), . (.), %& (% &), y %d (% d) marcan varios archivos para su eliminación, basándose en sus nombres:
# (#, 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.
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).
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).
* c D t * c SPC D * c t SPC
Esta sección describe los comandos básicos de Dired para operar sobre uno o varios archivos. Todos estos comandos:
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.
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:
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).
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.
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.
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.
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:
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).
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.
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.
Ocultar un subdirectorio significa hacerlo invisible, excepto por su línea de cabecera.
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.
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.
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.
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.
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).
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.
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.
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).
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.
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.
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.
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:
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.
El modo calendario proporciona comandos para desplazarse a una fecha concreta especificada de varias maneras.
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).
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.
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.
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.
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).
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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Los siguientes comandos describen la fecha seleccionada (la fecha en el punto) en varios otros sistemas de calendario:
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).
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.
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 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 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.
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.
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.
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.
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.
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.
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:
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.
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).
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.
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.
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.
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.
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.
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.
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") ... )
Aquí están los comandos para seleccionar las fechas basadas en el calendario Maya:
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.
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))
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).
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.
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:
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.
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).
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.
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:
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:
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.
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.
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.
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.
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:
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.
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.
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.
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:
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.
El modo de mensajes ofrece los siguientes comandos especiales para desplazarse a determinados campos de cabecera y para completar direcciones en las cabeceras.
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.
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).
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.
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.
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.
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).
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.
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.
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.
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.
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.
Pasa al siguiente mensaje no eliminado, saltando cualquier mensaje eliminado que intervenga (rmail-next-undeleted-message).
Va al mensaje anterior no eliminado (rmail-previous-undeleted-message).
Pasa al siguiente mensaje, incluyendo los mensajes borrados (rmail-next-message).
Va al mensaje anterior, incluyendo los mensajes borrados (rmail-previous-message).
Pasa al siguiente mensaje con el mismo asunto que el actual (rmail-next-same-subject).
Pasa al mensaje anterior con el mismo asunto que el actual (rmail-previous-same-subject).
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).
Pasa al siguiente mensaje que contenga una coincidencia de expreg (rmail-search).
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.
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.
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.
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.
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.
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).
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.
Estos comandos copian los mensajes de un archivo de Rmail a otro archivo.
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.
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.
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.
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:
Todas las demás etiquetas son asignadas o eliminadas sólo por los usuarios, y no tienen un significado estándar.
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.
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).
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.
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.
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.
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:
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.
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.
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.
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.
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 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).
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).
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).
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.
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.
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.
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.
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:
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.
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
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.
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.
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.
Los siguientes comandos están disponibles en el buffer de grupo Gnus:
Los siguientes comandos están disponibles en el buffer de resumen de Gnus:
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.
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.
Si network-security-level es high, se harán las siguientes comprobaciones, además de las anteriores:
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:
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.
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.
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.
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.
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.
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.
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:
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.
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:
(remove-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt)
(add-hook 'comint-output-filter-functions 'comint-strip-ctrl-m)
(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).
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.
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 ‘!’.
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).
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.
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.
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).
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.
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.
Para cambiar entre el modo línea y el modo char en el modo Term, utilice estos comandos:
Los siguientes comandos sólo están disponibles en modo char:
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:
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.
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.
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:
systemctl --user enable emacs
[Socket] ListenStream=/ruta/a/.emacs.socket DirectoryMode=0700 [Install] WantedBy=sockets.target
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.
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.
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.
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:
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’.
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).
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).
Estos comandos convierten el contenido del buffer a PostScript, imprimiéndolo o dejándolo en otro buffer de Emacs.
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.
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.
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’).
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.
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.
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.
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).
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.
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.
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.
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.
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.
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:
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.
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).
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.
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.
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.
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.
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.
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.
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.
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 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 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:
Por ejemplo, puede instalar un paquete escribiendo i (i) en la línea que enumera ese paquete, seguido de x (x).
Un paquete puede tener uno de los siguientes estados:
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’).
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.
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.
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.
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).
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:
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.
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)
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]’).
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.
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.
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.
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).
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).
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.
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)
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.
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:
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.
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.
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).
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.
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).
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.
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:
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.
El minibuffer tiene su propio conjunto de mapas de teclas locales; contienen varios comandos de finalización y salida.
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)
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.
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.
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)
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)).
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:
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.
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.
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:
Se puede poner más de un botón del ratón en una secuencia de teclas, pero no es habitual hacerlo.
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.
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.
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:
Para más información sobre la sintaxis de Emacs Lisp, véase Introduction en The Emacs Lisp Reference Manual.
Aquí hay algunos ejemplos de cómo hacer ciertas cosas comúnmente deseadas con expresiones Lisp:
(add-to-list 'load-path "/path/to/lisp/libraries")
(setq c-tab-always-indent nil)
(setq-default case-fold-search nil)
(setq user-mail-address "cheney@torture.gov")
(setq-default major-mode 'text-mode)
(set-language-environment "Latin-1")
(line-number-mode 0)
(add-hook 'text-mode-hook 'auto-fill-mode)
(customize-set-variable 'selection-coding-system 'utf-8)
(load "foo")(load "foo")
(load "~/foo.elc")
(autoload 'mifuncion "mipaquete" "Haz lo que te digo." t)
(global-set-key "\C-xl" 'make-symbolic-link)
(define-key global-map "\C-xl" 'make-symbolic-link)
(define-key lisp-mode-map "\C-xl" 'make-symbolic-link)
(substitute-key-definition 'next-line 'forward-line global-map)
(global-unset-key "\C-x\C-v")
(modify-syntax-entry ?\$ "." text-mode-syntax-table)
(put 'narrow-to-region 'disabled nil)
(if (fboundp 'blink-cursor-mode) (blink-cursor-mode 0)) (if (boundp 'coding-category-utf-8) (set-coding-priority '(coding-category-utf-8)))
(ignore-errors (set-face-background 'region "grey75"))
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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:
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.
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.
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:
(open-termscript "~/termscript")
echo LC_ALL=$LC_ALL LC_COLLATE=$LC_COLLATE LC_CTYPE=$LC_CTYPE \ LC_MESSAGES=$LC_MESSAGES LC_TIME=$LC_TIME LANG=$LANG
Aquí hay algunas cosas que no son necesarias en un informe de error:
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.
Emacs es un proyecto colaborativo y fomentamos las contribuciones de todo el mundo.
Hay muchas formas de contribuir a Emacs:
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:
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:
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
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.
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.
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.
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.
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 .
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.
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.
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.
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).
Esta es una tabla de argumentos de acción:
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.
#!/usr/bin/emacs --script
Nota
(23) Esta opción no tiene efecto en MS-Windows.
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.
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.
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.
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.
Estas variables se usan sólo en configuraciones particulares:
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.
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.
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:
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.
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).
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.
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:
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.
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.
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.
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:
La opción ‘--name’ (ver Recursos X) también especifica el título para el marco Emacs inicial.
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.
La opción ‘--xrm’ (ver Recursos X) especifica valores adicionales de recursos 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).
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:
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.
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.
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:
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:
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.
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"
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:
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"
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"
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:
Estas son las cosas que pueden ir en una declaración de estilo:
pixmap_path "/usr/share/pixmaps:/usr/include/X11/pixmaps"
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