Про моё использование iTerm2 и Tmux

Давно уже собирался про это написать, но всё никак не находил время для этого. В общем-то, ничего особенного, просто хотел поделиться тем, насколько можно сделать использование этих инструментов удобнее, когда нужно пользоваться ими вместе.

Про iTerm2, я так полагаю, знает большое количество «маководов», которым часто нужно делать что-то в консоли (или же просто привычнее что-то делать в консоли). Если кратко, то это замена стандартному терминалу, только с большим количеством дополнительных возможностей. Правда, оценить эти расширенные возможности смогут сполна разве что те, кому приходится держать несколько открытых консольных сессий (локальных, удалённых - не особо важно). Тут вам и т.н. профили, когда можно настроить практически всё, что только возможно - команду запуска, внешний вид, свои клавиатурные комбинации… Ещё из особо полезных вещей можно выделить т.н. триггеры - возможность как-то реагировать на то, что появляется в консоли. Чтобы было понятно, что это такое, приведу пару примеров: можно настроить триггер, который будет окрашивать слово true в зелёный цвет, а слово false/error/fail - в красный. Или, например, при появлении какого-либо текста выдавать нотификацию.

Tmux - это консольный мультиплексор. Если очень кратко, то это специальная консольная утилита, которая позволяет работать с несколькими консольными окнами. Вся прелесть заключается в том, что она запускается в виде серверного приложения, к которому можно подключиться. Чтобы было более понятно, скажу так: запустив консольную сессию в tmux на удалённом сервере, можно особо не беспокоиться о том, что вдруг соединение оборвётся и прервётся выполнение какой-либо команды или что-то в этом духе. Потом можно будет просто подключиться к уже запущенной сессии, выполнив команду tmux attach и как ни в чём не бывало продолжать работу.

Поначалу я пользовался tmux’ом на удалённых серверах, каждый раз создавая отдельный профиль для нового сервера. Пример такой конфигурации можно увидеть на скриншоте:

Пример настройки профиля для удалённого сервера

Такой профиль соединится с сервером someserver.ru по ssh и сразу же попытается либо подключиться к текущей активной сессии tmux, либо создать новую. Я для удобства использую немного более длинный вариант для этого:

tmux -2 attach -t remote || tmux -2 new -s remote  

Такая команда не просто попытается соединиться к активной сессии, а соединится или создаст именованную сессию (по умолчанию информация о сессии будет видна в строке статуса), так я сам себе сигнализирую о том, что это удалённая сессия. Зачем? Потому что с некоторых пор на локальной машине я также пользуюсь tmux’ом, мой профиль по умолчанию сразу его запускает с именованной сессией "work". Лично мне такой подход весьма и весьма удобен, всегда можно по мимолётному взгляду на статусную строку понять, на какой машине я нахожусь. Следующий этап - сделать себе клавиатурные комбинации, чтобы в tmux достаточно быстро делать наиболее популярные действия. Например, у меня там присутствуют следующие полезные для меня клавиатурные комбинации (выдержка из .tmux.conf):

# Rebind prefix to Ctrl+a
set-option -g prefix C-a  
unbind-key C-b  
bind-key C-a send-prefix

# Creating ssh windows and panes
bind-key s command-prompt -p ssh: "new-window -n %1 'ssh %1’"  
bind-key V command-prompt -p vsplit-ssh: "split-window -h 'ssh %1'"  
bind-key H command-prompt -p hsplit-ssh: "split-window -v 'ssh %1’"

# Creating ssh windows and panes with tmux
bind-key T command-prompt -p tmux-ssh: "new-window -n %1 'ssh -t %1 \"tmux -2 attach -t remote || tmux -2 new -s remote\"'"  
bind-key C-v command-prompt -p vsplit-tmux-ssh: "split-window -h 'ssh -t %1 \"tmux -2 attach -t remote || tmux -2 new -s remote\"'"  
bind-key C-h command-prompt -p hsplit-tmux-ssh: "split-window -v 'ssh -t %1 \"tmux -2 attach -t remote || tmux -2 new -s remote\"'"

Эти строчки позволяют мне в tmux быстро создавать окна или панели с ssh-сессиями (если необходимо - то сразу же и tmux запустится). Как видно, я привык управляющие команды tmux’у отправлять по комбинации Ctrl+a. В этом есть один скрытый плюс - на удалённых серверах я обычно не переназначаю себе стандартную комбинацию, и там она Ctrl+b, но для совместимости добавил команду bind-key C-a send-prefix, чтобы можно было пробрасывать управление окну tmux внутри tmux.

То, что можно настроить свои какие-то комбинации для команд tmux - это, безусловно, плюс. Однако, вводить его комбинации не так удобно, как хотелось бы, так как нужно обязательно предварительно нажать т.н. prefix - та самая комбинация, которая обработает следующее за ней нажатие как команду tmux. Кому понравится для перехода на окно с нужным индексом переходить по Ctrl+A 1, например? А ведь переход на нужное окно всё же наиболее часто используемая команда для меня.

Тут на помощь приходит сразу пара возможностей iTerm2 - во-первых, назначать для профиля свои клавиатурные комбинации, а во-вторых, назначить на какую-нибудь клавиатурную комбинацию отправку Hex-последовательности. Например, для настройки переключения по комбинации Ctrl+1 в профиле, в котором используется tmux, на переключение на окно 1 в самом мультиплексоре, нужно выяснить, какая последовательность кодов при этом отправляется к нему при «обычном» вводе. Сделать это можно, например, так (напоминаю, что чтобы ввести в качестве текста в терминале какую-нибудь комбинацию, нужно перед ней нажать Ctrl+V, то есть, чтобы ввести комбинацию Ctrl+A как текст, нужно ввести последовательно сначала Ctrl+V, затем Ctrl+A, при этом не забыть ещё раз повторить последнее сочетание, если вы набираете её внутри сессии tmux, так как первое нажатие он отработает как prefix):

$ echo -n "^A1» | xxd
00000000: 0131                                     .1  

Из вывода видно, что Ctrl+A - это 0x01, а 1 - это 0x31. По аналогии можно составить таблицу своих таких сочетаний от 1 до 9:

Таблица клавиатурных сочетаний для профиля с tmux

Кстати, такую штуку не обязательно делать такиими окольными путями, можно воспользоваться для этой цели такой утилитой, как byobu, но она мне по каким-то причинам не подошла (к сожалению, уже даже и не вспомню, по каким причинам), но там суть немного в другом - добавляется ещё один «слой» до tmux, который сам перехватывает нажатия и передаёт нужную команду дальше. Не помню уже даже, можно ли как-то настраивать в этой утилите сами комбинации.

Также «под капотом» у iTerm2 есть своя собственная интеграция с tmux, но мне она тоже не особо понравилась, если честно. Почитать можно здесь. Плюс у бета-версии iTerm3 есть довольно-таки много других интересных «плюшек», про которые можно также прочитать на официальном сайте.