- PVSM.RU - https://www.pvsm.ru -

Линукс-порт Far Manager: прогресс за 4 года

Первая публикация исходников far2l, порта Far Manager под Линукс [1] — штуки, которая когда-то считалась принципиально невозможной — состоялась 10 августа 2016го. Поскольку главный разработчик поговаривает о переходе проекта в статус беты [2], решил написать обзорный пост, как там идут дела и чего удалось добиться за прошедшие четыре года.

Консольная версия

Первый же вопрос, который все задавали и здесь [3], и на опеннете [4], и на лоре [5] — а чего не в консоли? Изначально far2l действительно работал только в графическом режиме, через wxWidgets. Это оказалось самым простым способом быстро получить работающий порт со всеми пользовательскими удобствами: иксовым буфером обмена и всеми сочетаниями клавиш, причем с поддержкой событий не только KeyDown, но и KeyUp.

Сейчас это ограничение в прошлом: far2l прекрасно себя чувствует в консоли [6]. Более того, там появились так называемые расширения терминала far2l [7], поэтому если запускать консольный far2l внутри графического (например, зайдя куда-нибудь по ssh), они «сконнектятся» между собой, и внутренний far2l тоже будет видеть и буфер обмена (с разрешения пользователя, конечно), и все возможные горячие клавиши. Более того, сделана даже специальная сборка putty [8], позволяющая наслаждаться всеми этими фишками из Windows.

Вот, смотрите, это far2l в GNOME Terminal

Линукс-порт Far Manager: прогресс за 4 года - 1

А вот в putty

Линукс-порт Far Manager: прогресс за 4 года - 2

Русские буквы в .zip'ах «с винды»

Вы не поверите, но Windows, вплоть, как минимум, до семерки создавала .zip архивы, записывая туда имена файлов в OEM (DOS) кодировке! Совместимость страшная штука. В итоге StackOverflow переполнен вопросами «как мне правильно распаковать зип с кракозябрами».

В far2l мы это починили. В процессе родилась демонстрационная утилитка [9], которая показывает, как правильно работать с кодировками в .zip'ах, чтобы «кракозябров» не было (пригодится авторам архиваторов), а также патчик к p7zip [10], применяющий аналогичный алгоритм. p7zip-с-патчиком даже запакован в .deb'ку [11] (ubuntu 20.04+, amd64), установка которой чинит поддержку зипов, например, в Engrampa [12], используемом в MATE.

Линукс-порт Far Manager: прогресс за 4 года - 3

Приведение в порядок зависимостей

Изначально порт нёс в себе кучу кода библиотек, и так присутствующих в мире Linux в системных пакетах: pcre, minizip, universal charset detector. Сейчас всё это заменено на грамотное использование зависимостей: системные библиотеки используются везде, где это возможно (исключение: 7z и unrar, там статически компилируются самые свежие библиотеки для поддержки самых свежих особенностей форматов).

Человеческая поддержка .tar.gz

Плагин multiarc, который используется в far2l для доступа к архивам, приехал к нам из мира Windows, и не умел воспринимать .tar.gz как один архив. Он видел .gz, и внутри него .tar. Следовательно, чтобы получить список файлов, приходилось делать полную распаковку. Такой себе экспириенс. За последний месяц multiarc был существенно доработан, и эта проблема исчезла.

Красивое консольное окно

В графической версии far2l была проблема: символы рисования рамок показывались раздражающим «пунктиром».

image

У нас долго не получалось найти причину или подобрать настройки рендеринга, исправляющие этот бесячий баг, пока я не заглянул в исходники терминалок из GNOME и KDE. А там, оказывается, давным-давно символы рисования рамок рендерятся не из шрифта, а вручную, чтобы линии четкие и красивые получались.

В итоге сделали так же в far2l, только немножко лучше: добавив сглаживание. А то в терминалах KDE и GNOME максимально контрастные линии слишком сильно отвлекают на себя внимание рядом со сглаженным текстом.

В процессе пришлось разобраться в психовизуальных нюансах антиалиасинга, отлавливая несуществующие «слишком яркие пиксели», которые упорно видели глаза. Подробности [13].

image

Пакеты для дистрибутивов

В репозитории многих дистрибутивов мы пока не попали (а в некоторые уже попали [14]!). Зато давно есть пакеты во всех основных форматах [15]. Даже скрипт сборки для Amazon Linux есть! Ну и, конечно, есть ppa для *buntu [16] — самый удобный способ «просто поставить фар» для большинства пользователей.

Свежий Colorer

far2l «форкнулся» от ветки Far 2, так что некоторые плагины там требовали срочного обновления. Недавно такое обновление было проведено: обновили код распаковки 7z и unrar, а также схемы цветовой подсветки синтаксиса Colorer. Остальные портированные плагины не содержат каких-то регулярно обновляющихся штук, а вот старые «раскраски» и не открывающиеся новые архивы были реальной проблемой. Всё, её больше нет!

Линукс-порт Far Manager: прогресс за 4 года - 6

NetBoxRocks

Это был второй вопрос, который обычно задавали в каментах: «а нетбоооокс буууудеееет?». Нет, нетбокса не будет! Там putty внутри, и тащить в far2l её linux-версию показалось странной затеей. Да и сам код netbox'а не слишком располагал к портированию.

Поэтому автор порта, великолепный elfmz, сделал свою версию сетевого плагина: NetRocks. Там есть всё, что только может понадобиться — и ftp[s], и scp, и sftp, и nfs, и webdav, и даже samba! Всё работает на нативных линуксовых библиотеках. В sftp можно даже удаленные команды запускать и в удаленную консоль ходить.

А ещё в NetRocks есть псевдо-сетевой плагин file, который позволяет работать с локальной файловой системой. Зачем? Потому что NetRocks умеет в фоновые операции. А обычное копирование файлов Far — не умеет.

Линукс-порт Far Manager: прогресс за 4 года - 7

А как там вообще с плагинами?

Помимо NetRocks, в комплекте есть:

colorer (подсветка синтаксиса, свежий!)
multiarc (работа с архивами, доработанный, свежие архиваторы!)
tmppanel (временная панель)
align block (форматирование блоков для редактора)
autowrap (автоперенос слов в редакторе)
drawline (рисование линий в редакторе)
editcase (конвертация регистра в редакторе)
SimpleIndent (работа с отступами в редакторе)
compare (продвинутая версия «сравнения папок»)
editor autocomplete (автодополнение в редакторе)
filecase (конвертация регистра имен файлов)
incremental search («быстрый поиск» в редакторе)
inside (показывает, что внутри ELF и некоторых других форматов)
и даже плагин для написания других плагинов на Python!

Есть парочка сторонних, far2-gvfs [17] и far2l-fuse [18], но после появления NetRocks они в некоторой степени утратили актуальность.

В общем, базовый набор для комфортной работы с локальными и удаленными файлами и архивами, а также написания кода прямо в редакторе far2l — имеется :)

А со стабильностью как? Когда релиз уже?

Со стабильностью всё хорошо: за 4 года использования в работе (webdev + всякое офисное) ни одной потери данных с far2l я не «поймал». Автор порта готов понемножку менять статус с альфы на бету, если в течении месяца-двух не вылезет критических ошибок. Тогда можно будет подумать об отправке пакетов в репозитории дистрибутивов, например.

Bonus #1. А там правда Wine под капотом?

Отчасти :) Из Wine были вытащены некоторые кусочки трансляции WinApi в нативный API Linux (конвертация кодировок, например; к слову, этот кусок недавно попробовали переписать на iconv, но выяснилось, что код из Wine делает то же самое в 4 раза быстрее [19]). Со временем обращения к этим функциям, разбросанные по всему коду far2l, можно будет понемножку заменять на прямые вызовы нативных функций. А пока и эта конструкция работает очень даже быстро (самое медленное, на чём пробовали запускать — raspberry pi [20], полет нормальный) и вполне надежно.

Bonus #2. Хватит фигней страдать, консоль учите, дурни!

За время работы над far2l (тестировщиком, а ещё иногда нехитрые патчи шлю) я узнал о линуксовой консоли больше, чем за всю жизнь до этого :) А ещё понемногу осваиваю си, на которых кодить со времен института не приходилось — повода не было (заодно, кстати, перешел на «ты» с git). Так что ждите скоро статью «как веб-макака си на опен сорсе учила»!

Bonus #3. А нескучные обои имеются?

Несколько лет назад я бы скорее посмеялся над этим вопросом. Но да, если целый день смотреть в синий цвет, становится как-то не по себе (и прямо чувствуешь, как отрастает борода и свитер с оленями). Поэтому в итоге сделал себе раскраску в духе Monokai, ну и выложил для всех [21], конечно. У нас opensource ведь.

Линукс-порт Far Manager: прогресс за 4 года - 8

Bonus #4. А на маке взлетит?

Взлетит. Половину тикетов в багтрекер с маков пишут. И да, на BSD работает тоже.

Автор: Иван Сорокин

Источник [22]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/358101

Ссылки в тексте:

[1] порта Far Manager под Линукс: https://github.com/elfmz/far2l/

[2] поговаривает о переходе проекта в статус беты: https://github.com/elfmz/far2l/issues/802#issuecomment-711069148

[3] здесь: https://habr.com/ru/company/pvs-studio/blog/321948/

[4] опеннете: https://www.opennet.ru/opennews/art.shtml?num=44975

[5] лоре: https://www.linux.org.ru/forum/desktop/13197888

[6] прекрасно себя чувствует в консоли: https://github.com/elfmz/far2l/issues/276

[7] расширения терминала far2l: https://github.com/cyd01/KiTTY/issues/74#issuecomment-626917718

[8] специальная сборка putty: https://github.com/unxed/putty4far2l

[9] демонстрационная утилитка: https://github.com/unxed/oemcp/blob/master/ziplist

[10] патчик к p7zip: https://raw.githubusercontent.com/unxed/oemcp/master/p7zip_oemcp_ZipItem.cpp.patch

[11] запакован в .deb'ку: https://github.com/unxed/oemcp/blob/master/p7zip-oemcp.deb

[12] чинит поддержку зипов, например, в Engrampa: https://github.com/mate-desktop/engrampa/issues/5

[13] Подробности: https://github.com/elfmz/far2l/issues/611

[14] а в некоторые уже попали: https://repology.org/project/far2l/versions

[15] пакеты во всех основных форматах: https://github.com/elfmz/far2l/issues/647

[16] ppa для *buntu: https://launchpad.net/~far2l-team/+archive/ubuntu/ppa

[17] far2-gvfs: https://github.com/cycleg/far-gvfs

[18] far2l-fuse: https://github.com/unxed/far2l-fuse

[19] в 4 раза быстрее: https://github.com/elfmz/far2l/issues/733#issuecomment-711286475

[20] raspberry pi: https://github.com/elfmz/far2l/issues/48#issuecomment-245681913

[21] выложил для всех: https://github.com/elfmz/far2l/issues/791#issuecomment-709407687

[22] Источник: https://habr.com/ru/post/524370/?utm_source=habrahabr&utm_medium=rss&utm_campaign=524370