tmux: Um Multiplexador de Terminais

porrudsonalves

tmux: Um Multiplexador de Terminais

Embora utilize o terminal com bastante frequência a mais de 20 anos, nunca me interessei muito pelo aplicativo screen, o multiplexador de terminais que conhecido desde meus tempos de mestrado na Unicamp.

Recentemente, com a entrada de dois estagiários da Ciência da Computação para trabalhar em desenvolvimento de aplicativos no Laboratório de Física, tenho sido constantemente instigado a remexer alguns comandos e aplicativos, os quais não havia dado muita importância até então.

Com o uso das abas nos gerenciadores de terminal com o konsole do KDE, imaginava que comandos como o screen não teriam muita utilidade, até começar a utilizá-los. Brincando de otimizar o kernel de meu notebook foi que percebi pela primeira vez o quanto pode ser prático um multiplexador de terminais. Dai em diante foi adesão total à ideia.

O screen deu para dar um gostinho da ferramenta, no entanto o projeto tem tido pouca atenção ultimamente, com a última atualização em 7 de agosto de 2008 e a anterior 4 anos antes, em janeiro de 2004. Provavelmente isto é o que tem limitado muito o programa para as aplicações atuais. Por padrão o GNU Screen possui suporte apenas a split vertical, sendo o horizontal alcançado apenas por meio de um patch para a versão 4.0.2, que também funciona para a versão 4.0.3, segundo sua documentação.

Com o dito patch, o screen passa a suportar o split horizontal mas também passa a apresentar alguns problemas como travamentos ao redimensionar a janela do terminal (no ambiente gráfico) e a perda de referência dos contornos horizontais.

Neste texto faço uma breve apresentação do tmux, um multiplexador de terminais mais moderno que o GNU Screen e que vem atendendo muito bem às minhas expectativas, com poucos problemas no split horizontal e vertical, redimensionamento de janelas e travamentos. Ao menos até onde pude avaliar.

1. Instalação

O tmux não possui um pacote no Slackware padrão, sendo necessário a sua instalação através da fonte ou pacote de terceiros. O pacote não possui dependências e com o SBopgk a sua instalação se resume a executar o comando:

root@scadufax:# sbopkg -i tmux

Se desejar pode utilizar os scripts em SlackBuild.org e compilar a última versão (no momento 1.8). Se desejar pode utilizar a compilação ou os scripts ajustados para a versão 1.8 em meu repositório, nos links abaixo:

Para compilar pelos scripts do SlackBuilds editados, execute os comandos abaixo:

root@scadufax:# wget http://rra.etc.br/linux/tmux/tmux.tar.bz2
...
root@scadufax:# tar xvf tmux.tar.bz2
...
root@scadufax:# cd tmux
root@scadufax:# source tmux.info
root@scadufax:# wget $DOWNLOAD
...
root@scadufax:# ./tmux.SlackBuild
...
root@scadufax:# installpkg /tmp/tmux-1.8-x86_64-1_SBo.tgz
...

2. Um Pouco dos Atalhos do tmux

Para iniciar o tmux, no terminal basta executar o comando tmux:

tmux-00

Diferente do Screen, o tmux utiliza o prefixo CONTROL+b, representado apenas por C-b, enquanto que o primeiro usa o C-a. Pessoalmente prefiro o prefixo C-a pois as teclas ficam mais próximas, sendo mais fácil acionar. Adiante apresento como alterar esta combinação de tela, chamada de prefixo dos comandos.

A tabela a seguir apresenta um resumo de alguns comandos úteis do tmux. Com exceção dos dois primeiros comandos (C-b e C-d), todos os demais devem ser precedidas pelo prefixo C-b:

Tab 01: Alguns comandos do TMux

Comando Descrição
C-b (o prefixo) CONTROL-b é o prefixo para todos os comandos do tmux
C-d (sem prefixo) apaga janela corrente ou sai do tmux se for a última janela. O mesmo que C-b d
——- Dividir da Janela Corrente em Painéis:
split vertical do painel corrente
% split horizontal do painel corrente
——- Mover pelos Painéis:
Up move para o painel acima
Down move para o painel abaixo
Left move para o painel à esquerda
Right move para o painel à direita
——- Operações em Painéis:
{ move o conteúdo do painel atual com o painel anterior
} move o conteúdo do painel atual om o painel posterior
C-Up estende a divisão horizontal uma célula para cima
C-Down estende a divisão horizontal uma célula para baixo
C-Left estende a divisão vertical uma célula para esquerda
C-Right estende a divisão vertical uma célula para direita
M-Up o mesmo que C-Up, mas move 5 células
M-Down o mesmo que C-Down, mas move 5 células
M-Left o mesmo que C-Left, mas move 5 células
M-Right o mesmo que C-Right, mas move 5 células
M-o rotaciona os painéis na janela corrente
M-1 a M-5 reorganiza os painéis em layouts pré-definidos: horizontal; vertical; principal na horizontal; principal na vertical; azulejos
——- Renomear, criar, matar e mover pelas Janelas:
, renomeia a janela corrente
& mata a janela corrente
c cria uma nova janela
0-9 seleciona a janela de número n
n vai para a próxima janela
p vai para a janela anterior
seleciona a janela pelo índice (índice 0, 1, … na barra de status)
w seleciona a janela interativamente (através da lista de janelas)
——- Operações Sobre Cliente (Seções) do tmux:
d mata o cliente corrente (termina o tmux)
D seleciona uma seção cliente para matar (mesmo as abertas em outro terminal)
$ renomeia a seção corrente
s Escolha uma nova seção para o cliente conectado de forma interativa
——- Outros comandos:
t apresenta a hora no painel atual
? apresenta todas as teclas de atalho configuradas

Algumas explicações sobre esta tabela:

  • painel – o termo origital é pane e a tradução adequada ao contexto janelas seria vidrais, mas não me pareceu o adequado para o uso em informática. Painel me pareceu o mais adequado a situação;
  • M-<key> – assim como o C é uma abreviação à tecla CONTROL, o M é uma abreviação a tecla ALT. Portanto M-<key> se refere a ALT+<key>;
  • Seção (Cliente) – as seções abertas no tmux ficam armazenadas na memória, de forma semelhante ao que o screen faz no diretório ~/.screen.

3. Algumas Configurações/Modificações Úteis

Ao invocar o comando tmux, este procura pelo arquivo de configuração /etc/tmux.conf no sistema e em seguida pelo ~/.tmux.conf, na pasta do usuário (~). Este arquivo permite configurar algumas funcionalidades e comportamentos do tmux para adequar melhor às suas necessidades.

Nas próximas subseções são apresentadas algumas configurações bem úteis e interessantes para serem adicionadas ao seu arquivo de configuração local, ~/.tmux.conf. Para uma visão mais ampla é aconselhável a leitura do manual e info do aplicativo.

No texto a seguir, foram empregadas algumas formas abreviadas de alguns comandos, chamadas de alias. Os alias empregados foram: set como set-option; e setw como set-window-option.

3.1. Substituir o C-b pelo C-a

Para aqueles que estão acostumados em usar o CONTROL+a como prefixo para os comandos, como usado no GNU Screen, adicione as linhas abaixo ao ~/.tmux.conf:

unbind C-b
set -g prefix C-a

Após a edição, você necessita recarregar o arquivo de configuração para que o novo prefixo passe a funcionar. Para isto, a qualquer momento, use o comando C-b : e em seguida digite o código source ~/.tmux.conf

Observe que após isto o prefixo C-b não responderá mais, sendo necessário usar o prefixo C-a.

3.2. Mapeia e | para split Vertical e Horizontal

O split dos painéis me parecem pouco intuitivos com e %. As linhas a seguir mapeiam este split para as teclas “-” e “|”:

unbind %
bind | split-window -h
unbind '"'
bind - split-window -v

Para desconectar a tecla ” é necessário proteger o caractere com um par de aspas simples, de outra forma o unbind não reconhece o caractere e gera um erro. O mesmo deve ser feito para a tecla ‘, mas desta vez a proteja com aspas duplas.

Este último remapeamento é particularmente útil para nós brasileiros devido aos acentos, o que nos obriga a pressionar a tecla espaço sempre que se necessita gerar o caractere “, necessário para fazer o slit vertical na configuração padrão do tmux.

3.3. Renomear Automaticamente as Janelas

A sequência a seguir renomeia as janelas do tmux, como o konsole faz com as suas abas, renomeando-as com os últimos comandos executados no terminal aberto na aba:

setw -g automatic-rename

3.4. Interações com o Mouse

Para quem usa bem um terminal, o uso do mouse acaba sendo um atraso, uma vez que o acesso a uma short-key é bem mais rápido que a remoção das mãos do teclado para manusear o mouse. Mas para iniciantes estas dicas podem ser bem práticas.

set -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on

Na ordem, as linhas a seguir dão vida ao mouse no tmux:

  1. habilita o scroll da janela pela rodinha de scroll do mouse
  2. permite a seleção de um painel pelo clique do mouse;
  3. habilita o redimensionamento de um painel pelo mouse.

3.5. Selecionar um Painel com ALT+<direcional_key>

Achei esta dica no blog do Lukasz Wrobel e a adotei. Ele mapeia o Alt-<direcional_key> para mudar de painel sem o uso do prefixo (C-b), o que deixa o processo mais rápido:

bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

3.6. Barra de Status Customizada

Ainda há a possibilidade de customizar a barra de status. São muitas as opções e estão muito bem explicadas no manual do comando.

As linhas a seguir adicionam algumas customizações de meu gosto:

set -g status-bg blue
set -g status-fg white
set -g status-left '#[fg=green]#H'
setw -g window-status-current-bg red

4. Iniciar o tmux Automaticamente

Ainda não cheguei a este ponto, mas caso tenha gostado do tmux e o deseje utilizar automaticamente a cada terminal aberto, adicione as linhas abaixo ao ~/.bash_profile:

if [ `which tmux 2> /dev/null` -a -z "$TMUX" ]; then
    tmux -2 attach || tmux -2 new; exit
fi

Isto abrirá uma seção do tmux sempre que o terminal for carregado, sem recarregá-lo recursivamente, o que não seria desejável.

5. Trabalhando com Seções

Diferentemente do GNU Screen, o tmux não armazena as seções criadas em pasta local. As seções são criadas e mantidas na memória, enquanto o sistema estiver ligado. Isto mesmo, após reiniciar o sistema as seções serão perdidas.

Existem algumas ferramentas para salvar e restaurar as seções criadas no tmux na rede, mas acredito que esta não é a intenção da ferramenta. Caso tenha interesse dê uma lida nos links abaixo:

Pelo que compreendi do tmux, a ideia é que o usuário crie bash scripts que invoque o tmux para criar suas seções. Para isto o tmux vem preparado com um conjunto de comandos apropriados.

A listagem abaixo apresenta um bash script para criar um ambiente hipotético para compilação e configuração de um novo kernel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
#
SESSION=${SESSION:='kernel'}
 
tmux new-session -d -s $SESSION
 
tmux new-window -t $SESSION:1 -n 'System'
tmux split-window -v
tmux select-pane -t 1
tmux split-window -h
 
tmux select-pane -t 0
tmux send-keys "dmesg | less" C-m
 
tmux select-pane -t 1
tmux send-keys "watch sensors" C-m
 
tmux select-pane -t 2
 
tmux new-window -t $SESSION:2 -n 'Build'
tmux split-window -v
 
tmux select-pane -t 0
tmux send-keys "cd /usr/src/linux" C-m
 
tmux select-pane -t 1
tmux send-keys "vim /boot/grub/grub.cfg" C-m
 
tmux select-window -t $SESSION:0
tmux rename-window "Process View"
tmux send-keys "htop" C-m
 
tmux select-window -t $SESSION:2
tmux select-pane -t 0
 
tmux attach-session -t $SESSION

A linha 5 cria uma seção com o comando new-session. A flag -s renomeia a seção para $SESSION. Observe que as flags -d e -s são relativas ao comando new-session.

Na linha 7 é criado uma nova janela de nome ‘System’, flag -n. Nesta janela é feito um split vertical e em seguida um split horizontal no painel inferior. O resultado dos splits é apresentado na figura abaixo.

tmux-01

Nas linhas 12 e 13 o painel 0 é selecionado e em seguida é executado o comando less na saída do dmesg. Nas linhas 15 e 16 o painel 1 é selecionado e nela é executado o comando watch sensors.

A linha 18 apenas seleciona o painel 2 antes de segui para as próximas janelas.

A linha 20 cria uma nova janela nomeada ‘Build’, para a construção do kernel. Esta é dividida em duas painéis verticais (linha 21) onde uma é executado um cd para o diretório do kernel (linhas 23 e 24) e na outra o vim para editar o arquivo de configuração do grub, /boot/grub/grub.cfg (linhas 26 e 27).

Na linha 29 a primeira janela é selecionada e em seguida (linha 30) a janela é renomeada para ‘Process View’, onde um htop é executado (linha 31).

A linha 33 seleciona a janela 2 e o painel 0 (linha 34).

A última linha, 36, faz um attach à seção $SESSION, quando o tmux é de fato aberto. Este último comando pode ser empregado para reiniciar uma seção aberta anteriormente.

As figuras a seguir mostram as janelas da seção construída com os comandos acima.

tmux-05

tmux-04

tmux-02

6. Finalizando

O tmux possui muitas outras funcionalidades, mas ainda sou um iniciante nele e não deu para explorar mais. Aconselho uma leitura do manual do comando (man tmux) e do seu info (info tmux) para mais detalhes das configurações.

Uma funcionalidade a qual achei muito interessante é a possibilidade de trabalhar com seções, permitindo trabalhar com painéis ajustados para trabalhos específicos como projetos, compilação, edição de textos em Latex e outros. A inicialização e construção de seções é algo que ainda pretendo gastar alguma energia.

Sobre o Autor

rudsonalves administrator

7 Comentários até agora

Almir MendesPostado em1:57 pm - set 21, 2013

Show Rudson, parabéns!

Eu havia comentado sobre ele no meu blog. Pra mim que trabalho com desenvolvimento todos os dias ele me ajuda e muito, ele e o Vim são ferramentas indispensáveis pra mim ;).

Vou pegar algumas dicas suas e adicionar ao meu tmux.conf 😉

Ah, uma dica que acabei não percebendo é que com o mapeamento CTRL+a para acionar os comandos do Tmux vc acaba “perdendo” o CTRL+a do terminal para ir para o início da linha.

Na verdade tem um jeito, basta adicionar essa linha no tmux.conf https://github.com/m3nd3s/dotfiles/blob/master/.tmux.conf#L83

Aí basta precionar CTRL+a duas vezes sempre que quiser ir para o início da linha no terminal.

Do mais parabéns pelo post

rudsonalvesPostado em7:39 pm - set 21, 2013

Estranho o CTRL+a em meu terminal não vai para o início da linha. Mas valeu a dica.

Almir MendesPostado em12:21 pm - set 23, 2013

Rudson,

Tem que fazer CTRL+a duas vezes 😉

rudsonalvesPostado em3:24 pm - set 23, 2013

No tmux sim. Me referia ao terminal, mas acho que era bug, pois no último upgrade passou a funcionar.

LizziePostado em9:33 am - dez 31, 2014

Hi to every body, it’s my first visit of this website; this website consists of
amaszing aand actually fine information designed for visitors.

viewdetails http://www.insanejournal.com/update.bml http://warnernickl5.soup.io/post/427384083/Thoughts-On-Clear-cut-Finance-Systems http://www.insanejournal.com/update.bml http://www.blackplanet.com/your_page/blog/manage/posting_list.html?pp=1 http://wwwPostado em2:47 am - maio 7, 2015

This article will assist the internet users for
creating new weblog or even a weblog from start to
end.

Deixe uma resposta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.