10 Utilidades Diversas
Esta sección cubre herramientas que mejoran significativamente la experiencia general en terminal, desde corrección automática hasta personalización avanzada del prompt.
10.1 tealdeer - Ejemplos prácticos de comandos
tealdeer es una implementación moderna y rápida de tldr, compatible con las páginas tldr pero escrita en Rust.
La fórmula original de tldr en Homebrew ha sido marcada como obsoleta. Las alternativas recomendadas son:
Opción 1: tealdeer (recomendado para Homebrew)
# Desinstalar tldr si está instalado
brew uninstall tldr 2>/dev/null || true
# Instalar tealdeer (implementación en Rust)
brew install tealdeerOpción 2: tldr vía npm (versión oficial mantenida)
npm install -g tldr10.1.1 Uso básico
# Ver ejemplos de un comando (usa comando 'tldr' igual que antes)
tldr git
tldr curl
tldr find
# Actualizar base de datos
tldr --update
# Buscar comando por funcionalidad
tldr --search "compress"
tldr --search "network"
# Plataforma específica
tldr -p linux tar
tldr -p macos ls10.1.2 Configuración avanzada
# Configurar tema
tldr --theme base16
# Idioma específico (si está disponible)
tldr -L es git
# Configuración en ~/.config/tealdeer/config.toml
[display]
compact = false
use_pager = false
[updates]
auto_update = true
auto_update_interval_hours = 24
[style]
description = "white"
code = "green"
parameter = "cyan"10.1.3 Comparación de alternativas
| Implementación | Instalación | Velocidad | Estado |
|---|---|---|---|
tealdeer |
brew install |
⚡ Muy rápida | ✅ Mantenido |
tldr (npm) |
npm install -g |
🚀 Rápida | ✅ Oficial |
tldr (brew) |
❌ Obsoleto | 🐌 Regular | ❌ Deprecated |
10.2 thefuck - Corrector automático
thefuck corrige automáticamente comandos mal escritos.
10.2.1 Configuración inicial
# Agregar a ~/.zshrc o ~/.bashrc
eval $(thefuck --alias)
# O crear alias personalizado
eval $(thefuck --alias fix)10.2.2 Ejemplos de uso
# Comando mal escrito
$ gut push
git: 'gut' is not a git command
$ fuck
git push [enter/↑/↓/ctrl+c]
# Puerto ocupado
$ python -m http.server 8000
OSError: [Errno 48] Address already in use
$ fuck
python -m http.server 8001 [enter/↑/↓/ctrl+c]10.2.3 Configuración avanzada
Archivo ~/.config/thefuck/settings.py:
# Configuración personalizada
rules = ['git_push', 'python_command', 'ls_lah', 'cd_mkdir']
exclude_rules = ['rm_root']
require_confirmation = True
wait_command = 3
history_limit = 1000
# Alias personalizado
alias = 'fix'10.3 cowsay - Arte ASCII divertido
cowsay genera arte ASCII con mensajes personalizados.
10.3.1 Uso básico
# Mensaje básico
cowsay "Hola mundo"
# Diferentes animales
cowsay -f dragon "Soy un dragón"
cowsay -f tux "¡Linux!"
# Listar animales disponibles
cowsay -l10.3.2 Expresiones de la vaca
# Diferentes estados de ánimo
cowsay -b "Ojos de Borg" # Borg
cowsay -d "Muerto" # Dead
cowsay -g "Codicioso" # Greedy
cowsay -p "Paranoico" # Paranoid
cowsay -s "Stoned" # Stoned
cowsay -t "Cansado" # Tired
cowsay -w "Cableado" # Wired
cowsay -y "Joven" # Young10.3.3 Integración con otras herramientas
# Con fortune (si está instalado)
fortune | cowsay
# Con fecha
date | cowsay -f tux
# En MOTD del sistema
echo "$(whoami), bienvenido a $(hostname)" | cowsay -f dragon
# Pipeline divertido
curl -s "https://api.quotegarden.com/api/v3/quotes/random" | \
jq -r '.data.quoteText' | cowsay -f elephant10.4 direnv - Variables de entorno por directorio
direnv carga automáticamente variables de entorno al entrar a directorios.
10.4.1 Configuración inicial
# Agregar a ~/.zshrc
eval "$(direnv hook zsh)"
# Para bash
eval "$(direnv hook bash)"10.4.2 Uso básico
# Crear archivo .envrc en tu proyecto
echo 'export DATABASE_URL="postgres://localhost/mydb"' > .envrc
echo 'export DEBUG=true' >> .envrc
# Permitir el archivo
direnv allow
# Al entrar al directorio, las variables se cargan automáticamente
# Al salir, se descargan10.4.3 Ejemplos avanzados
10.4.3.1 Proyecto Python
# .envrc para proyecto Python
export VIRTUAL_ENV="$PWD/.venv"
export PATH="$VIRTUAL_ENV/bin:$PATH"
export PYTHONPATH="$PWD/src:$PYTHONPATH"
# Variables de desarrollo
export FLASK_ENV=development
export DATABASE_URL="sqlite:///dev.db"
# Activar virtualenv si existe
if [ -d "$VIRTUAL_ENV" ]; then
source "$VIRTUAL_ENV/bin/activate"
fi10.4.3.2 Proyecto Node.js
# .envrc para proyecto Node.js
export NODE_ENV=development
export PORT=3000
# Usar versión específica de Node con nvm
use node 18.17.0
# Variables de API
export API_KEY="dev-api-key"
export REDIS_URL="redis://localhost:6379"10.4.3.3 Proyecto con Docker
# .envrc para proyecto Docker
export COMPOSE_PROJECT_NAME="myapp"
export DOCKER_BUILDKIT=1
# Variables para docker-compose
export POSTGRES_DB=myapp_dev
export POSTGRES_USER=developer
export POSTGRES_PASSWORD=devpass
# Path para herramientas locales
PATH_add ./scripts
PATH_add ./node_modules/.bin10.5 starship - Prompt personalizable
starship es un prompt de terminal minimalista y rápido.
10.5.1 Configuración inicial
# Agregar a ~/.zshrc
eval "$(starship init zsh)"
# Para bash
eval "$(starship init bash)"10.5.2 Configuración básica
Archivo ~/.config/starship.toml:
[character]
success_symbol = "[➜](bold green)"
error_symbol = "[➜](bold red)"
[directory]
truncation_length = 3
truncation_symbol = "…/"
[git_branch]
symbol = "🌱 "
format = "on [$symbol$branch]($style) "
[git_status]
conflicted = "🏳"
ahead = "🏎💨"
behind = "😰"
diverged = "😵"
untracked = "🤷"
stashed = "📦"
modified = "📝"
staged = '[++\($count\)](green)'
renamed = "👅"
deleted = "🗑"
[nodejs]
symbol = "⬢ "
format = "via [$symbol($version )]($style)"
[python]
symbol = "🐍 "
format = 'via [${symbol}${pyenv_prefix}(${version} )(\($virtualenv\) )]($style)'
[rust]
symbol = "🦀 "
format = "via [$symbol($version )]($style)"
[docker_context]
symbol = "🐳 "
format = "via [$symbol$context]($style) "10.5.3 Presets disponibles
# Ver presets disponibles
starship preset --list
# Aplicar preset
starship preset nerd-font-symbols -o ~/.config/starship.toml
starship preset tokyo-night -o ~/.config/starship.toml10.6 Workflows con utilidades
10.6.1 Script de setup de entorno
#!/bin/bash
# dev-setup.sh - Configurar entorno de desarrollo
setup_git() {
echo "🔧 Configurando Git..."
# Configuración básica si no existe
if ! git config --global user.name >/dev/null 2>&1; then
read -p "Nombre para Git: " git_name
git config --global user.name "$git_name"
fi
if ! git config --global user.email >/dev/null 2>&1; then
read -p "Email para Git: " git_email
git config --global user.email "$git_email"
fi
# Aliases útiles
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
}
setup_shell() {
echo "🐚 Configurando shell..."
# Backup de configuración existente
[ -f ~/.zshrc ] && cp ~/.zshrc ~/.zshrc.backup
# Configurar starship
echo 'eval "$(starship init zsh)"' >> ~/.zshrc
# Configurar direnv
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc
# Configurar thefuck
echo 'eval $(thefuck --alias)' >> ~/.zshrc
# Aliases útiles
cat >> ~/.zshrc << 'EOF'
# Aliases útiles
alias ll='eza -la --git'
alias cat='bat'
alias find='fd'
alias grep='rg'
# Funciones útiles
help() {
tldr "$1" 2>/dev/null || man "$1" # tldr funciona igual con tealdeer
}
EOF
}
setup_project_templates() {
echo "📁 Creando templates de proyecto..."
TEMPLATES_DIR="$HOME/.project-templates"
mkdir -p "$TEMPLATES_DIR"
# Template para Python
mkdir -p "$TEMPLATES_DIR/python"
cat > "$TEMPLATES_DIR/python/.envrc" << 'EOF'
export PYTHONPATH="$PWD/src:$PYTHONPATH"
export VIRTUAL_ENV="$PWD/.venv"
export PATH="$VIRTUAL_ENV/bin:$PATH"
if [ -d "$VIRTUAL_ENV" ]; then
source "$VIRTUAL_ENV/bin/activate"
fi
EOF
# Template para Node.js
mkdir -p "$TEMPLATES_DIR/nodejs"
cat > "$TEMPLATES_DIR/nodejs/.envrc" << 'EOF'
export NODE_ENV=development
export PATH="$PWD/node_modules/.bin:$PATH"
use node 18
EOF
echo "Templates creados en $TEMPLATES_DIR"
}
# Función principal
main() {
echo "🚀 Configurando entorno de desarrollo..."
setup_git
setup_shell
setup_project_templates
echo "✅ Configuración completada!"
echo "💡 Reinicia tu terminal para aplicar los cambios"
# Mensaje motivacional
echo "¡Listo para programar!" | cowsay -f tux
}
main "$@"10.6.2 Sistema de notificaciones inteligente
#!/bin/bash
# smart-notify.sh - Sistema de notificaciones basado en contexto
NOTIFY_FILE="$HOME/.local/notifications"
LAST_COMMAND_FILE="$HOME/.last_command"
# Función para enviar notificación
send_notification() {
local title="$1"
local message="$2"
local urgency="${3:-normal}"
# macOS
if command -v osascript >/dev/null; then
osascript -e "display notification \"$message\" with title \"$title\""
# Linux
elif command -v notify-send >/dev/null; then
notify-send -u "$urgency" "$title" "$message"
fi
# Log para debug
echo "[$(date)] $title: $message" >> "$NOTIFY_FILE"
}
# Notificar cuando comando tarda mucho
notify_long_command() {
local cmd="$1"
local duration="$2"
if [ "$duration" -gt 30 ]; then
send_notification "Comando completado" "\"$cmd\" terminó en ${duration}s"
fi
}
# Hook para .zshrc
precmd() {
local exit_code=$?
local end_time=$(date +%s)
if [ -f "$LAST_COMMAND_FILE" ]; then
local start_time=$(cat "$LAST_COMMAND_FILE")
local duration=$((end_time - start_time))
if [ $exit_code -ne 0 ]; then
send_notification "Error en comando" "Comando falló con código $exit_code" "critical"
else
notify_long_command "$history[1]" "$duration"
fi
rm "$LAST_COMMAND_FILE"
fi
}
preexec() {
echo $(date +%s) > "$LAST_COMMAND_FILE"
}- Combina
tealdeer(comandotldr) conmanpara documentación completa direnves perfecto para proyectos con configuraciones específicasstarshippuede mostrar información contextual del proyecto actualthefuckaprende de tus errores comunes
En el próximo capítulo exploraremos combinaciones avanzadas y workflows complejos.