Las interfaces de usuario de terminal (TUI) actuales a menudo sacrifican una cantidad significativa de espacio en pantalla porque los bordes —las líneas que delimitan paneles y botones— se tratan como caracteres de texto. Debido a que cada carácter ocupa una celda completa, un diseño anidado puede perder fácilmente de seis a ocho filas de espacio vertical solo por decoración. Un nuevo protocolo de terminal, actualmente implementado en un fork de Ghostty, resuelve esto tratando los bordes como atributos de celda, similares a los colores de fondo, lo que les permite situarse en los bordes de las celdas sin ocupar ningún espacio de carácter.

La limitación de los caracteres de dibujo de cajas

Los bordes de terminal estándar dependen de los bloques de dibujo de cajas de Unicode. Debido a que estos son glifos de texto, deben ocupar una fila o columna completa de la cuadrícula. Esto crea un efecto de 'relleno' donde el texto no puede alinearse perfectamente con el borde de un panel, y los diseños complejos se vuelven apretados a medida que aumenta el número de bordes anidados.

Una demostración de interfaz de terminal renderizada usando caracteres estándar de dibujo de cajas
Una demostración de un gestor de ventanas en mosaico renderizada usando caracteres estándar de dibujo de cajas, ilustrando la naturaleza de consumo de espacio de los bordes basados en texto.www.joshka.net

Esta imagen demuestra el estándar actual de usar caracteres de dibujo de cajas, que ocupan celdas completas y crean problemas de relleno.

Más allá de las limitaciones de espacio, los caracteres de dibujo de cajas tienen limitaciones estéticas y funcionales. Por ejemplo, no pueden crear fácilmente una línea entre dos celdas que contienen contenido, lo que dificulta subrayar un campo de texto sin añadir relleno adicional. Además, al copiar texto de una TUI, a menudo se incluyen estos caracteres de caja como datos 'basura' en el portapapeles.

“Los bordes son parte del problema. Tienen que ocupar espacio, por lo que se convierten en parte de los paneles que la gente quiere construir.”

— Terminal borders that don't cost a cell | Joshka.net

Mecanismo de bordes de celda

El nuevo protocolo trata el borde de una celda como una propiedad de la celda misma. Cada celda puede portar hasta doce segmentos de línea, que representan las dos mitades de cada uno de sus cuatro bordes y cuatro brazos desde su centro. La terminal es responsable de renderizar estos segmentos sobre la cuadrícula, permitiendo colores, anchos y estilos específicos como líneas sólidas, dobles, discontinuas o punteadas.

Una demostración de gestor de ventanas en mosaico usando el nuevo protocolo de bordes de celda
Una demostración de un gestor de ventanas en mosaico usando el nuevo protocolo de bordes de celda para renderizar paneles, pestañas y botones sin consumir espacio de caracteres.www.joshka.net

Esta imagen muestra la aplicación práctica del nuevo protocolo en un diseño complejo de gestor de ventanas en mosaico.

Para manejar las líneas superpuestas, el protocolo utiliza un sistema de prioridad. Cuando dos celdas vecinas comparten un borde, la terminal resuelve qué línea dibujar basándose en una puntuación de prioridad, luego en el ancho del trazo y, finalmente, en la posición (derecha o inferior). Esto asegura que un panel enfocado pueda mantener su contorno completo incluso cuando está adyacente a otros paneles.

El protocolo utiliza el formato de cadena de control de dispositivo (DCS). Las aplicaciones pueden establecer una 'pluma' —similar a un color de fondo— para definir el estilo del borde para el texto subsiguiente, o usar comandos de rectángulo para aplicar bordes a celdas existentes. Si una terminal no soporta el protocolo, la aplicación vuelve a los caracteres estándar de dibujo de cajas.

Un formulario con campos de texto subrayados y botones redondeados usando bordes de celda
Un primer plano de un formulario que demuestra botones redondeados y campos de texto subrayados hechos posibles por el nuevo protocolo de bordes de celda.www.joshka.net

Esta visualización destaca las mejoras estéticas y funcionales, como las esquinas redondeadas y el subrayado, mencionados en la sección de mecanismo.

Compensaciones e implementación

La implementación en el emulador de terminal Ghostty involucra aproximadamente 1,650 líneas de código. A cada celda se le asigna un ID de borde de 16 bits que apunta a una tabla compartida de conjuntos de bordes. Si bien esto permite un renderizado eficiente, la tabla puede ocupar hasta 10-15 MB de memoria si se utiliza cada ID posible, aunque la mayoría de las TUI solo requieren un puñado de conjuntos distintos.

Memoria y escala de implementación: Cambio de código de Ghostty 1,650 líneas; Costo máximo de memoria 15 MB
Memoria y escala de implementaciónjoshka.net

Gráfico elaborado por HN Digest a partir de las cifras reportadas por joshka.net; los valores se muestran tal como aparecen en la fuente.

El rendimiento de renderizado varía según el estilo; mientras que las líneas rectas son eficientes, las esquinas redondeadas requieren más procesamiento porque se dibujan como filas de pequeños cuadriláteros para lograr el suavizado de bordes (anti-aliasing). El autor señala que, si bien el protocolo resuelve el problema del espacio, aún no aborda perfectamente los rellenos de 'media celda', que siguen siendo un desafío de diseño independiente.

Una galería de diferentes estilos de bordes que incluyen líneas sólidas, discontinuas y punteadas
Una galería que muestra la variedad de estilos de bordes soportados por el protocolo, incluyendo líneas sólidas, dobles, discontinuas y punteadas.www.joshka.net

Esta imagen ilustra los estilos específicos y tipos de línea que el protocolo puede renderizar como atributos de celda.

Qué dicen los lectores de Hacker News

  • Alternativa: Un comentarista sugirió que implementar el modo de sobreescritura en más emuladores de terminal sería una mejor manera de dibujar caracteres de borde sobre celdas de texto existentes. comentario ↗
  • Escéptico: Un comentarista cuestionó por qué los autores no buscaron un objetivo más ambicioso de crear un marco de UI completo y denso en información en lugar de simplemente modificar los protocolos de terminal para recuperar espacio en pantalla. comentario ↗
  • Escéptico: Otro usuario expresó escepticismo sobre por qué el protocolo no funcionaría en multiplexores como tmux, señalando que si fuera una propiedad de celda estándar, debería renderizarse como se pretende. comentario ↗
  • Alternativa: Algunos usuarios propusieron alejarse por completo de los trucos de terminal sirviendo HTML sobre SSH para permitir que un navegador renderice una interfaz de usuario adecuada. comentario ↗

Resumen de opiniones del hilo de Hacker News; no son hechos verificados. Leer el debate completo ↗