Madre mía, menudo paseo para conseguir un resultado aparentemente tan sencillo.
TLDR
Requisitos:
yabai
- para obtener información sobre espacios
skhd
o algo más para conectar los atajos de teclado con los scriptsdel shell
jq
- para analizar la salida json en el shell
- (opcionalmente)
SpaceLauncher
- si lo utiliza de todos modos y desea que el acceso directo sea, por ejemplo Space + D ("D" como Desktop)
Si no utiliza yabai
entonces instalar todo lo anterior puede ser demasiado. Esta solución quizá sólo sea aceptable si ya utiliza yabai
o tiene intención de utilizarlo.
Buenas noticias - mi solución no requiere desactivar SIP (System Integrity Protection).
1. Ok, vamos allá. Crea los archivos de abajo en alguna carpeta (yo los puse en ~/.local/scripts/
).
get_empty_space.sh
#!/bin/bash
my_array=($(yabai -m query --spaces --display | jq '.[].windows | any'))
any_space_empty=false
for ((i = 0; i < ${#my_array[@]}; i++)); do
if ! ${my_array[i]}; then
echo $((i + 1))
any_space_empty=true
break
fi
done
if ! $any_space_empty; then
echo false
fi
crear_espacio.sh
open -a 'Mission Control'
sleep 0.1
osascript -e 'tell application "System Events" to click (every button whose value of attribute "AXDescription" is "add desktop") of group 2 of group 1 of group 1 of process "Dock"'
sleep 0.1
osascript -e 'tell application "System Events" to key code 53'
cambiar_espacio.sh
#!/bin/bash
declare -a desktophash
desktophash[1]=18
desktophash[2]=19
desktophash[3]=20
desktophash[4]=21
desktophash[5]=23
desktophash[6]=22
desktophash[7]=26
desktophash[8]=28
desktophash[9]=25
desktophash[10]=29
desktopkey=${desktophash[$1]}
osascript -e "tell application \"System Events\" to key code $desktopkey using option down"
go_to_desktop.sh
#!/bin/bash
empty_space=$(/Users/yourname/.local/scripts/get_empty_space.sh)
if [ "$empty_space" == "false" ]; then
/Users/yourname/.local/scripts/create_space.sh
sleep 0.15
fi
empty_space=$(/Users/yourname/.local/scripts/get_empty_space.sh)
/Users/yourname/.local/scripts/switch_space.sh $empty_space
2. A continuación, otorgue permisos ejecutivos a los archivos anteriores.
chmod +x ~/.local/scripts/get_empty_space.sh
chmod +x ~/.local/scripts/create_space.sh
chmod +x ~/.local/scripts/switch_space.sh
chmod +x ~/.local/scripts/go_to_desktop.sh
3. Asigne accesos directos del sistema MacOS para los espacios.
- Cree espacios/desktops para que existan al menos 10 antes de pasar al siguiente paso.
- Ir a Preferencias del sistema > Teclado > Atajos > Control de Misión .
- Asignar accesos directos para los 10 Cambiar al escritorio N entradas.
- Los atajos que no requieren cambiar mi código anterior son Opt + N Así que Opt + 1 va al espacio 1 y así sucesivamente. Puede elegir diferentes atajos pero entonces tendrá que modificar
switch_space.sh
correspondientemente, lo más probable es que sólo la última línea del mismo.
4. Asigne un acceso directo en skhd
ejecutar go_to_desktop.sh
script.
En .skhdrc
añada una línea como ésta:
f4 : /Users/yourname/.local/scripts/go_to_desktop.sh
4a. (paso opcional) En SpaceLauncher bind Space + D pulsar F4 .
- Llave: D
- Acción: Simular pulsación de tecla
- Llave: F4
5. Pulse el acceso directo - es posible que tenga que añadir algunos permisos a skhd
antes de que empiece a funcionar.
Explicación y depuración
1. Si el idioma de su sistema operativo es distinto del inglés de EE.UU., es posible que tenga que modificar create_space.sh
script.
Basado en el Hilo de StackOverflow de donde saqué mi script, el script de abajo tiene buenas posibilidades de funcionar, pero no está probado:
open -b 'com.apple.exposelauncher'
sleep 0.5
osascript -e 'tell application id "com.apple.systemevents" tell (every application process whose bundle identifier = "com.apple.dock") to click (button 1 of group 2 of group 1 of group 1)'
sleep 0.5
osascript -e 'key code 53 -- esc key'
El AppleScript del hilo:
do shell script "open -b 'com.apple.exposelauncher'"
delay 0.5
tell application id "com.apple.systemevents"
tell (every application process ¬
whose bundle identifier = "com.apple.dock") to ¬
click (button 1 of group 2 of group 1 of group 1)
delay 0.5
key code 53 -- esc key
end tell
2. Es posible que tenga que aumentar las horas de sueño en create_space.sh
y go_to_desktop.sh
para que funcione correctamente en tu mac.
Por ensayo y error y partiendo de 0,5 segundos, llegué a los tiempos de mis scripts. Utilizo un MacBook Pro M1.
3. Una breve explicación de los scripts.
Puedes probar todos los scripts por separado para ver si funcionan y qué hacen.
create_space.sh
- se explica por sí mismo. El espacio creado estará al final.
switch_space.sh
- hace clic Opt + N en el teclado. Se utiliza como ./switch_space.sh 5
ir al espacio no. 5.
get_empty_space.sh
- devuelve el número entero de un espacio vacío. Si no hay ningún espacio vacío, muestra false
. La salida de esto será una entrada a switch_space.sh
.
go_to_desktop.sh
- el código creo que es razonablemente legible para explicarse.
La mayor parte de la magia ocurre en la 1ª línea de get_empty_space.sh
. La función yabai -m query --spaces --display
devuelve algo como:
[{
"index":1,
"windows":[1350901],
...
},
...
]
La clave de Windows de cada espacio puede decirnos si hay algunas ventanas allí o no. La pasamos a jq
con esta línea yabai -m query --spaces --display | jq '.[].windows'
y obtener sólo las listas de Windows.
[
1350901
]
[
1357661
]
...
Mejórelo aún más con | any
y esta línea yabai -m query --spaces --display | jq '.[].windows | any'
nos da una lista de booleanos, donde true
significa que hay algunas ventanas en el espacio dado.
true
true
...
El resto es bastante normal bash
.
Reflexiones finales
¿No es demasiado para una tarea tan "sencilla"? Puede que sí. Probablemente se podría lograr con un solo bash script en lugar de 4, pero:
- a) Pasé mucho tiempo aprendiendo
bash
para hacerlo funcionar y esta manera era más fácil para mí
- b) esos scripts hacen sólo una pequeña tarea cada uno y espero encontrarles también un uso en otras automatizaciones.