tmux: Um Multiplexador de Terminais
Índice
- 1. 1. Instalação
- 2. 2. Um Pouco dos Atalhos do tmux
- 3. 3. Algumas Configurações/Modificações Úteis
- 3.1. 3.1. Substituir o C-b pelo C-a
- 3.2. 3.2. Mapeia – e | para split Vertical e Horizontal
- 3.3. 3.3. Renomear Automaticamente as Janelas
- 3.4. 3.4. Interações com o Mouse
- 3.5. 3.5. Selecionar um Painel com ALT+<direcional_key>
- 3.6. 3.6. Barra de Status Customizada
- 4. 4. Iniciar o tmux Automaticamente
- 5. 5. Trabalhando com Seções
- 6. 6. Finalizando
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:
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:
- tmux-1.8-x86_64-1_SBo.tgz – pacote para o Slackware64;
- tmux.tar.bz2 – os scripts para montagem do pacote, copiados do SlackBuilds.org e já editados para a versão 1.8 do tmux.
Para compilar pelos scripts do SlackBuilds editados, execute os comandos abaixo:
wget http://localhost/linux/tmux/tmux.tar.bz2 ... [prompt]tar xvf tmux.tar.bz2 ... [prompt]cd tmux [prompt]source tmux.info [prompt]wget $DOWNLOAD ... [prompt]./tmux.SlackBuild ... [prompt]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
:
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:
[TABLE=56]
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:
- habilita o scroll da janela pela rodinha de scroll do mouse
- permite a seleção de um painel pelo clique do mouse;
- 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:
- Restore tmux session after reboot
- Resurrecting tmux Sessions After Reboot
- Preserving (some) session state with tmux and bash
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:
#!/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.
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.
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.
7 Comentários