Терминальный оконный менеджер Tmux
Последнее время screen завоевал себе довольно большую популярность. Почти каждый уважающий себя linux'оид, знаком с этой замечательной утилитой, но многие почему-то забывают что у неё тоже есть альтернатива со своими плюсами, и минусами. Ещё очень давно, когда я только знакомился со screen, то натыкался на упоминание утилиты - tmux. Пару дней назад я решил поближе познакомиться с ней, и описать её в блоге :)
Итак. Tmux - это терминальный оконный менеджер, и мультиплексор. Т.е. позволяет использовать несколько терминалов в одном. Tmux так же как и screen можно легко увести в фон, и так же легко вернуться к нему.
Первая версия tmux вышла вместе с OpenBSD 4.6, где заменяет собой screen. Отличительными особенностями являеются:
- Мощный, последовательный, хорошо задокументированный и простой скриптовый командный интерфейс.
- Окно может быть разбито вертикально и горизонтально на подокна (регионы).
- "Подокна" (регионы, фреймы) можно легко двигать, изменять размер и помещать в один из четырёх "макетов".
- Поддержка UTF-8, и 256 цветов.
- Копирование и вставка с несколькими буферами (несколько независимых буферов обмена).
- Интерактивные меню для выбора окон, сессий или клиентов.
- Блокировка терминала. Ручная, или по таймауту.
- Чистая, и легко расширяемая база кода под BSD лицензией, находящаяся в активной разработке.
- Экономное расходование оперативной памяти.
- Высокая скорость работы.
- Два варианта комбинаций клавиш: стиль vi и emacs.
- Клиент-серверная архитектура, при которой окна выполняют роль объектов, которые могут одновременно подключаться к нескольким сессиям, перемещаться между ними и просматриваться с разных клиентов (терминалов).
После запуска, tmux выглядит примерно так:
Сразу же видно первое отличие: строка статуса ( в screen она называется hardstatus) включена по умолчанию, и работает без лишних "телодвижений". Следующее что станет заметно, это другая комбинация клавиш по умолчанию - Ctrl-B
, которая при желании меняется крайне просто.
На мой взгляд основное, и главное преимущество tmux перед screen - это "фреймы". Работа с ними похожа на работу в tiled wm. Конечно, в screen тоже есть, но не столь удобное на мой взгляд. К тому же, отсутствует возможность вертикального разбиения окна (патч который добавляет такой функционал, ещё не в стабильной ветке, и когда будет неизвестно). В каждом окне независимые фреймы. В каждом фрейме независимая программа, которая не является ещё одним окном как к примеру screen. Например запустим в окне top. Затем разделим окно вертикально на два фрейма (Ctrl-"
). В первом фрейме всё так же остаётся top, и есть второй фрейм с шеллом, но окно по прежнему одно! Можно так его и оставить, а можно присоединить уже существующее окно. Это кстати, тоже одно из достойных преимуществ tmux перед screen: более продуманая клиент-серверная архитектура. Внутри окна фреймы можно выравнивать с помощью четырёх различных слоёв (Ctrl-b Space
).
Теперь немного о стандартных комбинациях клавиш. Как я уже писал, стандартная комбинация - ctrl-b
, которая легко меняется, но об этом чуть ниже ;) Команды следует вводить после префикса (в данном случае Ctrl-b
):
Функция | Клавиша |
---|---|
Справка по командам | ? |
Командная строка | : |
Увести tmux в фон | d |
Создать новое окно | c |
Следующее окно | n |
Предыдущее окно | p |
Выбрать окно под соответствующим номером | 0-9 |
Предыдущее окно | l |
Выбрать окно из списка | w |
Выбрать сессию | s |
Разделить окно вертикально | " |
Разделить окно горизонтально | % |
Листать "слои" | Space(пробел) |
Удалить фрейм | ! |
Переместить фрейм вверх | { |
Переместить фрейм вниз | } |
Следущий фрейм | o |
Изменить размеры фрейма | Alt + Стрелки |
Удалить окно | & |
Обновить клиент | r |
Часы | t |
Найти окно | f |
Переименовать окно | , |
Изменить номер окна | . |
Перейти в режим копирования | [ |
Вставить содержимое буфера обмена | ] |
Этого набора клавиатурных сочетаний должно хватить на первых, и не только порах.
После "детача", вернуть tmux на родину можно передав ему параметр attach
:
tmux attach
В случае если сессий несколько, то можно посмотреть их список с помощью ls
, и выбрать нужную передав к attach
ещё и аргумент в виде номера сессии:
┌─[bosha@home-pc]──(~)
└─[% >tmux ls # Вывод списка всех сессий
0: 1 windows (created Mon May 31 23:08:16 2010) [104x48] (attached)
1: 1 windows (created Mon May 31 23:33:19 2010) [80x23]
┌─[bosha@home-pc]──(~)
└─[% >tmux attach -t 1 # Подключение к конкретной сессии
Теперь мой файл конфигурации tmux'а. Находиться он должен в $HOME/.tmux.conf
:
# Поместите файл в домашнюю директорию, или его содержимое в файл ~/.tmux.conf
# Основные настройки --------------------------------------------------------------
set -g set-titles on # Разрешить смену заголовков в оконном менеджере
set -g set-titles-string "tmux.#I.#W" # Формат строки заголовка
set -g base-index 1 # Начинать отсчёт окон с первого
set -g history-limit 5000 # Размер буфера в линиях
set -g bell-action any # Следить за активностью на всех окнах
setw -g monitor-activity on # Информировать когда есть активность в окнах
set -g visual-activity on # Показывать статусное сообщение при активности в каком либо окне
bind-key k confirm kill-window # Подтверждать уничтожение окна
bind-key K confirm kill-server # Подтверждать уничтожение сервера
# Статусбар -------------------------------------------------------------------
set -g display-time 2000 # Время в миллисекундах, сколько будут отображаться сообщения (в статусбаре к примеру)
# Цвета ---------------------------------------------------------------------
# Цвета статусбара
set -g status-fg white
set -g status-bg default
set -g status-attr default
# Цвета заголовков окон
set-window-option -g window-status-fg cyan
set-window-option -g window-status-bg default
set-window-option -g window-status-attr dim
# Цвета активных окон
set-window-option -g window-status-current-fg white
set-window-option -g window-status-current-bg default # Выделение активного окна белым цветом
set-window-option -g window-status-current-attr bright
# Цвета командной строки
set -g message-fg white
set -g message-bg black
set -g message-attr bright
# Клавиатурные сочетания -----------------------------------------------------------------
unbind C-b # "Разбиндинг" префикса по умолчанию
set -g prefix C-q # Новый префикс для всех комбинаций клавиш - Ctrl-q
# Навигация в командной строке, и в списке окон как в vi
set -g status-keys vi
setw -g mode-keys vi
bind-key -n C-n next # Следующий таб
bind-key -n C-p prev # Предыдущий таб
bind-key b set-option status # Включить\Выключить статус бар
unbind % # Выключаем клавишу для горизонтального разбиения окна по умолчанию
bind H split-window -h # Назначаем другую
unbind '"' # Тоже самое, только по вертикали
bind V split-window -v # ----
# Переход на окно по F1-F9
bind-key -n F1 select-window -t 1
bind-key -n F2 select-window -t 2
bind-key -n F3 select-window -t 3
bind-key -n F4 select-window -t 4
bind-key -n F5 select-window -t 5
bind-key -n F6 select-window -t 6
bind-key -n F7 select-window -t 7
bind-key -n F8 select-window -t 8
bind-key -n F9 select-window -t 9
Думаю, из комментариев понятно что к чему, но хочу уделить особое внимание назначению комбинаций клавиш, и статусбару.
Как видно действия клавишам назначаются с помощью bind-key
, которому передаётся ключ -n
(новая комбинация), затем клавиша, и выполняемое действие. Помимо внутренних команд tmux'а, можно так же выполнять внешние команды. Вот небольшой пример:
bind -n F1 run-shell 'cmus-remote -s'
bind -n F2 run-shell 'cmus-remote -n'
bind -n F3 run-shell 'cmus-remote -p'
При составлении своих комбинаций клавиш можно использовать дополнительные (не буквенные) клавиши : Ctrl - C, Alt - M, Up, Down, Left, Right, BSpace, BTab, DC(Delete), End, Enter, F$(где $ число от 1 до 20), Home, IC(Insert), NPage(PageUp), PPage(PageDown), Space (пробел), Tab.
Основной префикс так же можно установить так:
set -g prefix C-a # Ctrl-a, как в screen
Немного о статус баре tmux
Статус бар в tmux делится на две части: левую, и правую. В каждую из частей можно вывести желаемую информацию. Формат довольно простой. Используются специальные символы:
- #(shell-command) - Любая внешняя команда
- #[attributes] - Изменение цвета, или атрибута статус бара
- #H - Имя хоста локального компьютера
- #F - Текущий флаг окна
- #I - номер текущего (активного) окна
- #P - Список всех фреймов
- #S - Имя сессии
- #T - Заголовок текущего окна
- #W - Имя текущего окна
- ## - Символ решётка - ‘#’
Снова небольшой пример:
set -g status-left '#[fg=green]#H#[default]' #
set -g status-right '#[fg=yellow]#(cut -d " " -f 1-4 /proc/loadavg)#[default] #[fg=cyan,bold]%Y-%m-%d %H:%M:%S#[default]' #
Для левой части задётся зелёный цвет, имя хоста и значение по умолчанию. Для правой жёлтый цвет, внешняя команда с аргументами, снова значение по умолчанию, и время в собственном формате с помощью внешней команды date. В примере комбинируются собственные спец. символами, с теми, что по умолчанию.
И последнее о чём хочу сегодня написать - использование в скриптах. В самом начале, я писал что в tmux предоставляет большие возможности для использования его из различных скриптав. Контролировать из командной строки можно почти всё: начиная от перерисовки определённого окна, и кончая изменением размеров фрейма. Я же приведу простой пример, как можно запускать заранее несколько окон с разным набором программ:
1 2 3 4 5 6 | #!/bin/sh
tmux start-server # Запуск сервера tmux
tmux new-session -n mcabber -s mcabber_ses 'mcabber' # создание сессии: -n имя окна, -s имя сессии, и после - запускаемая команда (mcabber)
tmux new-window -n vim -t mcabber_ses:2 'vim' # Создание окна под номером 2 в сессии mcabber_ses, именем vim, и запуском vim соответственно
tmux select-window -t mcabber_ses:1 # Выбор первого окна
tmux attach -t mcabber_ses # Присоединение сессии к активному терминалу
|
Кстати в tmux просто отличный man, который я советую почитать всем заинтересованным в этой программе.
Несколько скриншотов:
Несколько полезных ссылок: