*nix
11 January 2013

Приручаем Tmux для повседневных нужд

From Sandbox
Каждый из нас выбирает для себя наиболее удобную среду разработки. Многие пользуются отдельной IDE, несколькими открытыми консолями, отдельным браузером, множеством прочих сторонних инструментов. Я же придерживаюсь принципа — все должно быть милимастично и просто конфигурируемо. Tmux позволяет сделать очень удобную рабочую среду для программиста.


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


Зачем это нужно


Все хорошо, можно удобно работать и с кучей открытых окон, но… если вы работаете только на локальной машине. А если нужно работать удаленно? Например, нужно взаимодействовать в коде со сторонним програмным обеспечением, установленном на удаленном сервере, функционал которого нет возможности сэмулировать на локальной машине. Или же когда под рукой есть просто терминал, но нет средств разработки и прав их установку.
Можно воспользоваться и графическими терминалами, пробросить X-сервер. Но качество интернет-соединения не может гарантировать никто. Причем если раньше мы бились с dial-up модемами, то сегодня, отъехав чуть дальше центра города, будем бороться с модемами 3G. Да что там говорить, и проводной интернет не даст спокойной работы, если не брать канал более 8 Mbitps, а для юрлиц это довольно дорогое удовольствие.

Терминальные мультиплексоры


Работая с Linux мы в первую очередь открываем свой любимый терминал, будь то konsole, gnome-terminal, urxvt или что-то еще. А еще каждый привык держать в этом терминале кучу вкладок под свои цели. Но в сеансе SSH с удаленным хостом такой возможности нет. Конечно можно открыть кучу SSH-соединений на локальной машине. И переключать окна Putty, но мне представляется это не очень удобным. По одной из этих причин и придумали терминальные мультиплексоры.
Идея проста — на удаленной машине запускается некоторое подобие полноценного терминала с вкладками. Ну и есть некоторые дополнительные возможности в виде, например, внутреннего буфера обмена.
Опытные системные администраторы наверняка хоть раз использовали GNU Screen. Он не очень удобен в виду не совсем интуитивной настройки. Более новым решением является Tmux. Он имеет больший функционал, более прост в настройке. Про применение этого мультиплексора и пойдет речь.

Возможности Tmux


Сразу предоставлю изображение, в котором наглядно отображается, как может выглядеть Ваша консоль при разработке Django-проекта.
"
Рис.1 Пример Tmux для Django
Неплохой вид. На одном экране отображены «окна» IPython, текстового редактора и запущенного девелоперского сервер А что более интересно, все комбинации клавиш можно перенастроить под себя.

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

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

В терминологии Tmux есть следующие элементы:
  • window — отдельный терминал, аналог вкладки в обычном терминале («окно»);
  • pane — участок консоли в конкретном window («клетка»);
  • status — строка статуса снизу.



Рис. 2 обозначение основных элементов окна Tmux

Отдельного внимания заслуживает режим копирования между «окнами»/«клетками». Tmux поддерживает два режима копирования/вставки — Vim или Emacs. У меня Vim.
Допустим, вам нужно выбрать часть текста и скопировать его в другой терминал. Вот решение этой задачи:
  • Нажимаем Escape-[, переходим в режим копирования;
  • Работаем кнопками j,k,l,m(можно и стрелками), доходим до нужного текста;
  • Space — начали выбирать. Также перемещаемся стрелками по тексту до конца нужного текста;
  • Enter — текст скопирован;
  • Переключаемся на другой участок(«окно», «клетку»);
  • Escape-] — текст вставлен

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

Адаптация


Все консольные мультиплексоры управляются по следующему принципу: нажимается некоторый escape-символ, после него идет некоторая последовательность символов, отвечающих за какой-либо функциионал. По умолчанию в Tmux escape-последовательностью является комбинация Ctrl-B (в GNU Screen Ctrl-A). Лично я же переиначил ее на символ ` (обратная кавычка). Мне показалось удобно с учетом того, что я довольно уверенно пользуюсь текстовым редактором Vim.

Устанавливается в Debian-подобных дистрибутивах так:
apt-get install tmux
Конфигурационный файл $HOME/.tmux.conf
Основные рабочие комбинации клавиш можно найти на просто по запросу в google tmux клавиши. У меня же немного они переиначены:
  • ` — escape-клавиша
  • `-h — переключение на левую pane
  • `-j — переключение на нижнюю pane
  • `-k — переключение на верхнюю pane
  • `-l — переключение на правую pane
  • `-` — переключиться на предпоследнее окно
  • `-a — вставить символ ` (обратная кавычка)

Мой tmux.conf можно найти в приложениях.
Некоторое внимание стоит уделить цветам в терминале. Руководство строго рекомендует использовать для переменной окружения $TERM внутри Tmux значение screen-256color или screen-256color-bce. Вне Tmux тоже лучше использовать именно это значение. Я лично сделал alias в моем bashrc.
alias tmux=«TERM=screen-256color tmux»

Приложения


1. Мой tmux.conf
set-window-option -g mode-keys vi
set-option -g status-keys vi
set-window-option -g utf8 on
set-window-option -g mode-mouse off

set-option -g set-titles on
set-option -g set-titles-string '#S:#I.#P #W' # window number,program name,active (or not)
set-window-option -g automatic-rename on

set-window-option -g mode-bg magenta
set-window-option -g mode-fg black
set-option -g message-bg magenta
set-option -g message-fg black

set -g visual-activity off
set -g visual-bell off
set -g base-index 1

set-option -g status-utf8 on
set-option -g status-justify left
set-option -g status-bg black
set-option -g status-fg cyan
set-option -g status-interval 5

set-option -g status-right-length 30
set-option -g status-right '#[fg=magenta]» #[fg=blue,bold]#T#[default]'
#set-option -g status-left '#[fg=cyan]»» #[fg=blue,bold]###S #[fg=magenta]%R %m-%d#(acpi | cut -d ',' -f 2)#[default]'
#set-option -g status-left '#[fg=cyan]»» #[fg=blue,bold]###S #[fg=magenta]%R %m-%d#(acpi | cut -d ',' -f 2)#[default]'
set-option -g visual-activity on
set-window-option -g monitor-activity on
set-window-option -g window-status-current-fg colour154
set-window-option -g window-status-fg colour243

set-window-option -g clock-mode-colour cyan
set-window-option -g clock-mode-style 24

set -g terminal-overrides 'xterm*:smcup@:rmcup@'
set -s escape-time 1
set -g default-terminal «screen-256color»

set -g prefix `
bind ` send-prefix
bind-key ` last-window
unbind %
unbind '"'
unbind x
unbind C-o
unbind k
unbind j
unbind h
unbind l

bind-key H split-window -h
bind-key V split-window -v
bind-key a send-keys `
bind-key X kill-pane
bind-key K confirm-before kill-window
bind-key N rotate-window -U
bind-key P rotate-window -D

bind-key j select-pane -D
bind-key k select-pane -U
bind-key h select-pane -L
bind-key l select-pane -R

bind-key F swap-pane -U
bind-key D swap-pane -D


2.Мой screenrc
startup_message off
defmonitor on
defscrollback 10240
autodetach on
vbell off
termcapinfo xterm|xterms|xs|rxvt ti@:te@
escape `e
altscreen on
autodetach on
caption always "%{= 45}%{+b w}Screen: %n | %h %=%t %c"
#hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<"
hardstatus alwayslastline
hardstatus string '%{= kG}%{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}'


Некоторые ознакомительные ссылки


1. Официальный man tmux;
2. Tmux на wiki;
3. GNU Screen на wiki.

+30
57.7k 231
Comments 32
Top of the day