Приручаем 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.
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 32
    • +1
      Нет, я не люблю такие вещи потому что здесь компот. Вот всплывет ошибка по обработке UTF-8, и лазь по всему этому безобразию, выискивай. Или ошибка с цветами. Как правило, такие пилюли собираются под конкретный терминал. И вот что будет, если твой $TERM не такой, как у разработчика. Не говоря уже про другие менее известные переменные окружения.
      zsh тоже не мой выбор — очень мало хостов, где она есть. Да и к лени она приучает с ее возможностью коррекции набранного.
      • 0
        Спасибо за это! Буду изучать. К большинству вещей, которые они рекомендуют, впрочем, пришёл самостоятельно, но вот грамотно всё уложить в конфиги — до этого руки ещё не дошли.
      • 0
        скрин трудно менять на что-то, но чем больше читаю про tmux тем больше хочется его опробовать в реальной работе — но скрин мешает ойойой как, всё пытаюсь, но привычки это страшная сила

        Я лично сделал alias в моем bashrc.
        alias tmux=«TERM=screen-256color tmux»
        а в конфиге тмукса представление нельзя выставить?
        • 0
          set -g default-terminal «screen-256color»
          для тмукса можно хоткеи из скрина применить. www.doknowevil.net/2010/10/18/sorry-screen-tmux-is-better-but-here-are-some-screen-lik-hotkeys/ но, советую таки приучиться к хоткеям тмукса

          • 0
            set -g default-terminal «screen-256color»
            вот и нафиг тогда алиас…

            эх, помнится в rh старых приходилось xterm'ом представлятся дабы в tui софте внутри скрина без проблем работали хоткеи, а теперь уже скрином прикидыаются :(
          • +1
            Дедушку GNU Screen я теперь использую только для тех програм, которые мне надо бы свернуть, но хотелось бы посмотреть у них вывод. Я начал искать альтернативу ему после того, как мне что-то надо было поменять в status, но лень было менять длинную и непонятную строку:)

            По поводу внешнего alias:
            если вы попробуете оставить снаружи что-то вроде xterm-16, не будут корректно работать цвета. Например, solarized для vim будет работать весьма странно.
            • 0
              комбинирую Tmux + Screen

              Выглядит просто логинюсь на Host 1 дальше надо Host 2( но желательно с фоновой работой и тут screen)

              конечно Tmux не кастомизировал…
            • +1
              Я тоже сильно привык к screen, но иногда бывает, что он зависает\залипает, ни как не могу выяснить причину. Те он так зависает, что даже не возможно сделать detach и в новом терминале не возможно сделать screen –x session. Приходится его kill -9.

              Еще я очень привык что screen у меня запускается по алиасу:
              alias live='
              if [ -n "`screen -ls | grep LIVE`" ]; then 
                  if [ -n "`screen -ls | grep LIVE | grep Attached`" ]; then 
                      if [ -z "`echo $TERMCAP | grep screen`" ]; then 
                          echo "Enter into Atached screen"; 
                          sleep 2; 
                          screen -x LIVE ; 
                      else 
                          echo "in LIVE" ; 
                      fi 
                  else 
                      screen -r LIVE ; 
                  fi  
              else 
                  screen -S LIVE -c .screenrc.live ; 
              fi'
              


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

              Те все, что мне нужно сделать в терминале после перезагрузки (бывает и такое) это набрать live. На работе не забыть нажать C-a d, а по приходу домой просто набрать live.

              А в .screenrc.live (настриваем по вкусу рабочее окружение):
              vbell off
              hardstatus alwayslastline '%{= dg}[ %{g}%H %{g}][%= %{= dg}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{g}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
              screen -t root          0 sudo -i
              screen -t jabber        1 mcabber
              screen -t irc           2 irssi -c irc.freenode.net -n nick -w password
              screen -t rss           3 snownews -u
              screen -t bash          4
              startup_message off
              bindkey -k F2 next # переключение табов по <--f11 f12-->
              bindkey -k F1 prev
              


              Спасибо за пост, буду пробовать tmux. Правда в посте не хватает пару слов о том, как вывести список сессий и как вернутся в нужную сессию.
              C-b d – отключится от сессии
              tmux list-sessions – список сессий
              tmux attach-session -t 0 – вернуться в нужную сессию

              C-b после C-a в screen ужасно не удобно…
              • 0
                Это мой первый пост. Я полагаю, что эти команды легко найти в списке литературы в конце статьи. Но спасибо, буду писать в более расширенную справку в дальнейшем.
                • 0
                  Это скорей всего интересно будет тем кто переходит от screen к tmux.
                • 0
                  но иногда бывает, что он зависает\залипает, ни как не могу выяснить причину.
                  muhas.ru/?p=98
                  не оно?
                  • 0
                    не уверен, потому, что оно даже по C-q не отвисает
                  • +1
                    Я тоже сильно привык к screen, но иногда бывает, что он зависает\залипает, ни как не могу выяснить причину. Те он так зависает, что даже не возможно сделать detach и в новом терминале не возможно сделать screen –x session. Приходится его kill -9.


                    Я тоже регулярно сталкивался с такой проблемой и поступал аналогичным образом. Но потом нашёл в чём дело, просто случайно промахивался мимо Ctrl-a и нажимал Ctrl-s, а эта комбинация как выяснилось делает «pause transmission» в терминале, и чтобы вернуть себе контроль над терминалом достаточно просто нажать Ctrl-q и всё отлипнет, это называется Software flow control.

                    В bash (возможно и в других шеллах тоже, не проверял) всё что будет набираться на клавиатуре после нажатия Ctrl-s запомнится и отправится в шелл после нажатия Ctrl-q, так что не нужно бездумно долбить по клавиатуре :)

                    Почему-то в screen при нажатии Ctrl-s подвешивается полностью всё, в tmux такого не происходит и вполне можно переключиться на другое окно.
                  • 0
                    а я теперь на тормозной скрин вряд ли вернусь.
                  • +1
                    раньше тоже использовал ` как escape клавишу, но с приобретением клавиатуры ms natural 4000 стало неудобно — далеко тянуться, сейчас вот мучаюсь, не зная на какое сочетание переместить :(
                    C-a для вставки ` будет конфликтовать с имаксом и zsh. в таком случае я использую «bind-key ` send-prefix», тогда при повторном нажатии ` будет вставляться обратная кавычка.
                    • 0
                      image
                      Интересная клавиатура. Говорят на изогнутых клавиатурах печатать удобнее. Но мне не привычно, так как некоторое время раньше работал эникейщиком — приходилось работать за множеством разных рабочих мест
                      • 0
                        Сижу на такой клаве лет десять. Сначала это была Microsoft Natural 4000, а потом беспроводная Microsoft Natural 7000. Клава — блеск. (Для тех, кто умеет печатать вслепую)
                      • 0
                        3 года назад взял себе такую в офис. Боялся, что будет долгая адаптация, но в результате и к этой быстро привык, и от обычной не отвык — дома лежит самая дешевая Anti RSI от A4Tech, купленная за $8 и ничего — большого дискомфорта от пересаживания с клавы за клаву нет.
                        Плюсы клавиатуры очевидны, давайте по минусам:
                        — Непривычно высокая. Если у вас высокий стол или низкая ниша для клавиатуры — может не подойти
                        — Тупой и громкий пробел. Нужно приловчиться его нажимать — срабатывает туго и не под любым углом нажатия — иногда клинит и не пускает
                        — Мелкий Enter в сочетании с глубоким ходом — частенько нажимая на Enter цепляю соседние клавиши. У некоторых других клавиш та же проблема.
                        — Тупой софт. Так и не смог нормально использовать мультимедийные клавиши — очень ограниченный простор для их кастомизации. Пользуюсь только кнопкой «Калькулятор» и кнопками плеера
                        — Кожаное покрытие под запястьями за три года не износилось, не замаслилось — удобное и приятное, но вот надписей на нескольких клавишах уже почти нет. У меня пострадали стрелки и почему-то кнопка «J».

                        А теперь самое суровое предупреждение. Как это ни странно, но эта клавиатура — для набора текста! Если вы больше работаете с программами типа Photoshop или другими, которым клавиатура нужна только для хоткеев — не берите эту клавиатуру. Дергать на ней хоткеи типа Ctrl+M, Ctrl+L в одну руку невозможно. Расстояние между этими клавишами огромное — даже с моими немаленькими руками могу нажать только Ctrl+N, и то ценой боли в оттопыренном мизинце. Чтобы пользовать такие хоткеи придется бросать мышь, либо изворачивать руку для нажатия на правый Ctrl.
                        Я серьезно. Если вы дизайнер или фотограф — поищите себе другую клавиатуру.
                        А программировать за этой клавой очень удобно. Если свободны две руки — хоткеи не проблема.
                      • +1
                        Еще совет вам на будущее — оставляйте комментарии в конфигах, ибо не всегда можно понять что это за опция и пр. (к примеру мой скромный конфиг github.com/iSlava/myconfigs/blob/master/.tmux.conf)
                        • 0
                          Да, никак до этого не дойду, но надо. В vimrc-то коменты оставлял:)
                          • 0
                            приучаю себя к комментариям в конфигах и коду, но нет-нет да проскакивает. в чужих без комментариев даже не стараюсь разбираться. так что за «оставляйте комментарии» плюсую до бесконечности!
                          • +1
                            Статья отличная, спасибо! У меня только одна ремарка.

                            Tmux — хорошо, i3 — лучше. Я в смысле, что идеология хороша не только для терминалов, но и для всех окон вообще, по моему весьма скромному мнению.
                            • 0
                              Эх, ещё бы vim умел автодополнение как eclipse, то я бы полностью от него отказался и перешел на gvim+i3.
                            • 0
                              Основные рабочие комбинации клавиш можно найти на просто по запросу в google tmux клавиши
                              Айай. Есть же:

                              man tmux<ENTER>/bindings<ENTER>

                              или даже

                              tmux<ENTER>^B?

                              Видел скринкаст, где автор пользовуется Alt'ом в качестве префикса.
                              • +1
                                Пользуюсь tmux и screen'ом до него уже порядка 8 лет. В tmux'е жутко напрягает отсутствие такой естественной функции как fit window в screen'е (C-A F). Есть aggressive-resize, появился в 2008, но это совсем не то.
                                Неужели нельзя за пять лет закрыть этот таск?
                                Для себя я немного пропатчил его (если заглянуть в resize.c, как это сделать становится очевидно), но люди, как вы без этого живете в tmux?
                                • +1
                                  Отчего бы вам не открыть тикет и не прикрепить к нему фикс?
                                • 0
                                  Есть ещё вот такое интересное применение tmux с vim.
                                  • 0
                                    Вот, как раз в итоге хочу написать статью, в которой напишу, как сделать среду разработки на основе tmux и vim, но только для python
                                    • 0
                                      Вот ещё вам в копилку тогда.
                                      • 0
                                        Ну это не совсем то, так как у меня нет цели программировать парно.

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