Productividad en Shell: tmux, fzf y direnv
Mantén vivas las ejecuciones largas de go test en tmux, salta a paquetes con fzf y carga la configuración de Go por módulo con direnv en monorepos.
Busca en todas las páginas de la documentación
Mantén vivas las ejecuciones largas de go test en tmux, salta a paquetes con fzf y carga la configuración de Go por módulo con direnv en monorepos.
Los monorepos de Go pasan más tiempo en la terminal que muchas pilas web: raíces de módulos, múltiples árboles de go.mod y comandos de prueba de paridad con CI.
tmux, fzf y direnv reducen la fricción para que dediques tu atención a los fallos, no a las sesiones perdidas o a los valores incorrectos de GOPRIVATE.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# direnv: carga automática del entorno al entrar en un módulo
echo 'export GOTOOLCHAIN=auto' >> .envrc
echo 'export GOPRIVATE=github.com/myorg/*' >> .envrc
direnv allow
# fzf: búsqueda difusa de un directorio de paquete
fd -t d . internal | fzf --preview 'ls {}'
# fzf + ripgrep: saltar a un símbolo
rg -l "func HandleHealth" --glob '*.go' | fzf -m | xargs -r ${EDITOR:-vim}
# tmux: sesión nombrada para ejecución larga de pruebas
tmux new -s gotest
go test ./... -race -count=1 2>&1 | tee test.log
# desconectar: Ctrl-b d ; reconectar: tmux attach -t gotestCuándo usar esto:
go test ./... de 20 minutos.go.mod diariamente.#!/usr/bin/env bash
# ~/.config/dotfiles/go-monorepo-setup.sh (ilustrativo)
# 1) direnv en un módulo de servicio
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) Atajo de teclado fzf: abrir archivo del repositorio (requiere 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) Sesión tmux con ventanas para watch + tests
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 apiLo que esto demuestra:
.envrc con GOPRIVATE y layout go para rutas conscientes del módulo.go test) con comandos de vista previa opcionales.cd de la shell y exporta variables desde .envrc después de direnv allow, evitando fugas de GOPRIVATE entre proyectos no relacionados.| Herramienta | Resuelve | Comando Go Típico |
|---|---|---|
| tmux | Persistencia de sesión | go test ./... durante la noche |
| fzf | Selección difusa | seleccionar paquete internal/billing |
| direnv | Entorno por directorio | GOTOOLCHAIN, GOPRIVATE |
| ripgrep + fzf | Navegación de código | saltar a la definición del manejador |
fd | Listas rápidas de archivos | alimentar fzf con directorios |
# .envrc
use go # si está disponible en la biblioteca estándar de 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"Ejecuta direnv allow una vez por directorio después de editar .envrc.
# fzf: seleccionar un paquete y probarlo
go list ./... | fzf -m | xargs -r go test -count=1Combina con go list -json para metadatos de ruta de módulo en vistas previas avanzadas.
direnv allow olvidado - Los cambios en .envrc no hacen nada silenciosamente. Solución: alias da='direnv allow' y enganchar el prompt de la shell para mostrar el estado de direnv.set -g mouse on en ~/.tmux.conf y aprender el modo de copia (Ctrl-b [)..gitignore - Alimentar find simple incluye ruido de vendor. Solución: rg --files o fd con reglas de ignorar.GOPRIVATE - Exportar en .bashrc se aplica a toda la organización a proyectos personales. Solución: direnv solo por repositorio.tmux list-sessions y nombrar por servicio (api, worker).head o bat --line-range 1:80.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| tmux | Desarrollo remoto SSH | Solo terminal integrada de IDE local |
| GNU screen | tmux no disponible | Greenfield - preferir características de tmux |
| Espacio de trabajo de IDE por módulo | Herramientas de refactorización avanzadas | VM remota mínima |
Tareas just / Make | Comandos de equipo repetibles | Navegación difusa exploratoria |
| Zellij | UX multiplexor moderno | El equipo ya está estandarizado en tmux |
Remote SSH recupera el estado del editor, pero las ejecuciones largas de pruebas puramente en shell todavía mueren si la conexión remota se interrumpe sin tmux.
Establece convenciones de diseño de GOPATH para flujos de trabajo heredados de GOPATH.
Los proyectos en modo módulo principalmente necesitan PATH_add y exportaciones de entorno, no un diseño completo de GOPATH src.
fzf-cd-widget (zsh) o enlaces bash personalizados saltan directorios rápidamente.
Emparejar con zoxide para rutas frecuentes.
El predeterminado Ctrl-b está bien.
Algunos mapean el prefijo a Ctrl-a para usuarios de Emacs - documentar la configuración del equipo en el repositorio de dotfiles.
Los sockets de tmux y la multi-conexión SSH son posibles pero raros.
Prefiere logs compartidos en artefactos sobre sesiones interactivas compartidas.
Sí, con el hook de direnv para fish.
Las variables de entorno de Go se aplican de la misma manera una vez permitidas.
git branch | fzf | xargs git checkout es un enlace común.
Útil cuando las ramas de lanzamiento se multiplican.
Sí para valores predeterminados no secretos.
Nunca confirmes secretos - referencia Paths de 1Password o vault en su lugar.
Sí.
watchexec o entr en *.go combinan bien con un panel de lint junto al watch de go test.
apt install tmux fzf direnv ripgrep fd-find (el binario puede ser fdfind).
macOS: equivalentes de Homebrew.
Un panel se encarga de la ejecución larga de ./...; otros ejecutan go test ./internal/pkg -run TestName con ámbito reducido.
No, pero vale la pena cuando go list ./... devuelve cientos de paquetes.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, modernizadores de
go fix- verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación) y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026