Dejé AeroSpace y me quedé con Hammerspoon: atajos para saltar entre apps en macOS
Durante bastante tiempo he usado AeroSpace en el Mac.
Si no lo conoces, es un gestor de ventanas en mosaico al estilo i3: tiene sus propios escritorios virtuales, coloca las ventanas solas una al lado de otra y saltas entre escritorios con el teclado. ⌥A, ⌥S, ⌥D… Junto a él tenía SketchyBar para la barra superior y borders para marcar la ventana activa.
Sobre el papel, una maravilla. En el día a día, menos.
Lo que me pasaba con AeroSpace
AeroSpace es muy rígido. En el monitor ultrapanorámico funciona bien, porque me caben dos o tres ventanas a la vez en cada escritorio. Pero en el portátil solo cabe una app por escritorio.
Así que acabé asignando una app a cada escritorio. Además me venía bien para recordar dónde tenía cada cosa.
Y ahí me di cuenta de lo que usaba de verdad: pulsar ⌥ + una letra para ir a una app concreta. Los escritorios eran solo el medio para conseguirlo, y el mosaico, en el portátil, ni lo aprovechaba.
Así que desactivé los tres.
Lo que quería
Algo muy simple:
- ⌥ + una tecla me lleva a la app asignada.
- Si la app está detrás de otras o minimizada, la trae al frente.
- Si está cerrada, la abre.
Y todo eso sin cambiar cómo funcionan los escritorios de macOS. Las ventanas se quedan donde yo las ponga, y el atajo me lleva a la app esté donde esté.
Esto lo pueden hacer varias herramientas (Raycast permite asignar un atajo a cada app, rcmd lo hace con la tecla ⌘ derecha…), pero acabé con Hammerspoon, y me ha sorprendido bastante.
Qué es Hammerspoon
Hammerspoon es una app de código abierto que hace de puente entre macOS y un motor de Lua. Tú escribes un script en ~/.hammerspoon/init.lua y ese script puede controlar casi cualquier parte del sistema.
Tiene su historia. Steven Degutis encadenó varios proyectos de automatización para Mac: Zephyros (Ruby), Phoenix (JavaScript), Hydra (Lua) y, finalmente, Mjolnir. Mjolnir buscaba ser un núcleo mínimo con las extensiones fuera, instaladas con un gestor de paquetes de Lua. En 2014, un grupo de usuarios hizo un fork para tener todo integrado en la propia app, y así nació Hammerspoon (el martillo de Thor, Mjolnir, más la cuchara del fork).
Doce años después sigue activo, con más de 16.000 estrellas en GitHub, la versión 1.1.1 publicada en febrero de 2026 y el último commit en julio.
Recién instalado no hace nada. Todo depende de lo que pongas en el script. Pero las piezas que trae dan para mucho:
- Teclado: atajos globales, remapear teclas, escuchar cualquier pulsación.
- Ventanas: moverlas, cambiarles el tamaño, mandarlas a otro monitor, guardar disposiciones.
- Barra de menús: iconos propios con menús, o que muestren datos en vivo.
- Eventos del sistema: cambiar de wifi, conectar un monitor o un USB, despertar del reposo, abrir una app…
- Interfaz: alertas, buscadores tipo Spotlight, lienzos para dibujar lo que quieras por encima de todo.
- Audio y pantalla: cambiar la salida de audio, silenciar el micro, brillo.
- Todo lo demás: ejecutar comandos de shell, llamar a APIs, levantar un servidor HTTP local, lanzar AppleScript.
Además, la comunidad comparte plugins listos para usar, que aquí se llaman Spoons.
Lo que no puede hacer es saltarse lo que macOS no expone. Por ejemplo, no puede quitar la animación al cambiar de escritorio en macOS.
Lo que he montado
1. ⌥ + tecla para cada app
La base son unas pocas líneas. Hammerspoon trae una función, launchOrFocus, que hace exactamente lo que yo quería: abre la app si está cerrada y la trae al frente si ya está abierta.
hs.hotkey.bind({ "alt" }, "q", function()
hs.application.launchOrFocus("Claude")
end)
En mi caso, las apps las busco por su bundle ID (com.anthropic.claudefordesktop, com.google.Chrome…), que es más fiable que el nombre.
Ahora mismo tengo pocas, porque estoy empezando:
- ⌥Q → Claude
- ⌥W → Chrome
- ⌥A → Arc
- ⌥S → Spark
Uso solo letras a propósito. Con el teclado español, ⌥ + número escribe caracteres que necesito (⌥2 es la @, ⌥3 es la #), y no quiero perderlos.
2. Un menú en la barra superior para gestionarlos
No quería tener que editar código cada vez que añado una app. Así que los atajos viven en un JSON (~/.hammerspoon/apps.json) y hay un icono ⌥ en la barra de menús para gestionarlos:

- La lista de arriba es la chuleta de lo que tengo asignado, y hacer clic en una línea también abre la app.
- Asignar la app activa a una tecla… es lo que más uso: estoy en una app, abro el menú, escribo la letra y listo.
- Asignar otra app… abre un buscador con todas las aplicaciones instaladas, para las que no tengo abiertas:

- Quitar un atajo hace lo que dice.
Los cambios se aplican al momento, sin reiniciar nada.
3. Mantener ⌥ para ver la chuleta
Esta es mi parte favorita. Mientras me aprendo los atajos, si mantengo ⌥ pulsado un momento sin tocar otra tecla, aparece un panel en el centro de la pantalla con todos los que tengo:

Al soltar ⌥ desaparece. Si pulso ⌥Q rápido, ni llega a salir, y escribir una @ tampoco lo dispara.
Por dentro son tres piezas de Hammerspoon:
- un
eventtapque escucha cuándo pulso y suelto modificadores, - un temporizador de 0,4 segundos que se cancela si suelto o pulso otra tecla,
- un
canvas, una ventana sin bordes por encima de todo, donde se dibujan las filas a partir del mismo JSON.
Para escuchar el teclado, Hammerspoon necesita permiso de Accesibilidad. Si macOS te lo pide y en Ajustes ya aparece activado, bórralo con tccutil reset Accessibility org.hammerspoon.Hammerspoon, vuelve a concederlo y reinicia Hammerspoon.
Cuando me los sepa, lo desactivo. O no, porque mola bastante.
No he escrito ni una línea de Lua
Todo esto lo ha escrito un agente. Le fui contando a Claude Code lo que quería (primero los atajos, luego el menú, luego la chuleta) y en cada paso lo escribía, recargaba Hammerspoon desde la terminal y comprobaba que cargaba sin errores.
Incluso las capturas de este artículo las ha sacado él, y también con Hammerspoon. Para que no salieran mis ventanas ni mi escritorio, dibujaba un lienzo con un degradado justo debajo de lo que quería capturar, hacía la captura de esa zona y lo borraba. Es otro uso de la misma pieza que dibuja la chuleta.
Hasta ahora, que Hammerspoon se configure en Lua era una barrera: había que aprender su API, buscar ejemplos y pelearse con los detalles. Ahora basta con explicarle al agente lo que quieres.
Ya tengo apuntadas unas cuantas ideas para lo siguiente: un modo grabación que active No Molestar y cierre las apps que molestan, un indicador de micro silenciado durante las llamadas, el estado de mis tareas en la barra de menús…
Si usas Mac y nunca has probado Hammerspoon, dale una oportunidad. Y si te da pereza el Lua, pídeselo a tu agente.