Каждый из нас выбирает для себя наиболее удобную среду разработки. Многие пользуются отдельной 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»
Приложения
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
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.
Автор: vvpoloskin