Luis Carlos Pando's avatar En este post quiero compartir la configuración actual de mi .zshrc, para mejorar un poco mi workflow en macOS. En él incluyo la siguiente configuración: Mi ambiente de Node Mi ambiente de Ruby (Ruby porque uso Jekyll para generar mi sitio) Un prompt personalizado para mi terminal con Starship Una integración custom con el CLI Permalink
Saltar navegación

¡Estoy en vivo!

La configuración de mi .zshrc para mejorar mi workflow en la Mac

Por ( Mastodon @mijo ) Enlace permanente Permalink

En este post quiero compartir la configuración actual de mi .zshrc, para mejorar un poco mi workflow en macOS. En él incluyo la siguiente configuración:

  • Mi ambiente de Node
  • Mi ambiente de Ruby (Ruby porque uso Jekyll para generar mi sitio)
  • Un prompt personalizado para mi terminal con Starship
  • Una integración custom con el CLI de 1Password para usar mis llaves SSH y credenciales de manera cómoda y segura

Mi .zshrc hace lo siguiente básicamente:

Configura Ruby mediante rbenv y chruby

Uso estas herramientas según las necesidades del proyecto. Me permite cambiar de versión fácilmente o establecer mi herramienta preferida de forma global.

Gestionar Node Version Manager (nvm)

La mejor manera de gestionar Node.js es usando nvm. Recomiendo ampliamente su uso.

Uso del prompt de Starship

Hay prompts muchos más locos y perros que lo que yo hice aquí, pero a mi me gusta y me funciona. Igual puede servirle de base a alguien.

Da soporte para ejecutables instalados con pipx

Esto hace que los CLI instalados vía pipx estén disponibles globalmente añadiéndolas a mi PATH.

Implementa caché por sesión y auto-refresh en el CLI 1Password

Esto es lo que más me entona. Vean:

Al abrir una terminal:

  • Primero verifica si hay una sesión de 1Password en caché
  • Si está expirada o no existe, inicia sesión automáticamente con op signin y guarda el token de la sesión localmente en un archivo
  • Usa un simple mecanismo lockfile para evitar inicios de sesión repetidos e innecesarios dentro de un intervalo de tiempo (yo lo tengo configurado en 10 minutos)
  • Muestra una pequeña notificación (🔐 Sesión de 1Password actualizada ✅) al auto-actualizar la sesión

Agrega útiles alias para la gestión de sesiones de 1Password

Y estos alias los tengo agregados a Raycast como snippets:

Snippet !1plogout en Raycast:

op signout
rm ~/.op_session

Limpia manualmente una sesión del CLI de 1Password

Snippet !1preset en Raycast:

op-reset

Reinicia una sesión del CLI de 1Password

Snippet !1pstatus en Raycast:

op-status

Checa el estatus de la sesión actual del CLI de 1Password

¿Por qué hacer todo esto?

Si estás manejando varios proyectos a la vez (especialmente en editores como Zed o VS Code), podrás notar que varias sesiones de terminal compiten por una sesión válida del CLI de 1Password.

La configuración que tengo en mi .zshrc mantiene la sesión almacenada de manera segura en caché y solo solicita una nueva cuando es necesario, esto reduce interrupciones en mi workflow (no me pide autenticarme muchas veces) y hace uso de buenas prácticas de seguridad.

También se asegura que el socket del agente SSH siempre esté apuntando al agente de 1Password. Esto hace que mis llaves SSH estén disponibles para Git y conexiones a servidores usando 1Password, que es en donde tengo todos mis secrets de manera segura. Y lo hermoso de este cotorreo es que puedo simplemente usar Touch ID para autenticarme.

Antes de implementar una configuración como la mía, asegúrate de:

  • Reemplazar ruby-3.2.0 por la versión de Ruby que prefieras (o ignorar esta sugerencia completamente si no usas Ruby, entiendo que en 2025 es difícil que alguien lo siga usando)
  • Reemplazar my por el alias real de tu cuenta de 1Password, lo puedes obtener usando este comando:
op account list

Ahora si, mi .zshrc completo

# ========================
# Ruby environment setup
# ========================
# rbenv setup (replace X.X.0 with your Ruby version)
export PATH="$HOME/.gem/ruby/X.X.0/bin:$PATH"
eval "$(rbenv init - zsh)"
export PATH="/usr/local/opt/ruby/bin:/usr/local/lib/ruby/gems/3.0.0/bin:$PATH"
# chruby setup (replace ruby-3.2.0 with your desired Ruby version)
source /opt/homebrew/opt/chruby/share/chruby/chruby.sh
source /opt/homebrew/opt/chruby/share/chruby/auto.sh
chruby ruby-3.2.0
# ========================
# Node Version Manager
# ========================
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
# ========================
# Starship Prompt
# ========================
eval "$(starship init zsh)"
# ========================
# pipx executables
# ========================
export PATH="$PATH:$HOME/.local/bin"
# ========================
# 1Password CLI & SSH Agent (with session caching)
# ========================
# Set SSH agent socket for 1Password CLI
export SSH_AUTH_SOCK="$HOME/.1password/agent.sock"
if command -v op >/dev/null 2>&1; then
  # Path to cached session token
  OP_SESSION_FILE="$HOME/.op_session"
  OP_SESSION_LOCK="$HOME/.op_session.lock"
  # Check if lockfile exists and is fresh (within last 10 minutes)
  if [ ! -f "$OP_SESSION_LOCK" ] || [ $(find "$OP_SESSION_LOCK" -mmin +10 2>/dev/null) ]; then
    # No fresh lock — perform signin check
    if [ -f "$OP_SESSION_FILE" ]; then
      export OP_SESSION_my=$(cat "$OP_SESSION_FILE")
      if ! op account get --account my >/dev/null 2>&1; then
        export OP_SESSION_my=$(op signin --account my --raw)
        echo "$OP_SESSION_my" > "$OP_SESSION_FILE"
        echo "🔐 1Password session refreshed ✅"
      fi
    else
      echo "🔐 Signing in to 1Password CLI..."
      export OP_SESSION_my=$(op signin --account my --raw)
      echo "$OP_SESSION_my" > "$OP_SESSION_FILE"
    fi
    # Update lockfile timestamp
    touch "$OP_SESSION_LOCK"
  else
    # Session assumed valid — just load token
    export OP_SESSION_my=$(cat "$OP_SESSION_FILE")
  fi
fi
# ========================
# 1Password CLI Helpers
# ========================
# Check if 1Password session is active
alias op-status='if op account get --account my >/dev/null 2>&1; then echo "✅ 1Password session is active"; else echo "❌ 1Password session is NOT active"; fi'
# Force-reset session lock manually
alias op-reset='rm -f $HOME/.op_session.lock && echo "🔐 1Password session lock cleared. Next terminal will prompt again."'
# ========================
# Default Editor (Optional)
# ========================
# export VISUAL="vim"
# export EDITOR="$VISUAL"

Mi .zshrc también está disponible en:

Como casi siempre, comparto cosas que muy probablemente solo apliquen a mi caso, pero prefiero compartirlo por si sirve de inspiración para alguien o si a alguien le sirve, pues que mejor. 🫰


  • Likes

      Coméntame por correo o respóndeme en Mastodon (dale fav o boost para aparecer arriba). ¿Algo que no tenga que ver con este post? Pásate a mi página de página de contacto o contáctame en Discord.

      ¿Te gustó este post?