2 votos

¿Cómo ir a un espacio/escritorio vacío con un atajo de teclado en MacOS?

Me gustaría asignar un atajo de teclado para ejecutar la siguiente lógica:

Encuentra un espacio vacío (sin Windows, así que sólo mi escritorio) y ve a él. Si no hay espacio vacío, crear uno y luego ir a ella. Yo uso yabai y skhd, que podría ayudar. Creo que hay una manera de hacerlo con yabai, pero requeriría desactivar la Protección de Integridad del Sistema, que no quiero hacer.

3voto

pipe Puntos 471

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.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X