Perl и ncurses.

February 16, 2020 PERL SOFTWARE BUGS

Уже не первый год я немного пишу на perl.

В конце прошлого года я задался идеей написать некоторую интерактивную программу. А именно программу по взаимодействию с корпоративной тикетницей. Подробности и детали я опущу, так как заметка не об этом. Остановлюсь лишь на том что в процессе я запользовал библиотеку Curses, точнее, перловые биндинги к ней. И даже не к ней именно, а к ncurses.

Что это вообще за библиотека? О ней знают не только линуксоиды со стажем, но и некоторые не столь искушённые админы и пользователи не windows систем. Свою историю эта библиотека начинает... с игры nethack, для кого-то это окажется несколько внезапно, так как эта игрушка уходит корнями чуть ли не в 60-е прошлого века. Для взаимодействия с терминалом в один прекрасный момент и была изобретена библиотека curses, что и заложило в неё некоторые особенности. Эти самые особенности перекочевали в библиотеку ncurses.

Собственно, эта библиотека располагает к процедурному рисованию больше, чем к генерации текстовых интерфейсов в стиле midnight commander. И всё же...

По мере углубления в свой небольшой проект, я задавался вопросом - почему? Ну, то есть задачи по рисованию на терминальном окне интерфейсов становились регулярно и ncurses до сих пор остаётся чуть ли не единственной относительно популярной либой для этого.

Ответ простой с одной стороны, а с другой - странный. Лень. За это не платят.

В питоне тоже единственный штатный способ рисования по консоли - это curses. И да, в названии этой либы таки содержится ответ на вопрос, почему эта либа так называется.

Но, поскольку к питону я отношусь не оч хорошо, я подумал глянуть в сторону гошки. Оказывается, у них там своя атмосфера и есть несколько библиотек для манипуляции символами в окне терминала. И весьма недурных. Откуда синдром nih? Да ещё и в таких масштабах? Ну, тут всё просто - во-первых ходить в сишку или в плюсы из гошки хоть и можно, но не модно (переносимость собранных бинарников от этого страдает), во-вторых, это дорого по ресурсам, дороже, чем в перле, питоне, рубях. В-третьих - гошка модна в поднебесной, а там популярна ещё и венда, так что терминал - это понятие растяжимое, хотя это, наверно, не основная причина :) Тем не менее разнообразие и механика работы с текстовыми интерфейсами имеется в ассортименте.

Что же мне не понравилось в работе с ncurses? Отсутствие внятного интерфейса работы с окнами. Ну, то есть он есть, но более, чем базовый. Сделать окно, удалить окно, очистить окно, пере-рисовать окно, задать рамку.

Работа с текстом - здесь начинается проблема с utf8. На дворе 21-й век, прошло 20 лет с его начала, а мы до сих пор не можем определиться с длиной строки. Традиционно, возможны только следующие операции: вписать символ, очистить символ, очистить символы до конца строки (если была задана рамка окна, то удаляется один правый фрагмент, так как именно на нём заканчивается строка). Форматирование символов - начало и конец. Работа со строками аналогична работе с символами. Но форматирование текста работает только для символов, не для строк. Есть вариант нарисовать линию из символов. Этим приходится пользоваться для затирания строк, если надо их обновить.

Отдельная история начинается, когда надо отреагировать на изменение размера окна терминала. Curses умеет понимать, что терминал поменялся. Ну, то есть её можно собрать с поддержкой обработчика SIGWINCH. Но что делает этот обработчик? Он преобразовывает этот сигнал в нажатие кнопки KEY_RESIZE. И на этом всё. Терминалы этот самый SIGWINCH отсылают весьма не регулярно, от случая к случаю. То есть поставив обработчик на SIGWINCH не факт, что при изменении окна ты сможешь отреагировать в свое программе. И это печально. Как быть с обходными путями я пока не знаю.

Никаких рамочек, кнопочек, галочек, крестиков, радиобатонов, полос прокрутки, выпадающих списков. Хоть в текстовых интерфейсах это всё по идее есть давно, но при работе с curses все эти вещи надо изобретать с нуля и обёрток для curses, реализующих это вот всё тоже нет (во всяком случае внятных и на перле, мы же говорим в контексте перла).

Собственно, если бы не было бы curses как библиотеки для nethack-овского текстового ui, возможно, была бы изобретена более вменяемая либа для работы с текстовыми окнами. Более для этого подходящая. Но этого не произошло. Поэтому хочешь текстовых плюшечек? Забудь про свой перл/питон/руби/... и бери в руки гошку.

Next Post