Примерно раз в год я пишу длинный статус апдейт по проекту far2l — порту Far Manager под Linux, MacOS и BSD. Пожалуй, накопилось достаточно изменений для очередного выпуска.
Поддержка Unicode: составные символы и символы двойного размера
Оригинальный Far Manager для консоли Windows писался в парадигме «одна экранная ячейка — один символ». И даже когда Far переводили с однобайтных кодировок на Unicode (внутри у современного Far все строки в UTF16, в Linux версии — в UTF32), от этой парадигмы не отходили.
Однако Unicode устроен сложнее. Во-первых, существуют иероглифы, которые в одно знакоместо латинского символа помещаться категорически не желают. Для них придумали концепцию Full-Width знаков, которые в моноширинных шрифтах занимают не одно знакоместо, а два, логически являясь при этом одним символом. Во-вторых, существуют диакритические символы (это могут быть знаки ударения или, например, точки над ё), которые в Unicode кодируются отдельным символом, а отображаются над (или под) предыдущим.
В результате имена файлов, содержащие иероглифы или диакритику (или эмодзи, они тоже двойного размера) приводили к ошибкам рендеринга интерфейса.
Аналогичные проблемы наблюдались и в приложениях, работающих во встроенном терминале: при выводе таких символов псевдографический интерфейс «разваливался».
По этому поводу в багтрекере висел десяток тикетов, закрыть которые было непросто: требовалось пересмотреть концепцию «одна экранная ячейка — один символ», и перейти при расчёте метрик интерфейса от подсчёта числа символов к подсчёту числа экранных ячеек по всему коду Far'а. В итоге совсем недавно соответствующие наработки были приняты в master-ветку, и Unicode теперь поддерживается гораздо лучше (скрин ниже — тестовое Unicode-приложение, работающее во встроенном терминале Far'а).
Из того, что пока осталось не реализованным — поддержка RTL-письменностей (где пишут справа налево: иврит, арабский) и шрифтов с лигатурами (по которым скучают те, кто читает или пишет код прямо в Far'е).
Скрипты на lua
Теперь в far2l можно писать плагины не только на Python, но и на Lua! Соответствующий плагин портирован и активно развивается. Также стоит отметить форк far2l автора этого плагина, в котором понемногу исправляются ошибки far2l, которые мешают сделать поддержку Lua идеальной. Если скрипты на Lua были основным сдерживающим фактором, мешавщим вашему переходу на far2l, возможно, этот форк подойдет вам больше ванильной версии.
Поддержка Truecolor во встроенном терминале
В это трудно поверить, но всё это время встроенный терминал far2l поддерживал только 16-цветовую палитру. Не слишком здорово в современном мире. Поддержка truecolor упиралась, опять-таки, в необходимость доработать внутреннюю структуру данных, описывающую одну экранную «ячейку», и заменить работающий с этой структурой код по всему дереву исходников. Однако и эта работа была проделана, и теперь мы можем, например, предпросматривать картинки в виде псевдографики прямо с удаленных серверов по ssh (F3 на картинке, затем F5). Было:
Стало:
Ещё один терминал с поддержкой расширений far2l
Кстати, на последнем скрине показан far2l, работающий в kitty — поддержка расширений far2l, обеспечивающих удаленную синхронизацию буфера обмена, а также передачу любых сочетаний клавиш (а также различие событий KeyUp и KeyDown, что в классических Unix терминалах недостижимо), добавлена и в этот терминал тоже. kitty — форк классического putty, поддерживающий автоматический реконнект при разрыве связи, автоматическое выполнение скриптов на удаленных серверах, сворачивание в tray и много других полезных возможностей. На днях я отправил туда патч с исправлением давней ошибки, приводящей к проблемам после разрыва соединения при запущенном Far'е — единственной остававшейся недоработки поддержки расширений far2l. Ждем принятия PR в апстрим.
Подсветка синтаксиса в Truecolor-цветах
Ещё одно следствие перевода внутренней архитектуры far2l на truecolor-цвета — возможность использования их в подсветке синтаксиса в редакторе. Соответствующие изменения уже добавлены в портированную версию плагина colorer, так что цвета подсветки теперь не ограничены стандартной фаровской 16-цветной палитрой.
Гибридный режим ввода в консольной версии
Изначально far2l существовал только в графической версии (с рендерингом через тулкит wxWidgets), это было необходимо для обхода некоторых фундаментальных ограничений Unix терминалов. Помимо работы с буфером обмена X11, речь идет о поддержке сложных комбинаций клавиш, для которых не существует стандартных escape-последовательностей (например, Ctrl+ноль), а также разделения событий KeyUp и KeyDown (без которого, к примеру, не реализовать подсказку по комбинациям клавиш в нижней панели).
Со временем добавился и консольный бекенд, возможности которого понемногу начали приближаться к возможностям wx-версии. Например, иксовый буфер обмена поддерживается в консоли через прямые обращения к соответствующим библиотекам X11 (если нужные библиотеки есть в системе, и far2l собран с соответствующим плагином). А позже добавилась и поддержка почти любых сочетаний клавиш — с помощью так называемого «гибридного режима ввода».
Как реализован гибридный ввод? Тоже в виде отдельного плагина, чтобы не тащить библиотеки X11 в зависимости, когда в них нет необходимости. Этот плагин «слушает» клавиатурные события иксов, и, если в консоль упала какая-то esc-последовательность, проверяет через X11, были ли одновременно нажиты клавиши-модификаторы (Ctrl, Alt, Shift). Изначально присутствовали некоторые проблемы из-за задержек между приходом события от иксов и соответствующей esc-последовательности в терминал (особенно это было заметно, когда far2l запущен на удаленной системе с X Forwarding, и работа идет по медленному каналу), но в итоге был разработан умный алгоритм определения необходимых таймаутов с адаптацией под конкретное соединение (всё работает само, ничего настраивать не надо), и пользоваться стало вполне комфортно, на все комбинации клавиш происходит адекватная реакция.
В итоге в случае с последней версией far2l разницу в UX между терминальным и графическим бекендом вы едва ли заметите. Разве что события KeyUp/KeyDown всё ещё не различаются в консоли — для их разделения нужно было бы полностью отказаться от обработки ввода через терминал, и получать ввод только через X11. А тут уже возникают проблемы с определеним наличия фокуса на окне терминала, и надёжный способ их обойти мы пока не придумали.
portable версия теперь есть для разных платформ
Portable сборка far2l это один единственный исполняемый файл, способный запускаться практически на любой современной (т.е. для которой всё ещё выходят обновления) Linux системе. Изначально я собирал его только для amd64, но со временем добавилась поддержка и i386, и даже aarch64. Скачать portable сборку можно здесь, но стоит иметь в виду, что обновляется она не так часто, как ppa.
Как обычно, отчёты о найденных ошибках отправляем в багтрекер, а поделиться опытом или задать вопрос можно в русскоязычном чате пользователей far2l в Telegram. Добро пожаловать в сообщество!
Автор: Иван Сорокин