Пользователь
0,0
рейтинг
11 января 2013 в 13:18

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

*nix*
Каждый из нас выбирает для себя наиболее удобную среду разработки. Многие пользуются отдельной 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.
Валентин @vvpoloskin
карма
25,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (31)

  • +1
    • +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
      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
          Ну это не совсем то, так как у меня нет цели программировать парно.

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