24 Modos Mayores y Menores
Emacs contiene muchos modos de edición que alteran su comportamiento básico de forma útil. Se dividen en modos mayores y modos menores.
Los modos principales proporcionan facilidades especializadas para trabajar con un tipo de archivo en particular, como un fichero fuente C (ver 27 Edición de Programas), o un tipo particular de búfer no-fichero, como un búfer de shell (ver 39 Ejecución de comandos de shell desde Emacs). Los modos principales son mutuamente excluyentes; cada búfer tiene uno y sólo un modo principal 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 Relleno automático (Auto Fill mode) es un modo secundario en el que SPC
interrumpe las líneas entre palabras a medida que escribe (consulte 26.6.1 Modo de Relleno Automático (Auto Fill)). Los modos secundarios son independientes entre sí y del modo principal seleccionado.
24.1 Modos Mayores (o Principales)
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 1.3 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, de modo 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 código Lisp o texto en inglés, se suele usar 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 están el modo Lisp (que tiene algunas variantes), el modo C, el modo Fortran y otros. El tercer grupo consiste en modos principales que no están asociados directamente con archivos; se usan en búferes creados para propósitos específicos por Emacs. Los ejemplos incluyen el modo Dired para búferes hechos por Dired (ver 31 Dired, el Editor de Directorios), el modo Message para búferes hechos por C-x m
(ver 33 Envío de Correo), y el modo Shell para búferes usados para comunicarse con un proceso shell inferior (ver 39.2 Subshell Interactiva).
Normalmente, el modo principal es establecido automáticamente por Emacs, cuando visita por primera vez un archivo o crea un búfer (vea 24.3 Elección de los Modos de Archivo). Puede seleccionar explícitamente un nuevo modo principal usando un comando `` M-x``.y Toma el nombre del modo y añade -mode
para obtener el nombre del comando para seleccionar ese modo (ejemplo: M-x lisp-mode
entra en modo Lisp). Dado que cada búfer tiene exactamente un modo principal, no hay forma de «desactivar» un modo principal; en su lugar, debe cambiar a uno diferente.
El valor de la variable de búfer-local major-mode
es un símbolo con el mismo nombre que la orden 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 usar para archivos que no especifican un modo mayor, y para nuevos búferes creados con C-x b
. Normalmente, este valor por defecto es el símbolo fundamental-mode, que especifica el modo Fundamental. Puede cambiar este valor por defecto a través de la interfaz de personalización (vea 50.1 Interfaz de Personalización Fácil), o añadiendo una línea como esta a su archivo init (vea 50.4. El Archivo 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 búfer 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
para sangrar la línea actual de acuerdo con las reglas del lenguaje (ver 25 Indentación). Las teclas que suelen cambiarse son TAB
, DEL
y C-j
. Muchos modos también definen comandos especiales propios, normalmente ligados a secuencias de teclas cuyo prefijo es Ctrl-c (C-c
) (ver 3 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 en el búfer para la variable comment-start
, que determina cómo se delimitan los comentarios del código fuente (véase 27.5. Manipulación de Comentarios).
Para ver la documentación del modo principal actual, incluida una lista de sus combinaciones de teclas, escriba Ctrl-h (C-h m
, describe-mode
). Consulte 11.8 Otros comandos de Ayuda.
Cada modo principal, aparte del modo Fundamental, define un gancho (hook) de modo, una lista personalizable de funciones Lisp que se ejecutarán cada vez que se active el modo en un búfer. Para obtener más información sobre ganchos, consulte 50.2.2 Ganchos (Hooks). Cada gancho de modo recibe el nombre de su modo principal, por ejemplo, el modo Fortran tiene fortran-mode-hook
. Además, todos los modos principales basados en texto ejecutan text-mode-hook
, y muchos modos de lenguaje de programación [11] (incluyendo todos los distribuidos con Emacs) ejecutan prog-mode-hook
, antes de ejecutar sus propios ganchos de modo. Las funciones gancho pueden mirar el valor de la variable major-mode
para ver en qué modo se está entrando realmente.
Los ganchos de modo se usan comúnmente para habilitar modos menores (vea 24.2 Modos Menores). Por ejemplo, puede poner las siguientes líneas en su archivo init para habilitar el modo menor Flyspell en todos los modos mayores basados en texto (vea 17.4 Comprobar y Corregir la Ortografía), y el modo menor ElDoc en el modo Emacs Lisp (vea 27.6.3. Búsqueda de Documentación en Lenguajes de Programación):
(add-hook 'text-mode-hook 'flyspell-mode)
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode)
24.2 Modos Menores
Un modo menor es un modo de edición opcional que altera el comportamiento de Emacs de alguna manera bien definida. A diferencia de los modos mayores, cualquier número de modos menores puede estar activo en cualquier momento. Algunos modos menores corresponden al búfer local, y pueden activarse (habilitarse) en ciertos búferes y desactivarse (deshabilitarse) en otros. Otros modos menores son globales: mientras están activados, afectan a todo lo que haga en la sesión del Editor, en todos los búferes. La mayoría de los modos menores están desactivados por defecto, pero unos pocos están activados por defecto.
La mayoría de los modos menores locales al búfer 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. Ver 1.3 La Línea de Modo.
Al igual que los modos principales, cada modo menor (también llamando modo secundario) 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 Relleno automático es auto-fill-mode
. Pero a diferencia de un comando de modo principal, que simplemente activa el modo, el comando de modo para un modo secundario puede activarlo o desactivarlo:
Si invoca el comando mode directamente sin argumento de prefijo (ya sea a través de
M-x
, o vinculándolo a una tecla y tipeando esa tecla; consulte 50.3 Personalizar las Combinaciones de Teclas), se activa el modo secundario. El modo menor se activa si estaba desactivado, y se desactiva si estaba activado.Si invoca la orden mode con un argumento prefijo, el modo menor se desactiva incondicionalmente si ese argumento es cero o negativo; en caso contrario, se activa incondicionalmente.
Si el comando mode se invoca a través de Lisp, el modo menor se activa incondicionalmente si el argumento se omite o es nulo. Esto facilita la activación de un modo secundario desde el gancho de modo de un modo principal (véase 24.1 Modos Mayores (o Principales)). Un argumento no nulo se trata como un argumento prefijo interactivo, como se ha descrito anteriormente.
La mayoría de los modos menores también tienen una variable de modo con el mismo nombre que el comando mode. Su valor es no nil
si el modo está habilitado, y nil
si está deshabilitado. 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, al establecer la variable mode
a través de la interfaz Customize (Personalizar) (véase 50.1 Interfaz de Personalización Fácil) 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 locales de búfer:
El modo Abbrev amplía automáticamente el texto basándose en definiciones de abreviaturas predefinidas. Consulte 30 Abreviaturas.
El modo Relleno automático (Auto Fill mode) inserta nuevas líneas a medida que escribe para evitar que las líneas se alarguen demasiado. Ver 26.6 Rellenar Texto.
El modo Autoguardar (Auto Save mode) guarda el contenido del búfer periódicamente para reducir la cantidad de trabajo que puede perder en caso de fallo. Véase 19.6 Guardado Automático: Protección Frente a Desastres.
El modo Electric Quote convierte automáticamente las comillas. Por ejemplo, entrecomilla el texto escrito
`así'
a texto‘así‘
. Puede controlar en qué tipo de texto funciona, y puede desactivarlo por completo en búferes individuales. Véase 26.5 Comillas.El modo enriquecido (Enriched mode) permite editar y guardar texto formateado. Véase 26.14 Texto enriquecido.
El modo Flyspell (Flyspell mode) resalta automáticamente las palabras mal escritas. Véase 17.4 Comprobar y Corregir la Ortografía.
El modo Bloqueo de Fuentes (Font-Lock mode) resalta automáticamente ciertas unidades de texto que se encuentran en los programas. Está activado globalmente por defecto, pero puede desactivarlo en búferes individuales. Véase 15.8. Caras de Texto.
El modo Visualizar números de línea (Display Line Numbers mode) es un práctico asistente para la visualización de números de línea (
display-line-numbers
), que se configura usando el valor dedisplay-line-numbers-type
. Véase 15.24 Personalización de la Pantalla.El modo menor Esquema (Outline mode) proporciona facilidades similares al modo mayor llamado Outline mode. Véase 26.9 Modo Esquema (mode Outilne).
El modo de Sobrescritura (Overwrite mode) hace que los caracteres de impresión normales sustituyan al texto existente en lugar de desplazarlo a la derecha. Por ejemplo, si hay un punto delante de la
B
deFOOBAR
, en el modo de sobrescritura, si se escribe unaG
, se convierte enFOOGAR
, en lugar de producirFOOGBAR
como de costumbre. En el modo de sobrescritura, el comandoC-q
inserta el siguiente carácter, sea cual sea, incluso si es un dígito, lo que le permite insertar un carácter en lugar de sustituir uno existente. El comando de modo,overwrite-mode
, está ligado a la tecla Insert (Insert
).El modo Sobrescritura Binaria (Binary Overwrite mode) es una variante del modo Sobrescritura para la edición de archivos binarios; trata las nuevas líneas y los tabuladores como otros caracteres, de modo que sobrescriben a otros y pueden ser sobrescritos por ellos. En el modo Sobrescritura binaria, los dígitos después de
C-q
especifican un código de carácter octal, como es habitual.El modo Línea visual (Visual Line mode) realiza el ajuste de palabras, haciendo que las líneas largas se ajusten a los límites de palabra. Véase 15.23 Modo de Línea Visual.
Y aquí hay algunos modos menores globales útiles:
El modo Número de Columna (Column Number mode) permite mostrar el número de columna actual en la línea de modo. Véase 1.3 La Línea de Modo.
El modo Borrar Selección (Delete Selection mode) hace que la inserción de texto borre primero el texto de la región, si la región está activa. Véase 12.3 Operar en la Región.
El modo Icompletar muestra una indicación de las terminaciones disponibles cuando se está en el minibúfer y la terminación está activa. Véase 20.7.2 Selección Rápida del Minibúfer.
El modo Número de línea (Line Number mode) permite mostrar el número de línea actual en la línea de modo. Está activado por defecto. Véase 1.3 La Línea de Modo.
El modo Barra de Menús (Menu Bar mode) proporciona a cada marco una barra de menús. Está activado por defecto. Véase 22.15 Barras de Menús.
El modo Barra de Desplazamiento (Scroll Bar mode) proporciona a cada ventana una barra de desplazamiento. Está activado por defecto, pero la barra de desplazamiento sólo aparece en los terminales gráficos. Ver 22.12. Barras de Desplazamiento.
El modo Barra de herramientas (Tool Bar mode) proporciona a cada marco una barra de herramientas. Está activado por defecto, pero la barra de herramientas sólo se muestra en los terminales gráficos. Véase 22.16. Barras de Herramientas.
El modo Barra de Pestañas (Barra de Pestañas) proporciona a cada marco una barra de pestañas. Ver 22.17 Barras de Pestañas.
El modo Línea de Pestañas (Tab Line mode) proporciona a cada ventana una barra de pestañas. Véase 21.8 Línea de Pestañas de Ventana.
El modo Marca transitoria (Transient Mark mode) resalta la región, y hace que muchos comandos de Emacs operen en la región cuando la marca está activa. Está activado por defecto. Véase 12 La marca y la región.
24.3 Elección de los Modos de Archivo
Cuando visita un archivo, Emacs elige un modo principal automáticamente. Normalmente, hace la elección basándose en el nombre del archivo, por ejemplo, los archivos 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 archivo. Este texto especial también puede usarse para habilitar modos menores locales al búfer.
Este es el procedimiento exacto:
Primero, el Editor comprueba si el archivo contiene variables de modo local de archivo. Ver 50.2.4. Variables locales en Archivos. Si hay una variable local de archivo que especifica un modo mayor, entonces Emacs usa ese modo mayor, ignorando todos los demás criterios. Hay varios métodos para especificar un modo principal usando una variable local de archivo; 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 se usa el punto y coma para que Lisp trate esta línea como un comentario. De forma equivalente, podría escribir
; -*- mode: Lisp;-*-
También puede usar variables locales de archivo para especificar modos menores locales de búfer, usando especificaciones eval
. Por ejemplo, esta primera línea no en blanco pone el búfer en modo Lisp y activa el modo de Relleno Automático (Auto-Fill mode):
; -*- mode: Lisp; eval: (auto-fill-mode 1); -*-
Tenga en cuenta, sin embargo, que normalmente es inapropiado activar los modos menores de esta forma, ya que la mayoría de ellos representan preferencias individuales del Usuario. Si personalmente quiere usar 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 24.1 Modos Mayores (o Principales)).
En segundo lugar, Emacs comprueba si la extensión del archivo coincide con una entrada de cualquier lista de modos automáticos local del directorio (automode-mode-alist
). Estas se encuentran usando la herramienta .dir-locals.el
(ver 50.2.5 Variables Locales por Directorio).
En tercer lugar, si no hay ninguna variable de archivo que especifique un modo principal, Emacs comprueba si el contenido del archivo empieza por #!
. Si es así, eso indica que el archivo puede servir como un comando de shell ejecutable, que funciona corriendo un intérprete nombrado en la primera línea del archivo (el resto del archivo se usa como entrada para el intérprete). Por lo tanto, Emacs intenta usar 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 empieza con #!
, normalmente no puede usar la función -*-
en la primera línea, porque el sistema se confundiría al ejecutar el intérprete. De modo que el Editor busca -*-
tanto en la primera como en la segunda línea de tales archivos. Lo mismo ocurre con las páginas de manual que empiezan con la cadena mágica '\"
para especificar una lista de preprocesadores troff.
Cuarto, Emacs intenta determinar el modo principal mirando el texto al principio del búfer, 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 su archivo init (vea 50.4. El Archivo 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 16.6 Sintaxis de las Expresiones Regulares), y mode-function es un comando de modo principal. Si el texto al principio del archivo 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 búfer; si la función devuelve un valor no nulo, Emacs establece el modo principal con mode-function.
Quinto -si Emacs todavía no ha encontrado un modo principal adecuado- mira el nombre del archivo. La correspondencia entre nombres de archivo y 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 con este formulario,
(regexp mode-function flag)
Por ejemplo, un elemento que normalmente se encuentra en la lista tiene la forma ("\\.c\\'" . c-mode
), y es el responsable de seleccionar el modo C para los archivos cuyos nombres terminan en .c.
(Tenga en cuenta que \\
es necesario en la sintaxis Lisp para incluir un \' en la cadena, que debe usarse para suprimir el significado especial de ``'.
en las expreg).
Si el elemento tiene la forma (regexp mode-function flag
) y flag es no nil
, entonces después de llamar a mode-function (si es no nil
), Emacs descarta el sufijo que coincidió con expreg y busca de nuevo en la lista otra coincidencia. Esta «eliminación recursiva de extensiones» se usa para archivos que tienen múltiples extensiones, y la extensión «externa» oculta la «interna» que realmente especifica el modo correcto. Por ejemplo, los archivos de copia de seguridad y los archivos cifrados con GPG con extensión .gpg usan esta función.
En GNU/Linux y otros sistemas con nombres de archivo que distinguen mayúsculas de minúsculas, Emacs realiza una búsqueda que distingue mayúsculas de minúsculas a través de la lista auto-mode-alist
; si esta búsqueda falla, realiza una segunda búsqueda que no distingue mayúsculas de minúsculas a través de la lista 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 mayúsculas de minúsculas, como Microsoft Windows, Emacs realiza una única búsqueda que no distingue mayúsculas de minúsculas a través de auto-mode-alist
.
Finalmente, si Emacs todavía no ha encontrado un modo principal que usar, compara el texto al principio del búfer 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 estilo Unix.
Una vez que se encuentra un modo principal, Emacs hace una comprobación final para ver si el modo ha sido remapeado por major-mode-remap-alist
, en cuyo caso usa el modo remapeado en su lugar. Esto se usa cuando se pueden usar varios modos principales diferentes para el mismo tipo de archivo, para que pueda especificar qué modo prefiere.
Si ha cambiado el modo principal de un búfer, puede volver al modo principal que Emacs habría elegido automáticamente, tecleando Ctrl-x normal-mode
(M-x normal-mode
). Esta es la misma función que find-file
llama para elegir el modo principal. Si el búfer está visitando un archivo, este comando también procesa la línea -*-
del archivo y la lista de variables locales del archivo (si existe). Véase 50.2.4. Variables locales en Archivos. Si el búfer no visita un archivo, el comando procesa sólo la especificación de modo principal, si la hay, en la línea -*-
y en la lista de variables locales del archivo.
Los comandos C-x C-w
y`` set-visited-file-name`` cambian a un nuevo modo principal si el nuevo nombre de archivo implica un modo (véase 19.3 Guardar Archivos). (C-x C-s
también lo hace, si el búfer no estaba visitando un archivo.) Sin embargo, esto no ocurre si el contenido del búfer especifica un modo principal, y ciertos modos principales especiales no permiten cambiar el modo. Puede desactivar esta función de cambio de modo estableciendo change-major-mode-with-file-name
en nil
.