Примерно раз в год я пишу длинный статус апдейт по проекту 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. Добро пожаловать в сообщество!
Комментарии (71)
soondook
10.11.2022 00:37+1Под Cygwin будет работать?
unxed Автор
10.11.2022 00:38+1Когда-то работал, но это давно не тестировалось. Будет здорово, если вы проверите!
Urub
10.11.2022 10:02мне кажется, что работать в новой псевдоконсоли, а не в той из которой был запуск - это архитектурная ошибка
unxed Автор
10.11.2022 10:59Вопрос как минимум заслуживающий дискуссии. А какие ограничения с вашей точки зрения такой подход создаёт?
Urub
10.11.2022 11:12неудобно несколько far запускать и консоль теряется при выходе
сейчас я использую консоль и mc так:
запустил konsole и в нем 10 табов (все это стартует автоматом при логине)
работаю в голой косноли (табе)
нужен mc - запускаю его и также консоль вижу
unxed Автор
10.11.2022 16:10Всё равно до конца не понимаю, почему модель far2l вам не подходит. Почему важна именно та консоль, в которой запущено приложение, а не встроенная отдельная, и как это связано с табами? Окружение родительской консоли в фаровскую консоль передается, если что. Проверить можно так: a=b far2l --tty, и потом env
Urub
10.11.2022 16:23исходное состояние konsole с табами консолей - я работаю в консолях, например пойду по ssh кудато, а там mc и всё тутже - в этом табе
т.е. если нужен mc - я его запускаю и он работает в этом табе, в этой консоли, не отдельное окно вылезает 2.1 вышел из mc - и в этойже консоли все выводы команд поданные в mc - вижу, не пропали
10 табов - 10 mc и все в рамках одного окна, а не 10ти окон
если ктото работает только в одном экземпляре far2l и более ему не надо, то проблем наверно и нет
unxed Автор
10.11.2022 16:31так можно и с far2l, пошли куда-то по ssh, там запустили tty-версию
вот тут да, история команд в фаре и баше отдельная. это обсуждалось в тикете, не только у вас запрос такой есть. вот тут обсуждение, там и workaround есть https://github.com/elfmz/far2l/issues/1075
опять же, делаете 10 табов, в них 10 tty-версий far2l, в чём проблема? запускаете far2l --tty просто. или собираете вообще без wx
Urub
10.11.2022 16:38про --tty не знал )
но стали проблемы с хоткеами - не работают LCtrl-Цифира
также надо дважды нажимать ESC для закрытия диалогов (в мс есть настройка для этого)
наверно никто в режиме --tty не тестирует )а быстро убрать\показыть скрытые файлы и каталоги хоткей есть ?
unxed Автор
10.11.2022 18:41Я в режиме tty тестирую. Чтоб нажимать ESC один раз, запускайте с ключиком --ee. Но вообще, похоже, у вас он без поддержки гибридного ввода собран, раз LCtrl+цифры не работают. Это странно. Бинарник far2l_ttyx.broker присутствует? Или вы его на удаленной системе гоняете, где нет библиотек x11 или не включен x forwarding при ssh соединении? Тогда надо запустить far2l локально, и уже через него делать ssh куда-то, все хоткеи заработают.
Скрытые — Ctrl+H.Urub
10.11.2022 21:52с ключом --ee заработал одиночный esc, но заметна на глаз задержка закрытия окон при его нажатии
deb пакет брал из вышеуказанного репа, наверно потому и клавиши LCtrl+цифры не работают, far2l_ttyx.broker не вижу
при этом Ctrl+H - работает
такто есть еще много вопросов после mc )
но может где есть тематический форум по far2l чтобы тут не засорять тред ?unxed Автор
11.11.2022 00:06Ссылка на чатик в Телеграме в конце поста, приходите туда!
2. попробуйте из исходников или portable
manyakRus
10.11.2022 11:18+4Спасибо автору :-), far2l очень нужен в линуксе,
всякими mc невозможно пользоваться :-(
Единственное не хватает кнопки как в mc "SFTP-соединение" чтоб копировать файлы из удалённого компьютера к себе...
K_Chicago
10.11.2022 20:56на минуточку, а какая именно проблема с mc? Я знаю его развивают, работает нормально...
да и вообще скажу страшное, плохо понятно зачем они нужны на люниксах...разве что прожженым винудсятникам которым почему-то пришлось переползти полностью на линух из-за какой-то жизненной катастрофы...
Я имею ввиду, линуксоиды они от рожденья в свитере с бородой и знают как выходить из VI, а наш брат идущий от DOS-Win311 и далее везде - ну нам обычно нужно 2-3 команды запомнить да больше и не нужно...
Urub
10.11.2022 21:58есть разные эффективные способы работы в файловой системе, ftp, ssh - mc один из них, который дополняет консоль, но не отменяет ее
а проблемы mc уже заучены и привычны )unxed Автор
11.11.2022 00:11+1Да mc норм, никто ведь не предлагает обязательно всем на фар перебираться :) Хорошо, когда есть выбор! Мне вот именно такой инструмент нравится, я к нему привык, у него много интересных плюшечек, экономящих время и упрощающих жизнь, и мне очень не хватало его на *nix. Плюс этот порт — история о том, как можно в дополнить *nix консоль фичами, которых там отродясь не было, а в виндовой консоли были. В процессе приходится придумывать весьма изящные с инженерной точки зрения решения, участвовать в этом дикий кайф. А mc конкуренция только на пользу, подстегнёт развитие. И будет у нас два классных консольных двухпанельника, а не один.
checkpoint
10.11.2022 14:58+2Спасибо Вам за far2l! Пользуемся с удовольствием всем коллективом.
unxed Автор
10.11.2022 16:12Спасибо в первую очередь основному автору,@elfmz! Я только помогаю тестировать немножко, иногда небольшие патчики пишу, статьи обзорные вот, ну и концптуально удавалось несколько раз предложить удачное решение той или иной проблемы.
И всё же слышать это очень тепло и приятно!
ShashkovS
10.11.2022 17:16А кто-нибудь сумел успешно собрать на CentOS?
Пока видел две ссылки с инструкциями:
https://github.com/elfmz/far2l/issues/336#issuecomment-459049056
https://github.com/pgagarinov/centos-config/blob/master/centos8/basic/install_far2l.sh
Но в том или ином виде у меня с обеими проблема. Сложность в том, что аккуратно перевести с убунтовского на центосовский:apt-get install gawk m4 libwxgtk3.0-gtk3-dev libx11-dev libxi-dev libpcre3-dev libxerces-c-dev libspdlog-dev libuchardet-dev libssh-dev libssl-dev libsmbclient-dev libnfs-dev libneon27-dev libarchive-dev cmake g++ git
IvanShatsky
10.11.2022 20:24+1Хотите собрать именно с wx, GUI-вариант? Я себе собираю под CentOS 7, но только TTY-вариант, без GUI, если хотите, могу поделиться рецептом.
ShashkovS
10.11.2022 20:57+1Да, мне только TTY-вариант.
IvanShatsky
10.11.2022 23:12+1Написал инструкцию для CentOS 7:
https://github.com/elfmz/far2l/issues/647#issuecomment-1310838699
Скорее всего то же самое (с заменой yum на dnf) подойдёт и для CentOS 8. Если будете пробовать, буду благодарен за любой (положительный или отрицательный) feedback.
IvanShatsky
10.11.2022 23:24+1Дополнительно в той же ветке на обсуждения на GitHub:
https://github.com/elfmz/far2l/issues/647#issuecomment-652671363
586
11.11.2022 00:00А почему не работает поиск? Вот, например, пытаюсь искать:
ipic.su/7yZe12.png
Результат:
ipic.su/7yZe14.png
Но, стоит зайти, например, в /etc файлы находятся. Но лишь жалкая доля того, что находит find:
ipic.su/7yZe15.png
PS и подобных «мелочей» огромное множество. Есть какой-нибудь рускоязычный форум, куда можно внятно писать о всех найденных ошибках?unxed Автор
11.11.2022 00:12Ссылка на багтрекер в конце поста, написать о проблеме нужно именно туда! Спасибо! :)
IvanShatsky
11.11.2022 16:03+1Конкретно с проблемой ненахождения существующих файлов я не сталкивался. Но один комментарий к скриншоту дам, если я что-либо ищу начиная с корневого каталога (чего я обычно стараюсь не делать), я всегда отключаю "Search in symbolic links", иначе фар будет рекурсивно гулять внутри
/proc
до бесконечности. Собственно говоря, в Far для Windows я тоже при поиске по большому дереву (типа по всему диску, по всем несъёмным дискам) эту опцию всегда отключаю.
shmuz
11.11.2022 17:59+1Это (поиск из /) было исправлено не так давно (https://github.com/elfmz/far2l/issues/1371)
alex82374
11.11.2022 17:59Хорошая программа, давно пользуюсь. Из минусов, кот. переодически напрягает, не работает (или не понятно как пользоваться) прокруткой вывода терминала в режиме Ctrl+O (когда панели скрыты).
pharo
12.11.2022 08:22+1При пользовании Far мне, бывает, не хвтает третьей открытой панели и чтобы её отображение было постоянным (не перекрывалось другими панелями).
Поэтому приходиться запускать ещё один Far. :)
P.S. А, интересно, есть ли для Far плагин сравнения файлов сравнимый по функционалу с программой WinMerge?lieff
12.11.2022 12:27Есть кросс-платформенные аналоги WinMerge: KDiff3 и Meld.
shmuz
12.11.2022 12:52+1Да, в линуксе использую Meld. Из far2l запускаю его макросом, который выбирает файлы для сравнения в зависимости от текущих или выделенных позиций в панелях.
unxed Автор
12.11.2022 13:03А выложите макрос, пожалуйста!
shmuz
12.11.2022 13:17+1Увы, мои макросы могут работать только на моём форке far2l. Но тем не менее вот он: https://github.com/shmuz/LuaFAR-2L/blob/main/Macros/scripts/Shell/visual_compare.lua
echo10
Планируется ли порт под Windows?)
unxed Автор
Аххаха, он уже есть! Правда, давно не тестировался, так что сложно сказать, соберется ли сейчас. Но можно написать тикет, если что-то пойдет не так :)
А если серьёзно, я вполне допускаю, что адаптировать far2l под Windows, приделав ещё один бекенд «консоль Windows», куда проще, чем оригинальный Far для Windows сделать кроссплатформенным.
pharo
А, собирается ли Вами ещё порт Far2L для Linux32 для запуска в «старых» версиях Linux?
(как ранее портабельная сборка стартующая c Xenial Ubuntu 32)
Upd: Увидел в cтатье.
unxed Автор
Для amd64 вот сейчас собираю прямо. Выложу туда же, куда ведет ссылка portable из поста. Xenial и более поздние, да. Раньше с Trusty начинал, но сейчас там проблемки, больно старый всё-таки.
Для i386 лежит там же, но без последний изменений, дойдут руки — обновлю как-нибудь тоже, если кому-нибудь это вообще актуально ещё.
BoldDwarf
Не уверен что поддержка i386 действительно актуальна, но поддержка 32 битных систем вполне нужна.
Far2l прекрасно работает в сборках для arm32, проверено лично для imx6.
Таких встроенных систем пруд пруди.
unxed Автор
Собрать portable в принципе подо что угодно можно, если мне кто-нибудь даст виртуалку на этой архитектуре на час.
BoldDwarf
Для встройки проще предложить патч для buildroot и/или yocto.
Добавить новый package.
Тогда не будет нужду строить все самому.
Те кому надо просто добавят far2l к билду и оно само построится.
Опять таки, это сильно продвинет far2l в сообщество.
Это конечно не приём в официальные репы Ubuntu или других больших дистро но вполне себе прогресс.
Пользуясь случаем, хочу сказать огромное спасибо за проект.
Народ конечно говорит что mc может все тоже, но это не совсем так.
По моему сугубо личному мнению far2l намного удобнее и привычнее для тех, кто долгие годы работал с far для windows.
unxed Автор
Тепло это слышать! Основные благодарности, конечно, должны @elfmzдостаться :) С buildroot и/или yocto опыта, увы, не имел, но если вы возьметесь делать и будут какие-то сложности, постараюсь помочь по возможности! Можно тут в личку писать, например, или в телеграм t.me/unxed, там отвечу быстрее
unxed Автор
Пересобрал portable aarch64-версию тоже.
SpecterOfChaos
А так Вы напишите основные отличия от mc. Я например не знаю про достоинства, запустил, посмотрел, и вернулся обратно в привычный mc. А вполне возможно, что есть фичи, о которых я не знаю
unxed Автор
Ой, не, такие сравнения это очень конфликтогенная тема, не полезу в это :) Тем более, надо быть доскональным знатоком их обоих, чтоб хорошее сравнение написать, а я точно таковым не являюсь, я и в фаре-то привычном постоянно новые фишки открываю, о которых не знал раньше. Но кто-то делал такие сравнения в каментах к моим предыдущим постам про far2l здесь, поищите, если интересно!
unxed Автор
Собрал и выложил 32-битный portable тоже, проверяйте!
pharo
Пишет, что не найден 'GLIBCXX_3.4.22' плагина Colorer и далее запускается.
unxed Автор
А пойдемте в телеграм разбираться, чтоб здесь не флудить сильно? t.me/unxed
tark-tech
А давайте все же лучше здесь? Дабы результаты разбирательства можно было хоть как-то найти потом.
Аналогично, кстати. Не запускается:
/far2l: /lib64/libstdc++.so.6: version
GLIBCXX_3.4.20' not found (required by ./far2l) ./far2l: /lib64/libstdc++.so.6: version
CXXABI_1.3.8' not found (required by ./far2l)./far2l: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./far2l)
unxed Автор
Исправил на своей стороне, попробуйте свежую версию по той же ссылке, пожалуйста!
unxed Автор
Как временный workaround, чисто теоретически, вот это должно помочь, libstdc++ поставится свежая. Я, вроде, понял, отчего такое происходит, но чтобы понять, как исправлять, надо сперва дождаться ответа автора вот на этот тикет.
domix32
We need to go deeper. Как насчет Far в WSL?
unxed Автор
Писали что работает, вот инструкция по сборке https://t.me/far2l_ru/2447
domix32
Поставил версию из ppa, вроде работает
Qetzlcoatl
Только не "консоль Windows" нужно делать, а сразу "Windows Terminal" - вот это нормальная консоль и она доступна в 10, а в 11 IMHO уже по-дефолту использется.