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:

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:

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:

[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:

  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:

#!/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.