Shell Productivity: tmux, fzf & direnv
Mantenha longas execuções de go test ativas no tmux, pule para pacotes com fzf e carregue configurações Go por módulo com direnv em monorepos.
Busque em todas as páginas da documentação
Mantenha longas execuções de go test ativas no tmux, pule para pacotes com fzf e carregue configurações Go por módulo com direnv em monorepos.
Monorepos Go passam mais tempo no terminal do que muitas stacks web: raízes de módulos, múltiplas árvores go.mod e comandos de teste com paridade de CI.
tmux, fzf e direnv reduzem o atrito para que você concentre sua atenção nas falhas, não em sessões perdidas ou valores incorretos de GOPRIVATE.
Cartão de receita de referência rápida - pronto para copiar e colar.
# direnv: carrega automaticamente o ambiente ao entrar em um módulo
echo 'export GOTOOLCHAIN=auto' >> .envrc
echo 'export GOPRIVATE=github.com/myorg/*' >> .envrc
direnv allow
# fzf: busca difusa por um diretório de pacote
fd -t d . internal | fzf --preview 'ls {}'
# fzf + ripgrep: pule para um símbolo
rg -l "func HandleHealth" --glob '*.go' | fzf -m | xargs -r ${EDITOR:-vim}
# tmux: sessão nomeada para longa execução de testes
tmux new -s gotest
go test ./... -race -count=1 2>&1 | tee test.log
# desanexar: Ctrl-b d ; reanexar: tmux attach -t gotestQuando usar isso:
go test ./... de 20 minutos.go.mod diariamente.#!/usr/bin/env bash
# ~/.config/dotfiles/go-monorepo-setup.sh (ilustrativo)
# 1) direnv em um módulo de serviço
cd ~/src/myorg/platform/services/api
cat > .envrc <<'EOF'
export GOTOOLCHAIN=auto
export GOPRIVATE=github.com/myorg/*
export PATH="$(go env GOPATH)/bin:$PATH"
layout go
EOF
direnv allow
# 2) atalho fzf: abrir arquivo do repositório (requer fzf instalado)
export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!vendor/**" --glob "!*.git/*"'
open_go_file() {
local file
file=$(fzf -m --preview 'bat -n --color=always {} 2>/dev/null || head -100 {}') || return
${EDITOR:-vim} $file
}
# 3) sessão tmux com janelas para watch + testes
tmux new-session -d -s api -n shell
tmux send-keys -t api:shell "cd ~/src/myorg/platform/services/api && direnv allow ." C-m
tmux new-window -t api -n test
tmux send-keys -t api:test "go test ./... -count=1 -race 2>&1 | tee ~/artifacts/api-test.log" C-m
tmux attach -t apiO que isso demonstra:
.envrc com GOPRIVATE e layout go para caminhos cientes de módulos.go test) com comandos de pré-visualização opcionais.cd do shell e exporta variáveis de .envrc após direnv allow, prevenindo vazamento de GOPRIVATE entre projetos não relacionados.| Ferramenta | Resolve | Comando Go Típico |
|---|---|---|
| tmux | Persistência de sessão | go test ./... durante a noite |
| fzf | Seleção difusa | selecionar pacote internal/billing |
| direnv | Ambiente por diretório | GOTOOLCHAIN, GOPRIVATE |
| ripgrep + fzf | Navegação de código | pular para a definição do manipulador |
fd | Listas rápidas de arquivos | alimentar fzf com diretórios |
# .envrc
use go # se disponível na biblioteca padrão do direnv
export GOTOOLCHAIN=auto
export GOPRIVATE=*.corp.example.com,github.com/myorg/*
export GOLANGCI_LINT_CACHE=$PWD/.cache/golangci-lint
PATH_add "$(go env GOPATH)/bin"Execute direnv allow uma vez por diretório após editar .envrc.
# fzf: selecionar um pacote e testá-lo
go list ./... | fzf -m | xargs -r go test -count=1Combine com go list -json para metadados de caminho de módulo em pré-visualizações avançadas.
direnv allow esquecido - Alterações em .envrc não fazem nada silenciosamente. Correção: alias da='direnv allow' e hook no prompt do shell para mostrar o status do direnv.set -g mouse on em ~/.tmux.conf e aprenda o modo de cópia (Ctrl-b [)..gitignore - Alimentar find puro inclui ruído do vendor. Correção: rg --files ou fd com regras de ignorar..bashrc aplica em toda a organização a projetos pessoais. Correção: direnv por repositório apenas.tmux list-sessions e nomear por serviço (api, worker).head ou bat --line-range 1:80.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| tmux | Desenvolvimento remoto SSH | Apenas terminal integrado do IDE local |
| GNU screen | tmux indisponível | Projeto novo - preferir recursos do tmux |
| Workspace do IDE por módulo | Ferramentas de refatoração ricas | VM remota mínima |
Tarefas just / Make | Comandos repetíveis da equipe | Navegação difusa exploratória |
| Zellij | UX multiplexador moderno | Equipe já padronizada no tmux |
O Remote SSH recupera o estado do editor, mas longas execuções de testes puramente de shell ainda morrem se a conexão remota cair sem tmux.
Ele define convenções de layout GOPATH para fluxos de trabalho legados de GOPATH.
Projetos em modo de módulo precisam principalmente de PATH_add e exportações de ambiente, não de layout de origem GOPATH completo.
fzf-cd-widget (zsh) ou atalhos bash personalizados pulam diretórios rapidamente.
Combine com zoxide para caminhos frequentes.
O padrão Ctrl-b é bom.
Alguns mapeiam o prefixo para Ctrl-a para usuários Emacs - documente a configuração da equipe no repositório de dotfiles.
Sockets tmux e multi-attach SSH são possíveis, mas raros.
Prefira logs compartilhados em artefatos em vez de sessões interativas compartilhadas.
Sim, com o hook do direnv para fish.
As variáveis de ambiente Go se aplicam da mesma forma uma vez permitidas.
git branch | fzf | xargs git checkout é um atalho comum.
Útil quando branches de lançamento se multiplicam.
Sim, para padrões não secretos.
Nunca comite segredos - referencie 1Password ou caminhos de vault em vez disso.
Sim.
watchexec ou entr em *.go combinam bem com um painel de lint ao lado do watch go test.
apt install tmux fzf direnv ripgrep fd-find (o binário pode ser fdfind).
macOS: Equivalentes do Homebrew.
Um painel gerencia a longa execução ./...; outros executam go test ./internal/pkg -run TestName com escopo.
Não, mas vale a pena quando go list ./... retorna centenas de pacotes.
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, modernizadores go fix - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos de placa na compilação), wazero (última - verifique na compilação) e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026