tmux 2

Брайан П. Хоган
Версия: P1.0 (ноябрь 2016 г.)

перевод В.Айсин

Что читатели говорят о tmux 2: продуктивная разработка без мыши

Обязательная книга для всех, кто ежедневно использует командную строку. Я рекомендую эту книгу с тех пор, как она была впервые опубликована, и обязательно буду рекомендовать ее снова!

Джефф Холланд
Старший инженер-программист, Ackmann & Dickenson

Уловки, упомянутые в этой книге, полностью изменили мой рабочий процесс. Я рекомендую эту книгу всем, кто хочет улучшить свой рабочий процесс из командной строки.

Джейкоб Чае
Инженер-программист, Assurant

У автора всегда есть для вас что-то удивительное: пользовательские команды для запуска вашей среды разработки, ее настройка, парное программирование и множество вариантов использования. Эта книга заставит вас сделать шаг вперед и стать более эффективным разработчиком.

Питер Перлепес
Инженер-программист, adaplo

У меня не было опыта работы с tmux до того, как я взял книгу, и я мог использовать tmux в своей повседневной жизни после прочтения книги.

Ник МакГиннесс
Инженер-программист, Прямые поставки

Благодарности

Спасибо, что прочитали эту книгу. Я искренне надеюсь, что эта книга поможет вам стать лучше в своей работе, сделав вас быстрее и продуктивнее.

Спасибо, Крис Джонсон, за то, что сначала показал мне, что такое tmux, и за то, что указал мне правильное направление своими начальными вопросами. Это полностью изменило то, как я работаю, и это побудило меня поделиться этим удивительным инструментом со всеми.

Спасибо, Дэйв Томас, за то, что убедил меня опубликовать первое издание этой книги. Я очень горжусь первым изданием и тем, скольким людям оно помогло. И спасибо, Энди Хант и Джанет Ферлоу, за всю вашу работу по выпуску лучших технических книг.

Спасибо, Сюзанна Пфальцер, за то, что снова поработала со мной. Вы снова призвали меня расти как писателю, и эта книга и я стали лучше.

Спасибо, Алессандро Бахгат, Джейкоб Чае, Джефф Холланд, Майкл Хантер, Шон Линдси, Локеш Кумар Макани, Ник МакГиннесс, Стивен Орр, Питер Перлепес, Чарли Стран и Колин Йейтс, за рецензирование этой книги. Второе издание более понятно и содержит более подробные объяснения, так как вы потратили время, чтобы прочитать эту книгу и опробовать каждый пример. Все, что до сих пор сломано, - это моя вина.

Спасибо моим деловым партнерам, Митчу Булларду, Кевину Гизи, Алексу Генри, Джеффу Холланду, Нику Ламуро, Остен Отт, Эриху Тески, Майлсу Стейнхаузеру, Джошу Свону, Крису Уоррену и Майку Веберу за вашу постоянную поддержку.

Спасибо, Ана и Лиза, за вашу любовь и вдохновение.

Наконец, спасибо, Карисса, за вашу любовь и поддержку. Спасибо за все, что вы делаете для нашей семьи.

Предисловие

Ваша мышь замедляет вас.

Когда мышь была впервые представлена, она создала новый способ взаимодействия людей с компьютерами. Мы можем щелкнуть, дважды щелкнуть и даже трижды щелкнуть, чтобы открывать документы, переключать окна и выделять текст. А благодаря трекпадам мы даже можем проводить пальцем по экрану и использовать жесты для взаимодействия с нашими приложениями. Мышь, наряду с графическим интерфейсом, сделала компьютеры немного проще в использовании для обычного человека. Но у мыши есть и обратная сторона, особенно для программистов.

Создавая программное обеспечение, мы работаем с несколькими программами в течение дня. Например, веб-разработчик может иметь консоль базы данных, веб-сервер и текстовый редактор, работающие одновременно. Переключение между ними с помощью мыши может замедлить работу. Может показаться, что это не так уж много, но перемещение руки с основного ряда клавиатуры, наложение ее на мышь, нахождение указателя и выполнение задачи могут съесть время и отвлечь внимание. И это также может вызвать нагрузку на ваше запястье, руку или плечо. Это повторяющееся движение, когда вы дотрагиваетесь до мыши, может вызвать серьезный дискомфорт, если вы не будете осторожны с тем, как вы держите мышь.

Используя tmux, вы можете создать такую среду прямо в своем терминале, полностью управляемую без мыши:

Используя окна tmux, вы можете легко управлять текстовым редактором, консолью базы данных и локальным веб-сервером в единой среде. И вы можете разделить окна tmux на разделы, чтобы несколько приложений могли работать бок о бок. Это означает, что вы можете запускать текстовый браузер, IRC-клиент или свои автоматизированные тесты в том же окне, что и ваш главный редактор.

Лучше всего то, что вы можете быстро перемещаться между этими окнами и панелями, используя только клавиатуру. Со временем нажатия клавиш, которые вы используете для управления окружающей средой, станут для вас второй натурой, что значительно повысит как вашу концентрацию, так и вашу продуктивность.

Из этой книги вы узнаете, как настраивать, использовать и настраивать tmux. Вы узнаете, как управлять несколькими программами одновременно, писать сценарии для создания пользовательских сред и использовать tmux для удаленной работы совместно с коллегами. С помощью tmux вы можете создать рабочую среду, в которой почти все, что вам нужно, всегда будет у вас под рукой.

Что такое tmux?

tmux - это терминальный мультиплексор. Он позволяет использовать единую среду для запуска нескольких терминалов или окон, каждое из которых запускает свой собственный процесс или программу. Например, вы можете запустить tmux и загрузить текстовый редактор Vim. Затем вы можете создать новое окно, загрузить консоль базы данных и переключаться между этими программами в течение одного сеанса.

Если вы используете современную операционную систему и терминал с вкладками, в этом нет ничего нового. Но одновременный запуск нескольких программ - это лишь одна из возможностей tmux. Вы можете разделить окна терминала на горизонтальные или вертикальные панели, что означает, что вы можете запускать две или более программы на одном экране бок о бок. И все это можно делать без использования мыши.

Вы также можете отключиться от сеанса, что означает, что вы можете оставить свою среду работающей в фоновом режиме. Если вы раньше использовали GNU-Screen, вы знакомы с этой функцией. Во многих отношениях tmux похож на GNU-Screen с множеством дополнительных функций и гораздо более простой системой конфигурации. А поскольку tmux использует модель клиент-сервер, вы можете управлять окнами и панелями из центра или даже переключаться между несколькими сеансами из одного окна терминала. Эта модель клиент-сервер также позволяет создавать сценарии и взаимодействовать с tmux из других окон или приложений.

В этой книге мы исследуем все эти и многие другие функции.

Кому следует прочитать эту книгу

Независимо от того, являетесь ли вы системным администратором или разработчиком программного обеспечения, большую часть времени проводящим с использованием инструментов терминала и командной строки, эта книга призвана помочь вам работать быстрее.

Если вы разработчик программного обеспечения, вы увидите, как использовать tmux для создания среды разработки, которая может упростить работу с несколькими сеансами терминала. И если вы уже освоили Vim или Emacs, вы увидите, как tmux может еще больше ускорить ваш рабочий процесс.

Если вы системный администратор или разработчик, который какое-то время работает с удаленными серверами, вам будет интересно узнать, как можно использовать tmux для создания постоянной панели мониторинга для управления или мониторинга серверов.

Что в этой книге

Эта книга покажет вам, как включить tmux в вашу работу, познакомит вас с его основными функциями и покажет, как вы можете применить их в повседневных ситуациях.

В главе 1, Изучение основ, вы узнаете об основных функциях tmux при создании сеансов, панелей и окон и узнаете, как выполнять базовую навигацию.

В главе 2, Настройка tmux, вы переопределите многие комбинации клавиш по умолчанию и настроите внешний вид tmux.

В главе 3, Создание сценариев для настраиваемых сред tmux, вы создадите сценарий для собственной среды разработки, используя интерфейс командной строки, файлы конфигурации и программу tmuxinator.

После этого вы будете работать с текстом в главе 4, Работа с текстом и буферами. Вы будете использовать клавиатуру, чтобы перемещаться по буферу назад, выделять и копировать текст, а также работать с несколькими буферами вставки.

Затем, в главе 5, Парное программирование с tmux, вы настроите tmux, чтобы вы и ваш коллега могли вместе работать над одной и той же кодовой базой с разных компьютеров с помощью tmux.

Наконец, в главе 6, Рабочие процессы, рассматриваются более сложные способы управления окнами, панелями и сеансами, а также показано, как повысить продуктивность работы с tmux.

Изменения во втором издании

Это новое издание имеет некоторые заметные изменения по сравнению с первым изданием. tmux 2.1 и 2.2 внесли несколько несовместимых изменений, которые рассматриваются в этом выпуске; в этом выпуске также представлены некоторые новые опции. tmux сейчас более популярен, чем был, поэтому есть больше инструментов и приемов, которые вы можете использовать для улучшения своего рабочего процесса. Вот что нового:

Для всех примеров требуется как минимум tmux 2.3.

В этой книге теперь рассматривается установка в Windows 10, где tmux поддерживается подсистемой Microsoft Windows для Linux.

Глава 2, Настройка tmux, включает больше опций для идентификации активной панели, использует более обновленные методы для управления визуальными стилями tmux и удаляет некоторые устаревшие опции конфигурации, которые больше не работают.

Глава 3, Создание сценариев настраиваемых сред tmux, содержит обновленные инструкции для Tmuxinator и его нового формата конфигурации, а также информацию о том, как экспортировать сценарии tmux из Tmuxinator.

Глава 4, Работа с текстом и буферами, содержит обновленный метод получения текста в системные буферы обмена и из них в Linux и Mac.

Глава 5, Парное программирование с tmux, теперь включает инструкции по генерации ключа SSH и обсуждает, как использовать tmate в качестве быстрой альтернативы.

Глава 6, Рабочие процессы, содержит несколько новых разделов:

Что вам нужно

Чтобы использовать tmux, вам понадобится компьютер с Mac OS X, Windows 10 с поддержкой Bash или разновидностью Unix или Linux. К сожалению, tmux не работает под обычной командной строкой Windows или Powershell, но он отлично работает на виртуальной машине, VPS или среде общего хостинга под управлением Linux или FreeBSD.

Вы также должны хорошо разбираться в использовании инструментов командной строки в системе Linux или Unix. В этой книге мы будем использовать оболочку Bash, и умение создавать каталоги и текстовые файлы, а также некоторые базовые сценарии помогут вам быстрее перемещаться по примерам.

Хотя это не обязательно, опыт работы с текстовыми редакторами, такими как Vim или Emacs, может быть полезным. tmux работает примерно так же, и в нем есть несколько предопределенных сочетаний клавиш, которые могут показаться вам знакомыми, если вы используете один из этих текстовых редакторов.

Условные обозначения

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

Для простоты я использовал следующие условные обозначения.

Интернет-ресурсы

На веб-сайте книги (http://pragprog.com/titles/bhtmux2) есть ссылки на интерактивный дискуссионный форум, а также место, где можно сообщить об ошибках в книге. Вы также найдете исходный код файлов конфигурации и скриптов, которые мы используем в этой книге (локальная копия: bhtmux2-code.zip). Вы можете щелкнуть поле над фрагментами кода, чтобы загрузить исходный код напрямую.

Работа с tmux сделала меня более продуктивным, и я рад поделиться с вами своим опытом. Давайте начнем с установки tmux и работы с его основными функциями.

Глава 1
Изучение основ

tmux может стать невероятным ускорителем производительности, если вы его освоите. В этой главе вы познакомитесь с основными функциями tmux при управлении приложениями в сеансах, окнах и панелях. Эти простые концепции составляют основу того, что делает tmux прекрасной средой как для разработчиков, так и для системных администраторов.

Но прежде чем вы сможете узнать, как использовать эти основные функции, вам необходимо установить tmux.

Установка tmux

Вы можете установить tmux одним из двух способов: с помощью диспетчера пакетов для вашей операционной системы или сборки tmux из исходного кода.

Какой бы метод вы ни выбрали, убедитесь, что вы установили tmux версии 2.2 или выше. Более ранние версии tmux не поддерживают некоторые функции, которые мы собираемся описать в этой книге, или имеют несовместимую конфигурацию.

Установка на Mac

Самый простой способ установить tmux на Mac - с помощью Homebrew.

Сначала установите Xcode через Mac App Store. После установки Xcode откройте новый терминал и выполните команду

$ xcode-select --install

для установки инструментов командной строки, необходимых Homebrew.

Затем установите Homebrew, следуя инструкциям на веб-сайте Homebrew.

Наконец, установите tmux с помощью следующей команды терминала:

$ brew install tmux

Чтобы убедиться, что tmux установлен правильно, и чтобы убедиться, что у вас правильная версия, выполните эту команду в своем терминале:

$ tmux -V
tmux 2.3

Установка в Windows 10

В августе 2016 года Microsoft выпустила обновление для Windows 10, которое переносит оболочку Bash в Windows. Эта оболочка работает на Ubuntu и поддерживает tmux. Чтобы использовать его, сначала переведите компьютер в режим разработчика. Откройте приложение «Настройки», выберите «Обновление и безопасность», а затем выберите «Для разработчиков». Включите параметр «Режим разработчика».

Затем откройте Панель управления и выберите Программы. Затем щелкните «Включение или отключение компонентов Windows». Найдите и включите параметр «Подсистема Windows для Linux». Затем перезагрузите компьютер.

Когда компьютер перезагрузится, откройте командную строку и введите

C:\> bash

Вам будет предложено установить Bash из Windows Store. Это бесплатная загрузка, загрузка и извлечение которой занимает несколько минут, но через короткое время вы будете готовы установить tmux.

После установки Bash переходите к следующему разделу, так как вы установите tmux из исходного кода, как если бы вы использовали Ubuntu.

Установка в Linux

В Linux лучше всего установить tmux, загрузив исходный код и скомпилировав его самостоятельно. Менеджеры пакетов не всегда имеют самую последнюю версию tmux. Процесс установки tmux одинаков на всех платформах. Вам понадобится компилятор GCC и libevent а также ncurses, от которого зависит tmux.

Для Ubuntu вы можете установить все это с помощью диспетчера пакетов apt:

$ sudo apt-get install build-essential libevent-dev libncurses-dev

После того, как у вас установлены компиляторы и необходимые компоненты, возьмите исходный код tmux и загрузите его. Разархивируйте загруженную версию и установите ее так:

$ tar -zxvf tmux-2.3.tar.gz
$ cd tmux-2.3
$ ./configure
$ make
$ sudo make install

Вы можете проверить установку, выполнив это из терминала, который возвращает текущую установленную версию tmux:

$ tmux -V
tmux 2.3

Теперь, когда вы правильно установили tmux, давайте рассмотрим основные возможности tmux, начиная с базового сеанса.

Запуск tmux

Запустить tmux так же просто, как напечатать

$ tmux

из окна терминала. Вы увидите на экране что-то похожее на следующее изображение.

Это «сеанс» tmux, и он работает так же, как и обычный сеанс терминала. Вы можете ввести любую команду терминала, и все будет работать должным образом.

Чтобы закрыть сеанс tmux, просто введите

$ exit

в самом сеансе. Это закроет tmux, а затем вернет вас в стандартный терминал.

Но если вы не используете tmux только в течение очень короткого периода времени, это не лучший способ работы с сессиями в tmux. Вместо этого вы можете создать «именованные сеансы», которые потом сможете идентифицировать и работать с ними.

Создание именованных сеансов

У вас может быть несколько сеансов на одном компьютере, и вы захотите, чтобы они были организованы. Например, у вас может быть один сеанс для каждого разрабатываемого приложения илисессия для работы и сессия для вашего крутого побочного проекта. Вы можете организовывать эти сеансы, давая каждому сеансу свое собственное уникальное имя. Попробуйте прямо сейчас. Создайте именованный сеанс под названием «базовый» с помощью следующей команды:

$ tmux new-session -s basic

Вы можете сократить эту команду до

$ tmux new -s basic

Когда вы введете эту команду, вы попадете в совершенно новый сеанс tmux, но на самом деле вы не заметите ничего особенного или отличного от того, что если бы вы все запускали нормально. Если вы набрали exit, вы бы просто вернулись к терминалу. Именованные сеансы пригодятся, когда вы хотите оставить tmux работающим в фоновом режиме, что мы вскоре обсудим. Но прежде чем продолжить, введите

$ exit

чтобы выйти из tmux.

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

Префикс-команда

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

Вы добавляете к каждой команде tmux префикс этой комбинации клавиш. Чтобы понять, как это работает, снова откройте tmux:

$ tmux

Затем внутри tmux нажмите Ctrl+b, затем нажмите t. На экране появятся большие часы.

Часы в tmux

Важно отметить, что вы не держите все эти клавиши вместе. Вместо этого сначала нажмите Ctrl+b и одновременно отпустите эти клавиши, а затем сразу же нажмите клавишу для команды, которую вы хотите отправить в tmux.

В остальной части книги я буду использовать обозначения Prefix, с последующим сочетанием клавиш для команд tmux, например Prefix d для отключения от сеанса. В главе 2, Настройка tmux, вы измените префикс на более простую комбинацию, но до тех пор вы будете использовать значение по умолчанию Ctrl+b всякий раз, когда вы видите Prefix.

Нажмите клавишу Enter, чтобы закрыть часы, и выйдите из tmux, набрав exit. Теперь посмотрим, как запускать программы в фоновом режиме.

Отсоединение и присоединение сессий

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

Если вы закроете обычный сеанс терминала, все программы, запущенные в этом сеансе, будут отключены. Но когда вы отключаетесь от сеанса tmux, вы фактически не закрываете tmux. Все программы, которые вы запустили в этом сеансе, продолжат работу. Затем вы можете «присоединиться» к сеансу и продолжить с того места, где остановились. Чтобы продемонстрировать это, давайте создадим новый сеанс tmux с именем, запустим программу и отключимся от сеанса. Сначала создайте сеанс:

$ tmux new -s basic

Затем в сеансе tmux запустите приложение с именем top, которое контролирует нашу память и использование ЦП, например:

$ top

В вашем терминале будет что-то похожее на изображенное на следующем рисунке.

top в tmux

Теперь отключитесь от сеанса tmux, нажав Prefix d. Это вернет вас в обычное окно терминала.

Теперь давайте посмотрим, как вернуться к тому сеансу tmux, который мы оставили запущенным. Но прежде чем мы это сделаем, закройте окно вашего терминала.

Повторное подключение к существующим сеансам

Мы настроили сеанс tmux, запустили программу внутри сеанса, отсоединились от него и закрыли сеанс терминала, но сеанс tmux все еще работает вместе с приложением top, которое мы запустили.

Вы можете просмотреть существующие сеансы tmux, используя команду

$ tmux list-sessions

в новом окне терминала. Вы можете сократить команду до:

$ tmux ls

Команда показывает, что в данный момент запущен один сеанс:

basic: 1 windows (created Tue Aug 23 16:58:26 2016) [105x25]

Чтобы присоединиться к сеансу, используйте ключевое слово attach. Если у вас запущен только один сеанс, вы можете просто использовать

$ tmux attach

и вы снова будете подключены к сеансу. Все становится сложнее, если у вас работает более одного сеанса. Отсоединитесь от сессии basic нажатием Prefix d.

Теперь создайте новый сеанс tmux в фоновом режиме с помощью команды

$ tmux new -s second_session -d

Это создает новый сеанс, но вы не подключаетесь к нему автоматически.

Теперь получите список сессий, и вы увидите два запущенных сеанса:

$ tmux ls
basic: 1 windows (created Tue Aug 23 16:58:26 2016) [105x25]
second_session: 1 windows (created Tue Aug 23 17:49:21 2016) [105x25]

Вы можете присоединиться к нужному сеансу, используя флаг -t, за которым следует имя сеанса. Выполните следующую команду:

$ tmux attach -t second_session

Это прикрепляет вас к tmux сессии second_session. Вы можете отключиться от этого сеанса так же, как и ранее, используя Prefix d, а затем подключиться к другому сеансу. В разделе Переход между сеансами вы увидите другие способы перехода между активными сеансами. А пока давайте удалим активные сеансы.

Удаление сессий

Вы можете ввести exit внутри сеанса, чтобы уничтожить сеанс, но вы также можете убить сеансы с помощью команды kill-session. Это работает так же, как tmux attach:

$ tmux kill-session -t basic
$ tmux kill-session -t second_session

Это полезно в ситуациях, когда программа в сеансе зависает.

Если вы снова перечислите сеансы, вы получите следующее сообщение:

$ tmux ls
no server running on /tmp/tmux-1000/default

Поскольку сеансы tmux не запущены, сам tmux не работает, поэтому он не может обработать запрос.

Теперь, когда вы знаете основы создания сеансов и работы с ними, давайте посмотрим, как мы можем работать с несколькими программами в рамках одного сеанса.

Работа с окнами

Бывает, и очень часто, в сеансе tmux нужно запустить несколько одновременных команд. Мы можем организовать их с помощью окон, которые похожи на вкладки в современных графических эмуляторах терминала или веб-браузерах.

Когда мы создаем новый сеанс tmux, среда устанавливает для нас начальное окно. Мы можем создать столько окон, сколько захотим, и они сохранятся, когда мы отключаемся и снова подключаемся.

Давайте создадим новый сеанс с двумя окнами. В первом окне будет обычное приглашение, а во втором запустим команду top . Создайте именованный сеанс под названием «windows», например:

$ tmux new -s windows -n shell

Используя флаг -n, мы говорим tmux дать имя первому окну, чтобы мы могли легко его идентифицировать.

Теперь давайте добавим окно в этот сеанс.

Создание и именование окон

Чтобы создать окно в текущем сеансе, нажмите Prefix c. Создание такого окна автоматически переводит новое окно в фокус. Отсюда вы можете запустить другое приложение. Давайте запустим top в этом новом окне.

$ top

Первое окно имеет определенное вами имя, «shell», но теперь кажется, что второе окно имеет имя «top». Имя этого окна меняется в зависимости от запущенного в данный момент приложения, потому что вы не давали ему имя по умолчанию при его создании. Итак, дадим этому окну собственное имя.

Чтобы переименовать окно, нажмите Prefix и далее , (запятую), и строка состояния изменится, что позволит вам переименовать текущее окно. Переименуйте окно в «Processes».

Вы можете создать столько окон в сеансе tmux, сколько захотите. Но если у вас их несколько, у вас должна быть возможность перемещаться между ними.

Переход между окнами

Итак, вы создали два окна в своей среде, и вы можете перемещаться по этим окнам несколькими способами. Когда у вас всего два окна, вы можете быстро перемещаться между окна с помощью Prefix n, для перехода в «следующее окно». Так можно циклически перебирать все открытые вами окна. Поскольку сейчас у вас только два окна, это просто переключает их между ними.

Вы можете использовать Prefix p чтобы перейти в предыдущее окно.

По умолчанию каждое окно в tmux имеет номер, начинающийся с 0. Вы можете быстро перейти к первому окну с помощью Prefix 0, и ко второму окно с помощью Prefix 1. Этот массив окон с отсчетом от нуля не всегда интуитивно понятен, и в главе 2, Настройка tmux, вы увидите, как сделать так, чтобы список окон начинался с единицы вместо нуля.

Если у вас больше девяти окон, вы можете использовать Prefix w, чтобы отобразить визуальное меню ваших окон, чтобы вы могли выбрать то, которое вам нужно. Вы также можете использовать Prefix f, чтобы найти окно, содержащее строку текста. Если набрать текст и нажать Enter, отобразится список окон, содержащих этот текст.

Отсюда вы можете продолжить создание новых окон и запуск программ. Когда вы отключитесь от сеанса и подключитесь позже, все ваши окна будут там, где вы их оставили.

Чтобы закрыть окно, вы можете либо ввести «exit» в подсказку в окне, либо использовать сочетание Prefix &, которое отображает подтверждающее сообщение в строке состояния перед закрытием окна. Если вы подтверждите, то активное окно закроется, а в фокусе окажется предыдущее окно. Чтобы полностью закрыть сеанс tmux, вы должны закрыть все окна в сеансе.

Создавать окна - это здорово, но мы можем сделать tmux еще более полезным, разбив окно на панели.

Работа с панелями

Размещение программ в отдельных окнах - это нормально для задач, которые нам не нужны сию минуту. Но с tmux мы можем разделить один сеанс на панели.

Создайте новый сеанс tmux под названием «panes», чтобы мы могли поэкспериментировать с панелями. Закройте все существующие сеансы tmux и создайте новый, например:

$ tmux new -s panes

Мы можем разделить окно вертикально или горизонтально. Давайте разделим окно пополам сначала по вертикали, а затем по горизонтали, создав одну большую панель слева и две меньшие панели справа, как показано на рисунке ниже.

Панели в tmux

В сеансе tmux нажмите Prefix %, и окно разделится посередине и запустит второй сеанс терминала в новой панели. Кроме того, фокус переместится на эту новую панель.

Нажатие Prefix " (двойная кавычка) разделит эту новую панель пополам по горизонтали. По умолчанию новые панели равномерно делят существующую панель пополам.

Для переключения между панелями нажимайте Prefix o. Также вы можете использовать Prefix, за которым следует клавиши Up, Down, Left или Right для перемещения по панелям.

Всего парой нажатий клавиш мы разделили одно окно на рабочее пространство с тремя панелями. Давайте посмотрим, как мы можем переставить эти панели с помощью размещения.

Размещение панелей

Мы можем изменить размер панели, используя постепенное изменение размера или используя шаблоны. Постепенное изменение размеров панелей с использованием сочетаний клавиш по умолчанию довольно неудобно. В главе 2, Настройка tmux, мы определим несколько шорткатов, упрощающих изменение размеров панелей. На данный момент мы будем использовать одно из нескольких размещений по умолчанию панелей tmux:

Вы можете переключаться между этими макетами, нажимая Prefix Spacebar.

Закрытие панелей

Вы закрываете панель так же, как выходите из сеанса терминала или окна tmux: просто набираете «exit» в панели. Вы также можете закрыть панель с помощью сочетания Prefix x, которое также закрывает окно, если в нем существует только одна панель.

Вам будет предложено подтвердить, хотите ли вы закрыть указанную панель. Удаление такой панели отлично подходит для ситуаций, когда панель зависла или вы больше не можете с ней взаимодействовать.

До сих пор мы могли создавать новые сеансы, создавать окна и панели и немного перемещаться. Прежде чем мы перейдем к более сложным темам, давайте рассмотрим некоторые дополнительные команды tmux.

Работа в командном режиме

До сих пор мы использовали комбинации клавиш для создания окон и панелей, но эти сочетания клавиш на самом деле являются просто ярлыками для команд tmux с некоторыми предустановленными параметрами. Мы можем выполнять команды tmux двумя способами: из самого терминала или из области команд в строке состояния tmux. Вы узнаете об использовании команд tmux из терминала в главе 3, Создание сценариев для настраиваемых сред tmux, а пока давайте исследуем командный режим tmux, используя его для создания новых окон и панелей в нашей рабочей области.

Чтобы войти в командный режим, нажмите Prefix : (двоеточие) в текущеем сеансе tmux. Строка состояния меняет цвет, и мы получаем приглашение, указывающее, что мы можем ввести нашу команду. Создайте новое окно, используя команду new-window, например:

$ new-window -n console

Используя команду, а не шорткат, вы можете создать новое окно и одновременно дать ему имя, используя флаг -n. Давайте сделаем еще один шаг и запустим новое окно, в котором запустится программа top. Для этого мы входим в командный режим и набираем эту команду:

$ new-window -n processes "top"

Когда вы нажимете Enter, появится новое окно с запущенным приложением top, показывающим ваши процессы.

Указание начальной команды для окна очень удобно для краткосрочных задач, но здесь есть небольшая складка; если вы выйдете из приложения top, нажав q, созданное вами окно tmux также закроется. Вы можете использовать параметры конфигурации, чтобы обойти это, но если вы хотите, чтобы окно сохранялось, просто создайте его без указания начальной команды, а затем выполните свою собственную команду в новом окне.

Вы можете использовать командный режим для создания новых окон, новых панелей или новых сеансов или даже для установки других параметров среды. В главе 2, Настройка tmux, мы создадим несколько пользовательских сочетаний клавиш, чтобы упростить использование некоторых из этих команд.

Что дальше?

В этой главе вы изучили самые основы использования сеансов tmux, панелей, окон и команд, но вы можете попробовать гораздо больше.

Нажав Prefix ?, вы получите список всех предопределенных сочетаний клавиш tmux и связанных команд, которые они запускают.

Работая с tmux, подумайте о том, как вы можете создать различные среды для своей работы. Если вы отслеживаете серверы, вы можете использовать панели tmux для создания панели мониторинга, на которой отображаются различные сценарии мониторинга и файлы журналов.

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

Для дальнейшего использования

Создание сессий

Команда Описание
tmux new-session Создает новую сессию без имени. Может быть сокращена до tmux new или просто tmux.
tmux new -s development Создает новую сессию с именем «development».
tmux new -s development editor Создает сессию с именем «development» и называет первое окно «editor».
tmux attach -t development Присоединяется к сессии с именем «development».

Команды по умолчанию для сеансов, окон и панелей

Команда Описание
Prefix d Отключается от сеанса, оставляя сеанс запущенным в фоновом режиме.
Prefix : Переходит в командный режим.
Prefix c Создает новое окно из существующего сеанса tmux. Шорткат для new-window.
Prefix n Переход к следующему окну.
Prefix p Переход к предыдущему окну.
Prefix 0...9 Выбирает окна по номеру.
Prefix w Отображает выбираемый список окон в текущем сеансе.
Prefix f Ищет окно, содержащее указанный вами текст. Отображает выбираемый список окон, содержащих этот текст в текущем сеансе.
Prefix , Отображает приглашение переименовать окно.
Prefix & Закрывает текущее окно после запроса подтверждения.
Prefix % Делит текущее окно пополам по вертикали.
Prefix " Делит текущее окно пополам по горизонтали.
Prefix o Перебирает открытые панели.
Prefix q Мгновенно отображает номера панелей на каждой панели.
Prefix x Закрывает текущую панель после запроса подтверждения.
Prefix Space Перебирает различные макеты панелей.

Глава 2
Настройка tmux

tmux по умолчанию не имеет самых удобных команд. Многие из наиболее важных и полезных функций связаны с труднодоступными нажатиями клавиш или состоят из длинных и подробных командных строк. И цветовая схема tmux по умолчанию не очень приятна для глаз. В этой главе вы создадите базовый файл конфигурации для своей среды, который затем будете использовать в оставшейся части книги. Вы начнете с настройки того, как вы перемещаетесь по экрану и как создаете и изменяете размер панелей, а затем изучите некоторые более сложные настройки. Вы также узнаете, как убедиться, что ваш терминал правильно настроен, чтобы некоторые из настроек, которые вы сделаете для внешнего вида tmux, хорошо смотрелись на вашем экране. Когда вы закончите, вы лучше поймете, насколько гибок tmux, и сможете начать создавать его самостоятельно.

Представляем файл .tmux.conf

По умолчанию tmux ищет параметры конфигурации в двух местах. Сначала он заглядывает в файл общесистемной конфигурации /etc/tmux.conf. Затем он ищет файл с именем .tmux.conf в домашнем каталоге текущего пользователя. Если эти файлы не существуют, tmux просто использует настройки по умолчанию. Нам не нужно создавать общесистемную конфигурацию, поэтому давайте создадим совершенно новый файл конфигурации в нашем домашнем каталоге. Выполните в своей оболочке следующую команду:

$ touch ~/.tmux.conf

В этом файле мы можем делать все, от определения новых сочетаний клавиш до настройки среды по умолчанию с несколькими окнами, панелями и запущенными программами. Начнем с установки пары основных параметров, которые значительно упростят работу с tmux.

info Файл .tmux.conf является скрытым и по умолчанию не отображается в обозревателях файлов или в списках каталогов. Ярлыки над листингами кода в этой книге ссылаются на файл как tmux.conf, без начальной точки, поэтому он соответствует файлу в загрузке исходного кода книги.

Определение более простого префикса

Как вы видели ранее, tmux использует Ctrl+b в качестве префикса команды. Многие пользователи tmux начали с использования GNU-Screen, который использует Ctrl+a для его командного префикса. Ctrl+a - отличный выбор для префикса, потому что его легче запускать, особенно если вы переназначаете на своем компьютере клавишу Caps Lock на Ctrl, как объяснено во врезке ниже. Так вы удерживаете руки в главном ряду клавиатуры.

Переназначение клавиши Caps Lock

На многих клавиатурах клавиша Caps Lock находится прямо рядом с а в главном ряду клавиатуры. Переназначив эту клавишу на Ctrl, вы можете сделать команды запуска более удобными.

На вашем Mac вы можете переназначить Caps Lock под панелью предпочтений клавиатуры в Системных настройках. Просто нажмите кнопку клавиш-модификаторов и измените действие с Caps Lock на «Control».

В Linux этот процесс может быть немного сложнее в зависимости от вашего дистрибутива или оконного менеджера, но вы можете найти несколько методов, описанных в wiki Emacs.

Это небольшое изменение в вашей конфигурации может сэкономить вам удивительно много времени в течение дня.

Чтобы установить параметры в файле .tmux.conf, используйте команду set-option, которую можно сократить до set. Вы определяете префикс tmux, добавляя его в файл .tmux.conf:

config/tmux.conf
# Setting the prefix from C-b to C-a
set -g prefix C-a

В этом примере мы используем ключ -g для использования опции «global», которая устанавливает параметр для всех сеансов tmux, которые мы создаем.

Строка, начинающаяся с # - это комментарий. Рекомендуется добавлять комментарии в файлы конфигурации; они пробудят вашу память позже, когда вы вернетесь и посмотрите на свою конфигурацию через несколько месяцев. Комментарии в файле конфигурации tmux работают так же, как комментарии в исходном коде.

Хотя в этом нет необходимости, мы можем использовать команду unbind-key или unbind, чтобы удалить определенную привязку клавиш, чтобы позже мы могли назначить для этой клавиши другую команду. Давай освободим Ctrl+b:

config/tmux.conf
# Free the original Ctrl-b prefix keybinding
unbind C-b

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

source-file ~/.tmux.conf

Теперь вы можете использовать Ctrl+a в качестве префикса. В остальных примерах в этой книге он по-прежнему будет называться Prefix.

Изменение задержки по умолчанию

tmux добавляет очень небольшую задержку при отправке команд, и эта задержка может мешать работе других программ, таких как текстовый редактор Vim. Мы можем установить эту задержку, чтобы она была более быстрой. Добавьте эту строку в свой файл конфигурации:

# Setting the delay between prefix and command
set -s escape-time 1

После перезагрузки файла конфигурации вы сможете без промедления нажимать клавиши.

Установка индекса окна и панелей

В главе 1, Изучение основ, вы узнали об окнах и о том, как при создании более одного окна в сеансе вы можете ссылаться на окна по их индексу. Этот индекс начинается с нуля, что может быть немного неудобно, поскольку вам придется использовать Prefix 0 для доступа к первому окну. Добавьте эту строку в свой файл конфигурации

# Set the base index for windows to 1 instead of 0
set -g base-index 1

чтобы индекс окна начинался с 1, и вы сможете использовать Prefix 1 для перехода в первое окно. Это намного проще, поскольку клавиши на клавиатуре теперь напрямую соответствуют окнам, перечисленным в строке состояния.

Вы также можете установить начальный индекс для панелей, используя опцию pane-base-index. Добавьте эту строку в свою конфигурацию, чтобы иметь некоторую согласованность между нумерацией панелей и окон.

config/tmux.conf
# Set the base index for panes to 1 instead of 0
setw -g pane-base-index 1

До сих пор мы использовали команду set, которая устанавливает параметры для сеанса tmux. Чтобы настроить параметры, которые влияют на то, как мы взаимодействуем с окнами, мы должны использовать другую команду, называемую set-window-option, которую мы можем сократить до setw. В этой книге я использовал сокращенные версии команд, чтобы примеры конфигурации умещались в одну строку.

Теперь давайте создадим несколько полезных шорткатов, которые повысят вашу производительность.

Настройка клавиш, команд и пользовательского ввода

Многие сочетания клавиш по умолчанию в tmux немного растянуты как физически, так и морально. Prefix % не только трудно нажимать, так как для этого нужно удерживать три клавиши, но не так то легко и запомнить, что делает эта комбинация клавиш.

В этом разделе мы определим или переопределим некоторые из наиболее часто используемых команд tmux. Начнем с создания настраиваемой привязки клавиш для перезагрузки конфигурации tmux.

Создание шортката для перезагрузки конфигурации

Каждый раз, когда вы вносите изменения в файл конфигурации, вам нужно либо выключить все сеансы, а затем перезапустите tmux или выполните команду source для перезагрузки вашей конфигурации из запущенных экземпляров. Давайте создадим индивидуальную привязку клавиш для перезагрузки файла конфигурации.

Команда bind определяет новую привязку клавиш. Вы указываете ключ, который хотите использовать, а затем команду, которую хотите выполнить.

Определим шорткат Prefix r чтобы он перезагружал файл .tmux.conf в текущем сеансе. Добавьте эту строку в свой файл конфигурации:

bind r source-file ~/.tmux.conf

Когда вы определяете сочетания клавиш с помощью bind, вам все еще нужно нажать Prefix, прежде чем вы сможете нажать вновь определенный шорткат. И хотя вы только что определили новую команду, чтобы упростить перезагрузку конфигурации tmux, вы не можете использовать ее, пока не перезагрузите файл конфигурации. Поэтому не забудьте войти в командный режим с Prefix : и ввести

source-file ~/.tmux.conf

еще раз.

Когда вы перезагружаете файл, вы не всегда можете сказать, что что-то изменилось, но вы можете использовать команду display, чтобы поместить сообщение в строку состояния. Измените команду перезагрузки, чтобы отображался текст «Reloaded!» при загрузке файла конфигурации:

config/tmux.conf
# Reload the file with Prefix r
bind r source-file ~/.tmux.conf \; display "Reloaded!"

Как видите, вы можете привязать клавишу к серии команд, разделив команды комбинацией символов \;.

Определение сочетаний клавиш, для которых не требуется префикс

Используя команду bind с префиксом -n, мы сообщаем tmux, что привязка клавиш не требует нажатия префикса. Например,

bind-key -n C-r source-file ~/.tmux.conf

позволил бы перезагружать файл конфигурации комбинацией Ctrl+r. К сожалению, это полностью отключит эту комбинацию клавиш в любом приложении, работающем в сеансе tmux, поэтому вы должны использовать ее с осторожностью.

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

Отправка префикса в другие приложения

Мы переназначили Ctrl+a как префикс, но такие программы, как Vim, Emacs и даже стандартная оболочка Bash также используют эту комбинацию. Возможно, вы захотите настроить tmux для отправки этой команды, когда она вам понадобится. Вы можете сделать это, привязав команду send-prefix на нажатие клавиши, например:

# Ensure that we can send Ctrl-A to other apps
bind C-a send-prefix

После перезагрузки файла конфигурации вы можете отправить Ctrl+a в приложение, работающее в tmux, просто нажав Ctrl+a дважды.

Разделение панелей

Ключи по умолчанию для разделения панелей может быть трудно запомнить, поэтому давайте установим наши собственные ключи, которые мы не сможем забыть. Мы установим горизонтальное разделение на Prefix | и вертикальное разделение на Prefix -. Для этого добавьте следующие строки в свою конфигурацию:

config/tmux.conf
# Splitting panes with | and -
bind | split-window -h
bind - split-window -v

На первый взгляд может показаться, что должно быть наоборот. Флаги -v и -h на split-window означают «вертикальное» и «горизонтальное» разделение, но для tmux вертикальное разделение означает создание новой панели под существующей панелью, так что панели располагаются вертикально друг над другом. Разбиение по горизонтали означает создание новой панели следующий к существующей, чтобы панели располагались горизонтально по экрану. То есть, чтобы разделить окно по вертикали, мы используем «горизонтальное» разделение, а чтобы разделить его по горизонтали, мы используем «вертикальное» разделение.

Эти новые шорткаты создают приятную визуальную ассоциацию. Если мы хотим, чтобы наши окна были разделены, мы просто нажимаем клавишу, которая выглядит как разделение, которое мы хотим создать.

Переназначение клавиш переходов

Переход с панели на панель с помощью Prefix o громоздко, а использование клавиш со стрелками означает, что придется убрать пальцы с домашнего ряда. Если вы используете текстовый редактор Vim, вы, вероятно, знакомы с его использованием h, j, k, а также l для перемещения курсора. Вы можете переназначить клавиши переходов в tmux на эти же клавиши.

# Moving between panes with Prefix h, j, k, l
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

Кроме того, вы можете использовать Prefix Ctrl+h, а также Prefix Ctrl+l для циклического просмотра окон путем привязки этих нажатий клавиш к соответствующим командам:

# # Quick window selection
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+

Если вы замапили свою клавишу Caps Lock на Ctrl, то теперь вы можете перемещаться между панелями, не отрывая рук от главного ряда.

Изменение размера панелей

Чтобы изменить размер панели, вы можете войти в командный режим и ввести resize-pane -D для изменения размера панели вниз по одной строке за раз. Вы можете увеличить шаг изменения размера, передав число после направления, например resize-pane -D 5. Сама команда довольно многословна, но вы можете добавить некоторые сочетания клавиш, чтобы упростить изменение размеров панелей.

Давайте воспользуемся вариацией клавиш перемещения в Vim для изменения размеров окон. Мы будем использовать Prefix H, Prefix J, Prefix K, а также Prefix L для изменения размера панелей. Добавьте эти строки в свой файл конфигурации:

bind H resize-pane -L 5
bind J resize-pane -D 5
bind K resize-pane -U 5
bind L resize-pane -R 5

Обратите внимание, что мы используем прописные буквы в файле конфигурации. tmux позволяет использовать как строчные, так и прописные буквы для нажатия клавиш. Вам нужно будет использовать клавишу Shift для введения заглавной буквы при нажатии клавиши.

Использование этих клавиш перемещения поможет нам отслеживать, каким образом мы хотим изменить размер окна. Например, если у нас есть окно, разделенное на две панели, уложенные вертикально, как это

------------------
|                |
|    Панель 1    |
|                |
------------------
|                |
|    Панель 2    |
|                |
------------------

и мы хотим увеличить размер Панели 1, значит нам нужно поместить курсор внутрь Панели 1 и нажать Prefix J, это действие переместит горизонтальный разделитель вниз. Если мы нажмем Prefix K, то переместим горизонтальный разделитель вверх.

В конфигурации, которую мы только что использовали, вы должны использовать Prefix каждый раз, когда вы хотите изменить размер панели. Но если вы используете флаг -r с командой bind, вы можете указать, что хотите, чтобы ключ был повторяемый. Это означает, что вы можете нажать префиксную клавишу только один раз, а затем непрерывно нажимать определенную клавишу в течение заданного промежутка времени, называемого пределом повтора.

Переопределите команды изменения размера окна, добавив опцию -r:

# Pane resizing panes with Prefix H, J, K, L
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

Теперь вы можете изменить размер панелей, нажав Prefix J один раз, а затем нажимая J пока окно не станет такого размера, какого вы хотите. Предел повторения по умолчанию составляет 500 миллисекунд, и его можно изменить, задав параметру repeat-time другое значение.

Теперь обратим внимание на то, как tmux может работать с мышью.

Работа с мышью

Хотя tmux должен полностью управляться с клавиатуры, бывают случаи, когда вам может быть проще использовать мышь. Если ваш терминал настроен на пересылку щелчков мыши и перемещения попрограммам в терминале, то вы можете указать tmux, как обрабатывать определенные события мыши.

Иногда приятно иметь возможность прокручивать буфер терминала вверх с помощью колесика мыши или выбирать окна и панели, особенно когда вы только начинаете работать с tmux. Чтобы настроить tmux так, чтобы мы могли использовать мышь, нам нужно включить режим мыши.

set -g mouse on

Этот параметр настраивает tmux так, что он позволяет нам использовать мышь для выбора панели или изменения ее размера, позволяет нам щелкать список окон, чтобы выбрать окно и даже использовать мышь для прокрутки буфера назад, если ваш терминал поддерживает это.

Это может быть удобным дополнением к вашей конфигурации, но помните, что использование мыши с tmux замедлит вашу работу. Хотя возможность прокрутки и щелчка может показаться отличной идеей, вам следует изучить эквиваленты клавиатуры для переключения панелей и перемещения вперед и назад через буферы. Итак, для нашего файла конфигурации мы отключим мышь.

config/tmux.conf
# Mouse support - set to on if you want to use the mouse
set -g mouse off

Установка этого параметра предотвращает случайное выполнение действий при выборе окна терминала с помощью мыши и заставляет нас более комфортно пользоваться клавиатурой.

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

Визуальный стиль

tmux предоставляет несколько способов настроить внешний вид вашей среды. В этом разделе мы рассмотрим настройку некоторых из этих параметров, так как мы настраиваем строку состояния и другие компоненты. Мы начнем с настройки цветов для различных элементов, а затем превратим нашу стандартную строку состояния в нечто, что предоставит нам важную информацию о нашем окружении.

Настройка цветов

Чтобы получить наилучшие визуальные впечатления от tmux, убедитесь, что и ваш терминал, и tmux настроены на 256 цветов.

Используя команду tput, вы можете быстро определить количество цветов, поддерживаемых сеансом терминала. Введите команду

$ tput colors
256

в свой терминал. Если в результате вы не видите 256, вам нужно будет немного его настроить.

Возможно, вам потребуется настроить свой терминал для использования xterm в режиме 256. На Mac вы можете настроить это в приложении Terminal, отредактировав профиль, как показано на следующем рисунке:

Настройка цветов в tmux

Если вы используете iTerm2, вы можете изменить настройки, отредактировав профиль по умолчанию и изменив режим терминала на xterm-256color, как показано на следующем рисунке:

Настройка цветов в tmux

Если вы используете Linux, вам может потребоваться добавить

[ -z "$TMUX" ] && export TERM=xterm-256color

в ваш файл .bashrc для включения 256-цветного терминала. Этот условный оператор гарантирует, что переменная TERM устанавливается только вне tmux, так как tmux устанавливает собственный терминал.

Также убедитесь, что ваш эмулятор терминала поддерживает отображение символов UTF-8, чтобы визуальные элементы, такие как разделители панелей, отображались пунктирными линиями.

Чтобы tmux отображал объекты в 256 цветах, добавьте эту строку в ваш файл .tmux.conf:

config/tmux.conf
# Set the default terminal mode to 256color mode
set -g default-terminal "screen-256color"

После установки правильного цветового режима вам станет намного проще использовать такие программы, как Vim, Emacs и другие полноцветные программы из tmux, особенно когда вы используете более сложные цветовые схемы для выделения синтаксиса. Просто взгляните на этот рисунок, чтобы увидеть разницу.

Теперь настроим внешний вид компонентов tmux, начав с цветов.

Изменение цветов

Вы можете изменить цвета нескольких частей интерфейса tmux, включая строку состояния, список окон, область сообщений и даже границы панели.

tmux предоставляет переменные, которые вы можете использовать для указания цветов, включая black, red, green, yellow, blue, magenta, cyan или white. Вы также можете использовать от colour0 до colour255 для ссылки на более конкретные цвета из 256 цветовой палитры.

Чтобы найти числа для этих цветов, вы можете запустить этот простой сценарий оболочки, чтобы получить переменную цвета, которую вы хотите использовать:

for i in {0..255} ; do
    printf "\x1b[38;5;${i}m${i} "
done

Когда вы выполните эту команду, вы увидите в своем терминале следующий вывод, отображающий цвета:

Настройка цветов в tmux

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

Изменение цвета строки состояния

Строка состояния по умолчанию имеет черный текст на ярко-зеленом фоне. Он довольно мягкий, и в зависимости от конфигурации вашего терминала его может быть трудно читать. Сделаем так, чтобы по умолчанию у него был белый текст на черном фоне, чтобы он выглядел так:

Статусная строка в tmux

Опция status-style устанавливает цвета переднего плана и фона строки состояния, а также стиль. Добавьте следующую строку в свою конфигурацию, чтобы установить цвета строки состояния:

config/tmux.conf
# Set the status line's colors
set -g status-style fg=white,bg=black

Вы можете установить цвет переднего плана и цвет фона и контролировать внешний вид текста, в зависимости от того, поддерживает ли его ваш терминал. Как вы, наверное, догадались, опция fg устанавливает цвет переднего плана, а опция bg устанавливает цвет фона.

Эта команда поддерживает параметры dim, bright (или bold), reverse и blink в дополнение к цветам. Например, чтобы сделать текст строки состояния белым и жирным шрифтом, вы должны использовать следующую конфигурацию:

set -g status-style fg=white,bold,bg=black

Вы также можете настроить цвета элементов в строке состояния. Начнем с настройки списка окон.

Изменение цвета списка окон

tmux отображает список окон в строке состояния. Давайте сделаем более очевидным то, какое окно активно, задав для активного окна красный цвет, а для неактивных - голубой. Опция window-status-style контролирует внешний вид обычных окон, а опция window-status-current-style управляет тем, как выглядит активное окно. Чтобы настроить цвета, вы используете тот же синтаксис, который вы использовали для опции status-style.

Сделаем имена окон голубыми, например:

Статусная строка в tmux

Добавьте это в свой файл конфигурации:

config/tmux.conf
# Set the color of the window list
setw -g window-status-style fg=cyan,bg=black

Вы можете использовать default, чтобы значение наследовалось от цвета строки состояния.

Чтобы стилизовать активное окно с красным фоном и полужирным белым текстом, добавьте эту строку в свою конфигурацию:

# Set colors for the active window
setw -g window-status-current-style fg=white,bold,bg=red

Теперь неактивные окна имеют голубой цвет, а активное окно легко идентифицировать:

Статусная строка в tmux

Это настройка списка окон. Давайте посмотрим, как мы можем настроить отображение панелей в окне.

Изменение внешнего вида панелей

У нас есть несколько вариантов управления внешним видом панелей. Мы можем контролировать цвет разделителей панелей, определять цвета, чтобы активная панель была более заметной, и даже «затемнить» неактивные панели.

Панели имеют цвета как переднего плана, так и фона. Цвет переднего плана панели - это фактическая пунктирная линия, составляющая границу. Цвет фона по умолчанию черный, но если мы раскрасим его, когда панель активна, мы можем сделать активную панель чрезвычайно заметной, как показано на следующем рисунке:

Статусная строка в tmux

Добавьте это в свой файл конфигурации, чтобы добавить этот эффект в свою среду:

config/tmux.conf
# Colors for pane borders
setw -g pane-border-style fg=green,bg=black
setw -g pane-active-border-style fg=white,bg=yellow

Наконец, вы можете захотеть упростить определение активной панели, изменив цвет переднего плана или фона текущей панели. Или вы можете захотеть скрыть неиспользуемые панели. Параметры set-window-style и set-window-active-style позволяют управлять цветами переднего плана и фона, хотя вы должны указать как цвет переднего плана, так и цвета фона как часть значения, установленного для параметра.

Давайте затемним любую неактивную панель. Мы добьемся этого, фактически уменьшив яркость всех панелей, а затем сделав активную панель нормальной. Добавьте эти строки в свою конфигурацию:

# Active pane normal, other shaded out
setw -g window-style fg=colour240,bg=colour235
setw -g window-active-style fg=white,bg=black

Чтобы создать эффект затемнения, мы устанавливаем цвет текста переднего плана на более светлый серый, а затем используем более темный серый цвет в качестве цвета фона. Затем для активного окна мы используем черный и белый цвета.

С этим изменением и границами активной панели должно быть довольно ясно, какая панель активна. Теперь давайте подправим область tmux, в которой мы выполняем команды.

Настройка командной строки tmux

Мы также можем настроить командную строку, в которой мы вводим команды tmux и видим предупреждающие сообщения. Подход почти идентичен тому, как мы стилизовали саму строку состояния. Давайте изменим цвет фона на черный, а цвет текста на белый. Мы будем использовать ярко-белый цвет, чтобы сообщение выделялось более детально. Добавьте это в свою конфигурацию:

config/tmux.conf
# Command/message line
set -g message-style fg=white,bold,bg=black

Это было просто. Теперь давайте изменим области статусной строки по обе стороны от списка окон.

Настройка содержимого строки состояния

Строка состояния tmux может отображать практически любую информацию, которую мы хотим. Мы можем использовать некоторые предопределенные компоненты или создавать свои собственные, выполняя команды оболочки.

Строка состояния состоит из трех компонентов: левой панели, списка окон и правой панели. По умолчанию это выглядит так:

[development] 0:bash*       "example.local" 13:37 31-Oct-16

Слева у нас имя сеанса tmux, за которым следует список окон. В списке окон отображается числовой индекс текущего окна и его имя. Справа имя хоста нашего сервера, за которым следуют дата и время. Давайте настроим содержимое нашей строки состояния.

Настройка элементов строки состояния

Вы можете изменить содержимое левой или правой панели строки состояния, используя комбинацию текста и переменных. В следующей таблице показаны возможные переменные, которые мы можем использовать в нашей строке состояния.

Таблица 1. Описание переменных строки состояния

Переменная Описание
#H Hostname локального хоста
#h Hostname локального хоста без имени домена
#F Флаг текущего окна
#I Индекс текущего окна
#P Текущий индекс панели
#S Название текущей сессии
#T Текущий заголовок окна
#W Имя текущего окна
## Литерал #
#(shell-command) Первая строка вывода команды оболочки
#[attributes] Изменение цвета или атрибута

Например, если вы хотите показать слева только имя текущего сеанса tmux, вы должны использовать параметр set-option -g status-left со значением #S, например:

set -g status-left "#S"

Но вы также можете сделать его более заметным, используя атрибут для установки цвета переднего плана, например:

set -g status-left "#[fg=green]#S"

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

set -g status-left "#[fg=green]#S #[fg=yellow]#I #[fg=cyan]#P"

Вы также можете добавить произвольный текст в строку состояния. Давайте добавим текст, чтобы сделать сессию, окно и панель более заметными, например:

config/tmux.conf
# Status line left side to show Session:window:pane
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"

Мы устанавливаем параметр status-left-length, потому что указанный нами вывод слишком длинный для длины по умолчанию, поэтому мы должны сделать эту область шире.

Вы также можете настроить правую часть строки состояния. Добавьте текущую дату и время, например:

config/tmux.conf
# Status line right side - 31-Oct 13:37
set -g status-right "#[fg=cyan]%d %b %R"

Это форматирует дату как «31-Oct 13:37», но вы можете отформатировать ее по своему усмотрению, используя стандартный механизм форматирования времени strftime, используемый во многих языках программирования. (См. http://www.foragoodstrftime.com/, чтобы найти удобный инструмент, который поможет вам найти идеальный формат времени.) Теперь ваша строка состояния должна выглядеть так:

Статусная строка в tmux

Вы можете пойти дальше, включив в микс команды оболочки, используя переменную #(shell-command), чтобы вернуть результат любой внешней программы командной строки в строку состояния. Мы подробно рассмотрим это в Добавление срока службы батареи в строку состояния.

Обновление информации в строке состояния

Мы добавили текущее время и некоторую другую динамическую информацию в нашу строку состояния, но нам нужно указать tmux, как часто нужно периодически обновлять эту информацию. По умолчанию tmux обновляет строку состояния каждые 15 секунд. Мы можем точно указать, как быстро tmux должен обновлять свою строку состояния с set-option -g status-interval с последующим интервалом обновления в секундах, например:

# Update the status line every sixty seconds
set -g status-interval 60

Это будет обновлять строку состояния каждые 60 секунд. Имейте в виду, что если вы запускаете команды оболочки, они будут выполняться один раз за интервал, поэтому будьте осторожны, чтобы не загружать слишком много ресурсоемких скриптов.

Центрирование списка окон

Мы также можем контролировать размещение списка окон. По умолчанию список окон выровнен по левому краю, но мы можем центрировать список окон между левой и правой областями состояния с помощью одного изменения конфигурации:

config/tmux.conf
# Center the window list in the status line
set -g status-justify centre

После этого список окон отображается по центру:

Статусная строка в tmux

По мере создания новых окон список окон будет соответственно сдвигаться, оставаясь в центре строки состояния.

Определение активности в других окнах

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

config/tmux.conf
# Enable activity alerts
setw -g monitor-activity on
set -g visual-activity on

Команда monitor-activity on выделяет имя окна в строке состояния, когда в этом окне есть активность. Строка visual-activity on сообщает tmux, чтобы он также отображал сообщение в строке состояния.

Теперь, когда в одном из других окон происходит какая-то активность, оно выделяется голубым фоном, как показано в «top» окне:

Статусная строка в tmux

Как только вы переключитесь в это окно, цвета вернутся к нормальному. Если вы хотите настроить разные цвета, вы можете сделать это с помощью setw -g window-status-activity-style и цвета по вашему выбору.

Что дальше?

В этой главе мы создали довольно надежный файл конфигурации. См. в приложении 1, Наша конфигурация, весь файл tmux.conf.

Вы можете определить дополнительные параметры в своем файле .tmux.conf. Например, в главе 3, Создание сценариев для настраиваемых сред tmux, вы настроите индивидуальную рабочую среду по умолчанию, используя файлы конфигурации для конкретного проекта.

Кроме того, вы можете настроить конфигурацию по умолчанию для вашей системы в /etc/tmux.conf. Это отлично подходит для ситуаций, когда вы настроили общий сервер, чтобы члены вашей команды могли сотрудничать, или если вы просто хотите убедиться, что у каждого пользователя в системе есть разумные настройки по умолчанию.

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

Для дальнейшего использования

Привязки клавиш, определенные в этой главе

Команда Описание
Ctrl+a Новый Prefix.
Prefix a Отправляет Ctrl+a в программу, работающую в окне tmux, или панель.
Prefix r Перезагружает файл конфигурации tmux.
Prefix | Разделяет окно по горизонтали.
Prefix - Разбивает окно по вертикали.
Prefix h, Prefix j,
Prefix k, Prefix l
Перемещения между панелями.
Prefix H, Prefix J,
Prefix K, Prefix L
Изменяет размер текущей панели.
Prefix Ctrl+h,
Prefix Ctrl+l
Движение вперед и назад по окнам.

Команды для управления поведением tmux

Команда Описание
set -g prefix C-a Устанавливает комбинацию клавиш для клавиши префикса.
set -sg escape-time n Устанавливает время (в миллисекундах) tmux ожидает нажатия клавиши после нажатия Prefix.
set -g base-index 1 Устанавливает базовый индекс для окон на 1 вместо 0.
setw -g pane-base-index 1 Устанавливает базовый индекс для панелей равным 1 вместо 0.
source-file [file] Загружает файл конфигурации. Используйте это, чтобы перезагрузить существующую конфигурацию или ввести дополнительные параметры конфигурации позже.
bind C-a send-prefix Настраивает tmux для отправки префикса при нажатии комбинации Prefix два раза подряд.
bind-key [key] [command] Создает привязку клавиш, которая выполняет указанную команду. Можно соратить до bind.
bind-key -r [key] [command] Создает повторяемую привязку клавиш, то есть вам нужно только один раз нажать клавишу Prefix, а затем вы можете нажимать назначенную клавишу несколько раз. Это полезно для команд, в которых вы хотите циклически перемещаться по элементам или изменять размер панелей. Можно соратить до bind.
unbind-key [key] Удаляет определенную привязку клавиш, чтобы ее можно было привязать к другой команде. Можно сократить до unbind.
display-message или display Отображает данный текст в статусном сообщении.
set-option [flags] [option] [value] Устанавливает параметры сеансов. Использование флага -g устанавливает параметр для всех сеансов.
set-window-option [option] [value] Устанавливает параметры для окон, например уведомления о действиях, перемещение курсора или другие элементы, связанные с окнами и панелями.
set -a Добавляет значения к существующим параметрам, а не заменяет значение параметра.
set -g mouse off Отключает поддержку мыши в tmux. Установите в on, если хотите использовать мышь.
set -g default-terminal "screen-256color" Определяет тип терминала для окон. Устанавливает значение TERM, которое будут использовать другие программы. screen-256color обеспечивает широчайшую совместимость с программами, изначально написанными для программы screen.

Команды для управления внешним видом tmux

Команда Описание
set -g status-style Устанавливает цвет переднего плана и фона для строки состояния. В дополнение к цветам поддерживает параметры dim, bright (или bold), reverse и blink.
Пример: set -g status-style fg=white,bold,bg=black
setw -g window-status-style Устанавливает цвет переднего плана и фона списка окон в строке состояния. Использует такие же параметры, как и status-style.
setw -g window-status-current-style Устанавливает цвет переднего плана и фона активного окна в списке окон в строке состояния. Использует такие же параметры, как и status-style.
setw -g window-status-activity-style Устанавливает цвет переднего плана и фона любого окна с фоновой активностью. Использует такие же параметры, как и status-style.
setw -g pane-border-style Устанавливает цвет переднего плана и фона границ панели. Использует такие же параметры, как и status-style.
setw -g pane-active-border-style Устанавливает цвет переднего плана и фона для границы активной панели. Использует такие же параметры, как и status-style.
setw -g window-style Устанавливает цвет переднего плана и фона окна. Использует такие же параметры, как и status-style.
setw -g window-active-style Устанавливает цвет переднего плана и фона активного окна. Использует такие же параметры, как и status-style.
setw -g message-style Устанавливает цвет переднего плана и фона области сообщения и командной строки tmux. Использует такие же параметры, как и status-style.
set -g status-length-left и
set -g status-length-right
Управляет количеством видимых символов в левой и правой частях строки состояния.
set -g status-left и
set -g status-right
Настраивает элементы, которые отображаются в левой и правой частях строки состояния.
set -g status-interval n Определяет интервал обновления для строки состояния, где n - количество секунд между обновлениями.
set -g status-justify centre Центрирует список окон в строке состояния.
setw -g monitor-activity on Ищет активность в других окнах и выделяет имя окна с фоновой активностью.
set -g visual-activity on Отображает сообщение в области сообщений, когда есть активность в другом окне.

Глава 3
Создание сценариев для настраиваемых сред tmux

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

Представьте, что вы можете прийти на свою рабочую станцию, готовый взяться за эту новую функцию, и иметь возможность чтобы запустить каждую из этих программ, каждую в своей панели или окне в одном сеансе tmux, с помощью одной команды. Мы можем использовать модель клиент-сервер tmux для создания настраиваемых сценариев, которые автоматически создают нашу среду разработки, разделяют окна и запускают программы. Сначала мы рассмотрим, как это сделать вручную, а затем рассмотрим более продвинутые автоматические инструменты.

Создание пользовательской настройки с помощью команд tmux

Мы уже изучили, как мы используем команду tmux для создания новых сеансов tmux, но команда tmux принимает много других параметров. Мы можем взять существующий сеанс и разделить его окна на панели, изменить размещение или даже запустить приложения в рамках сеанса.

Ключ к этому - параметр -t или «target». Когда у вас есть именованный сеанс tmux, вы можете присоединиться к нему следующим образом:

$ tmux attach -t [session_name]

Вы можете использовать этот целевой переключатель, чтобы направить команду tmux в соответствующий сеанс tmux. Создайте новый сеанс tmux под названием «development», например:

$ tmux new-session -s development

Затем отключитесь от сеанса с помощью Prefix d. Даже если вы больше не подключены, вы можете разделить окно в сеансе tmux по горизонтали, выполнив эту команду:

$ tmux split-window -h -t development

Когда вы снова подключитесь к сеансу, окно разделится на две панели. Присоединяйтесь к сеансу еще раз, чтобы убедиться в этом.

$ tmux attach -t development

Фактически, вам даже не нужно отключаться от сеанса tmux для отправки команд. Вы можете открыть другой терминал и снова разделить окно, но на этот раз с вертикальным разделением. Попробуйте сами. Откройте второе окно или вкладку терминала и введите эту команду:

$ tmux split-window -v -t development

Используя этот подход, вы можете легко настроить свою среду. Давайте исследуем эту концепцию, создав собственную среду разработки.

Создание сценария для конфигурации проекта

В главе 1, Изучение основ, мы обсудили команды tmux, такие как new-session и new-window. Давайте напишем простой скрипт с использованием этих и подобных команд, который создает новый сеанс tmux и создает окно с парой панелей и два дополнительных окна с одной панелью каждое. В довершение всего, мы запустим приложения на каждой из панелей.

Начнем с создания нового скрипта под названием development в нашем домашнем каталоге. Мы сделаем этот скрипт исполняемым, поэтому мы сможем запускать его как любую другую исполняемую программу из нашей оболочки. Выполните эти команды в своем терминале:

$ touch ~/development
$ chmod +x ~/development

Когда мы запускаем наш сеанс, мы хотим перейти в каталог для нашего проекта. Мы назовем этот каталог devproject. И прежде чем мы сможем перейти в этот каталог, нам лучше сначала его создать.

$ mkdir ~/devproject

Теперь откройте скрипт ~/development в текстовом редакторе и добавьте эту строку, чтобы создать новый сеанс tmux под названием «development»:

scripting/development
tmux new-session -s development -n editor -d

Мы передаем пару дополнительных параметров при создании этого нового сеанса. Сначала мы создаем этот сеанс и называем его с помощью ключа -s, как и раньше. Затем мы даем начальному окну имя «editor», а затем немедленно отключаемся от этого нового сеанса с помощью ключа -d.

Затем добавьте строку в нашу конфигурацию, которая использует команду send-keys для изменения текущего каталога на тот, который мы используем для нашего проекта:

tmux send-keys -t development 'cd ~/devproject' C-m

Мы размещаем C-m в конце строки для отправки последовательности возврата каретки (Carriage Return), представленной Ctrl-M. Так мы говорим tmux нажать клавишу Enter.

Мы будем использовать тот же подход, чтобы открыть текстовый редактор Vim в этом окне. Добавьте эту строку в свой скрипт:

tmux send-keys -t development 'vim' C-m

С помощью этих трех команд мы создали новый сеанс, перешли в каталог и открыли текстовый редактор, но наша среда еще не завершена. Давайте разделим главное окно редактора так, чтобы внизу было небольшое окно терминала. Мы делаем это с помощью команды split-window. Добавьте эту строку в свой скрипт:

tmux split-window -v -t development

Это разделит главное окно пополам по горизонтали. Вы могли указать процент, используя что-то типа

tmux split-window -v -p 10 -t development

но пока просто оставьте команду split-window как есть, а затем выберите одно из размещений tmux по умолчанию - main-horizontal - добавив это в свой сценарий:

tmux select-layout -t development main-horizontal

Мы создали наше первое окно и разделили его на две панели, но нижняя панель должна открываться в папке проекта. Мы уже знаем, как мы отправляем команды экземплярам tmux, но теперь нам нужно нацелить эти команды на определенные панели и окна.

Ориентация на определенные панели и окна

С такими командами, как send-keys, вы можете указать не только целевой сеанс, но также целевое окно и панель. В файле конфигурации, который вы создали в главе 2, Настройка tmux, вы указали base-index в 1. Это означает, что нумерация окон начинается с 1. Этот базовый индекс не влияет на панели, поэтому вы также устанавливаете pane-base-index в 1. В нашем случае у нас есть две панели в нашей текущей настройке, как в следующем примере:

------------------
|                |
|    Панель 1    |
|                |
------------------
|                |
|    Панель 2    |
|                |
------------------

У нас есть текстовый редактор Vim, открытый на панели 1, и мы хотим отправить команду на панель 2, которая изменяет каталог нашего проекта. Мы нацелены на панель, используя формат [session]:[window].[pane], поэтому для таргетинга на панель 2 мы будем использовать development:1.2. Итак, добавьте эту строку в свой скрипт, и вы получите именно то, что хотите:

tmux send-keys -t development:1.2 'cd ~/devproject' C-m

Мы почти на месте. Давайте закончим эту настройку, добавив в сеанс еще пару окон.

Создание и выбор окон

Нам нужно второе окно в нашем сеансе, которое будет полноэкранной консолью. Мы можем создать это новое окно, используя команду new-window. Добавьте эти строки в свой скрипт:

tmux new-window -n console -t development
tmux send-keys -t development:2 'cd ~/devproject' C-m

После создания окна мы используем send-keys чтобы еще раз перейти в каталог нашего проекта. В нашем новом окне есть только одна панель, поэтому нам нужно указать только номер окна в целевом окне.

Когда мы запускаем наш сеанс, мы хотим, чтобы отображалось наше первое окно, и мы делаем это с помощью команды select-window:

tmux select-window -t development:1
tmux attach -t development

Мы могли бы продолжить добавление к этому сценарию, создание дополнительных окон и панелей, запуск удаленных подключений к нашим серверам, отслеживание файлов журналов, подключение к консолям баз данных или даже выполнение команд, которые загружают последнюю версию нашего кода, когда мы начинаем работать. Но мы остановимся здесь и просто завершим наш скрипт, наконец, подключившись к сеансу, чтобы он появился на экране и был готов к работе. Весь наш скрипт выглядит так:

tmux new-session -s development -n editor -d
tmux send-keys -t development 'cd ~/devproject' C-m
tmux send-keys -t development 'vim' C-m
tmux split-window -v -t development
tmux select -layout -t development main-horizontal
tmux send-keys -t development:1.2 'cd ~/devproject' C-m
tmux new-window -n console -t development
tmux send-keys -t development:2 'cd ~/devproject' C-m
tmux select -window -t development:1
tmux attach -t development

Когда вы запускаете его с

$ ~/development

ваше окружение будет выглядеть так:

Среда для разработки в tmux

Одним из недостатков этого подхода является то, что этот сценарий создает совершенно новый сеанс. Он не будет работать должным образом, если вы запустите его второй раз, пока сеанс development уже запущен. Вы можете изменить сценарий, чтобы проверить, существует ли уже сессия с таким именем, используя команду tmux has-session и создать сессию, только если ее еще не существует, например:

scripting/reattach/development
tmux has-session -t development
if [ $? != 0 ]
then
    tmux new-session -s development -n editor -d
    tmux send-keys -t development  'cd ~/devproject' C-m
    tmux send-keys -t development  'vim' C-m
    tmux split-window -v -t development
    tmux  select-layout -t development main-horizontal
    tmux send-keys -t development:1.2  'cd ~/devproject' C-m
    tmux new-window -n console -t development
    tmux send-keys -t development:2  'cd ~/devproject' C-m
    tmux  select-window -t development:1
fi
tmux attach -t development

Этот подход хорошо работает для настройки одного проекта. Вы можете изменить это дальше, используя переменную для имени проекта, чтобы сделать сценарий более универсальным, но давайте рассмотрим еще пару способов, которыми мы можем настроить вещи для управления несколькими проектами.

Использование конфигурации tmux для установки

В .tmux.conf сам файл может включать команды, которые устанавливают среду по умолчанию. Если вы хотите, чтобы каждый сеанс tmux запускался в одной и той же папке по умолчанию или автоматически открывал разделенное окно, вы можете запечь его прямо в конфигурации по умолчанию, просто используя соответствующие команды.

Но вы также можете указать файл конфигурации при запуске экземпляра tmux, используя флаг -f. Таким образом, вам не нужно изменять исходный файл конфигурации по умолчанию, и вы можете проверить файл конфигурации с исходным кодом вашего проекта. Вы также можете настроить собственные параметры конфигурации для каждого проекта, такие как новые сочетания клавиш для запуска команд или запуска набора тестов.

Давайте попробуем это. Создайте новый файл с именем app.conf.

$ touch app.conf

Внутри этого файла вы можете использовать те же команды, о которых вы только что узнали в предыдущем разделе, но поскольку вы находитесь внутри файла конфигурации, а не сценария оболочки, вам не нужно явно указывать перед каждой командой префикс tmux. Добавьте этот код в свой app.conf файл:

scripting/app.conf
source-file ~/.tmux.conf
new-session -s development -n editor -d
send-keys -t development 'cd ~/devproject' C-m
send-keys -t development 'vim' C-m
split-window -v -t development
select-layout -t development main-horizontal
send-keys -t development:1.2 'cd ~/devproject' C-m
new-window -n console -t development
send-keys -t development:2 'cd ~/devproject' C-m
select-window -t development:1

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

Чтобы использовать этот файл конфигурации, передайте -f флаг, за которым следует путь к файлу конфигурации. Вы также должны запустить tmux с командой attach, например:

$ tmux -f app.conf attach

Это потому, что по умолчанию tmux всегда вызывает команду new-session при запуске. Этот файл уже создает новый сеанс, поэтому у вас будет два запущенных сеанса tmux, если вы остановились на attach.

Такой подход дает вам большую гибкость, но вы можете получить еще больше, используя инструмент командной строки под названием tmuxinator.

Управление конфигурацией с помощью tmuxinator

tmuxinator - это простой инструмент, который вы можете использовать для определения и управления различными конфигурациями tmux. Вы определяете расположение окон и команды в простом формате YAML, а затем запускаете их командой tmuxinator. В отличие от других подходов, tmuxinator предлагает центральное расположение для ваших конфигураций и гораздо более простой диалект для создания сложных макетов. Он также позволяет вам указывать команды, которые всегда должны выполняться перед созданием каждого окна.

tmuxinator требует наличия интерпретатора Ruby, поэтому он должен быть в вашей системе. У пользователей Mac OS X уже установлен Ruby, а пользователи Linux обычно могут установить Ruby через диспетчер пакетов. Однако, если вы планируете использовать Ruby для чего-либо, помимо tmuxinator, я настоятельно рекомендую вам установить Ruby через RVM, следуя инструкциям на веб-сайте RVM.

Установите tmuxinator с помощью Rubygems, системы управления пакетами для Ruby.

$ gem install tmuxinator

Если вы не используете RVM, вам нужно будет запустить его как root или с командой sudo.

tmuxinator нуждается в установке переменной среды оболочки $EDITOR, поэтому, если вы ее еще не установили, нужно сделать это в файле .bashrc в Linux или .bash_profile в OS X. Например, чтобы определить Vim как редактор по умолчанию, вы должны добавить эту строку в свою конфигурацию Bash:

export EDITOR=vim

Теперь мы можем создать новый проект tmuxinator. Назовем это «development». Выполните эту команду:

$ tmuxinator open development

Откроется редактор, который вы назначили переменной среды $EDITOR и отобразит конфигурацию проекта по умолчанию, которая выглядит следующим образом:

scripting/default.yaml
# ~/.tmuxinator/development.yml

name: development
root: ~/

# a bunch of comments...

windows:
  - editor:
    layout: main-vertical
    panes:
      - vim
      - guard
  - server: bundle exec rails s
  - logs: tail -f log/development.log

Это окружение, которое может по достоинству оценить разработчик Ruby on Rails, работающий с Git. Оно создает сеанс tmux с тремя окнами. Первое окно разделено на две панели с помощью схемы расположения main-vertical. Левая панель открывает Vim, а правая - Guard, Ruby-программу, которая отслеживает изменения в файлах и выполняет задачи, такие как средства запуска тестов. Второе окно запускает встроенный веб-сервер Rails, а третье окно использует команда tail для отслеживания файла журнала разработки приложения.

Как видите, tmuxinator упрощает определение не только окон и панелей, но и того, какие команды мы хотим выполнять в каждом из них. Давайте используем Tmuxinator для создания нашей среды разработки, с Vim на верхней панели и терминалом внизу, начиная с папки ~/devproject. Удалите содержимое этого файла и замените его следующим кодом:

scripting/development.yaml
name: development
root: ~/devproject
windows:
  - editor:
    layout: main-horizontal
    panes:
      - vim
      - #empty, will just run plain bash
  - console: # empty

Формат файла yml использует два пробела для отступа, поэтому очень важно убедиться, что вы правильно форматируете файл и случайно не используете табуляции при записи файла.

Чтобы запустить новую среду, сохраните файл конфигурации и затем выполните следующую команду:

$ tmuxinator development

tmuxinator автоматически загружает ваш оригинал файла .tmux.conf, применяет настройки, а затем размещает окна и панели, как вы указали. Если вы хотите внести больше изменений в свою среду, просто используйте

$ tmuxinator open development

снова и отредактируйте конфигурацию.

По умолчанию файлы конфигурации для tmuxinator находятся в ~/.tmuxinator/, так что вы можете найти их и создать резервную копию или поделиться ими с другими.

Под капотом tmuxinator просто создает сценарий, который выполняет отдельные команды tmux точно так же, как это делали мы, когда писали собственный сценарий. Однако это более приятный синтаксис, которому довольно легко следовать. Однако для этого требуется интерпретатор Ruby на вашем компьютере, поэтому его можно не настраивать для каждой среды, в которой вы хотели бы использовать tmux. Однако вы можете использовать Tmuxinator для создания конфигурации, которую можно использовать где угодно. Команда tmuxinator debug может отображать сценарий, который будет использовать Tmuxinator:

$ tmuxinator debug development

Вот как выглядит результат:

#!/bin/bash

# Clear rbenv variables before starting tmux
unset RBENV_VERSION
unset RBENV_DIR

tmux start-server;
    cd /home/brianhogan/devproject
    # Run pre command.

    # Create the session and the first window. Manually switch to root
    # directory if required to support tmux < 1.9
    TMUX= tmux new-session -d -s development -n editor
    tmux send-keys -t development:1 cd \ /home/brianhogan/devproject C-m

    # Create other windows.
    tmux new-window -t development:2 -n console

    # Window "editor"
    tmux send-keys -t development:1.1 vim C-m

    tmux splitw -c /home/brianhogan/devproject -t development:1
    tmux  select-layout -t development:1 tiled

    tmux  select-layout -t development:1 tiled

    tmux  select-layout -t development:1 main-horizontal
    tmux  select-pane -t development:1.1

    # Window "console"

    tmux  select-window -t 1

    if[ -z  " $TMUX "  ];  then
        tmux -u attach-session -t development
    else
        tmux -u switch-client -t development
    fi

Вы можете сохранить вывод tmuxinator debug в скрипт, который можно запустить на любой машине. Вы также можете использовать эту опцию для устранения любых проблем, которые могут возникнуть при разработке файла конфигурации.

Что дальше?

Вы можете использовать каждую команду tmux через оболочку, что означает, что вы можете писать сценарии для автоматизации почти всех аспектов tmux, включая запуск сеансов. Например, вы можете создать привязку клавиатуры, которая является источником сценария оболочки, который разделяет текущее окно на две панели и регистрирует вас на рабочем веб-сервере и сервере базы данных.

Мы уже многое рассмотрели. Вы знаете, как настраивать проекты, перемещать панели и окна, а также запускать консоли. Вы достаточно повозились со своей конфигурацией, чтобы понять, как настраивать вещи по своему вкусу. И вы экспериментировали с тремя разными способами написания сценария для вашей среды tmux. Но когда вы начнете интегрировать tmux в свой рабочий процесс, вы начнете замечать некоторые новые проблемы. Например, результаты тестов или журналы приложений начинают прокручиваться за пределы экрана, и вы захотите прокрутить вверх, чтобы что-то прочитать. И вы, вероятно, захотите копировать и вставлять текст между панелями, окнами или другими приложениями. Итак, давайте теперь узнаем, как работать с буферами вывода tmux.

Для дальнейшего использования

Скриптовые команды tmux

Команда Описание
tmux new-session -s development -n editor Создает сеанс с именем «development» и называет первое окно «editor».
tmux attach -t development Присоединяется к сеансу под названием «development».
tmux send-keys -t development '[keys]' C-m Отправляет нажатия клавиш в активное окно или панель сеанса «development». C-m эквивалентно нажатию клавиши Enter.
tmux send-keys -t development:1.1 '[keys]' C-m Отправляет нажатия клавиш в первое окно сеанса «development» и первую панель, при условии, что индексы окон и панелей установлены на 1. C-m эквивалентно нажатию клавиши Enter.
tmux select-window -t development:1 Выбирает первое окно «development», делая его активным окном.
tmux split-window -v -p 10 -t development Разбивает текущее окно в сеансе «development» по вертикали, разделяя его пополам по горизонтали и устанавливает его высоту в 10% от общего размера окна.
tmux select-layout -t development main-horizontal Задает формат для сессии «development» main-horizontal.
tmux source-file [file] Загружает указанный конфигурационный файл tmux.
tmux -f app.conf attach Загружает конфигурационный файл app.conf и присоединяется к сеансу, созданному в файле app.conf.

Команды tmuxinator

Команда Описание
tmuxinator open [name] Открывает файл конфигурации для проекта name в текстовом редакторе по умолчанию. Создает конфигурацию, если она не существует.
tmuxinator [name] Загружает сеанс tmux для данного проекта. Создает сеанс из содержимого файла конфигурации проекта, если сеанс в настоящее время не существует, или присоединяется к сеансу.
tmuxinator list Список всех текущих проектов.
tmuxinator copy [source] [destination] Копирует конфигурацию проекта.
tmuxinator delete [name] Удаляет указанный проект.
tmuxinator implode Удаляет все текущие проекты.
tmuxinator doctor Ищет проблемы с tmuxinator и конфигурацией системы.
tmuxinator debug Показывает сценарий, который будет запускать tmuxinator, помогая вам выяснить, что происходит не так.

Глава 4
Работа с текстом и буферами

В течение обычного дня вы будете копировать и вставлять текст больше раз, чем это возможно отследить. Когда вы работаете с tmux, вы в конечном итоге дойдете до точки, когда вам нужно будет прокрутить назад выходной буфер терминала, чтобы увидеть что-то, что прокручивается за пределы экрана. Вам также может потребоваться скопировать текст и вставить его в файл или в другую программу. Эта глава посвящена тому, как управлять текстом внутри ваших сессий. Вы увидите, как использовать клавиатуру для прокрутки буфера вывода tmux, как работать с несколькими буферами вставки и как работать с системной панелью.

Прокрутка вывода в режиме копирования

Когда вы работаете с программами в терминале, часто вывод этих программ прокручивается за пределы экрана. Но когда вы используете tmux, вы можете использовать клавиатуру для перемещения назад по буферу вывода, чтобы видеть, что вы пропустили. Это особенно полезно в тех случаях, когда вы запускаете тесты или просматриваете файлы журналов, и вы не можете просто полагаться на команду less или в свой текстовый редактор.

Нажатие Prefix [ переводит вас в режим копирования. Затем вы можете использовать клавиши перемещения для перемещения курсора по экрану. По умолчанию клавиши со стрелками работают. Но в главе 2, Настройка tmux, вы настроили tmux для использования шорткатов Vim для перемещения между окнами и изменения размеров панелей, чтобы вам не приходилось убирать руки с домашнего ряда. tmux имеет vi режим работы также с буфером. Чтобы включить его, добавьте эту строку в .tmux.conf:

config/tmux.conf
# Enable vi keys
setw -g mode-keys vi

С этим набором параметров вы можете использовать h, j, k, а также l для перемещения вашего буфера.

Чтобы выйти из режима копирования, нажмите кнопку Enter. Передвигаться по одному символу за раз не очень эффективно. Поскольку вы включили режим vi, вы также можете использовать некоторые другие видимые ярлыки для перемещения по буферу.

Например, вы можете использовать w, чтобы перейти к следующему слову и b, чтобы вернуться на одно слово назад. И вы можете использовать f, за которым следует любой символ, чтобы перейти вперед к этому символу в этой же строке, и F, чтобы перейти к этому символу по строке назад.

Быстрое перемещение через буфер

Когда у вас есть несколько страниц буферизованного вывода, перемещение курсора для прокрутки не будет таким полезным. Вместо того чтобы перемещать слово за словом или символ за символом, вы можете прокручивать буфер страницу за страницей или переходить к началу или концу буфера.

Вы можете перейти на одну страницу вверх с помощью Ctrl+b и вниз на одну страницу с помощью Ctrl+f. Вы можете полностью перейти к началу истории буфера с помощью g, а затем прыгните вниз с помощью G.

Поиск в буфере

Вам не нужно просматривать сотни строк контента страницу за страницей, если вы знаете, что ищете. Нажимая ? в режиме копирования вы можете искать фразы или ключевые слова вверх. Просто нажмите ?, введите поисковую фразу и нажмите Enter для перехода к первому вхождению фразы. Затем нажмите n, чтобы перейти к следующему вхождению или N, чтобы перейти к предыдущему.

Для поиска вниз нажмите / вместо ?. Затем нажатие n совершает переход к следующему вхождению, и N - к предыдущему.

Если вы научитесь перемещаться по буферу таким образом, это значительно ускорит вас. Вместо использования стрелок для перемещения быстрее вводить слово, к которому вы хотите перейти, особенно если вы просматриваете вывод файлов журнала.

Теперь давайте посмотрим, как скопировать текст из одной панели и вставить его в другую. В конце концов, это режим копирования.

Копирование и вставка текста

Перемещение и поиск вещей в выходном буфере - это обычно только половина уравнения. Нам часто нужно скопировать какой-то текст, чтобы мы могли сделать с ним что-нибудь полезное. Режим копирования tmux дает нам возможность выделять и копировать текст в буфер вставки, чтобы мы могли выгружать этот текст в другом месте.

Чтобы скопировать текст, войдите в режим копирования и переместите курсор туда, где вы хотите начать выделение текста. Затем нажмите Space и переместите курсор в конец текста. Когда вы нажмете Enter, выделенный текст будет скопирован в буфер вставки.

Чтобы вставить только что записанное содержимое, нажмите Prefix ].

Давайте рассмотрим несколько способов скопировать и вставить текст из основного выходного буфера.

Захват панели

tmux имеет удобный шорткат, который копирует все видимое содержимое панели в буфер вставки. Войдите в командный режим tmux с помощью Prefix : и введите

capture-pane

Содержимое панели будет помещено в буфер вставки. Затем вы можете вставить это содержимое в другую панель или окно, нажав Prefix ].

Отображение и сохранение буфера

Вы можете отобразить содержимое буфера вставки, используя команду show-buffer в командном режиме или из сеанса терминала с помощью

$ tmux show-buffer

Однако, используя save-buffer, вы можете сохранить буфер в файл, что часто помогает сэкономить время. Фактически, вы можете сохранить содержимое текущей панели в текстовый файл.

В командном режиме выполните команду capture-pane; save-buffer buffer.txt. Вы можете легко сопоставить эту команду с нажатием клавиши, если хотите.

Использование нескольких буферов вставки

tmux поддерживает стек буферов вставки, что означает, что вы можете копировать текст, не заменяя существующее содержимое буфера. Это намного более гибко, чем традиционный буфер обмена, предлагаемый операционной системой.

Каждый раз, когда вы копируете новый текст, tmux создает новый буфер вставки, помещая новый буфер в верхнюю часть стека. Для демонстрации запустите новый сеанс tmux и загрузите текстовый редактор, такой как Vim или Nano. В редакторе введите следующие предложения, по одному в строке:

First sentence is first.
Next sentence is next.
Last sentence is last.

Теперь скопируйте текст в буфер вставки с помощью tmux. Войдите в режим копирования с помощью Prefix [. Перейти к началу первого предложения, нажмите Space, чтобы начать выделение текста, перейдите к концу первого предложения и нажмите Enter, чтобы скопировать выделение. Повторите это со вторым и третьим предложениями.

Каждый раз, когда вы копировали текст, tmux создавал новый буфер. Вы можете увидеть эти буферы командой list-buffers.

0: 22 bytes: "Last sentence is last."
1: 22 bytes: "Next sentence is next."
2: 24 bytes: "First sentence is first."

Нажатие Prefix ] всегда вставляет буфер 0, но вы можете выполнить команду choose-buffer, чтобы выбрать буфер и вставить его содержимое в область с фокусом.

Разделите текущее окно пополам и запустите Nano на второй панели, затем войдите в командный режим и введите следующее:

choose-buffer

Вам будет представлен список, который выглядит так:

Список буферов в tmux

Вы можете выбрать любую запись в списке, нажмите Enter, и текст будет вставлен в выбранную панель.

Это отличный способ управлять несколькими кусками текста, особенно в текстовых средах, где у вас нет доступа к буферу обмена на уровне ОС.

Эти буферы используются совместно во всех запущенных сессиях tmux, так что вы можете взять контент из одного сеанса и вставить его в другой.

Переназначение ключей копирования и вставки

Если вы используете Vim и хотите сделать клавиши управления копированием и вставкой более знакомыми, вы можете переназначить их в своей конфигурации. Например, вы можете использовать Prefix Escape для входа в режим копирования, затем использовать v, чтобы запустить визуальный режим для выделения текста, y,чтобы «скопировать» текст в буфер и p, чтобы вставить:

bind Escape copy-mode
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
unbind p
bind p paste-buffer

Это может быть реальным повышением производительности, если вам случится много копировать и вставлять между окнами и панелями и вы уже хорошо знакомы с клавишами Vim.

Работа с буфером обмена в Linux

Используя утилиту xclip, вы можете интегрировать свои буферы с системной панелью Linux, чтобы упростить копирование и вставку между программами.

Сначала вам нужно установить xclip. В Ubuntu используйте эту команду:

$ sudo apt-get install xclip

Затем мы используем команды save-buffer и set-buffer с xclip.

Чтобы скопировать текущий буфер в системную панель, мы добавляем эту команду в наш .tmux.conf файл:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"

Это настраивает шорткат Prefix Ctrl+c так, чтобы он передавал текущий буфер в xclip.

Итак, вы входите в режим копирования, выделяете свой текст, нажимаете y, а затем нажмимаете Prefix Ctrl+c, чтобы поместить текст в буфер обмена. Вы можете ускорить процесс, привязав клавишу y для отправки вывода на xclip напрямую:

bind -t vi-copy y copy-pipe "xclip -sel clip -i"

Теперь текст, который вы выделите и скопируете в режиме копирования, будет в вашем системном буфере.

Чтобы вставить текст из системного буфера в сессию tmux, добавьте эту строку в свою конфигурацию:

bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

Это настраивает tmux для извлечения содержимого из xclip в новый буфер tmux, а затем вставляет его в выбранное окно или панель tmux, когда вы нажимаете Prefix Ctrl+c.

Использование команд буфера обмена OS X

Если вы пользователь Mac, возможно, вы знакомы с утилитами командной строки буфера обмена OS X pbcopy и pbpaste. Эти простые утилиты позволяют легко работать с буфером обмена. Команда pbcopy записывает текст в системный клипборд, а Команда pbpaste вставляет содержимое. Например, вы можете использовать pbcopy и cat вместе, чтобы легко собрать содержимое вашего файла .tmux.conf в буфер обмена, чтобы вы могли вставить его в электронное письмо или в Интернете, например:

$ cat ~/.tmux.conf | pbcopy

Это довольно удобный способ работы с текстом, но tmux не имеет доступа к этим утилитам, поэтому мы не можем использовать их во время работы внутри сеанса tmux. Мы можем использовать программу-оболочку, написанную Крисом Джонсеном, чтобы обойти это ограничение.

Чтобы использовать этот сценарий оболочки, мы сначала устанавливаем сценарий с помощью Homebrew. Хотя вы можете установить это из исходного кода, использование Homebrew упрощает процесс:

$ brew install reattach-to-user-namespace

Затем настройте tmux для использования оболочки, добавив эту строку в свой .tmux.conf:

set -g default-command "reattach-to-user-namespace -l /bin/bash"

Это настраивает команду по умолчанию, которую tmux использует для новых окон, поэтому она загружает оболочку Bash через сценарий оболочки. Если вы используете оболочку, отличную от Bash, например Fish или zsh, вы должны вместо этого указать ее путь или команду.

После перезагрузки файла конфигурации вы сможете снова использовать команду pbcopy. И в качестве дополнительного бонуса вы можете отправить содержимое текущего буфера tmux в системный буфер:

$ tmux show-buffer | pbcopy

Или вы можете вставить содержимое буфера обмена следующим образом:

$ tmux set-buffer $(pbpaste); tmux paste-buffer

Это означает, что вы также можете создавать для этого сочетания клавиш, как и в разделе Работа с буфером обмена в Linux. К сожалению, программа-оболочка, которую мы используем, не работает с командой run из tmux. Обходной путь - явный префикс pbpaste и pbcopy с помощью сценария-оболочки. Итак, чтобы поддержать копирование буфера в системный буфер, добавьте эту строку в свой файл .tmux.conf:

bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"

Как и в случае с Linux, вы также можете настроить режим копирования tmux для отправки копируемого текста непосредственно в системный буфер, добавив эту привязку клавиш к вашей конфигурации:

bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Теперь, когда вы выделяете текст в режиме копирования и нажимаете y, текст будет отправлен на pbcopy и будет в вашем системном буфере, готовый для использования в других программах.

Чтобы поддерживать вставку из системного буфера, мы бы добавили эту более длинную команду, которая должна быть вся в одной строке.

bind C-v run \
"tmux set-buffer \"$(reattach-to-user-namespace pbpaste)\"; tmux paste-buffer"

Это обеспечивает простое решение довольно сложной проблемы.

Что дальше?

Используя буферы вставки tmux для перемещения текста, вы получаете возможность иметь буфер обмена в ситуациях, когда у вас его может не быть, например, когда вы вошли в консоль сервера или без графического терминала. Возможность прокручивать назад историю длинного вывода на консоль может быть огромной помощью. Только по этой причине стоит установить tmux прямо на ваши серверы.

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

Для дальнейшего использования

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

Prefix [
Переход в режим копирования.
Prefix ]
Вставляет текущее содержимое буфера.
Prefix =
Выводит список всех буферов вставки и вставляет содержимое выбранного буфера.

Клавиши перемещения в режиме копирования (режим vi)

h, j, k, l
Перемещает курсор влево, вниз, вверх и вправо соответственно.
w
Перемещает курсор вперед на одно слово за раз.
b
Перемещает курсор назад на одно слово за раз.
f за которым следует любой символ
Переход к следующему вхождению указанного символа.
F за которым следует любой символ
Переход к предыдущему вхождению указанного символа.
Ctrl+b
Прокручивает одну страницу вверх.
Ctrl+f
Прокручивает одну страницу вниз.
g
Переход к началу буфера.
G
Переход к нижней части буфера.
?
Начинает поиск в обратном направлении по буферу.
/
Начинает поиск вперед по буферу.

Команды

show-buffer
Отображает текущее содержимое буфера.
capture-pane
Захватывает видимое содержимое выбранной панели в новый буфер.
list-buffers
Список всех буферов вставки.
choose-buffer
Показывает буферы вставки и вставляет содержимое выбранного вами.
save-buffer [filename]
Сохраняет содержимое буфера в указанный файл.

Глава 5
Парное программирование с tmux

До сих пор вы вносили изменения в конфигурацию и учились работать с tmux на своей собственной машине. Но одно из самых популярных применений tmux разработчиками - парное программирование. На самом деле это было мое первое знакомство с tmux, и я сразу увидел потенциал, когда мой друг познакомил меня с его различными функциями.

Парное программирование имеет много преимуществ. Работа с другим разработчиком может помочь вам увидеть вещи, которые вы, возможно, не видели сами, но если вы физически не находитесь в одном месте, парное программирование может быть несколько сложным. Совместное использование экрана через iChat, Skype или даже GoToMeeting занимает много полосы пропускания и может быть изворотливым, когда вы не используете лучшее сетевое соединение. В этой главе мы рассмотрим использование tmux для парного программирования, чтобы вы могли удаленно работать с другим разработчиком даже при самом медленном Wi-Fi-соединении в отеле.

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

У обоих этих методов есть недостаток безопасности: они позволяют кому-то другому видеть вещи на вашем экране и в вашей учетной записи. Вы приглашаете кого-то потенциально посмотреть ваши файлы. Чтобы обойти это, разумно использовать промежуточный сервер для сопряжения. Используя недорогой VPS или виртуальную машину с VirtualBox и Vagrant, вы можете быстро создать среду разработки для сопряжения. В этой главе мы будем работать с удаленным сервером, исследуя оба этих подхода.

Сопряжение с общей учетной записью

Использование общей учетной записи - самый простой способ работы с другим пользователем. Вкратце, вы включаете доступ по SSH на машине, которая будет выступать в качестве хоста, устанавливаете и настраиваете tmux на этой машине, а затем создаете там сессию tmux. Второй пользователь входит в систему с той же учетной записью и подключается к сеансу. Используя открытые ключи SSH, вы можете сделать процесс входа в систему несколько прозрачным. Давайте пройдемся по настройке. В этом примере мы будем использовать сервер с именем puzzles под управлением Ubuntu, на котором установлен демон SSH.

Сначала создайте на сервере пользователя «tmux». Это пользователь, которого все будут использовать для подключения к сеансу сопряжения. На удаленном сервере выполните эту команду:

tmux@puzzles:~$ adduser tmux

Мы хотим настроить учетную запись, чтобы мы могли брать ключи SSH от других разработчиков и использовать их для входа в эту учетную запись. Мы делаем это, создавая файл ~/.ssh/authorized_keys под пользователем tmux. Используйте команду su для переключения пользователя:

tmux@puzzles:~$ su tmux

Затем создайте папку .ssh и файл .ssh/authorized_keys, установив соответствующие разрешения. Только пользователю tmux должно быть разрешено читать, писать или запускать папку и файл.

tmux@puzzles:~$ mkdir ~/.ssh
tmux@puzzles:~$ touch ~/.ssh/authorized_keys
tmux@puzzles:~$ chmod 700 ~/.ssh
tmux@puzzles:~$ chmod 600 ~/.ssh/authorized_keys

Каждому пользователю, которого вы хотите подключить, нужен открытый ключ, который они сгенерируют на своем локальном компьютере. Чтобы сгенерировать ключ, используйте команду

$ ssh-keygen

и следуйте подсказкам на экране.

Затем каждый пользователь должен передать свой открытый ключ на сервер и добавить его в файл authorized_keys. Есть несколько способов сделать это, но наиболее универсальный подход - использовать cat и ssh для передачи ключа и добавления его в authorized_keys, вот так:

$ cat ~/.ssh/id_rsa.pub | ssh tmux@your_server 'cat >> .ssh/authorized_keys'

Вам будет предложено ввести пароль пользователя tmux, прежде чем вы сможете подключиться.

Команда ssh-copy-id немного упрощает этот процесс. Если вы установите эту команду с помощью диспетчера пакетов на своем клиенте, вы можете передать ключ следующим образом:

$ ssh-copy-id tmux@your_server

Эта команда скопирует файл .id_rsa.pub автоматически.

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

Затем на удаленном сервере вы должны настроить tmux, текстовые редакторы, компиляторы, языки программирования и системы контроля версий, как и в любой другой среде разработки. Затем вы создаете новый сеанс tmux на сервере:

tmux@puzzles:~$ tmux new-session -s Pairing

Другой член вашей команды может войти на тот же компьютер и подключиться к сеансу следующим образом:

tmux@puzzles:~$ tmux attach -t Pairing

Затем вы можете совместно работать над проектом. Более того, вы можете отключиться от сеанса и подключиться к нему позже, что означает, что вы можете оставить свою среду работающей на несколько дней или даже недель. У вас будет постоянная среда разработки, в которую вы можете войти из любого места, где есть терминал с поддержкой SSH.

Использование общей учетной записи и сгруппированных сеансов

Когда два человека подключены к одному и тому же сеансу tmux, они обычно видят одно и то же и взаимодействуют с одними и теми же окнами. Но бывают случаи, когда полезно, если один человек может работать в другом окне, не принимая на себя полный контроль.

Это можно сделать с помощью «сгруппированных сеансов». Давайте продемонстрируем, создав новый сеанс на нашем удаленном сервере под названием groupedsession.

tmux@puzzles:~$ tmux new-session -s groupedsession

Затем вместо присоединения к сеансу другой пользователь может присоединиться к этому сеансу, создав новый сеанс, указав целевой объект исходного сеанса groupedsession, а затем указав свое собственное имя сеанса, например:

tmux@puzzles:~$ tmux new-session -t groupedsession -s mysession

Когда запускается второй сеанс, оба пользователя могут взаимодействовать с сеансом одновременно, как если бы второй пользователь подключился к сеансу. Однако пользователи могут создавать окна независимо друг от друга. Итак, если наш новый пользователь создает окно, вы оба увидите, что новое окно отображается в строке состояния, но вы останетесь в окне, в котором сейчас работаете! Это отлично подходит для моментов типа «Эй, позволь мне попробовать что-нибудь» или когда один человек хочет использовать Emacs, а другой предпочитает Vim:

Групповая работа в tmux

Второй пользователь может завершить сеанс с помощью kill-session, и оригинал все еще будет существовать. Однако оба сеанса будут убиты, если все окна будут закрыты, поэтому будьте осторожны!

Это большая работа, через которую нужно пройти, если вы просто хотите, чтобы кто-то вмешался и помог вам с кодом. Итак, давайте рассмотрим простую альтернативу, которая практически не требует времени на настройку.

Быстрое соединение с tmate

tmate - это форк tmux, призванный сделать парное программирование безболезненным. Используя tmate, вы можете быстро пригласить другого разработчика к сотрудничеству. Когда вы запускаете tmate, он генерирует адрес, который ваши партнеры могут использовать для установления соединения. Вам не нужно настраивать какие-либо ключи или использовать какие-либо промежуточные службы. Вместо этого серверы tmate обрабатывают туннелирование соединения за вас.

Загвоздка в том, что вам нужно установить tmate и использовать его вместо tmux. Но не волнуйтесь; он полностью поддерживает уже созданную вами конфигурацию. Давайте посмотрим, как его установить.

В Ubuntu вы можете установить его, добавив PPA tmate в свой менеджер пакетов:

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:tmate.io/archive
$ sudo apt-get update && sudo apt-get install tmate

На Mac вы можете установить его с помощью Homebrew:

$ brew install tmate

После установки tmate запустите его с помощью

$ tmate

и tmate запустится, отобразив адрес подключения в нижней части окна, где будет ваша строка состояния.

tmate

Скопируйте этот адрес и отправьте его своим партнерам, и они мгновенно присоединятся к вам. Если адрес исчезнет до того, как вы сможете его скопировать, или вы захотите увидеть его снова, выполните команду

$ tmate show-messages

чтобы снова просмотреть адрес вместе с некоторыми другими интересными деталями, включая адрес только для чтения, который вы можете отправить кому-то, если вы просто хотите что-то продемонстрировать и не хотите, чтобы у них был какой-либо контроль:

Sun Sep 25 17:46:13 2016 [tmate] Connecting to ssh.tmate.io...
Sun Sep 25 17:46:13 2016 [tmate] Note: clear your terminal before sharing readonly access
Sun Sep 25 17:46:13 2016 [tmate] web session read only: https://...
Sun Sep 25 17:46:13 2016 [tmate] ssh session read only: ssh ...
Sun Sep 25 17:46:13 2016 [tmate] web session: https://...
Sun Sep 25 17:46:13 2016 [tmate] ssh session: ssh ...

tmate поддерживает те же команды, что и tmux, поэтому вы можете создавать именованные сеансы и даже создавать сценарии для своих конфигураций. Вы даже можете использовать его с Tmuxinator, добавив следующее в свой YAML-файл Tmuxinator:

tmux_options: -S /tmp/your_project_name_tmate_socket
tmux_command: tmate

Поскольку tmate создает файл сокета со случайным именем, мы просто говорим ему не делать этого, передавая ключ -S. Затем мы говорим Tmuxinator, что он должен использовать tmate вместо того tmux.

Использование tmate с собственными серверами

Если вы чувствуете себя некомфортно, проходя через http://ssh.tmate.io для подключения к другим сеансам, вы можете найти инструкции по настройке собственного сервера на сайте tmate. Он предоставляет вам сервер, который вы компилируете и устанавливаете на своем собственном сервере Linux. Затем вы запускаете сервер и настраиваете клиентские машины для использования этого сервера вместо службы по умолчанию. Это может повысить безопасность, но вам стоит подумать о резервировании и доступности. Например, адрес tmate.io разрешается на несколько внутренних серверов, обеспечивая высокую доступность. Если вы хотите обеспечить непрерывность, вам нужно настроить свою среду аналогичным образом.

Использовать общие учетные записи или tmate легко, но не всегда желательно делиться учетными записями пользователей с членами команды или разрешать кому-то удаленный доступ к вашей машине разработки. Давайте посмотрим на альтернативный подход.

Сопряжение с отдельными учетными записями и сокетами

Используя поддержку сокетов tmux, вы можете создавать сеансы, к которым могут легко подключаться несколько пользователей.

Чтобы проверить это, создайте две новые учетные записи пользователей для сеанса: одну с именем «ted» и другую с именем «barney».

tmux@puzzles:~$ sudo adduser ted
tmux@puzzles:~$ sudo adduser barney

Затем создайте группу «tmux» и папку /var/tmux, в которой будут храниться общие сеансы.

tmux@puzzles:~$ sudo addgroup tmux
tmux@puzzles:~$ sudo mkdir /var/tmux

Затем измените группу папки /var/tmux, чтобы группа tmux имела к ней доступ:

tmux@puzzles:~$ sudo chgrp tmux /var/tmux

Затем измените разрешения для папки, чтобы новые файлы были доступны для всех участников группы tmux:

tmux@puzzles:~$ sudo chmod g+ws /var/tmux

Наконец, добавьте ted и barney в группу tmux.

tmux@puzzles:~$ sudo usermod -aG tmux ted
tmux@puzzles:~$ sudo usermod -aG tmux barney

Теперь давайте посмотрим, как эти пользователи могут работать вместе над проектом.

Создание и совместное использование сеансов

До сих пор вы использовали команду new-session для создания этих сеансов, но в ней используется расположение сокета по умолчанию, доступное не каждому пользователю. Вместо создания именованных сеансов мы создаем наши сеансы, используя параметр -S.

Войдите на свой сервер как ted и создайте новый сеанс tmux, используя файл сокета в папке /var/tmux/:

ted@puzzles:~$ tmux -S /var/tmux/pairing

В другом окне терминала войдите как barney а затем подключитесь к сеансу. Но вместо того, чтобы указывать цель с помощью параметра -t, укажите расположение файла сокета, например:

barney@puzzles:~$ tmux -S /var/tmux/pairing attach

Теперь пользователь barney подключается к сеансу tmux и видит все, что видит пользователь ted.

Важно отметить, что при использовании этого подхода .tmux.conf используется файл, который запустил сеанс. Наличие двух отдельных учетных записей не означает, что каждая учетная запись может использовать свои собственные файлы конфигурации в сеансе tmux, но это означает, что они могут настраивать свои учетные записи для других целей, и каждая может инициировать свой собственный сеанс tmux по мере необходимости. Что еще более важно, он не позволяет barney попасть в домашний каталог ted.

Что дальше?

Теперь, когда вы знаете, как использовать tmux для совместного использования экрана с другими, вы можете использовать его для удаленного обучения, импровизированного сотрудничества в проектах с открытым исходным кодом или даже для презентаций.

Кроме того, вы можете использовать этот метод для запуска сеанса tmux на одном из ваших производственных серверов, загрузки инструментов мониторинга или консолей, а затем отсоединения от него, оставив эти инструменты работать в фоновом режиме. Затем вы просто подключаетесь к своей машине, снова подключаетесь к сеансу, и все возвращается на прежнее место. Я делаю нечто подобное со своей средой разработки. Я установил tmux на VPS, что позволяет мне использовать только iPad, SSH-клиент и Bluetooth-клавиатуру для взлома кода, когда я вхожу из дома. Он отлично работает даже в сети 3G.

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

Для дальнейшего использования

tmux new-session -t [existing session] -s [new session]
Создает подключение к групповой сессии.
tmux show-messages
Отображает журнал сообщений в текущем окне, полезный для отладки.
tmux -S [socket]
Создает новый сеанс, используя сокет вместо имени.
tmux -S [socket] attach
Присоединяется к существующему сеансу с использованием сокета вместо имени.

Глава 6
Рабочие процессы

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

Эффективная работа с панелями и окнами

В этой книге вы видели способы разделить сеансы tmux на панели и окна. В этом разделе мы рассмотрим более сложные способы работы с этими панелями и окнами.

Превращение панели в окно

Панели отлично подходят для разделения рабочего пространства, но иногда вам может понадобиться «выдвинуть» панель в отдельное окно. В tmux есть команда для этого.

На любой панели нажмите Prefix ! и tmux создаст новое окно из вашей панели, удалив исходную панель.

Превращение окна в панель

Иногда полезно объединить рабочее пространство. Вы можете легко взять окно и превратить его в панель. Для этого выполните команду join-pane.

Попробуйте сами. Создайте новый сеанс tmux с двумя окнами.

$ tmux new-session -s panes -n first -d
$ tmux new-window -t panes -n second
$ tmux attach -t panes

Теперь, чтобы переместить первое окно в панель второго окна, нажмите Prefix :, чтобы войти в командный режим, и введите следующее:

join-pane -s panes:1

Это означает «Возьмите окно 1 из сеанса panes и присоедините его к текущему окну», поскольку мы не указали цель. Когда вы «присоединяетесь» к панели, вы по существу перемещаете панель из одного сеанса в другой. Вы указываете исходное окно и панель, а затем целевое окно и панель. Если вы оставите цель выключенной, текущее сфокусированное окно станет целью.

Вы также можете использовать эту технику для перемещения панелей. Если ваше первое окно имело две панели, вы можете указать исходную панель следующим образом, помня, что вы устанавили базовые индексы окна и панели в 1 вместо 0 еще в главе 2, Настройка tmux.

join-pane -s panes:1.1

Эта команда захватывает первую панель первого окна и присоединяет ее к текущему окну.

Чтобы продвинуться дальше, вы можете указать другой исходный сеанс, используя обозначение [session_name]:[window].[pane], и вы можете указать целевое окно, используя флаг -t с использованием тех же обозначений. Это позволяет переносить панели из одного сеанса в другой.

Развертывание и восстановление панелей

Иногда вам просто нужно, чтобы панель ненадолго открылась в полноэкранном режиме, чтобы вы могли видеть ее содержимое или работать более целенаправленно. Вы можете использовать команду break-pane. Но тогда вам придется использовать join-pane, чтобы вернуть ее на место. Но есть способ получше. Команда resize-pane принимает параметр -Z для возможности масштабирования панели. Лучше всего то, что этот шорткат уже замаплен на Prefix z, и повторное нажатие восстанавливает панель до исходного размера.

Запуск команд в панелях

В главе 3, Создание сценариев для настраиваемых сред tmux, мы изучили, как использовать команды оболочки и send-keys для запуска программ на наших панелях, но мы можем выполнять команды автоматически, когда запускаем окно или панель.

У нас два сервера, burns и smithers, которые запускают наш веб-сервер и сервер базы данных соответственно. Когда мы запускаем tmux, мы хотим подключиться к этим серверам, используя одно окно с двумя панелями.

Создайте новый скрипт под названием server.sh и запустите один сеанс подключения к двум серверам:

$ tmux new-session -s servers -d "ssh deploy@burns"
$ tmux split-window -v "ssh dba@smithers"
$ tmux attach -t servers

Когда мы создаем новый сеанс, мы можем передать команду, которую хотим выполнить, в качестве последнего аргумента. В нашем случае мы запускаем новый сеанс и подключаемся к burns в первом окне, и мы отключаем сеанс. Затем мы разделяем окно вертикальным разделением, а затем подключаемся к smithers.

У этой конфигурации есть удобный побочный эффект: когда мы выходим из наших удаленных серверов, панель или окно закрываются.

Открытие панели в текущем каталоге

Когда вы открываете новую панель, tmux помещает вас в каталог, в котором вы изначально запустили tmux. Иногда это именно то, что вам нужно, но если вы перешли в другой каталог, вы можете вместо этого создать новую панель, которая запускается в этом каталоге.

Вы можете использовать переменную pane_current_path, предоставляемую tmux при создании новой панели. Откройте командный режим и выполните

split-window -v -c "#{pane_current_path}"

Это разбивает окно по горизонтали, но открывает новый сеанс терминала в том же рабочем каталоге, что и текущая панель или окно.

Вы можете добавить это в свой файл конфигурации, чтобы упростить эту задачу. Вместо того, чтобы изменять существующие привязки для разбиения, добавьте новые, чтобы вы могли выбрать желаемое поведение:

workflows/tmux.conf
# split pane and retain the current directory of existing pane
bind _ split-window -v -c "#{pane_current_path}"
bind \ split-window -h -c "#{pane_current_path}"

Это настройка работает так, чтобы Prefix _ разбивал окно по горизонтали, а Prefix \ - по вертикали.

Выдача команд на многих панелях одновременно

Время от времени вам может потребоваться выполнить одну и ту же команду на нескольких панелях. Например, вам может потребоваться запустить один и тот же сценарий обновления на двух серверах. Вы можете легко сделать это с помощью tmux.

При использовании команды set-window-option synchronize-panes on, все, что вы вводите на одной панели, будет немедленно транслироваться на другие панели в текущем сеансе. После того, как вы дали команду, вы можете отключить ее с помощью set-window-option synchronize-panes off.

Чтобы сделать это проще, вы можете сопоставить эту команду с Prefix Ctrl+s, вот так:

workflows/tmux.conf
# shortcut for synchronize-panes toggle
bind C-s set-window-option synchronize-panes

Без указания варианта off или on, команда synchronize-panes действует как переключатель. Хотя это не то, что вы будете использовать очень часто, это очень удобно, когда вам это нужно.

Управление сеансами

По мере освоения tmux вы можете обнаружить, что используете более одного сеанса tmux одновременно. Например, вы можете запускать уникальные сеансы tmux для каждого приложения, над которым вы работаете, чтобы сохранить среды в замкнутом пространстве. Есть несколько замечательных функций tmux, которые делают управление этими сеансами безболезненным.

Переход между сеансами

Все сеансы tmux на одной машине проходят через один сервер. Это означает, что вы можете легко переключаться между сеансами с одного клиента.

Давайте попробуем это. Запустите два отдельных сеанса tmux, один с именем «editor», который запускает Vim, а другой запускает команду top и называется «processes»:

$ tmux new -s editor -d vim
$ tmux new -s processes -d top

Подключитесь к сеансу «editor» с помощью

$ tmux attach -t editor

а затем нажмите Prefix (, чтобы перейти к предыдущему сеансу и Prefix ), чтобы перейти к следующему сеансу.

Вы также можете использовать Prefix s для отображения списка сеансов, чтобы вы могли быстро переключаться между сеансами:

Управление сессиями в tmux

Вы можете использовать клавиши j и k для перемещения вверх и вниз, если вы настроили tmux для использования движения, подобного Vim, и вы можете нажать Space, чтобы развернуть сеанс, чтобы можно было перейти к определенному окну или панели.

Для этого вы можете добавить пользовательские привязки клавиш в своем файле .tmux.conf, привязав ключи к команде switch-client. Конфигурация по умолчанию выглядит так:

bind ( switch-client -p
bind ) switch-client -n

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

Перемещение окон между сеансами

Вы можете переместить окно из одного сеанса в другой. Это удобно, если вы запустили процесс в одной среде и хотите переместить его или хотите объединить свои рабочие пространства.

Команда сопоставлена с Prefix . (точка), чтобы вы могли открыть окно, которое хотите переместить, нажмите комбинацию клавиш, а затем введите имя целевого сеанса.

Чтобы попробовать это, создайте два сеанса с именами «editor» и «processes», выполняющие vim и top соответственно:

$ tmux new -s editor -d vim
tmux new -s processes -d top

Переместим окно из сеанса «processes» в сеанс «editor». Во-первых, подключитесь к сеансу «processes» следующим образом:

$ tmux attach -t processes

Затем нажмите Prefix . и введите «editor» в появившейся командной строке.

Это удаляет единственное окно в сеансе «processes», вызывая его закрытие. Если вы подключитесь к сеансу «editor», то увидите оба окна.

Для этого вы также можете использовать команды оболочки, поэтому вам не нужно объединять вещи, открывая сеансы. Для этого используйте move-window, например так:

$ tmux move-window -s processes:1 -t editor

Это перемещает первое окно сеанса «processes» в сеанс «editor».

Создание или присоединение к существующим сеансам

До сих пор мы всегда использовали подход к созданию новых сеансов tmux всякий раз, когда мы хотим работать. Однако в действительности мы можем определить, существует ли сеанс tmux, и подключиться к нему, если он существует.

Команда has-session возвращает логическое значение, которое мы можем использовать в сценарии оболочки. Это означает, что мы можем сделать что-то подобное в сценарии Bash:

if ! tmux has-session -t development; then
    exec tmux new-session -s development -d
    # other setup commands before attaching...
fi
exec tmux attach -t development

Если вы измените сценарий, чтобы он принимал аргумент, вы можете использовать его для создания одного сценария, который можно использовать для подключения к любому сеансу tmux или создания любого сеанса tmux.

tmux и ваша операционная система

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

Использование другой оболочки

В этой книге мы использовали оболочку Bash, но если вы поклонник zsh, вы все еще можете получить все преимущества tmux.

Просто явно установите оболочку по умолчанию в .tmux.conf вроде этого:

set -g default-shell /bin/zsh

Поскольку tmux - это просто терминальный мультиплексор, а не отдельная оболочка, вы просто указываете, что именно запускать при его запуске.

Запуск tmux по умолчанию

Вы можете настроить свою систему на автоматический запуск tmux при открытии терминала. И используя то, что вы знаете об именах сеансов, вы можете создать новый сеанс, если он не существует, или присоединиться к существующему.

Когда tmux запущен, он устанавливает переменную TERM в «screen» или в значение настройки default-terminal в файле конфигурации. Вы можете использовать это значение в своем .bashrc (или .bash_profile в macOS), чтобы определить, находитесь ли вы в данный момент в сеансе tmux. Вы установили свой терминал tmux в «screen-256color» еще в главе 2, Настройка tmux, чтобы вы могли использовать это, чтобы определить, действительно ли запущен tmux.

Например, вы можете добавить эти строки в конец вашего файла .bashrc:

if [[ "$TERM" != "screen-256color" ]]
    then
    tmux attach-session -t "$USER" || tmux new-session -s "$USER"
fi

Это сначала проверяет, что вы еще не находитесь в сеансе tmux. Если это так, скрипт пытается подключиться к сеансу с именем сеанса $USER, которое является вашим именем пользователя. Вы можете заменить это значение любым желаемым, но использование имени пользователя помогает избежать конфликтов.

Если сеанс не существует, tmux выдаст ошибку, которую сценарий оболочки может интерпретировать как false. Затем он может запустить правую часть выражения, которая создает новый сеанс с вашим именем пользователя в качестве имени сеанса. Затем он выходит из сценария.

Когда сеанс tmux запускается, он будет проходить через ваш .bashrc или .bash_profile снова, но на этот раз он увидит, что мы находимся в сеансе tmux, пропускаем этот фрагмент кода и выполняем остальные команды в нашем файле конфигурации, гарантируя, что все переменные среды для нас установлены.

Теперь каждый раз, когда вы открываете новый терминал, вы будете в сеансе tmux. Однако будьте осторожны, поскольку каждый раз, когда вы открываете новый сеанс терминала на своем компьютере, он будет присоединяться к этому же сеансу. Выход из tmux в одном терминале приведет к выходу из tmux во всех из них.

Сохранение отдельных конфигураций отдельно

В главе 4, Работа с текстом и буферами, вы узнали, как заставить tmux работать с системным буфером OS X и Linux, и это включало добавление некоторых конкретных параметров конфигурации в ваш файл .tmux.conf. Но если вы хотите, чтобы ваша конфигурация работала в обеих операционных системах, вы столкнетесь с некоторыми конфликтами.

Решение состоит в том, чтобы переместить вашу конфигурацию ОС в отдельный файл, а затем сказать tmux, чтобы он загрузил его, используя команды tmux if-shell и source.

Попробуйте сами. Создайте новый файл с именем .tmux.mac.conf в вашем домашнем каталоге:

$ touch ~/.tmux.mac.conf

В этот файл поместите весь код, чтобы буфер обмена Mac работал с tmux:

workflows/tmux.mac.conf
# Setting the namespace
set -g default-command "reattach-to-user-namespace -l /bin/bash"

# Prefix C-c copy buffer to system clipboard
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"

# Prefix C-v paste system clipboard into tmux
bind C-v run \
"tmux set-buffer \"$(reattach-to-user-namespace pbpaste)\"; tmux paste-buffer"

# use y in visual mode to copy text to system clipboard
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Затем откройте .tmux.conf и удалите все строки, относящиеся к OS X, если вы их вставили. Затем добавьте это в конец файла:

workflows/tmux.conf
# Load mac-specific settings
if shell "uname | grep -q Darwin" "source-file ~/.tmux.mac.conf"

Команда if-shell запускает команду оболочки и, если она была успешной, выполняет шаг. В этом случае мы говорим tmux запустить команду uname и использовать grep чтобы увидеть, есть ли в нем слово «Darwin». Если это так, можно с уверенностью сказать, что у нас Mac, поэтому мы загружаем файл конфигурации.

Вы можете использовать аналогичный подход для загрузки дополнительной части конфигурации, только если она существует. Например, вы можете поделиться своим основным файлом .tmux.conf с миром на GitHub, но вы можете сохранить в тайне некоторые из ваших секретных соусов. Так что переместите все эти уловки в .tmux.private, и добавьте это в свой файл .tmux.conf:

workflows/tmux.conf
# load private settings if they exist
if-shell "[ -f ~/.tmux.private]" "source ~/.tmux.private"

Это загрузит файл, только если он существует.

Запись вывода программы в журнал

Иногда полезно иметь возможность записывать вывод сеанса терминала в журнал. Вы уже научились пользоваться для этого capture-pane и save-buffer, но tmux может фактически записывать активность в панели прямо в текстовый файл с помощью команды pipe-pane. Это похоже на команду script, доступную во многих оболочках, кроме того, что с командой pipe-pane вы можете включать и выключать это действие по желанию, и запускать его после того, как программа уже запущена.

Чтобы активировать это, войдите в командный режим и введите

pipe-pane -o "cat >> mylog.txt"

Вы можете использовать флагом -o для переключения вывода, что означает, что если вы снова отправите точную команду, вы можете отключить выход. Чтобы упростить выполнение этой команды, добавьте ее в сценарий конфигурации в качестве сочетания клавиш.

workflows/tmux.conf
# Log output to a text file on demand
bind P pipe-pane -o "cat >> ~/#W.log" \; display "Toggled logging to ~/#W.log"

Теперь вы можете нажать Prefix P, чтобы переключить ведение журнала. Благодаря команде display (сокращение от display-message), вы увидите имя файла журнала, отображаемое в строке состояния. Команда display имеет доступ к тем же переменным, что и в строке состояния, о которых вы узнали в таблице 1, Переменные строки состояния.

Добавление срока службы батареи в строку состояния

Если вы используете tmux на ноутбуке, вы можете захотеть показать оставшееся время автономной работы в строке состояния, особенно если вы запускаете свой терминал в полноэкранном режиме. Оказывается, это просто добавить благодаря переменной #(shell-command).

Давайте добавим статус батареи в наш файл конфигурации. Возьмите сценарий оболочки, который может получить оставшийся заряд батареи и отобразить его на экране. Мы поместим это в файл с именем battery в нашей домашней папке и скажем tmux запустить его для нас.

Сначала загрузите файл:

$ wget --no-check-certificate \
https://raw.github.com/richo/battery/master/bin/battery

Вы также можете найти скрипт battery в исходном коде книги.

Теперь сделайте его исполняемым, чтобы tmux мог его использовать:

$ chmod +x ~/battery

Проверьте это, запустив

$ ~/battery Discharging

Если вы используете это на ноутбуке без подключенного шнура питания, вы увидите процент заряда батареи.

Мы можем заставить tmux отображать вывод любой программы командной строки в строке состояния, используя #(<command>). Итак, чтобы отображать батарею напротив часов, измените строку status-right в .tmux.conf на это:

# Status line right side - 50% | 31 Oct 13:37
set -g status-right "#(~/battery Discharging) | #[fg=cyan]%d %b %R"

Теперь, когда вы перезагрузите файл .tmux.conf, появится индикатор состояния батареи.

Индикатор батареи в tmux

Чтобы узнать состояние батареи во время зарядки, вам нужно выполнить команду

$ ~/battery Charging

и вставьте это в строку состояния. Я оставлю это на ваше усмотрение.

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

Полная интеграция с Vim

Текстовый редактор Vim довольно хорошо работает с tmux, но разработчик Мислав Марохнич разработал решение, позволяющее легко перемещаться между панелями tmux и разделениями Vim. Чтобы это работало, вам необходимо установить плагин Криса Туми vim-tmux-navigator для Vim. и добавить несколько сочетаний клавиш в свой файл .tmux.conf.

Эта настройка создаст следующие сочетания клавиш:

Ctrl+j движение вверх

Ctrl+k движение вниз

Ctrl+h движение влево

Ctrl+l движение вправо

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

Plugin 'christoomey/vim-tmux-navigator'

Теперь сохраните свой файл .vimrc и запустите

:PluginInstall

в Vim, чтобы установить плагин.

Затем в .tmux.conf, добавьте эти строки:

workflows/tmux.conf
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ 
    | grep -iqE '^[^TXZ ]+ +( \\ S + \\ /)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
bind-key -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
bind-key -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
bind-key -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
bind-key -n C- \ if-shell "$is_vim" "send-keys C- \\"  "select-pane -l"

bind C-l send-keys 'C-l'

Привязка клавиш Ctrl+l, используется библиотекой readline во многих оболочках для очистки экрана. Последняя строка этой конфигурации устанавливает Prefix Ctrl+l для выполнения этой команды вместо указанной выше.

Расширение tmux с помощью плагинов

Пока что мы внесли изменения непосредственно в файл конфигурации tmux. Хотя это работает, делать что-то более сложное может быть немного неудобно. Бруно Сутик разработал решение под названием TPM, менеджер плагинов tmux. С тех пор все больше и больше людей собираются вместе, чтобы создавать плагины для расширения tmux. Давайте использовать TPM, чтобы установить невероятно полезный плагин tmux-resurrect, который может восстанавливать сессии tmux даже после перезагрузки!

Чтобы настроить его, сначала клонируйте репозиторий в папку с именем ~/.tmux/plugins/tpm:

$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

Затем добавьте эти строки в свой файл .tmux.conf:

workflows/tmux.conf
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
run '~/.tmux/plugins/tpm/tpm'

Сначала мы перечисляем сам TPM, а затем плагин tmux-resurrect. Затем мы загружаем TPM, чтобы он мог загружать другие плагины. Сохраните этот файл и перезагрузите конфигурацию. Затем нажмите Prefix I для установки плагина. Вы увидите этот вывод в tmux:

Already installed "tpm"

Installing "tmux-resurrect"
  "tmux-resurrect" download success

TMUX environment reloaded.

Done, press ENTER to continue.

Теперь проверьте программу tmux-resurrect. Откройте еще пару панелей и нажмите Prefix Ctrl+s, чтобы сохранить состояние сеанса tmux. Затем закройте все панели и выйдите из tmux. Наконец, перезагрузите tmux и нажмите Prefix Ctrl+r для восстановления сохраненного сеанса. Все ваши панели вернутся!

Посетите список плагинов tmux и найдите тот, который хотели бы установить. Вы найдете один для установленного нами измерителя уровня заряда, другой для буферов обмена для конкретных ОС и даже один с разумными параметрами конфигурации.

Что дальше?

Теперь, когда вы знаете основы и имеете некоторый опыт работы с различными конфигурациями, вы можете сделать с tmux намного больше. Руководство tmux, к которому вы можете получить доступ из вашего терминала

$ man tmux

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

И не забывайте, что сам tmux стремительно развивается. В следующей версии появятся новые параметры конфигурации, которые дадут вам еще большую гибкость.

По мере того, как вы интегрируете tmux в свой рабочий процесс, вы можете обнаружить другие методы, на которые начнете полагаться. Например, вы можете использовать tmux и текстовый редактор на удаленном сервере, чтобы создать невероятно эффективную среду разработки, которую вы можете использовать для совместной работы с другим разработчиком. Вы даже можете использовать irssi (клиент IRC на базе терминала) и Alpine (приложение электронной почты на основе терминала) в сеансах tmux, либо вместе с текстовым редактором на панели, либо в фоновых окнах. Затем вы можете отключиться от сеанса и вернуться к нему позже, когда вся ваша среда будет готова к работе.

Продолжайте работать с tmux, и прежде чем вы это узнаете, он станет неотъемлемой частью вашего рабочего процесса.

Для дальнейшего использования

Prefix !
Преобразует текущую выбранную панель в новое окно.
join-pane -s [session]:[window].[pane]
Преобразует окно или панель указанного сеанса в панель в текущем окне.
join-pane -s [session]:[window].[pane] -t [other session]
Преобразует окно или панель указанного сеанса в панель в целевом сеансе.
Prefix Z
Масштабирует текущую панель, делая ее полноэкранной. Повторное нажатие восстанавливает исходный размер панели.
tmux new-session "[command]"
Запускает tmux и выполняет команду. По завершении команды сеанс tmux закрывается.
split-pane "[command]"
Разбивает текущее окно и выполняет указанную команду на новой панели. Когда команда завершится, панель закрывается.
split-window -c "#{pane_current_path}"
Разбивает панель и устанавливает в качестве рабочего каталога новой панели текущий рабочий каталог выделенной панели.
set-window-option synchronize-panes
Включает синхронизацию панелей, при которой нажатия клавиш выполняются одновременно для всех панелей, а не только для текущей панели.
Prefix (
Переход к следующему сеансу tmux.
Prefix )
Переход к предыдущему сеансу tmux.
Prefix s
Показывает список выбора сеанса.
move-window -s [source session]:[window] -t [target session]
Перемещает окно из одного сеанса в другой. Также доступно Prefix ., за которым следует имя целевого сеанса.
set -g default-shell [shell]
Устанавливает оболочку по умолчанию, которую tmux использует при создании новых окон.
set -g default-command [command]
Устанавливает команду по умолчанию, которую tmux использует при создании новых окон. По умолчанию пусто.
if-shell "[condition]" "[command]"
Выполняет заданную command, если condition имеет значение true.
pipe-pane -o "cat >>~/#W.log"
Записывает текущую панель в текстовый файл.

Приложение 1
Наша конфигурация

На протяжении всей книги мы выстраивали некий комплексный файл .tmux.conf. Вот весь файл для вашей справки.

# Our .tmux.conf file

# Setting the prefix from C-b to C-a
set -g prefix C-a
#
# Free the original Ctrl-b prefix keybinding
unbind C-b
#
#setting the delay between prefix and command
set -s escape-time 1
#
# Ensure that we can send Ctrl-A to other apps
bind C-a send-prefix

# Set the base index for windows to 1 instead of 0
set -g base-index 1

# Set the base index for panes to 1 instead of 0
setw -g pane-base-index 1

# Reload the file with Prefix r
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# splitting panes with | and -
bind | split-window -h
bind - split-window -v

# moving between panes with Prefix h,j,k,l
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Quick window selection
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+

# Pane resizing panes with Prefix H,J,K,L
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# mouse support - set to on if you want to use the mouse
set -g mouse off

# Set the default terminal mode to 256color mode
set -g default-terminal "screen-256color"

# set the status line's colors
set -g status-style fg=white,bg=black

# set the color of the window list
setw -g window-status-style fg=cyan,bg=black

# set colors for the active window
setw -g window-status-current-style fg=white,bold,bg=red

# colors for pane borders
setw -g pane-border-style fg=green,bg=black
setw -g pane-active-border-style fg=white,bg=yellow

# active pane normal, other shaded out
setw -g window-style fg=colour240,bg=colour235
setw -g window-active-style fg=white,bg=black

# Command / message line
setw -g message-style fg=white,bold,bg=black

# Status line left side to show Session:window:pane
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"

# Status line right side -  50% | 31 Oct 13:37
set -g status-right "#(~/battery Discharging) | #[fg=cyan]%d %b %R"

# Update the status line every sixty seconds
set -g status-interval 60

# Center the window list in the status line
set -g status-justify centre

# enable activity alerts
setw -g monitor-activity on
set -g visual-activity on

# enable vi keys.
setw -g mode-keys vi

# shortcut for synchronize-panes toggle
bind C-s set-window-option synchronize-panes

# split pane and retain the current directory of existing pane
bind _ split-window -v -c  "#{pane_current_path}"
bind \ split-window -h -c "#{pane_current_path}"

# Log output to a text file on demand
bind P pipe-pane -o "cat >>~/#W.log" \; display "Toggled logging to ~/#W.log"
#
# Load mac-specific settings
if-shell "uname | grep -q Darwin" "source-file ~/.tmux.mac.conf"

# load private settings if they exist
if-shell "[ -f ~/.tmux.private]" "source ~/.tmux.private"

is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
    | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n C-h if-shell "$is_vim" "send-keys C-h"  "select-pane -L"
bind-key -n C-j if-shell "$is_vim" "send-keys C-j"  "select-pane -D"
bind-key -n C-k if-shell "$is_vim" "send-keys C-k"  "select-pane -U"
bind-key -n C-l if-shell "$is_vim" "send-keys C-l"  "select-pane -R"
bind-key -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l"

bind C-l send-keys 'C-l'

set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
run '~/.tmux/plugins/tpm/tpm'