Последнее время 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 |
| Выбрать окно под соответствующим номером | 1\2\3\4\5\6\7\8\9\0 |
| Предыдущее окно | 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 предоставляет большие возможности для использования его из различных скриптав. Контролировать из командной строки можно почти всё: начиная от перерисовки определённого окна, и кончая изменением размеров фрейма. Я же приведу простой пример, как можно запускать заранее несколько окон с разным набором программ:
#!/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, который я советую почитать всем заинтересованным в этой программе.
Несколько скриншотов:
![]() |
![]() |
![]() |
Несколько полезных ссылок:
Похожие записи:





в screen тоже слои есть (layout)
хотя сейчас посмотрел как в tmux ^bпробел работает - добавляет немного динамичности, которая впрочем с помощью layout в скрине тоже настраивается правда в ручную слои надо создавать(либо в конфиге либо в процессе) и только потом переключаться между ними. в общем клиент-серверная архитектура во многом схожа
и это... я не понял - строка статуса(аля хардстатус в скине) иммется, а что с статускной строкой фреймов(аля status в скрине)? только выделение активного региона?
ps. с utf всё так же плохо как в старых версиях? (русские буквы в статусе? - в скрине с этим тоже всё плохо)
ззы. пока для себя сократил твой список отличий от скрина(хотя свой личный увеличил):
Лицензия.
Интерактивные меню для выбора сессий или клиентов.
Немного другая клиент-серверная архитектура. (втыкать в доку лениво, опять же без отрыва от скрина, может расскажешь поподробнее?)
Копирование и вставка с несколькими буферами (не знаю как с этим в скрине, редко пользовался ^a[ ^a]).
[Ответить]
bosha Отвечает:
Июнь 1st, 2010 at 11:28
Они там не совсем так реализованы. Посмотри скрин - ссылко! >>
Обрати внимание, сколько у меня фреймов, и сколько окон. Фреймов куча, а окно одно. Screen так не умеет, и это жутко бесит лично меня
Если я правильно тебя понял, то да. Выделяется только активный регион, но я если честно, не помню чтобы screen что-то ещё умел. Можешь напомнить\рассказать?
В целом да, но в tmux она несколько более продвинутая.
Screen нечто подобное умеет же?
Ммм.. Есть основной сервер. К нему подключаются клиенты. У каждого клиента свои окна, и у каждого окна свои фреймы. Можно одно окно, или фрейм отображать на нескольких клиентах или окнах, причём обновляться они будут одновременно и без лишних глюков. Главное чтобы терминалы были примерно одного размера. Если разные, то в только что приатаченном всё в порядке, а на другом может непропорционально уменьшиться. Чем объяснять, вот скрин - ссылко! >>.
Как я понял, у каждой сессии свой независимый буфер обмена. В конкретное окно другой сессии можно вставлять используя paste-buffer.
[Ответить]
muhas Отвечает:
Июнь 1st, 2010 at 11:45
> Обрати внимание, сколько у меня фреймов, и сколько окон. Фреймов куча, а окно одно. Screen так не умеет, и это жутко бесит лично меня
а это что? (только сделал скрин) http://omploader.org/vNGd0OA - там же кстати и статус (в данном случае это номер и в квадратных скобках имя окна)
>В целом да, но в tmux она несколько более продвинутая.
вот о ней и хотелось бы узнать поподробнее. вот всё что ты ниже со ссылкой на картинку написал но подробнее с примерами и прочим - мне бы было очень интересно. о то я как минимум по скрину могу спросить "а если большее окно в меньшем открыть то что не влезет?(надуманный вопрос) но мало честно говоря понятно ибо недопонимаю всю архитектуру тмукса (у скрина тот же мультиплекс с любыми лейаутами к одному скрину можно делать) http://omploader.org/vNGd0Yw (это тот же скрин что и в яхконсоли на первом скрине, но в хтерме)
> Screen нечто подобное умеет же?
если всё правильно помню менюха для выбора того что в регионе вроде(по меньшей мере я другими менюхами не пользуюсь). остальное параметрами командной строки и командами
[Ответить]
bosha Отвечает:
Июнь 1st, 2010 at 12:05
>а это что? (только сделал скрин) http://omploader.org/vNGd0OA – там же кстати и статус (в данном случае это номер и в квадратных скобках имя окна)
Ты смотрел скрины что я выкладывал? =) У тебя внизу, появилось на каждый созданный тобой фрейм, по новому окну. В tmux это необязательно. Фактически, у тебя один лейот. К примеру, ты не можешь переключиться на другое окно, где у тебя другое разбиение, и другой набор программ. Вместо этого в текущем фрейме откроется окно, на которое ты хотел перейти. Это трудно объяснить. Чтобы понять: запусти tmux и в первое окно разбей наполовину. Запусти в них что либо. Затем создай ещё окно и запусти ещё что либо. Перейди на первое окно, и поймёшь о чем я =]
>вот о ней и хотелось бы узнать поподробнее. вот всё что ты ниже со ссылкой на картинку написал но подробнее с примерами и прочим – мне бы было очень интересно. о то я как минимум по скрину могу спросить «а если большее окно в меньшем открыть то что не влезет?(надуманный вопрос) но мало честно говоря понятно ибо недопонимаю всю архитектуру тмукса (у скрина тот же мультиплекс с любыми лейаутами к одному скрину можно делать) http://omploader.org/vNGd0Yw (это тот же скрин что и в яхконсоли на первом скрине, но в хтерме)
Напиши подробнее что именно тебя интересует. Я тебе скажу и что. Если описывать, то очень много получится =)
Если было большее окно, а приатачил в меньшем окне, то уменьшиться до состояния текущего окна (в котором был сделал tmux attach). Открой два терминала. Сделай один больше другого, и запусти в нём к примеру htop. Во втором сделай tmux attach и сам увидишь)
>если всё правильно помню менюха для выбора того что в регионе вроде(по меньшей мере я другими менюхами не пользуюсь). остальное параметрами командной строки и командами
А, точно. Там просто окно в котором список окон. Не интерактивное насколько я помню. Я им никогда не пользовался, поэтому не сразу вспомнил =]
[Ответить]
muhas Отвечает:
Июнь 1st, 2010 at 12:40
>Чтобы понять: запусти tmux и в первое окно разбей наполовину. Запусти в них что либо. Затем создай ещё окно и запусти ещё что либо. Перейди на первое окно, и поймёшь о чем я =]
во, понял... на каждое окно свои лейауты. в скрине лейауты на окна(один регион=одно окно)
> Если описывать, то очень много получится =)
всё интересует =) я с тмуксом мало знаком, только со скрином. о регионах я уже понял, ататчи что-то завис - ататчится к первому тмуксу(мультиплекс с помощью tmux attach), а у мну их два - как между ними кидать окна и прочее пока не ясно(да - доки читать лень. только беглый просмотр - а то мозг начинает путаться из-за использования фреймового wm - кучи скринов с ранзными настройками, а тут ещё и тмукс)
>Не интерактивное насколько я помню.
интерактивное...
[Ответить]
bosha Отвечает:
Июнь 1st, 2010 at 13:35
>всё интересует =) я с тмуксом мало знаком, только со скрином. о регионах я уже понял, ататчи что-то завис – ататчится к первому тмуксу(мультиплекс с помощью tmux attach), а у мну их два – как между ними кидать окна и прочее пока не ясно(да – доки читать лень. только беглый просмотр – а то мозг начинает путаться из-за использования фреймового wm – кучи скринов с ранзными настройками, а тут ещё и тмукс)
Ctrl-b + : далее move-window -s номер_окна -t номер\имя_сессии:номер_окна. Например: move-windo -s 1 -t 1:3, где -s 1 номер окна которое хотим переместить, -t :1:3 номер другой сессии, и окно в которое перемещаем (если нет создаётся).
Всё довольно просто =]
[Ответить]
Ссылка | Июнь 1st, 2010 at 11:04
Когда пробовал tmux, наверное не разобрался в нем. Screen как-то больше по душе был.
А теперь, когда прочел, как все по полочкам разложил, захотелось попробовать.
Может поставить все таки линух?
[Ответить]
bosha Отвечает:
Июнь 1st, 2010 at 14:03
Это уж тебе решать =]
[Ответить]
Ссылка | Июнь 1st, 2010 at 13:53
У меня по C-b C-[left,rght,up,dwn]Arrow ресайзятся фреймы.
[Ответить]
bosha Отвечает:
Июнь 1st, 2010 at 17:46
Так и должно быть =] Во всяком случае по умолчанию, именно такие хоткеи для ресайза фреймов.
[Ответить]
Ссылка | Июнь 1st, 2010 at 17:38
Прикольно :) Доходчиво, наглядно... Даже попробовал бы, но уже не представляю, зачем оно мне реально нужно может быть :) Когда 4 с половиной года стояла гента на работе и её иногда приходилось обновлять, то нечто подобное было актуальным. Но сейчас... ))
[Ответить]
bosha Отвечает:
Июнь 6th, 2010 at 22:55
Случаи разные бывают. Для любого администратора (да и не только) утилиты подобного рода просто must have =]
[Ответить]
Ссылка | Июнь 6th, 2010 at 20:26
А я так и не разобрался как в tmux историю листать (
Используя screen я в kde мог мышкой наверх историю просматривать, а в тмухе такого по умолчанию нет. Может кто знает решение ?
[Ответить]
bosha Отвечает:
Июнь 11th, 2010 at 10:34
Похоже что сам tmux не умеет такого. Если я правильно понял что нужно. У меня в urxvt прокручивается вместе с панелью tmux'а. Т.е. как обычная прокрутка в терминале.
[Ответить]
Rumata Отвечает:
Июль 26th, 2010 at 17:16
В tmux: Ctrl+B [
в screen: Ctrl+A [ (или Ctrl+A Esc)
переход в режим прокрутки, выход по Esc.
[Ответить]
bosha Отвечает:
Июль 26th, 2010 at 17:23
Хм. Очевидно я и правда не про то думал :)
[Ответить]
Rumata Отвечает:
Июль 29th, 2010 at 11:15
Вообще-то это не режим прокрутки, а копирования в буфер, но я использую именно для этого :) .
[Ответить]
awwakum Отвечает:
Июнь 23rd, 2010 at 14:51
решение никто не нашёл? почему то прокручивается только в rxvt, в сакуре и тильде нет.
[Ответить]
Ссылка | Июнь 11th, 2010 at 10:19
Спасибо, что показали vifm.
[Ответить]
bosha Отвечает:
Июнь 12th, 2010 at 01:12
Не за что. Правда странно, но здесь пост про tmux. Ну да ладно =]
[Ответить]
Ссылка | Июнь 11th, 2010 at 23:32
Привет.
А не подскажешь, как переопределить в tmux сочетание Shift-Tab? Дело в том, что эта комбинация нужна в vim. А если запускаешь vim в tmux, то tmux её перехватывает и не передает в vim.
[Ответить]
bosha Отвечает:
Август 24th, 2011 at 23:47
@User, привет.
Увы, нет. Почему-то если верить документации, то Shift он не воспринимает:
tmux allows a command to be bound to most keys, with or without a prefix
key. When specifying keys, most represent themselves (for example ‘A’ to
‘Z’). Ctrl keys may be prefixed with ‘C-’ or ‘^’, and Alt (meta) with
‘M-’. In addition, the following special key names are accepted: Up,
Down, Left, Right, BSpace, BTab, DC (Delete), End, Enter, Escape, F1 to
F20, Home, IC (Insert), NPage (Page Up), PPage (Page Down), Space, and
Tab. Note that to bind the ‘"’ or ‘'’ keys, quotation marks are neces‐
sary, for example:
[Ответить]
Istergul Отвечает:
Август 25th, 2011 at 09:17
@bosha, Прискорбно, конечно. Наверное, прийдётся перенастраивать vim.
[Ответить]
Ссылка | Август 24th, 2011 at 23:30
Дай PS1! :)
[Ответить]
bosha Отвечает:
Декабрь 28th, 2011 at 15:57
@nCdy, https://github.com/bosha/zshrc/blob/master/.zsh/prompt.sh
[Ответить]
Ссылка | Декабрь 28th, 2011 at 15:25