Мейнтейнер Ratatui предложил терминальный протокол для линий на границах ячеек
Мейнтейнер библиотеки с открытым кодом Ratatui Joshka подготовил черновик протокола, позволяющего терминалам рисовать рамки на границах ячеек, не расходуя целую строку или столбец. Протокол реализован в патче для терминала Ghostty, автор просит отзывов у разработчиков терминалов и TUI-приложений.

Joshka, поддерживающий Ratatui — популярную библиотеку для создания текстовых пользовательских интерфейсов (TUI), — опубликовал черновик терминального протокола для рисования тонких линий на границах символьных ячеек. Сегодня рамки в терминалах обычно рисуют символами блока Unicode Box Drawing, поэтому каждая линия занимает целую ячейку. Автор ищет отзывы разработчиков терминалов и TUI-приложений.
В чём проблема
Символы рамок — это текст, поэтому они занимают место. Автор отмечает, что в терминале 200x50 с несколькими вложенными панелями на одни лишь линии может уходить 6–8 строк из 50. Линию нельзя провести и между двумя заполненными ячейками, поэтому для подчёркивания текстового поля или обводки кнопки нужны дополнительные отступы. При копировании текста из приложения вместе с ним копируются и символы рамки.
Как это работает
Граница ячейки — это атрибут ячейки, подобно цвету фона. В каждой ячейке может быть до двенадцати отрезков линий: обе половины каждого из четырёх краёв и четыре луча из центра. У каждого отрезка свои цвет, толщина, положение и стиль. Линии могут быть сплошными, двойными, пунктирными или точечными, а углы — прямыми или скруглёнными. Границы хранятся в ячейках, поэтому прокручиваются, стираются и переносятся вместе с текстом.
Команды передаются одной DCS-строкой. Приложение проверяет поддержку запросом и следующим за ним DA1; если поддержки нет, оно использует обычные символы рамок. Терминалы, не знающие протокола, строку игнорируют. Мультиплексоры вроде tmux, не знающие о нём, должны её отбрасывать.
Реализация
Патч для Ghostty занимает около 1650 строк, значительная часть которых — тесты. Каждой ячейке добавляется 16-битный идентификатор границы, поэтому размер ячеек не растёт. Автор признаёт, что производительность ещё не измерялась должным образом. Патч проверялся только на macOS, а протокол следует считать черновиком.


