25 Indentación

La sangría o identación se refiere a la inserción o ajuste de caracteres de espacio en blanco (caracteres de espacio y/o 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 modos relacionados, así como a los modos de lenguaje de programación. Consulte 27.3 Indentación de Programas, para obtener documentación adicional sobre la indentación 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 27.3.4 Comandos para la Indentación en C).

TAB (TAB)

Inserta un espacio en blanco o aplica una sangría (o indentación) a la línea actual según el modo (comando sangría por tabulación). Si la región está activa, indenta todas las líneas dentro de ella.

El comportamiento exacto de TAB depende del modo principal. En el modo Texto y modos principales relacionados, TAB normalmente inserta alguna combinación de caracteres de espacio y tabulación para avanzar el punto hasta la siguiente parada de tabulación (véase 25.2 Topes de Tabulación). Para este propósito, la posición del primer carácter que no sea un espacio en blanco en la línea precedente se trata como un tabulador adicional, por lo que puede usar TAB para alinear el punto con la línea precedente. Si la región está activa (véase 12.3 Operar en la Región), TAB actúa de forma especial: sangrará 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 precedentes. 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 espacio en 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 8.1 Inserción de Texto).

25.1 Comandos de Indentado

Aparte del comando TAB (indent-for-tab-command), Emacs proporciona una variedad de comandos para realizar la sangría de otras maneras.

Ctrl-Alt-q (C-M-o)

Divide la línea actual en el punto (split-line, dividir línea). El texto de la línea posterior al punto se convierte en una nueva línea, con sangría en la misma columna en la que se encuentra el punto. Este comando primero desplaza el punto por encima de los espacios y tabulaciones. Después, el punto se sitúa antes de la nueva línea insertada.

Alt-m (M-m)

Se desplaza (hacia delante o hacia atrás) hasta el primer carácter que no sea un espacio en blanco de la línea actual (hacia atrás hasta la sangría). Si no hay caracteres que no sean espacios en blanco en la línea, se desplaza al final de la línea.

Alt-i (M-i)

Sangra (o indentna) los espacios en blanco en un punto, hasta el siguiente tabulador (tab to tab-stop). Véase 25.2 Topes de Tabulación.

Alt-x indent-relative (M-x indent-relative)

Inserta espacios en blanco en el punto, hasta que el punto esté alineado con el primer carácter sin espacio en blanco de la línea anterior (en realidad, la última línea sin espacios en blanco). Si el punto ya está más a la derecha que eso, ejecute tab-to-tab-stop en su lugar, a menos que se llame con un argumento numérico, en cuyo caso no hace nada.

Alt-^ (M-^)

Une la línea anterior y la actual (delete-indentation, eliminar sangría). Une las dos líneas limpiamente, sustituyendo cualquier sangría al principio de la línea actual, junto con el límite de la línea, por un único espacio.

Como caso especial (útil para código Lisp), el espacio simple se omite si los caracteres a unir son paréntesis consecutivos de apertura y cierre, o si la unión sigue a otra nueva línea.

Si hay un prefijo de relleno, M-^ borra el prefijo de relleno si aparece después de la nueva línea que se borra. Véase 26.6.3 El Prefijo de Relleno.

Con un argumento de prefijo, une la línea actual con la siguiente. Si la región está activa y no se da ningún argumento de prefijo, une todas las líneas de la región.

Ctrl-Alt-\ (C-M-\)

Indenta todas las líneas de la región, como si hubiera escrito TAB (TAB) al principio de cada línea (indent-region).

Si se proporciona un argumento numérico, se indentará cada línea de la región hasta ese número de columna.

Ctrl-x TAB (C-x TAB)

Indenta todas las líneas que comienzan en la región, moviendo las líneas afectadas como una unidad rígida (indent-rigidly).

Si se ejecuta sin argumento, este comando activa un modo transitorio para ajustar la sangría de las líneas afectadas de forma interactiva. Mientras este modo transitorio está activo, al teclear (LEFT, IZQUIERDA) o (RIGTH, DERECHA) se aplica una sangría de un espacio hacia la izquierda o hacia la derecha, respectivamente. También puede teclear Shift- (S-LEFT) o Shift- (S-RIGHT) para sangrar hacia la izquierda o hacia la derecha hasta el siguiente tabulador (véase 25.2 Topes de Tabulación). Si se teclea cualquier otra tecla, se desactiva el modo transitorio y se actúa normalmente sobre esta tecla.

Si se invoca con un argumento prefijo n, este comando avanza las líneas n espacios (sin activar el modo transitorio). Los valores negativos de n sangrar hacia atrás, por lo que puede eliminar toda la sangría de las líneas de la región usando un argumento negativo grande, como este:

C-u -999 C-x TAB

25.2 Topes de Tabulación

Emacs define ciertos números de columna como topes de tabulación. Estos son usados como puntos de parada por TAB cuando se insertan espacios en blanco en modo Texto y modos relacionados (ver 25 Indentación), y por comandos como M-i (ver 25.1 Comandos de Indentado). La variable tab-stop-list controla estas posiciones. El valor por defecto es nil, lo que significa un tabulador 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 los tabuladores. 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 los tabuladores es mediante el comando M-x edit-tab-stops. Esto cambia a un búfer que contiene una descripción de los ajustes de tabulación, que tiene este 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 ocurre 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 usa el modo de sobreescritura (ver 24.2 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, teclee Ctrl-c Ctrl-c (C-c C-c) para que los nuevos tabuladores surtan efecto. Normalmente, los nuevos ajustes de tabulación se aplican a todos los búferes. Sin embargo, si ha hecho que la variable tab-stop-list sea local al búfer donde llamó a M-x edit-tab-stops (vea 50.2.3 Variables Locales), entonces los nuevos ajustes de tabulación se aplican sólo a ese búfer. Para guardar la configuración de tabuladores para futuras sesiones de Emacs, usa la interfaz Personalizar para guardar el valor de tab-stop-list (ver 50.1 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 búfer. Los caracteres de tabulación siempre se muestran como espacios vacíos que se extienden hasta la siguiente parada de tabulación. Véase 15.20 Cómo se Muestra el Texto.

25.3 Tabulaciones vs. Espacios

Normalmente, los comandos de sangría insertan (o eliminan) la serie más corta posible de caracteres de tabulación y espacio para alinearse con la columna deseada. Los caracteres de tabulación se muestran como un tramo de espacio vacío que se extiende hasta el siguiente tope tabulación. Por defecto, hay un tabulador por cada columna de ancho de tabulación (8 por defecto). Véase 15.20 Cómo se Muestra el Texto.

Si lo prefiere, toda la indentación puede hacerse sólo a partir de espacios. Para ello, establezca la variable local del búfer indent-tabs-mode a nil. Consulte 50.2.3 Variables Locales, para más información sobre la configuración de variables locales del búfer. Tenga en cuenta, sin embargo, que C-q TAB siempre inserta un carácter de tabulación, independientemente del valor de indent-tabs-mode.

Una razón 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 tab-width. Usando sólo espacios, puede asegurarse de que su archivo tiene siempre el mismo aspecto. Si sólo le importa cómo se ve dentro de Emacs, otra forma de abordar este problema es establecer la variable tab-width en una variable local de archivo (vea 50.2.4. Variables locales en Archivos).

También hay comandos para convertir tabuladores en espacios o viceversa, preservando siempre las columnas de todo el texto que no tenga espacios en blanco. M-x tabify escanea la región en busca de secuencias de espacios, y convierte secuencias de al menos dos espacios en tabuladores si puede hacerse sin cambiar la sangría. M-x untabify cambia todos los tabuladores de la región por el número de espacios apropiado.

25.4 Funciones Prácticas para la Sangría

La variable tab-always-indent modifica el comportamiento del comando TAB (indent-for-tab-command ,sangría para el comando tab). El valor por defecto, t, proporciona el comportamiento descrito en Sangría. Si cambia el valor por el símbolo complete, TAB intentará primero aplicar la sangría a la línea actual y, si la línea ya estaba sangrada, intentará completar el texto en el punto (véase 27.8 Completado de Nombres de Símbolos). Si el valor es nil, TAB aplica 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 opción de expandir o sangrar puede personalizarse aún más mediante 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 Específico de Sangría en el Manual de Referencia de Emacs Lisp, para más detalles.

El modo Electric Indent es un modo global menor que automáticamente indenta la línea después de cada RET que escriba. Este modo está activado por defecto. Para activar este modo menor, escriba M-x electric-indent-mode. Para activar este modo en un único búfer, use M-x electric-indent-local-mode.