Заметки программиста

TMUX — мультиплексор терминалов

Горячие клавиши

В tmux большое количество операций выполняются с помощью горячих клавиш. По умолчанию для активации сочетания клавиш нужно нажать Ctrl+b, отпустить, а потом нажать нужную клавишу. Программа tmux обладает большим набором горячих клавиш. Полный их список можно посмотреть с помощью комбинации клавиш Ctrl+b ?.

Основные сочетания клавиш tmux:

  • Ctrl+b c — создать новое окно;
  • Ctrl+b w — выбрать окно из списка;
  • Ctrl+b 0-9 — открыть окно по его номеру;
  • Ctrl+b , — переименовать текущее окно;
  • Ctrl+b % — разделить текущую панель по вертикали;
  • Ctrl+b » — разделить текущую панель по горизонтали;
  • Ctrl+b <стрелка> — перейти на панель, находящуюся в стороне, куда указывает стрелка;
  • Ctrl+b Ctrl+<стрелка> — изменить размер текущей панели;
  • Ctrl+b o — перейти на следующую панель;
  • Ctrl+b ; — переключаться между текущей и предыдущей панелью;
  • Ctrl+b x — закрыть текущую панель;
  • Ctrl+b [ — войти в режим копирования (подробнее ниже);
  • Ctrl+b ] — вставить из внутреннего буфера обмена tmux;
  • Ctrl+b s — показать список всех сессий (позволяет переключиться между ними);
  • Ctrl+b d — отключиться от текущей сессии;
  • Ctrl+b : — открыть командную строку.

Основные команды

Основные команды tmux для управления сессиями:

  • attach-session(attach) — подключиться к уже существующей сессии. В параметре необходимо передать опцию -t и идентификатор сессии;
  • detach-session(detach) — отключить всех клиентов (или переданного с помощью опции -t) от сессии, переданной в опции -s;
  • has-session — проверить существует ли сессия, аналогично, надо передать идентификатор сессии;
  • kill-server — остановить все запущенные сессии;
  • kill-session — завершить сессию, переданную в параметре -t;
  • list-clients(lsc) — посмотреть клиентов, подключенных к сессии -t;
  • list-sessions(ls) — вывести список всех запущенных сессий;
  • new-session (new) — создать новую сессию, можно передать имя сессии в опции -s и стартовую директорию в опции -c;
  • rename-session — переименовать сессию, нужно передать идентификатор сессии и новое имя.

Особенности

  • Возможность создания многочисленных окон и панелей в них в пределах одной сессии.
  • Возможность скроллинга в консольном режиме, т.к. из последних версий ядра Linux удалена поддержка скроллинга по Shift-PgUp/PgDn.
  • Возможность отключиться от сессии и подключиться позднее к ранее созданной сессии.
  • Нечувствительность к потере связи при удалённом подключении.
  • Наличие внутреннего буфера обмена только в консольном режиме, также в ряде случаев возможность взаимодействия с системным буфером обмена пользователя.

Помощь выводится так: нужно нажать Ctrl-B, отпустить обе клавиши и нажать клавишу «?«. Для выхода из просмотра нужно нажать Esc или «q«.


Сессии, окна и панели

Сессии

На одном хосте может быть одновременно запущено множество сессий TMUX, в каждой из сессий может быть открыто множество окон, и каждое окно может быть разделено на множество панелей. Сессия создаётся каждый раз, когда пользователь подключается к CLI, и закрывается, когда пользователь выходит из CLI по Ctrl-D (простое закрытие окна оставляет сессию работающей).

Посмотреть список сессий можно сочетанием Ctrl-B s. При этом в верхней половине экрана показан список сессий в формате root-YYYYMMDD-HHMMSS: X windows, где YYYYMMDD HHMMSS — дата и время входа в данную сессию, X — число открытых в ней окон. В нижней части экрана будет показано содержимое нулевого окна данной сессии. Перемещение по списку проводится стрелками вверх и вниз. Подключиться к выбранной сессии можно нажатием Enter.
Удалить выбранное окно или сессию можно нажатием клавиши X. При этом цвет статусной строки сменится с зелёного на оранжевый, появится запрос подтверждения удаления, в ответ на запрос нужно нажать клавишу y для удаления или любую клавишу для отмены.

Подключение к активной сессии

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

Отключиться от сессии можно нажатием Ctrl-B d.


Окна

В новой сессии создаётся по умолчанию одно окно. Оно имеет номер 0. Создать окно можно сочетанием клавиш Ctrl-B c. При этом переключаться между окнами можно по номерам: Ctrl-B <номер окна>. Сочетание клавиш Ctrl-B w показывает список открытых окон всех сессий в том же формате, что и список сессий. Отличие в том, что в нижней части экрана показывается содержимое всех панелей выбранного окна.


Панели

Окно можно разделить на панели по вертикали или горизонтали. При этом содержимое панелей отображается независимо и одновременно. Сочетание клавиш Ctrl-B % разделяет окно по горизонтали (вертикальной чертой), а Ctrl-B « — по вертикали (горизонтальной чертой). Активную панель также можно разделить и так далее. Закрыть панель можно нажатием Ctrl-D. Переключение между панелями — щелчком «мыши» на нужной панели, или при отсутствии «мыши» — Ctrl-B стрелка, где стрелка — в направлении нужной панели относительно текущей.


Скроллинг

Скроллинг в TMUX производится переходом в особый режим Copy/Scroll.

  • При работе с терминалом с поддержкой «мыши» для перехода в этот режим нужно вращать колёсико «мыши» вверх.
  • Если доступна только клавиатура, то нужно нажать Ctrl-B «[» (левая квадратная скобка).

При этом в правом верхнем углу экрана появляется оранжевый маркер с указанием смещения текущего экрана от последней строки и текущей длины буфера прокрутки TMUX. В этом режиме доступен поиск вперёд и назад (сочетания клавиш Ctrl-S и Ctrl-R соответственно). При этом цвет нижней строки экрана меняется на оранжевый и предлагается ввести строку поиска.

Выход из этого режима — нажатие Esc или скроллинг «мышью» до нижней строки терминала.


Копирование и буферы обмена

TMUX обладает собственными буферами обмена для копирования и вставки текстовой информации.

Для выделения текста:

  • при поддержке «мыши» — нажать левую клавишу «мыши» и перемещать «мышь» либо использовать колесо, не отпуская левую клавишу.
  • без поддержки «мыши»:
    • перейти в режим Copy/Scroll (нажать Ctrl-B [).
    • клавишами навигации перейти к краю нужного участка и нажать Ctrl-Space, далее клавишами навигации выделять текст.

Выделенный текст отображается оранжевым фоном.

Для окончания выделения текста и помещения его в буфер обмена:

  • при поддержке «мыши» — отпустить левую клавишу.
  • без поддержки «мыши» — нажать Ctrl-W.

При этом текст помещается в новый буфер обмена TMUX. Вставка из последнего буфера обмена производится по Ctrl-B ]

Список буферов обмена можно увидеть при помощи Ctrl-B =. При этом в верхней части экрана показывается объём содержимого буфера и дата его создания, а в нижней — содержимое. Нажатием Enter можно вставить текст из выбранного буфера обмена.

Примечание о взаимодействии с локальным буфером обмена пользователя

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

Копирование из консоли возможно несколькими способами (рассматривается SSH или SOL подключение):

  • в пределах видимого окна или буфера прокрутки локального терминала и при поддержке «мыши» — нажатием Shift + левой клавиши «мыши» и перемещением «мыши»;
  • без поддержки «мыши» ситуация усложняется. Существует протокол ANSI OSC 52, который позволяет вставлять текст в локальный буфер обмена путём передачи данных из удалённого буфера обмена особым образом вместе с основными текстовыми данными. Этот протокол поддерживается TMUX и должен поддерживаться терминалом на локальной машине.

Список терминалов, которые поддерживают ANSI OSC 52 (следовательно, выделенный текст из TMUX попадёт в буфер обмена локальной машины, если для соединения использован этот терминал):

Linux:

  • Alacritty;
  • kitty;
  • rxvt;
  • xterm (требует указания строки XTerm*disallowedWindowOps: 20,21,SetXprop в файл ~/.Xdefaults на локальной машине).

MacOS:

  • iTerm2.

Windows:

  • Windows Terminal.