Примерно раз в год я пишу длинный статус апдейт по проекту 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)


  1. echo10
    09.11.2022 23:48
    +18

    Планируется ли порт под Windows?)


    1. unxed Автор
      09.11.2022 23:52
      +6

      Аххаха, он уже есть! Правда, давно не тестировался, так что сложно сказать, соберется ли сейчас. Но можно написать тикет, если что-то пойдет не так :)

      А если серьёзно, я вполне допускаю, что адаптировать far2l под Windows, приделав ещё один бекенд «консоль Windows», куда проще, чем оригинальный Far для Windows сделать кроссплатформенным.


      1. pharo
        09.11.2022 23:58
        +1

        А, собирается ли Вами ещё порт Far2L для Linux32 для запуска в «старых» версиях Linux?
        (как ранее портабельная сборка стартующая c Xenial Ubuntu 32)

        Upd: Увидел в cтатье.


        1. unxed Автор
          10.11.2022 00:11

          Для amd64 вот сейчас собираю прямо. Выложу туда же, куда ведет ссылка portable из поста. Xenial и более поздние, да. Раньше с Trusty начинал, но сейчас там проблемки, больно старый всё-таки.
          Для i386 лежит там же, но без последний изменений, дойдут руки — обновлю как-нибудь тоже, если кому-нибудь это вообще актуально ещё.


          1. BoldDwarf
            10.11.2022 00:53

            Не уверен что поддержка i386 действительно актуальна, но поддержка 32 битных систем вполне нужна.

            Far2l прекрасно работает в сборках для arm32, проверено лично для imx6.

            Таких встроенных систем пруд пруди.


            1. unxed Автор
              10.11.2022 00:56

              Собрать portable в принципе подо что угодно можно, если мне кто-нибудь даст виртуалку на этой архитектуре на час.


              1. BoldDwarf
                10.11.2022 01:10
                +2

                Для встройки проще предложить патч для buildroot и/или yocto.

                Добавить новый package.

                Тогда не будет нужду строить все самому.

                Те кому надо просто добавят far2l к билду и оно само построится.

                Опять таки, это сильно продвинет far2l в сообщество.

                Это конечно не приём в официальные репы Ubuntu или других больших дистро но вполне себе прогресс.

                Пользуясь случаем, хочу сказать огромное спасибо за проект.

                Народ конечно говорит что mc может все тоже, но это не совсем так.

                По моему сугубо личному мнению far2l намного удобнее и привычнее для тех, кто долгие годы работал с far для windows.


                1. unxed Автор
                  10.11.2022 01:18
                  +1

                  Тепло это слышать! Основные благодарности, конечно, должны @elfmzдостаться :) С buildroot и/или yocto опыта, увы, не имел, но если вы возьметесь делать и будут какие-то сложности, постараюсь помочь по возможности! Можно тут в личку писать, например, или в телеграм t.me/unxed, там отвечу быстрее


                  1. unxed Автор
                    10.11.2022 16:28
                    +1

                    Пересобрал portable aarch64-версию тоже.


                1. SpecterOfChaos
                  10.11.2022 20:00
                  +1

                  А так Вы напишите основные отличия от mc. Я например не знаю про достоинства, запустил, посмотрел, и вернулся обратно в привычный mc. А вполне возможно, что есть фичи, о которых я не знаю


                  1. unxed Автор
                    10.11.2022 20:02

                    Ой, не, такие сравнения это очень конфликтогенная тема, не полезу в это :) Тем более, надо быть доскональным знатоком их обоих, чтоб хорошее сравнение написать, а я точно таковым не являюсь, я и в фаре-то привычном постоянно новые фишки открываю, о которых не знал раньше. Но кто-то делал такие сравнения в каментах к моим предыдущим постам про far2l здесь, поищите, если интересно!


        1. unxed Автор
          10.11.2022 00:31

          Собрал и выложил 32-битный portable тоже, проверяйте!


          1. pharo
            10.11.2022 00:43

            Пишет, что не найден 'GLIBCXX_3.4.22' плагина Colorer и далее запускается.


            1. unxed Автор
              10.11.2022 00:55

              А пойдемте в телеграм разбираться, чтоб здесь не флудить сильно? t.me/unxed


              1. tark-tech
                10.11.2022 09:40
                +2

                А давайте все же лучше здесь? Дабы результаты разбирательства можно было хоть как-то найти потом.

                Аналогично, кстати. Не запускается:

                /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)


                1. unxed Автор
                  10.11.2022 10:55
                  +1

                  Исправил на своей стороне, попробуйте свежую версию по той же ссылке, пожалуйста!


            1. unxed Автор
              10.11.2022 01:02

              Как временный workaround, чисто теоретически, вот это должно помочь, libstdc++ поставится свежая. Я, вроде, понял, отчего такое происходит, но чтобы понять, как исправлять, надо сперва дождаться ответа автора вот на этот тикет.


      1. domix32
        10.11.2022 15:35
        +2

        We need to go deeper. Как насчет Far в WSL?


        1. unxed Автор
          10.11.2022 16:06

          Писали что работает, вот инструкция по сборке https://t.me/far2l_ru/2447


          1. domix32
            10.11.2022 16:10
            +1

            Поставил версию из ppa, вроде работает


      1. Qetzlcoatl
        11.11.2022 16:51

        Только не "консоль Windows" нужно делать, а сразу "Windows Terminal" - вот это нормальная консоль и она доступна в 10, а в 11 IMHO уже по-дефолту использется.


  1. pharo
    09.11.2022 23:52
    +4

    Поддержка Truecolor во встроенном терминале

    Графика в терминале

    image


    1. unxed Автор
      09.11.2022 23:57
      +3

      Тикет про поддержку sixel или чего-то подобного. Пока нет, но обсуждается.


  1. soondook
    10.11.2022 00:37
    +1

    Под Cygwin будет работать?


    1. unxed Автор
      10.11.2022 00:38
      +1

      Когда-то работал, но это давно не тестировалось. Будет здорово, если вы проверите!


  1. Melirius
    10.11.2022 03:57
    +1

    Ой спасибо за цвета, очень не хватало.


  1. tongohiti
    10.11.2022 05:04

    А под macOS не планируется?


    1. unxed Автор
      10.11.2022 10:59

      Так он работает под macOS прекрасно, в чате примерно треть пользователей маководы.


      1. ksmrnv
        10.11.2022 19:57
        +1

        Подтверждаю, на m1 работает прекрасно!
        Ещё бы научить его включать F-клавиши, при переключении на приложение, и возвращать обратно при смене фокуса.


        1. unxed Автор
          10.11.2022 19:58

          По F-клавишам можно тикет запилить :) Ссылка на багтрекер в конце поста.


  1. Urub
    10.11.2022 09:19

    актуальные deb для убунты где брать ?


    1. Urub
      10.11.2022 10:01
      +3

  1. Urub
    10.11.2022 10:02

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


    1. unxed Автор
      10.11.2022 10:59

      Вопрос как минимум заслуживающий дискуссии. А какие ограничения с вашей точки зрения такой подход создаёт?


      1. Urub
        10.11.2022 11:12

        неудобно несколько far запускать и консоль теряется при выходе

        сейчас я использую консоль и mc так:

        1. запустил konsole и в нем 10 табов (все это стартует автоматом при логине)

        2. работаю в голой косноли (табе)

        3. нужен mc - запускаю его и также консоль вижу


        1. unxed Автор
          10.11.2022 16:10

          Всё равно до конца не понимаю, почему модель far2l вам не подходит. Почему важна именно та консоль, в которой запущено приложение, а не встроенная отдельная, и как это связано с табами? Окружение родительской консоли в фаровскую консоль передается, если что. Проверить можно так: a=b far2l --tty, и потом env


          1. Urub
            10.11.2022 16:23

            1. исходное состояние konsole с табами консолей - я работаю в консолях, например пойду по ssh кудато, а там mc и всё тутже - в этом табе

            2. т.е. если нужен mc - я его запускаю и он работает в этом табе, в этой консоли, не отдельное окно вылезает 2.1 вышел из mc - и в этойже консоли все выводы команд поданные в mc - вижу, не пропали

            3. 10 табов - 10 mc и все в рамках одного окна, а не 10ти окон

            если ктото работает только в одном экземпляре far2l и более ему не надо, то проблем наверно и нет


            1. unxed Автор
              10.11.2022 16:31

              1. так можно и с far2l, пошли куда-то по ssh, там запустили tty-версию

              2. вот тут да, история команд в фаре и баше отдельная. это обсуждалось в тикете, не только у вас запрос такой есть. вот тут обсуждение, там и workaround есть https://github.com/elfmz/far2l/issues/1075

              3. опять же, делаете 10 табов, в них 10 tty-версий far2l, в чём проблема? запускаете far2l --tty просто. или собираете вообще без wx


              1. Urub
                10.11.2022 16:38

                про --tty не знал )

                но стали проблемы с хоткеами - не работают LCtrl-Цифира
                также надо дважды нажимать ESC для закрытия диалогов (в мс есть настройка для этого)
                наверно никто в режиме --tty не тестирует )

                а быстро убрать\показыть скрытые файлы и каталоги хоткей есть ?


                1. unxed Автор
                  10.11.2022 18:41

                  Я в режиме tty тестирую. Чтоб нажимать ESC один раз, запускайте с ключиком --ee. Но вообще, похоже, у вас он без поддержки гибридного ввода собран, раз LCtrl+цифры не работают. Это странно. Бинарник far2l_ttyx.broker присутствует? Или вы его на удаленной системе гоняете, где нет библиотек x11 или не включен x forwarding при ssh соединении? Тогда надо запустить far2l локально, и уже через него делать ssh куда-то, все хоткеи заработают.

                  Скрытые — Ctrl+H.


                  1. Urub
                    10.11.2022 21:52

                    1. с ключом --ee заработал одиночный esc, но заметна на глаз задержка закрытия окон при его нажатии

                    2. deb пакет брал из вышеуказанного репа, наверно потому и клавиши LCtrl+цифры не работают, far2l_ttyx.broker не вижу

                    3. при этом Ctrl+H - работает

                    такто есть еще много вопросов после mc )
                    но может где есть тематический форум по far2l чтобы тут не засорять тред ?


                    1. unxed Автор
                      11.11.2022 00:06

                      Ссылка на чатик в Телеграме в конце поста, приходите туда!

                      2. попробуйте из исходников или portable


  1. manyakRus
    10.11.2022 11:18
    +4

    Спасибо автору :-), far2l очень нужен в линуксе,

    всякими mc невозможно пользоваться :-(

    Единственное не хватает кнопки как в mc "SFTP-соединение" чтоб копировать файлы из удалённого компьютера к себе...


    1. boojum
      10.11.2022 12:35
      +3

      Есть же и sftp, и всё что захочешь. Даже больше чем в FAR3


    1. K_Chicago
      10.11.2022 20:56

      на минуточку, а какая именно проблема с mc? Я знаю его развивают, работает нормально...

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

      Я имею ввиду, линуксоиды они от рожденья в свитере с бородой и знают как выходить из VI, а наш брат идущий от DOS-Win311 и далее везде - ну нам обычно нужно 2-3 команды запомнить да больше и не нужно...


      1. Urub
        10.11.2022 21:58

        есть разные эффективные способы работы в файловой системе, ftp, ssh - mc один из них, который дополняет консоль, но не отменяет ее
        а проблемы mc уже заучены и привычны )


        1. unxed Автор
          11.11.2022 00:11
          +1

          Да mc норм, никто ведь не предлагает обязательно всем на фар перебираться :) Хорошо, когда есть выбор! Мне вот именно такой инструмент нравится, я к нему привык, у него много интересных плюшечек, экономящих время и упрощающих жизнь, и мне очень не хватало его на *nix. Плюс этот порт — история о том, как можно в дополнить *nix консоль фичами, которых там отродясь не было, а в виндовой консоли были. В процессе приходится придумывать весьма изящные с инженерной точки зрения решения, участвовать в этом дикий кайф. А mc конкуренция только на пользу, подстегнёт развитие. И будет у нас два классных консольных двухпанельника, а не один.


  1. checkpoint
    10.11.2022 14:58
    +2

    Спасибо Вам за far2l! Пользуемся с удовольствием всем коллективом.


    1. unxed Автор
      10.11.2022 16:12

      Спасибо в первую очередь основному автору,@elfmz! Я только помогаю тестировать немножко, иногда небольшие патчики пишу, статьи обзорные вот, ну и концптуально удавалось несколько раз предложить удачное решение той или иной проблемы.

      И всё же слышать это очень тепло и приятно!


  1. ShashkovS
    10.11.2022 17:16

    А кто-нибудь сумел успешно собрать на CentOS?

    Пока видел две ссылки с инструкциями:


    Но в том или ином виде у меня с обеими проблема. Сложность в том, что аккуратно перевести с убунтовского на центосовский:

    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
    


    1. unxed Автор
      10.11.2022 19:55

      По сборкам под разные дистрибутивы можно поискать вот в этом тикете или спросить в чяте (ссылка в конце поста). Отпишитесь в тикет, если вы будете первым, кто соберет!


      1. unxed Автор
        11.11.2022 18:18

        Ссылка на тикет потерялась

        https://github.com/elfmz/far2l/issues/647


    1. IvanShatsky
      10.11.2022 20:24
      +1

      Хотите собрать именно с wx, GUI-вариант? Я себе собираю под CentOS 7, но только TTY-вариант, без GUI, если хотите, могу поделиться рецептом.


      1. ShashkovS
        10.11.2022 20:57
        +1

        Да, мне только TTY-вариант.


        1. IvanShatsky
          10.11.2022 23:12
          +1

          Написал инструкцию для CentOS 7:
          https://github.com/elfmz/far2l/issues/647#issuecomment-1310838699
          Скорее всего то же самое (с заменой yum на dnf) подойдёт и для CentOS 8. Если будете пробовать, буду благодарен за любой (положительный или отрицательный) feedback.


        1. IvanShatsky
          10.11.2022 23:24
          +1

          Дополнительно в той же ветке на обсуждения на GitHub:
          https://github.com/elfmz/far2l/issues/647#issuecomment-652671363


  1. 586
    11.11.2022 00:00

    А почему не работает поиск? Вот, например, пытаюсь искать:
    ipic.su/7yZe12.png

    Результат:
    ipic.su/7yZe14.png

    Но, стоит зайти, например, в /etc файлы находятся. Но лишь жалкая доля того, что находит find:
    ipic.su/7yZe15.png

    PS и подобных «мелочей» огромное множество. Есть какой-нибудь рускоязычный форум, куда можно внятно писать о всех найденных ошибках?


    1. unxed Автор
      11.11.2022 00:12

      Ссылка на багтрекер в конце поста, написать о проблеме нужно именно туда! Спасибо! :)


    1. IvanShatsky
      11.11.2022 16:03
      +1

      Конкретно с проблемой ненахождения существующих файлов я не сталкивался. Но один комментарий к скриншоту дам, если я что-либо ищу начиная с корневого каталога (чего я обычно стараюсь не делать), я всегда отключаю "Search in symbolic links", иначе фар будет рекурсивно гулять внутри /proc до бесконечности. Собственно говоря, в Far для Windows я тоже при поиске по большому дереву (типа по всему диску, по всем несъёмным дискам) эту опцию всегда отключаю.


    1. shmuz
      11.11.2022 17:59
      +1

      Это (поиск из /) было исправлено не так давно (https://github.com/elfmz/far2l/issues/1371)


      1. 586
        12.11.2022 04:18

        Проблема не в корне. В /home были аналогичные проблемы. Это я уже для скринов подобрал параметры, независящие от дистрибутива.


        1. unxed Автор
          12.11.2022 13:02

          На последнем мастере все ещё воспроизводится?


  1. alex82374
    11.11.2022 17:59

    Хорошая программа, давно пользуюсь. Из минусов, кот. переодически напрягает, не работает (или не понятно как пользоваться) прокруткой вывода терминала в режиме Ctrl+O (когда панели скрыты).


    1. unxed Автор
      11.11.2022 18:00
      +2

      Она там по F3 работает. Если надо текст скопировать — ctrl-shift-f4


      1. alex82374
        11.11.2022 18:11
        +2

        Очень вам благодарен за подсказку!


    1. pharo
      12.11.2022 08:22
      +1

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

      P.S. А, интересно, есть ли для Far плагин сравнения файлов сравнимый по функционалу с программой WinMerge?


      1. shmuz
        12.11.2022 10:09

        Есть один для Фар 3 (Visual Compare), но я его не пробовал.


      1. lieff
        12.11.2022 12:27

        Есть кросс-платформенные аналоги WinMerge: KDiff3 и Meld.


        1. shmuz
          12.11.2022 12:52
          +1

          Да, в линуксе использую Meld. Из far2l запускаю его макросом, который выбирает файлы для сравнения в зависимости от текущих или выделенных позиций в панелях.


          1. unxed Автор
            12.11.2022 13:03

            А выложите макрос, пожалуйста!


            1. shmuz
              12.11.2022 13:17
              +1

              Увы, мои макросы могут работать только на моём форке far2l. Но тем не менее вот он: https://github.com/shmuz/LuaFAR-2L/blob/main/Macros/scripts/Shell/visual_compare.lua