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

от автора

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

ссылка на оригинал статьи http://habrahabr.ru/post/165437/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *