[О блоге] [index] [пред] [2020-06-26 00:12:44+03:00] [6b41cf89e38fbb3ca3607514748337d9e42826a3]
Темы: [tmux]

Почему эмулятор терминала должен быть простым?

В 186bcbc63c0dd094494dee36b845c0b03969dc5f я "вбросил" что в Kitty
терминале много лишнего есть. Я против Kitty ничего не имею, впервые про
неё там услышал, но просто она хороший пример терминала перегруженного
фичами. Если при этом она отлично быстро работает на диких разрешениях
там, где все остальные тормозят, то хвала ей и конечно стоит
использовать, раз главное она делает лучше остальных.

Но а что я имею в виду под лишними фичами:

* контроль через скрипты, layout-ы, multiple terminal windows, startup
  sessions
* scrollback buffer в отдельном окне
* несколько copy-paste буферов

С ходу не увидел, но если есть табы, то и их в стопку "ненужного". Если
есть всякие штуки по выцеплению URL-ов, то и их тоже.

Почему? Да потому что всё это делает tmux! Или другие terminal
multiplexer и подобные штуки. Я совершенно не понимаю почему всеми этими
вещами занимается эмулятор терминала. Разработчики впиливают это в свои
творения потому что могут, потому что challenge и интересно, потому что
может быть не сложно.

А чем плохо то, что терминал будет делать всё что умеет tmux? Как
минимум это плохо тем, что где-то конкретный эмулятор терминала
работает, где-то нет. Куча терминалов работают только под GNU/Linux,
какие-то только под macOS, какие-то наверное только под OpenBSD есть. А
tmux работает везде, одинаково. Более того, tmux как минимум полезен
тем, что если терминал упадёт или его надо будет отключить, то сессия в
tmux может оставаться жить. Плюс tmux даёт ещё кучу плюшек.

Эмулятор терминала это штука которая должна уметь выводить и вводить
всякое. Возможно даже графику, обязательно (сейчас) Unicode, возможно
TrueColor кому-то полезен. Если нравятся лигатуры -- ok, это тоже задача
терминала. Перехват мышки и её прокидывание в терминальные программы.
Bracketed paste. Всё это задачи терминала, безусловно, и их не мало. А
ещё ввод специальных символов, наверное какая-то магия для азиатских
языков. Это всё терминал бесспорно.

Но создание layout-а из окон... это совершенно не касается ни ввода, ни
вывода. Автоматизация запуска терминала с всякими скриптами -- уж точно
тоже не относится. GNU Screen или tmux (ещё есть какие-то более suckless
решения) с этими задачами справляются уже тьму времени. У меня для
многих проектов простые shell-ы написаны которые мне порождают окна,
переименовывают их, размещают, вбивают в них какие-нибудь virtualenv-ы,
запускают vi на нужных файлах, и т.д.. И это везде одинаково будет
работать, независимо от терминала.

Scrollback -- аналогично, tmux (я про него говорю потому что имею опыт
только с ним богатый, когда-то давно имел неприятный опыт с GNU Screen)
умеет это, плюс позволяет искать по буферу хоть vi клавишами, хоть
Emacs, хоть сбрасывать его в файл, хоть искать по всем scrollback-ам
всех окон. Терминалу то зачем это всё знать и помнить?

Copy-paste буфер -- аналогично, в tmux имеется, с очень удобной
возможностью их просмотра и управления. Для Vim я ещё ставлю Tbone
плагин который позволяет "интегрировать" tmux буферы с Vim-овскими.

Табы -- как и окна, тема мультиплексоров. Нужно открыть и "подсветить"
все URL-ы которые мы видим? По сути задача сводится к сбрасыванию
текущего буфера и запуска программы поиска URL-ов в нём, которая сможет
открыть эти URL-ы. Делается в одну строчку в конфиге tmux:

    bind-key u capture-pane -J \;
        save-buffer /tmp/tmux-buffer \;
        split-window 'urlview /tmp/tmux-buffer' \;
        delete-buffer

Делаю ровно два нажатия на клавиатуре и у меня показывается список всех
URL-ов. Это значительно быстрее чем мышкой нацеливаться на URL и
нажимать по нему. А ещё нередко нужно изменить этот URL (например,
выпилить всякие ?utm_campaign и прочие следы трэкинга), что в urlview из
коробки делается.

Хочется натравить любимый редактор на текущий буфер окна? Или на всё
историю в нём? Аналогично однострочником делается. В
5d2d9f386d547b8e436829db5c6533b17feffe8e я упоминал тривиальный "qq"
скрипт который находит в буфере всё что похоже на пути к файлам чтобы их
сразу же в vi в виде quickfix списка открыть. В терминале такого уже
никто не добавит. А в tmux это гибко и просто делается. Так сказать,
Unix-way.

Не забывать что tmux это ещё и "демонизация" сессий. А ещё можно делать
удалённый доступ к своей сессии: в 5f98503b78f5aa80bd48f4633ce82e9a219ed7e6
на работе мы так организовывали парное программирование. Коллега как-то
показывал фишку в tmux-е где у него одна сессия с кучей окон, но на
нескольких мониторах одновременно, где на одном он работает, а остальные
только заданные окна из сессии показывают.

Плюс, всё что я сказал -- смехотворно для любого Emacs-овода, ибо у них
всё это может спокойно делать сам Emacs, только ещё гибче и больше. Всей
этой функциональности в эмуляторе терминала просто нет места. Если Emacs
это конечно точно не для всех, то уж tmux это один из основных
инструментов на серверах. Мой терминал автоматом запускает tmux всегда:
по сути одно окно терминала=ещё одна сессия tmux. Причём tmux в tmux-е
совершенно не проблема, если в "родном" tmux использовать другую клавишу
для отсылки prefix-а: я клавиши "Menu" и "Super" забиндил на отсылку
Ctrl-A и Ctrl-B, где Ctrl-A это prefix "родного" tmux. Никаких
Ctrl-что-то комбинаций я не ввожу в tmux-ах совсем, ибо это дико бы
убивало скорость работы.

Вообще изначально я не понимаю как можно жить в терминале без табов и
scrollback-буфера, которые у меня были в urxvt. Я решил попробовать
suckless st, ради интереса, и вот не понимал как жить без всего этого. И
tmux пришёл как решение само собой. Причём не как костыль, а именно как
гораздо более удобное, гибкое и универсальное решение.

abduco+dvtm наверное тоже достойная альтернатива tmux, но лично мне уже,
читая доку dvtm, точно не хватало бы нескольких copy-paste буферов.

Для urxvt можно писать плагины на Perl. Звучит тоже гибко. Но я только
один раз в жизни видел как это использовал один человек чтобы мышкой
открывать Python traceback-и: мышкой он указывает желаемый traceback,
плагин понимает что это за файл, дальше посылает команду в GVim,
запущенный как сервер, на открытие файла на нужном месте. В tmux через
буфер тоже можно было бы сделать, если что. Но это я к тому, что плагины
для терминалов всё равно или для ввода чего-то странного или для поиска
URL-ов каких-нибудь используются на практике.

В общем, резюмирую: люди должны открыть для себя terminal multiplexer-ы
и перестать изобретать точно такой же функционал в терминалах. Или, как
вариант, люди могут открыть для себя Emacs. Просто terminal multiplexer
типа GNU Screen или tmux ещё и управляют login session-ами, что полезно
само по себе и постоянно юзается на серверах, в любом случае заставляя
человека знать про эти средства.

[оставить комментарий]
комментарий 0:
From: David Rabkin
Date: 2020-07-01 16:11:10Z

Начал про эмулятор, кончил тимаксом. Все правильно расписал, тимакс—наше все.
В Kitty я его и запускаю.
комментарий 1:
From: Sergey Matveev
Date: 2020-07-01 16:16:19Z

>Начал про эмулятор, кончил тимаксом. Все правильно расписал, тимакс—наше все.
>В Kitty я его и запускаю.

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

Начали с эмуляторов... верно, а закончил тем, что в куче тех, кто
называет себя эмулятором терминала, очень много функций не по теме :-)
комментарий 2:
From: David Rabkin
Date: 2020-07-02 21:59:12Z

>Ну и, соответственно, наверное кучей функционала Kitty и не пользуешься
поэтому?

Я и не задумывался даже, потому что на тимаксе давно сижу, кстати, он—из дома
OpenBSD. От Kitty мне нужны лигатуры и портабилити. Так у меня жизнь сложилась,
что и Линуксы разнообразные попадаются, то у одного дистро что-то работает, а
что-то отваливается, МасОС люблю, так как Эппл фанбой, ФриБиЭсДи уважаю за
ЗиЭфЭс и за философию.