Cómo configurar tmux para que se inicie automáticamente en tu terminal

Si eres desarrollador o administrador de sistemas, probablemente ya conoces las ventajas de tmux (Terminal Multiplexer). Esta herramienta te permite crear múltiples sesiones de terminal, dividir ventanas, mantener procesos ejecutándose en segundo plano y mucho más. Pero, ¿no sería genial que tmux se iniciara automáticamente cada vez que abres tu terminal?

En este post te enseñaré cómo configurar tanto Zsh como Bash para que tmux se inicie automáticamente, con una configuración inteligente que evita problemas comunes.

¿Por qué iniciar tmux automáticamente?

Antes de entrar en la configuración, veamos las ventajas:

  • Continuidad: Nunca pierdes tu trabajo si se cierra accidentalmente la terminal
  • Organización: Siempre tienes acceso a múltiples ventanas y paneles
  • Eficiencia: No necesitas recordar iniciar tmux manualmente
  • Sesiones persistentes: Puedes desconectarte y reconectarte sin perder el contexto

La configuración inteligente

El comando que usaremos es más sofisticado que un simple tmux al inicio del archivo de configuración. Aquí está la lógica completa:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux attach-session -t default || tmux new-session -s default
fi

Desglosando el comando paso a paso

Vamos a analizar cada parte de esta condición:

1. command -v tmux &> /dev/null

  • Propósito: Verifica que tmux esté instalado en el sistema
  • Funcionamiento: command -v busca el ejecutable de tmux
  • &> /dev/null: Redirige la salida al «agujero negro» para evitar mensajes en pantalla

2. [ -n "$PS1" ]

  • Propósito: Asegura que estamos en una sesión interactiva
  • PS1: Variable que contiene el prompt del shell
  • -n: Verifica que la variable no esté vacía
  • ¿Por qué importa?: Evita que tmux se ejecute en scripts o sesiones no interactivas

3. [[ ! "$TERM" =~ screen ]]

  • Propósito: Evita iniciar tmux dentro de GNU Screen
  • =~: Operador de expresión regular en Bash/Zsh
  • !: Negación – significa «NO coincide con»

4. [[ ! "$TERM" =~ tmux ]]

  • Propósito: Evita iniciar tmux dentro de otra sesión de tmux
  • Previene: Bucles infinitos de tmux dentro de tmux

5. [ -z "$TMUX" ]

  • Propósito: Verificación adicional de que no estamos en tmux
  • -z: Verifica que la variable esté vacía
  • $TMUX: Variable de entorno que tmux establece cuando está activo

6. tmux attach-session -t default || tmux new-session -s default

  • Primera parte: Intenta conectarse a una sesión existente llamada «default»
  • ||: Operador OR – si lo anterior falla, ejecuta lo siguiente
  • Segunda parte: Si no existe la sesión «default», crea una nueva

Configuración para Zsh

Si usas Zsh (puedes verificarlo con echo $SHELL), agrega esta configuración al final de tu archivo ~/.zshrc:

# Auto-start tmux
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux attach-session -t default || tmux new-session -s default
fi

Aplicar la configuración en Zsh:

# Opción 1: Agregar directamente desde la terminal
echo '
# Auto-start tmux
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux attach-session -t default || tmux new-session -s default
fi' >> ~/.zshrc

# Opción 2: Recargar la configuración
source ~/.zshrc

Configuración para Bash

Si usas Bash, la configuración es idéntica, pero va en el archivo ~/.bashrc (o ~/.bash_profile en macOS):

# Auto-start tmux
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux attach-session -t default || tmux new-session -s default
fi

Aplicar la configuración en Bash:

# Para Linux (usar ~/.bashrc)
echo '
# Auto-start tmux
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux attach-session -t default || tmux new-session -s default
fi' >> ~/.bashrc

# Para macOS (usar ~/.bash_profile)
echo '
# Auto-start tmux
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux attach-session -t default || tmux new-session -s default
fi' >> ~/.bash_profile

# Recargar la configuración
source ~/.bashrc  # o source ~/.bash_profile en macOS

Variantes y personalizaciones

Versión más simple (solo crear nueva sesión)

if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then
  exec tmux
fi

Versión con múltiples sesiones

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [ -z "$TMUX" ]; then
  # Lista sesiones existentes o crea una nueva con timestamp
  tmux attach || tmux new-session -s "session-$(date +%Y%m%d-%H%M%S)"
fi

Versión con selección de sesión

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [ -z "$TMUX" ]; then
  # Muestra sesiones existentes y permite elegir
  if tmux list-sessions &> /dev/null; then
    tmux attach
  else
    tmux new-session -s default
  fi
fi

Ventajas de nuestra configuración

  1. Segura: No crea bucles infinitos
  2. Inteligente: Solo se ejecuta cuando es apropiado
  3. Eficiente: Reutiliza sesiones existentes
  4. Compatible: Funciona en Bash y Zsh
  5. No invasiva: No interfiere con scripts o sesiones no interactivas

Cómo probar la configuración

  1. Aplicar los cambios: Ejecuta source ~/.zshrc o source ~/.bashrc
  2. Abrir nueva terminal: Debería iniciarse tmux automáticamente
  3. Verificar sesión: Dentro de tmux, presiona Ctrl+b seguido de s para ver sesiones

Comandos útiles de tmux

Una vez que tengas tmux ejecutándose automáticamente, estos comandos te serán útiles:

  • Ctrl+b d: Desconectarse de la sesión (detach)
  • Ctrl+b c: Crear nueva ventana
  • Ctrl+b %: Dividir panel verticalmente
  • Ctrl+b ": Dividir panel horizontalmente
  • tmux ls: Listar sesiones desde fuera de tmux
  • tmux attach -t nombre_sesion: Conectarse a sesión específica

Conclusión

Configurar tmux para que se inicie automáticamente es una pequeña optimización que puede hacer una gran diferencia en tu flujo de trabajo diario. La configuración que hemos implementado es robusta, segura y te garantiza que siempre tendrás acceso a las poderosas funcionalidades de tmux sin pensarlo dos veces.

¿Ya implementaste esta configuración? ¡Cuéntanos en los comentarios cómo ha mejorado tu productividad!


¿Te gustó este tutorial? Compártelo con otros desarrolladores que puedan beneficiarse de esta configuración.

Mi Configuración Perfecta de Tmux en macOS

Si pasas una cantidad ingente de tiempo en la terminal. Y cuando es tu herramienta principal, quieres que sea cómoda, potente y, por qué no, linda. Aquí es donde entra en juego `tmux`, el multiplexor de terminal que te permite tener múltiples sesiones, ventanas y paneles en un solo lugar.

Pero `tmux` por defecto es… bueno, es funcional. Para desatar su verdadero potencial, necesitas un buen archivo de configuración. Hoy quiero contarles mi viaje, un proceso de prueba y error, para llegar a una configuración de la que estoy realmente orgulloso, perfectamente adaptada para macOS.

## Paso 1: La Base y los Plugins

No empecé de cero. Encontré un Gist bastante popular que parecía un excelente punto de partida. Tenía una buena selección de plugins gestionados con [TPM (Tmux Plugin Manager)](https://github.com/tmux-plugins/tpm), que es la forma moderna de manejar esto.

La lista de plugins inicial era esta:

* `tmux-plugins/tpm`: El propio gestor de plugins.

* `tmux-plugins/tmux-sensible`: Un conjunto de configuraciones de sentido común que arreglan algunas de las peculiaridades de `tmux`.

* `christoomey/vim-tmux-navigator`: ¡Esencial! Permite navegar entre paneles de `tmux` y splits de Vim usando las mismas teclas (`Ctrl + h/j/k/l`).

* `dreamsofcode-io/catppuccin-tmux`: Si voy a pasar horas aquí, ¡que se vea bien!

* `tmux-plugins/tmux-yank`: Mejora la integración del portapapeles del sistema con el de `tmux`.

* `tmux-plugins/tmux-continuum` y `tmux-plugins/tmux-resurrect`: Guardan mi entorno de `tmux` automáticamente y lo restauran después de un reinicio. ¡Nunca más perderé mi layout!

Con esto ya tenía una base sólida, pero era hora de hacerla mía.

## Paso 2: La Batalla por los Atajos de Teclado

Aquí es donde empezó el verdadero trabajo de personalización. Lo primero que quise cambiar fue la forma de dividir paneles. Por defecto son `Ctrl-a %` y `Ctrl-a “`, que no me resultan nada intuitivos.

**La Solución Final:** Tras un poco de frustración, encontré la solución. Usar las teclas `-` (guion) y `=` (igual). Están juntas, en el lado derecho, y no entran en conflicto con nada.

* `Ctrl-a -` para división horizontal.

* `Ctrl-a =` para división vertical.

¡Perfecto! Simple, ergonómico y sin conflictos.

## Paso 3: Mejoras de Calidad de Vida

Con los atajos principales resueltos, me enfoqué en los detalles:

1. **Soporte para el Ratón:** Añadiendo `set -g mouse on`, de repente podía hacer clic en los paneles para seleccionarlos, arrastrar los bordes para cambiar su tamaño y, lo mejor de todo, hacer scroll con la rueda del ratón.

2. **Limpieza de Errores:** Durante el proceso, me encontré con algunos errores. La configuración base tenía unas opciones `utf8` que son obsoletas en versiones modernas de `tmux`. También encontré un error de sintaxis en el atajo para recargar la configuración (`Ctrl-a r`), donde faltaba una barra invertida. Corregir estos pequeños detalles dejó el archivo limpio y funcional.

## La Configuración Final

Después de todo este proceso, este es el archivo `.tmux.conf` con el que terminé. Siéntete libre de usarlo.

# Set prefix to Ctrl+a
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Set backtick as an additional prefix
set -g prefix2 `

# UTF-8 is on by default in modern tmux versions, these are deprecated
# set -g utf8 on
# set -g status-utf8 on

# 256 colors
set -g default-terminal "screen-256color"

# Increase scrollback buffer size
set -g history-limit 50000

# Decrease command delay
set -g escape-time 1

# Super useful when using "grouped" sessions
setw -g aggressive-resize on

# Enable mouse mode
set -g mouse on

# Set status bar position to top
set -g status-position top

# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-pipe "pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind -T copy-mode-vi Enter
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe "pbcopy"

# Reload tmux config
bind r source-file ~/.tmux.conf \; display "Reloaded!"

# Custom bindings for splitting panes
bind - split-window -v # Horizontal split (-)
bind = split-window -h # Vertical split (=)

# Don't exit from tmux when closing a session
set -g detach-on-destroy off

# Plugin Manager - TPM
# https://github.com/tmux-plugins/tpm
set -g @plugin 'tmux-plugins/tpm'

# List of plugins
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'christoomey/vim-tmux-navigator'
set -g @plugin 'dreamsofcode-io/catppuccin-tmux'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @plugin 'tmux-plugins/tmux-resurrect'

# Catppuccin settings
set -g @catppuccin_window_left_separator "?"
set -g @catppuccin_window_right_separator "? "
set -g @catppuccin_window_middle_separator " ?"
set -g @catppuccin_window_number_position "right"
set -g @catppuccin_window_default_fill "number"
set -g @catppuccin_window_default_text "#W"
set -g @catppuccin_window_current_fill "number"
set -g @catppuccin_window_current_text "#W"
set -g @catppuccin_status_modules_right "directory meetings date_time"
set -g @catppuccin_status_left_separator " ?"
set -g @catppuccin_status_right_separator "?"
set -g @catppuccin_status_fill "icon"
set -g @catppuccin_status_connect_separator "no"
set -g @catppuccin_directory_text "#{pane_current_path}"
set -g @catppuccin_meetings_text "#($HOME/.config/tmux/scripts/cal.sh)"
set -g @catppuccin_date_time_text "%H:%M"

## Cómo Instalar Esta Configuración

Si te ha gustado, aquí tienes los pasos para tenerla:

1. Guarda el código de arriba en `~/.tmux.conf`.

2. Instala el gestor de plugins TPM con este comando:

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

3. Abre `tmux` y presiona `Ctrl-a` + `I` (la letra i mayúscula) para que TPM instale todos los plugins.

¡Y ya está!

## Conclusión

Invertir tiempo en tus herramientas de trabajo siempre vale la pena. Este viaje de configuración me ha dejado con un entorno de `tmux` que no solo es potente, sino también increíblemente cómodo y personal. Espero que mi experiencia te sirva de inspiración para domar tu propia terminal.

«vfkit exited unexpectedly» en Mi Mac M3

Cómo Solucioné el Maldito Error «vfkit exited unexpectedly» en Mi Mac M3

El Error Que Me Hizo Cuestionar Mis Decisiones de Vida

Picture this: Es viernes por la tarde, quiero configurar Podman rápido en mi flamante Mac M3, y de repente aparece este error que me arruina el fin de semana:

Error: vfkit exited unexpectedly with exit code 1

Seguido de este mensaje críptico:

Error Domain=VZErrorDomain Code=1 Description="Internal Virtualization error. 
The virtual machine failed to start."

Y para colmo, cuando ejecuto podman info, veo esto:

OS: darwin/amd64  # ? ¿En serio? ¿En un Mac M3?

Si estás aquí, probablemente estés pasando por la misma pesadilla. Buenas noticias: ya encontré la solución y no es tan complicada como parece.

El Verdadero Problema (Spoiler: No Es Podman, Eres Tú… Bueno, Somos Nosotros)

Después de horas de frustración y de googlear hasta que me sangraron los ojos, descubrí la verdad incómoda: estaba usando la versión x86_64 de Podman en un Mac M3.

El problema es súper común y pasa porque:

  1. Homebrew doble personalidad: Muchos tenemos tanto la versión Intel (/usr/local) como la ARM (/opt/homebrew)
  2. PATH mal configurado: Terminamos usando la versión equivocada por accidente
  3. Rosetta 2 siendo «útil»: A veces ni nos damos cuenta que estamos en modo emulación

El resultado: vfkit (el hipervisor que maneja las VMs) intenta correr en modo de compatibilidad y el Apple Hypervisor Framework básicamente le dice «nope, esto no va a pasar».

Detective Mode: ¿Tengo Este Problema?

Antes de empezar a romper cosas, confirma que realmente tienes el problema de arquitectura:

# ¿Qué arquitectura está usando tu sistema?
uname -m && arch

# ¿Qué versión de Podman tienes?
which podman && file $(which podman)

# ¿Qué dice Podman sobre sí mismo?
podman info | head -5

Si ves x86_64 o i386 cuando deberías ver arm64, bingo. Ahí está tu problema.

También verifica si tienes los dos Homebrew:

# Intel Homebrew (el problemático)
ls -la /usr/local/bin/brew

# ARM Homebrew (el que queremos)
ls -la /opt/homebrew/bin/brew

La Solución Que Realmente Funciona

Paso 1: Mata al Podman Impostor

# Desinstala la versión x86_64
/usr/local/bin/brew uninstall podman

# Limpia cualquier VM zombie
podman machine stop --all 2>/dev/null || true
podman machine rm --all -f 2>/dev/null || true

Paso 2: Instala el Podman Correcto (ARM64 Nativo)

Aquí está la línea mágica que me salvó la vida:

# Esta línea es CRUCIAL - nota el arch -arm64 al principio
arch -arm64 /opt/homebrew/bin/brew install podman

Ese arch -arm64 es como decirle a tu Mac: «Oye, no seas inteligente, usa ARM64 y punto».

Paso 3: Arregla Tu PATH Para Siempre

Edita tu ~/.zshrc y asegúrate de que tenga esto al principio:

# Esto debe ir ANTES que cualquier otra cosa en tu PATH
export PATH="/opt/homebrew/bin:$PATH"

Paso 4: Verifica Que Todo Esté Bien

# Recarga tu configuración
source ~/.zshrc

# Verifica que ahora usa la versión correcta
which podman
file $(which podman)  # Debe decir "arm64"
podman --version

Paso 5: Crea Tu VM ARM64

# Configuración que me funciona perfecto en M3
podman machine init --cpus 2 --memory 4096 --disk-size 50

# El momento de la verdad
podman machine start

Si ves este mensaje, ya ganaste:

Machine "podman-machine-default" started successfully

Paso 6: La Prueba Definitiva

# Verifica que todo esté corriendo
podman machine list
podman info | head -5  # Ahora debe decir "darwin/arm64"

# Prueba con un contenedor real
podman run --rm hello-world

Lo Que Cambió y Por Qué Funciona Ahora

La diferencia clave es que ahora:

  • Antes: OS: darwin/amd64 (vfkit corriendo en emulación = dolor)
  • Después: OS: darwin/arm64 (vfkit nativo = felicidad)

El vfkit ahora puede hablar directamente con el Apple Hypervisor Framework sin traducciones raras de por medio.

Errores Comunes y Sus Soluciones

«Cannot install under Rosetta 2»

Tu terminal está corriendo en modo Intel. Solución:

arch -arm64 /opt/homebrew/bin/brew install podman

«VM already exists»

Podman se confundió con las VMs viejas:

podman machine rm podman-machine-default -f
podman machine init --cpus 2 --memory 4096 --disk-size 50

Sigue diciendo «darwin/amd64»

Tu PATH sigue apuntando al Podman viejo:

# Verifica cuál está usando
which podman

# Debe devolver: /opt/homebrew/bin/podman
# Si devuelve: /usr/local/bin/podman, tu PATH está mal

El Resultado: Podman Que Realmente Funciona

Una vez que termines, deberías tener:

$ podman info | head -5
OS: darwin/arm64           # ? ¡Por fin!
buildOrigin: brew
provider: applehv
version: 5.5.1

$ podman machine list
NAME                     VM TYPE     CREATED        LAST UP            CPUS   MEMORY   DISK SIZE
podman-machine-default*  applehv     5 minutes ago  Currently running  2      4GiB     50GiB

¿Por Qué No Simplemente Usar Docker Desktop?

Buena pregunta. Después de todo este drama, estas son las razones por las que vale la pena:

  1. Menos RAM: Podman usa significativamente menos memoria
  2. Sin daemon: No hay procesos corriendo en background cuando no los necesitas
  3. Rootless: Más seguro por defecto
  4. Compatible: Mismos comandos que Docker

Pero principalmente, porque después de solucionar esto te sientes como un ninja de la terminal.

Reflexiones Finales

Este error me enseñó algo importante: a veces los problemas más frustrantes tienen las soluciones más simples. El «vfkit exited unexpectedly» no era un bug raro de Podman o un problema de compatibilidad con M3. Era simplemente que estaba usando la herramienta equivocada para el hardware correcto.

Si llegaste hasta aquí y lograste que funcione, felicidades. Si no, no te rindas. La tecnología a veces es caprichosa, pero eventualmente cede.

Y la próxima vez que veas «darwin/amd64» en un Mac M3, ya sabes qué hacer. ?


¿Te funcionó esta solución? ¿Tuviste algún problema diferente? Cuéntame en los comentarios. Siempre me gusta saber que ayudé a alguien más a no tirar su laptop por la ventana.

Migrar de Spotify a Deezer

Como tengo Deezer Premium gratis con mi linea por el plan de datos que tengo y nunca use porque ya estaba muy comodo en Spotify.

Usando unos dias Deezer, tiene muchos temas, no me gusta para nada que es un poco complicado descubrir musicas, no encontre nada como http://playlists.net/, es mas las listas que encontre en Deezer son todas parecidas…

Pero como es gratis y gracias a que encontre una herramienta para importar listas y todo mi perfil de Spotify a Deezer, cancele mi suscripcion a Spotify.

Todo gracias a: http://sync.spotizr.com/

Adicionalmente puedo importar playlists que encuentre interesantes en http://playlists.net/ usando http://spotizr.com/

Problema al instalar homebrew en Yosemite

Al intentar instalar tenia este error:
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
Failed during: /usr/bin/sudo /usr/bin/xcode-select --install

Para probar realmente que pasaba escribi gcc en la linea de comandos y obtuve esta respuesta:
xcrun: error: active developer path ("/Volumes/MacOS/Applications/Xcode.app/Contents/Developer") does not exist, use `xcode-select --switch path/to/Xcode.app` to specify the Xcode that you wish to use for command line developer tools (or see `man xcode-select`)

Por alguna razon la variable de ambiente del Xcode estaba apuntando a otro lado

Para ver donde realmente tenia que apunta:
xcode-select -p
Mi Xcode estaba en /Applications/Xcode.app/ entonces con el comendo:
sudo xcode-select --switch /Applications/Xcode.app/
Ya no tuve problemas.

Configuracion MCC y MNC

Configuraciones para las telefonicas paraguayas:

744 01 VOX Hola Paraguay S.A Operational GSM 1900
744 02 Claro AMX Paraguay S.A. Operational GSM 1900 / UMTS 1900
744 04 Tigo Telefonica Celular Del Paraguay S.A. (Telecel) Operational GSM 850 / UMTS 850
744 05 Personal Núcleo S.A Operational GSM 850 / GSM 1900 / UMTS 850 / UMTS 1900

Sobreescribir el formato de fecha en Oracle

Oracle tiene su formato de fecha dentro de NLS_DATE_FORMAT.
El mismo puede ser consultado con:

SELECT VALUE FROM v$nls_parameters WHERE parameter ='NLS_DATE_FORMAT';

Para cambiar el valor durante la sesion actual, ejecutar:

EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''DD/MM/YYYY''';

Donde ‘DD/MM/YYYY’ es el formato deseado

Instalar Mysql en OSX con Homebrew

Para instalar Mysql (que es lo unico que falta para tener el stack completo AMP en OSX) con Homebrew en OSX Mountain Lion:

$ brew install mysql

Para iniciar automaticamente:

$ mkdir -p ~/Library/LaunchAgents
$ cp /usr/local/Cellar/mysql/5.5.25a/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

Establecer el directorio temporal y las tablas del sistema

$ unset TMPDIR
$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

Establecer clave de root en Mysql:

/usr/local/opt/mysql/bin/mysqladmin -u root password 'new-password'
/usr/local/opt/mysql/bin/mysqladmin -u root -h localhost password 'new-password'

Para iniciar el servidor:

$mysql.server start