Saltar a contenido

Pares automáticos y sangría inteligente

Mientras escribes, el editor cierra por ti los corchetes y las comillas, mantiene la sangría en las líneas nuevas, abre bloques entre llaves y aplica una única unidad de sangría coherente (tabulaciones o espacios) a la tecla Tab, al retroceso que reduce la sangría y a la sangría automática por igual. Todo lo que hay aquí es una función integrada del editor; los comandos de menú correspondientes y el ajuste de estilo de sangría vienen del plugin Sangría incluido.

Está pensado para ser invisible: solo actúa sobre el carácter que acabas de escribir y se retira allí donde estorbaría (dentro de comentarios y cadenas, delante de palabras existentes, con el carácter compañero equivocado).

Emparejar automáticamente corchetes y comillas

Escribir un corchete o una comilla de apertura inserta su pareja y deja el cursor entre ambos:

Escribes Obtienes Cursor
( () en medio
[ [] en medio
{ {} en medio
" "" en medio
' '' en medio

Unas cuantas reglas evitan que esto resulte molesto:

  • Escribir por encima. Escribir un carácter de cierre cuando el mismo carácter ya está a la derecha del cursor lo salta en lugar de insertar un segundo, así que escribir de corrido a través de () o "" deja una única pareja equilibrada.
  • No se empareja delante de una palabra. Un carácter de apertura solo se completa cuando el siguiente carácter es un espacio en blanco, un carácter de cierre o el fin de línea, así que añadir ( justo antes de un texto existente no le inyecta un ) perdido en medio.
  • Comillas conscientes del apóstrofo. Un ' escrito justo después de una letra (como en don't) se trata como apóstrofo y no se empareja. Las comillas solo se emparejan automáticamente en un contexto neutro (inicio de un token, tras un espacio en blanco o un operador).
  • Signos de menor/mayor solo en marcado. < … > se emparejan automáticamente solo en documentos HTML/XML, donde < abre una etiqueta. En todos los demás sitios < es un operador de comparación o de desplazamiento y se deja en paz.

Envolver una selección (escribir para envolver)

Con texto seleccionado, escribir un carácter de apertura no sustituye la selección: la envuelve.

select value  then type (        →   (value)
  • Funciona con ( [ { " ' (no con <: fuera del marcado es un operador).
  • El texto interior sigue seleccionado después, así que los envoltorios se encadenan: escribe ( y luego " y obtienes ("value").
  • Con varios cursores, cada selección se envuelve de forma independiente, y toda la operación es un solo paso de deshacer.

Borrar una pareja

Pulsar Retroceso con el cursor entre una pareja vacía insertada automáticamente ((|), [|], {|}, "|", '|' o <|> en marcado) borra ambos caracteres de una vez, así que puedes deshacer un par automático con una sola pulsación. En cuanto hay contenido entre la pareja, Retroceso se comporta con normalidad.

Sangría inteligente al pulsar Intro

Pulsar Intro lleva el espacio en blanco inicial de la línea actual a la línea nueva, de modo que te quedas a la misma profundidad sin volver a escribir tabulaciones ni espacios:

  • Mantener la sangría. La línea nueva empieza con la misma sangría que la línea que dejaste.
  • Abrir un nivel. Si la línea que dejaste termina con un carácter de apertura ({, [, (), la línea nueva lleva un nivel más de sangría.
  • Abrir un bloque. Si el cursor está entre un carácter de apertura y su cierre correspondiente, el bloque se despliega: la línea nueva lleva un nivel más de sangría y el cierre baja a su propia línea, a la profundidad de la apertura.
if (cond) {|}        Enter        if (cond) {
                     ───────►          |
                                   }

Estilo de sangría: tabulaciones, espacios o automático

Una única unidad de sangría gobierna la tecla Tab, el retroceso que reduce la sangría y la sangría automática de arriba, de modo que siempre coinciden. Elígela en Preferencias ▸ Complementos ▸ Sangría:

Estilo Comportamiento
Tabulaciones (predeterminado para archivos nuevos) Un nivel es un carácter de tabulación real; Espacios por nivel de sangría fija su anchura visual.
Espacios Un nivel son tantos espacios como indique Espacios por nivel de sangría.
Automático (detectar del documento) El editor examina la sangría existente del documento y la sigue: un archivo con tabulaciones sigue usando tabulaciones, uno de 2 espacios sigue usando dos espacios. Un archivo que aún no tiene sangría recurre al valor predeterminado (tabulaciones).

Los archivos nuevos sin título usan de forma predeterminada Tabulaciones, con anchura 4.

Ajustar la sangría a mano

El plugin Sangría añade dos comandos (también bajo Editar ▸ Sangría) que aumentan o reducen la sangría de todas las líneas que toca la selección, o de la línea del cursor cuando no hay nada seleccionado:

Comando Atajo
Aumentar la sangría Ctrl+]
Reducir la sangría Ctrl+[

Pegar un bloque de código

Copia unas líneas que lleven su propia sangría —digamos tres líneas que empiezan cada una con doce espacios— y pégalas con el cursor sangrado. Pegadas literalmente, la primera línea caería en tu sangría más los doce espacios del bloque (muy a la derecha) y cada línea siguiente en la columna 0 más doce, dejándote volver a sangrarlo todo a mano.

OctoEdit vuelve a sangrar el bloque por ti: se elimina la sangría que comparten las líneas del bloque, la primera línea cae donde ya está el cursor y cada línea siguiente recibe la sangría de la línea del cursor más la sangría que tuviera dentro del bloque. La estructura interna del bloque se conserva exactamente; las tabulaciones siguen siendo tabulaciones y los espacios, espacios.

Solo se sustituye la sangría inicial: el bloque conserva sus propios caracteres de sangría, así que un bloque sangrado con espacios pegado en un documento sangrado con tabulaciones sigue sangrado con espacios por dentro. Convertir la sangría interior del bloque al estilo del documento es una posible opción futura: hoy el editor no lo hace.

Esto se aplica solo a un pegado que sea inequívocamente un bloque:

  • el portapapeles contiene más de una línea;
  • hay un solo cursor y ninguna selección rectangular (por columnas);
  • entre el comienzo de la línea y el cursor no hay más que espacio en blanco —pegar en mitad de una línea es un empalme y se deja literal.

Todo lo demás se pega exactamente como antes. Todo el pegado es un único paso de Deshacer, y una selección se sustituye como de costumbre.

Desactívalo con Volver a sangrar las líneas pegadas según la sangría del cursor en Preferencias ▸ Complementos ▸ Sangría (activado de forma predeterminada).

Pegar como Markdown (Ctrl+Shift+V) pasa por la misma regla. El texto convertido es un bloque que empieza en la columna 0 con sus elementos de lista anidados sangrados respecto a él, así que con el cursor sangrado cada línea recibe la sangría del cursor y el anidamiento se conserva exactamente. Consulta Editar para saber qué hace el comando.

Valores predeterminados por lenguaje

Algunos lenguajes tienen una convención de sangría casi universal, y el editor la trae como valor predeterminado de ese lenguaje: un archivo de ese tipo recién abierto se sangra correctamente sin ninguna configuración.

Lenguaje Predeterminado
Python 4 espacios (PEP 8)
Rust 4 espacios (rustfmt)
Markdown 4 espacios (listas anidadas)
YAML 2 espacios (no se permiten tabulaciones)
JSON 2 espacios
Go tabulaciones (gofmt)
C / C++ tabulaciones

Todos los demás lenguajes no llevan, deliberadamente, ningún valor predeterminado y siguen tu ajuste global de sangría. Cambiar a mano el lenguaje de un documento (el menú Lenguaje) vuelve a aplicar de inmediato el valor predeterminado correspondiente.

El valor predeterminado vive en el archivo de definición del lenguaje (colorizers/<id>.json, clave "indent": { "style": "tabs|spaces", "width": N }). Un usuario avanzado puede cambiar un valor predeterminado de serie colocando una copia editada de ese archivo en el directorio de anulaciones del usuario: el catálogo sustituye las definiciones por identificador.

Previsto: anulaciones por lenguaje en Preferencias

Una tabla de ajustes para anular estos valores predeterminados por lenguaje (sin tocar ningún JSON) está diseñada y planificada como el siguiente paso de esta función; hasta que llegue, la anulación por JSON anterior y las capas de abajo son las formas de dirigir la sangría.

De dónde sale la unidad de sangría (precedencia)

Cuando varias fuentes tienen opinión sobre la sangría, el editor las resuelve en un solo sitio y aplica la ganadora, de mayor a menor precedencia:

  1. El .editorconfig del proyecto — cuando existe y «Aplicar los ajustes de .editorconfig» está activado, los indent_style / indent_size / tab_width de un proyecto ganan para los archivos que coincidan.
  2. El valor predeterminado de serie del lenguaje — la tabla de arriba, cuando el lenguaje del documento declara uno.
  3. Tu ajuste global de sangría — la elección Tabulaciones / Espacios / Automático de arriba.

Así, un proyecto que incluye un .editorconfig anula todo lo demás para los archivos de ese proyecto; un archivo de Python fuera de un proyecto así se sangra con los espacios de PEP 8 aunque tu ajuste global sean tabulaciones; y todo lo demás sigue tu ajuste global. Siempre puedes cambiar después a mano la sangría de un documento.

La precedencia se mantiene en el momento en que algo cambia: aplicar una elección distinta de Tabulaciones / Espacios / Automático en Preferencias vuelve a resolver el documento abierto de inmediato, así que un archivo gobernado por un .editorconfig o por un valor predeterminado de lenguaje conserva su sangría sin que tengas que cambiar de pestaña.

Varios cursores

Todo lo anterior se aplica en cada cursor cuando editas con varios cursores: escribir ( inserta () en todos, Intro mantiene la sangría de cada línea y Retroceso entre parejas vacías borra ambas celdas en todos. Un único Deshacer revierte toda la edición con varios cursores de una vez.

Retroceso con cursores mezclados

Retroceso solo borra parejas cuando todos los cursores están entre una pareja vacía. Si algunos cursores están en otro sitio, Retroceso recurre a su comportamiento normal en todos ellos, de modo que nunca borra un cierre suelto en un cursor mientras editas una palabra en otro.

En comentarios y cadenas

Cuando hay un colorizador de sintaxis activo, el emparejamiento automático y la apertura de bloque guiada por llaves se retiran dentro de los comentarios y de los literales de cadena y de carácter: allí un { o una " son texto corriente, no código, así que el editor los deja exactamente como los escribiste. La sangría simple (llevar el espacio en blanco de la línea anterior) sigue funcionando. En un documento de texto plano sin colorizador no hay nada que suprimir, así que el emparejamiento se comporta igual en todas partes.

Relacionado