Como eu uso o Windows Terminal – automação extrema de terminal com tmux e um workflow customizado
(jyn.dev)- tmux, SSH, nvim e scripts poderosos de busca e automação são combinados para implementar um workflow único que permite explorar, editar e pesquisar arquivos em um servidor remoto imediatamente, sem GUI
- Com uma única combinação de teclas, pesquisa automática de nomes de arquivos em várias janelas do tmux e abertura imediata, além de troca de arquivos e gerenciamento de buffers, tudo é feito por atalhos
- Insatisfeito com a lentidão do VSCode e conflitos de keybinds, o autor integrou todas as operações por conta própria com scripts
- Combinando ferramentas Unix como regex, perl, tmux e nvim, ele viabilizou o reconhecimento automático de caminhos de arquivo e informações de linha, além da abertura direta
- Embora o processo de implementação seja muito complexo, ele mostra como é possível maximizar o poder e a extensibilidade do terminal
Meu jeito de usar o terminal
- Este texto compartilha a experiência de montar um ambiente de desenvolvimento eficiente combinando terminal e ferramentas
- Como se trata de um processo complexo que normalmente exigiria vídeo, ele conecta texto e gravações reais em vídeo (assistir ao vídeo é essencial)
- Algumas etapas do vídeo (0:11, 0:21, 0:41) são momentos em que muita gente se surpreende e pensa: "isso é possível?"
Resumo passo a passo do workflow de terminal mostrado no vídeo
- 0:00 : Executa o Windows Terminal no notebook
- 0:02 : Abre uma nova aba do terminal com o atalho ctrl + shift + 5, conecta ao desktop de casa com
sshe executa tmux imediatamente - 0:03 : Executa o shell padrão zsh no tmux, mostra o prompt e carrega toda a configuração de forma assíncrona
- 0:08 : Usa
zoxidepara fazer busca fuzzy em diretórios recentes e navegar até eles - 0:09 : Começa a digitar o comando ripgrep, o zsh completa automaticamente com base no histórico anterior, e ele aceita com ctrl + f
- 0:11 : Com o atalho
ctrl + kf, pesquisa nomes de arquivos em todo o scrollback do tmux, com os nomes destacados em azul - 0:12 : Continua pressionando a tecla
npara navegar pela lista de arquivos encontrados na busca - 0:21 : Com a tecla
o, abre o arquivo selecionado no app padrão (nvim), executado por uma nova janela do tmux (ainda funcionando no servidor remoto) - 0:26 : Tenta navegar por várias referências no código com rust-analyzer; alguns macros não são reconhecidos, mas em 0:32 a navegação funciona normalmente
- 0:38 : Com
ctrl + kh, muda o foco do tmux para a janela da esquerda - 0:39 : Pressiona
nnovamente para continuar navegando pelos resultados anteriores da busca de arquivos no estado de "copy-mode" - 0:41 : Com a tecla
o, desta vez abre outro arquivo na instância existente do nvim - 0:43 : Com a tecla
b, verifica a lista de buffers de arquivos abertos e alterna entre os dois arquivos para encerrar
Por que ele passou a usar esse workflow de terminal?
- O VSCode é lento, especialmente com plugins de vim, e fica travando bastante
- Entre editor, plugin de vim, terminal e recursos de gerenciamento de janelas, há conflitos frequentes de keybinds, o que atrapalha
- Ele também testou o editor Zed, mas na época ainda era imaturo e o problema de conflito de keybinds continuava
- Ele começou a usar nvim (Neovim) diretamente no terminal, mas
- o processo de copiar manualmente os nomes dos arquivos encontrados com ripgrep e colá-los no editor era trabalhoso demais
- especialmente quando o resultado do ripgrep trazia nome do arquivo e número da linha juntos,
- surgiam erros de sintaxe a cada colagem
- e muitas vezes era preciso editar coisas desnecessariamente antes mesmo de abrir o arquivo de fato
- ele sentiu falta de um workflow que abrisse caminhos de arquivo diretamente, como o ctrl-click do VSCode
- Por isso, ele acabou implementando por conta própria os recursos desejados com tmux
- Quando perguntam por que as pessoas usam tmux, ele explica que é justamente por causa dessa automação e da persistência de sessão
- O terminal é muito mais poderoso do que parece, mas só com os recursos básicos essa automação não fica evidente
- Embora o tmux seja antigo, tenha sintaxe complexa e alguns bugs, ele o escolheu pela extensibilidade e possibilidade de customização
Principais formas de implementação
Busca de nomes de arquivos em todo o scrollback no tmux
- Correspondência de padrões de nomes de arquivo com expressões regulares complexas no copy-mode do tmux
- Um script de regex feito por ele (
search-regex.sh) destaca caminho do arquivo, linha e coluna - Exemplo de configuração do tmux:
bind-key f copy-mode \; send-keys -X search-backward '정규표현식'
Abrir o arquivo selecionado em uma nova janela/na janela atual
- Com atalhos do tmux, o arquivo selecionado é aberto no app padrão ou no editor (
nvim, etc.) de forma customizada - Com suporte a caminhos relativos e expansão de til
bind-key -T copy-mode-vi o send-keys -X copy-pipe 'cd #{pane_current_path}; ...' bind-key -T copy-mode-vi O send-keys -X copy-pipe-and-cancel 'tmux send-keys ...'
Abrir arquivos em uma instância do nvim já aberta
- Com um script em perl, o tmux encontra um pane específico do nvim e envia diretamente para ele a entrada de teclas com informações de arquivo/linha
- A sintaxe
file:line:columné convertida em um comando do vim para abertura automática
Vantagens e limitações dessa abordagem
- Supera os limites funcionais do terminal local: permite explorar, editar e pesquisar arquivos livremente em um servidor remoto via tmux
- Mesmo que o editor não ofereça suporte a protocolos de edição remota, o mesmo workflow continua possível
- Todos os keybinds, buscas, troca de arquivos e gerenciamento de buffers são integrados exatamente do jeito desejado
- É mais rápido e fácil automatizar assim do que criar um plugin para o VSCode
- Como os scripts feitos por ele são frágeis e difíceis de manter, é difícil recomendá-los para outras pessoas
Soluções alternativas
- Combinações de open source/ferramentas geralmente recomendadas:
fish + zoxide + fzf: pode substituir workflows de diretórios com fuzzy search, busca de comandos e parte da busca de arquivos- Recursos embutidos do editor (abas, janelas, fuzzy finder etc.) já são suficientes para a maioria dos usuários
qf: permite selecionar arquivos a partir da saída do terminal, mas não se integra com ferramentas interativas; usa uma CLI no estilo vie: pequena ferramenta que reconhece caminhosfile:line(exige scripts separados para cada tipo de editor)vim --remote,code filename,emacsclientetc. também produzem efeito semelhante, mas o reconhecimento defile:lineé incompleto
Conclusão e lições
- O terminal é muito mais poderoso do que parece e, quando combinado diretamente com scripts, permite automações impossíveis em ferramentas GUI
- Ainda assim, há limitações práticas, como manutenção e bugs inerentes aos scripts
- Se houver interesse em automação de workflows no terminal, o mais realista é começar montando gradualmente um ambiente customizado com tmux/nvim/fzf
1 comentários
Comentários do Hacker News
Eu também uso um truque parecido. Aproveito o scrollback do tmux e canalizo a saída tokenizada para o zsh, então consigo usar autocompletar para tudo que está visível na tela do tmux. Compartilhei um post no Threads relacionado e o código no gist. Foi realmente muito útil
Gosto muito desse tipo de workflow, então também venho refinando algo parecido há anos, repetidamente. Com o tempo, tenho tentado reduzir ao máximo as camadas de customização, porque quanto mais overlays você adiciona, maior fica o custo de manutenção. Dá para fazer a maior parte do que o post mostra só com Vim puro (sem tmux separado), por exemplo com
rg --vimgrep restore_tool | vim -c cb -(vim -c cb -é um dos meus recursos favoritos do Vim, e acho curioso como quase ninguém usa). Claro, rodar a busca do rg de novo toda vez pode ser pesado, então eu costumo analisar os resultados no terminal e, se precisar, uso um comando customizado do tmux para copiar a saída do último comando e mandar para o vim. Às vezes uso esse truque com caractere Unicode no prompt e, em outros casos, passo comtmux saveb - | vim -c cb -vimrcbem simples com 1 ou 2 linhas por ano. As configurações padrão de softwares antigos geralmente existem por um motivo, e eu recomendaria entender esse motivo antes de sair mudando tudovim -c cb -é um dos seus recursos favoritos do Vim; será que pode explicar o que isso faz? Eu testeils | vim -els | vim -c cb -, mas não percebi de imediato qual é a diferença)vim -q <(ripgrep --vimgrep restore_tool)Esse setup fica bonito porque inclui tmux, fzf, rg, zoxide e um nvim limpo. Se ainda não tiver, eu também recomendaria atuin, starship, bat, glow, duf, dogdns, viddy, gum/sesh, dust e btop. Dá para achar todos nas listas Awesome Terminal XYZ no GitHub. O atuin é realmente essencial, e ficar sem zoxide é como ser atleta usando um tênis que não serve direito. Para gravar vídeos de terminal, asciinema é uma escolha melhor. Na verdade, antigamente esse tipo de setup se chamava simplesmente “programador”. Hoje em dia também é obrigatório dominar ferramentas como VSCode, Zed, Cursor etc., além de saber o que delegar para cada LLM. Essas ferramentas são só o novo “mínimo”; elas não substituem o ambiente que já existia. Você pode ser muito bom com Claude Code, gptel e afins, mas às vezes ainda vai quebrar a árvore, e para mim é impensável usar git sem magit. Se alguém realmente acha que Cursor puro é mais rápido que o setup do autor, eu diria para essa pessoa gravar um vídeo usando LLMs em produção de verdade
Todo usuário de vim/tmux provavelmente já construiu, pelo menos pela metade, um “Emacs de imitação” não oficial, meio bugado, mas rápido
:Termdentro do nvimEle diz que usa tmux no Windows, mas queria entender como isso funciona na prática. Seria bom se alguém pudesse explicar
Gosto muito desse jeito de compartilhar workflows. É perfeito para o público-alvo. Eu queria que o vídeo tivesse áudio, mas também foi legal poder ler a lista de ações depois. Aprendi algumas coisas que posso aproveitar no meu próprio workflow. Ele mencionou os atalhos de teclado esotéricos do tmux; alguém aqui já usou byobu? O byobu é um wrapper para tmux que coloca a maioria dos comandos nas teclas F#. Conheci isso há 10 anos e uso desde então. Antes disso, passei alguns anos só com tmux puro
ctrl-ké o meu prefixo, ehnão fica com o padrão de “selecionar painel à esquerda”. Nunca usei byobu, mas pela descrição parece mais uma forma de deixar os atalhos padrão um pouco mais confortáveis, então eu não teria tanta vontade de adicionar mais uma camada por cimaDá para expandir recursos como o modo de cópia com plugins do tmux, sem precisar fazer tudo manualmente com regex gigantes. Existem tmux-fpp, tmux-copycat, tmux-fingers e tmux-urlview. Vale lembrar que depender o máximo possível dos recursos embutidos pode ser melhor para desempenho. Eu também gosto muito de tmux-resurrect (salvar/restaurar sessões), tmux-continuum (automação) e tmux-zen para Oh-My-Fish. Apresento tmux-resurrect, tmux-continuum e tmux-zen. Quero destacar que montar um ambiente tmux muito legal é mais fácil do que parece
:, e b) o copycat usa sua própria abstração de visualização, então só dá para fazer uma ação por busca. A minha abordagem reaproveita a busca embutida do tmux, então posso associar livremente a ação que eu quiser aos arquivos destacados. A razão de a maioria dos plugins oferecer só copiar/colar ou criar seu próprio modo é que o tmux praticamente só permite controlar destaque pela busca embutidaEsse tipo de setup é realmente lindo. Mas ainda acho um mistério não existir um typeahead de IA decente para terminal. O tab do Cursor parece servir perfeitamente, mas a aplicação ao terminal continua travada. Às vezes dá vontade de montar rapidinho um produto que canalize a saída do terminal para arquivos falsos e envie isso ao Cursor
O título do artigo na verdade é “How I use my terminal”