TMUX
Tags: tmux, produtividade, linux, terminal
Published: 2023-04-07 00:50:28

# O que é tmux?

O tmux é um multiplexador de terminal. No dicionário *Michaelis*, temos o seguinte significado para o verbo *multiplexar*:

> Combinar várias mensagens em um mesmo meio de transmissão.

Um multiplexador de terminal permite que a gente "rode vários terminais dentro de um mesmo terminal", e isso é muito útil!

# Como instalar o tmux?

Para quem usa *Linux*, ele pode ser facilmente instalado com qualquer gerenciador de pacotes, basta um `apt-get install tmux`, `yum install tmux`, `pacman -S tmux` ou um `brew install tmux` no *macOS*.

> Dica: instale o tmux e acompanhe os exemplos!

# Como rodar o tmux?

Antes de rodar o tmux, é importante conhecer alguns conceitos fundamentais:

1. o tmux pode ter várias sessões;
2. cada sessão pode ter várias janelas;
3. cada janela pode ter vários painéis;

# Como iniciar uma sessão?

Isso pode ser feito através do comando:

```bash
tmux new -s sess-01
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ws85xxs2xywz83nfg9ux.png)

No caso, estamos conectados na sessão `sess-01` e estamos vendo a janela `0:zsh`, ou seja, a janela do índice 0 que tem o nome `zsh`. Sabemos isso por causa da barra inferior verde. Também estamos vendo o painel padrão, mas vamos deixar isso para depois!

Caso a gente rode um *nodejs*, o nome da janela vai mudar para `node`:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hcd8v9g64e1t0t1aphgr.png)

# Como dar um nome fixo para a janela?

Podemos fazer isso digitando um comando, mas é muito útil conhecer alguns atalhos, que são feitos através de combinações de teclas. A combinação para trocar o nome da sessão começa apertando `Ctrl + b`, soltando essas teclas e apertando `,` na sequência.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gshqc1h5kg2o4roj90dm.png)

Podemos agora digitar o nome da janela, como `janela-01`, e dar um Enter.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zejayig6da2xso4tk397.png)

A essa combinação, vamos resumi-la como `C-b ,`.

# Como criar uma nova janela?

Podemos usar a combinação `C-b c` de *create*. No caso, usamos essa combinação quatro vezes para criar quatro novas janelas:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g93v17jrvmunsiq6l3mr.png)

> Repare que estamos na janela `4:zsh*` e sabemos isso por causa do asterisco (*) na barra verde!

# Como ir para a janela anterior?

Podemos usar a combinação `C-b p` de *previous*:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h1mx4bkzbkfududw8x4t.png)

# Como ir para a próxima janela?

Podemos usar a combinação `C-b n` de *next*:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hn3zrdxhoz9d2qz88vyp.png)

# Como ir para a primeira janela, aquela que alteramos o nome?

Podemos usar a combinação `C-b 0`, pois `0` é o índice da primeira janela:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7s2amw3xvzqdwvu2fxma.png)

Para ir para a janela de índice 2, `C-b 2`:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fq4fx5k36kb93p1v6q8v.png)

> Sempre devemos ficar de olho na barra verde para nos localizarmos dentro do tmux!

# Como criar um novo painel?

Caso a gente queira ter dois painéis um do lado do outro, podemos usar a combinação `C-b %`, que é um pouco esquisito, mas saiba que é possível customizar as combinações!

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9wp0pq0txbt81zmus2w.png)

Para ir para o painel da esquerda, podemos usar `C-b Left`, que é a setinha da esquerda:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j5az4wlsqbgo4tlxe1g3.png)

Podemos usar as setinhas para navegar entre os painéis! Agora para encerrar o painel em foco, `C-d`:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ruxyypcvniswsdmzt12l.png)

E para criar um painel embaixo do outro, `C-b "`:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jd24l0f8vfm8qpgantjk.png)

# Como ter uma visão geral das janelas?

Eu gosto muito desse, é o `C-b w` de *windows*:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rsdsg4tbn2fv377z4f8.png)

Podemos usar as setinhas para andar pelas janelas e ver o que está rodando em cada uma!

# Como sair do tmux?

Caso a gente queira sair, mas sem fechar nada, podemos usar `C-b d` de *detach*:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0apx7q9pindcswwietw7.png)

Para se reconectar na sessão `sess-01`, podemos usar o comando:

```bash
tmux a -t sess-01
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxqpjqxdjkjbhh6rhqpo.png)

Ao fazer isso, perceba que o *node* continuou rodando, pois ao fazer *detach* ou mudar de sessão/janela, os programas continuam executando normalmente, e isso é muito útil! Se a gente tivesse se conectado a um terminal via *ssh* e criado uma nova sessão no tmux, o comportamento seria o mesmo! Uma vez que aprendemos tmux, temos tudo isso disponível independente do emulador de terminal, seja remoto ou não. Podemos fechar uma sessão em um terminal e voltar nesta mesma sessão em outro terminal horas depois!

# Customizar atalhos

O prefixo `C-b` dos atalhos não é tão prático de usar, então a maioria dos usuários muda para `C-a`. Podemos fazer isso criando um arquivo `~/.tmux.conf` com o seguinte conteúdo:

```ini
unbind C-b
set -g prefix C-a
bind C-a send-prefix
```

Para que essa configuração tenha efeito, podemos abrir e fechar manualmente todas as sessões ou podemos usar o seguinte comando:

```bash
tmux source-file ~/.tmux.conf
```

Ao fazer isso, o prefixo de todos os comandos passa a ser `C-a`. Testando e apresentando um último atalho útil, use `C-a ?` para ver todos os atalhos do tmux:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jcirqji8mcu7u1znog09.png)

Eu também gosto outras customizações:

1. `C-a r` para recarregar as configurações do tmux;
2. `C-a |` ao invés de `C-a %` para criar painéis à direita;
3. `C-a -` ao invés de `C-a "` para criar painéis abaixo;
3. Começar a indexar as janelas e painéis com 1 ao invés de 0;

O meu arquivo `~/.tmux.conf` ficou assim:

```ini
# C-a => Replaces C-b
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# C-b r => Reload config
bind r source-file ~/.tmux.conf

# C-b | => Replaces C-b %
unbind '%'
bind | split-window -h

# C-b - => Replaces C-b "
unbind '"'
bind - split-window -v

# Start windows and panes at 1, not 0
set -g base-index 1
setw -g pane-base-index 1

# Enabling mouse
set -g mouse on
```

# Resumo dos comandos

Dos comandos que vimos até aqui, fica um resumo já considerando o prefixo `C-a` e as customizações:

| Atalho | Operação | Palavra-chave  |
|:-:|:-:| :-: |
| C-a , | Trocar o nome da janela | - |
| C-a $ | Trocar o nome da sessão | $ession |
| C-a c | Criar nova janela | create |
| C-a p | Ir para a janela anterior | previous |
| C-a n | Ir para a próxima janela | next |
| C-a w | Visualizar janelas | windows |
| C-a d | Sair da sessão | detach |
| C-a &#124; | Criar painel à direita | separar horizontalmente (&#124;) |
| C-a - | Criar painel abaixo | separar verticalmente (-) |
| C-a z | Toggle de zoom em um painel | zoom |
| C-a Space | Reorganizar painéis | - |
| C-a Up|Right|Down|Left | Navegar entre painéis | - |

# Conclusão

Eu gostei muito de ter aprendido tmux porque ele permite organizar diferentes assuntos e diferentes tarefas em diferentes sessões e janelas. Quando eu troco de sessão para ver outro assunto, a antiga sessão permanece configurada e posso voltar da onde parei, mesmo que seja horas depois e mesmo que eu tenha fechado o terminal.

Se um comando vai demorar para executar, crio uma nova janela para continuar trabalhando, depois volto e vejo o resultado, o que acho mais prático do que ficar trocando processos de *foreground* para *background* e vice-versa. E isso funciona no meu computador pessoal (*Linux*), no trabalho (*macOS*) ou em servidores remotos ao quais me conecto por *ssh*.

# Referências

- [Aula sobre ambiente de linha de comando do curso Missing Semester, MIT](https://www.youtube.com/watch?v=e8BO_dYxk5c&t=911s)
- [Repositório do tmux](https://github.com/tmux/tmux/wiki)
- [Imagem dos trilhos](https://unsplash.com/photos/aG8iIT9_iqM)