2 votos

¿Cómo enfocar la pestaña del terminal principal del shell script para la entrada?

Tengo un zsh script en el que solicito la entrada del usuario cada 15 minutos. Cómo puedo hacer que la pestaña de Terminal en la que se ejecuta el script se abra/enfoque? open -a Terminal simplemente abre toda la ventana.

Soy consciente de este truco para obtener la aplicación actual y reabrirla, ¿hay alguna forma de extenderlo a las pestañas/sesiones?

term=$(/usr/bin/osascript -e "copy path to frontmost application as text to stdout")
/usr/bin/osascript -e 'tell application $term to activate'

También es consciente de este truco para volver a una pestaña antigua, aunque (1) no he conseguido que funcione y (2) necesito los datos en stdout para que zsh pueda utilizarlos.

osascript \
    -e 'tell application "Terminal" to set oldTab to the selected tab of the front window' \
    -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' \
    -e 'delay 1' \
    -e 'tell application "Terminal" to set selected of oldTab to true'

1voto

Mockman Puntos 16

Esto es un poco incómodo ya que no puedo ejecutar este código desde dentro de tu script (ni dentro de un applescript) pero este osascript debería permitirte especificar una pestaña deseada (tp) y cambiar a ella desde cualquier otra dentro de la misma ventana.

osascript -e '
tell application "Terminal" to set tp to item 1 of (tabs of window 1 whose selected is true)
tell application "System Events" to tell process "Terminal" to keystroke "t" using command down
delay 1
tell application "Terminal" to set selected of tp to true'

Creo que tu problema era sólo de sintaxis: por ejemplo selected tab frente a tab whose selected is true .

Cada línea hace lo siguiente:

  • Establece la variable tp en la pestaña activa
  • Crea una nueva pestaña utilizando los eventos del sistema (que se convierte en la pestaña activa)
  • Retraso 1
  • Hace que tp sea la pestaña activa

La variable tp se parecerá a esto:

--> tab 3 of window id 360 of application "Terminal"

Ten en cuenta que hay algunas alternativas a la configuración de tp en la pestaña activa, pero son más complejas.

1voto

user3439894 Puntos 5883

Basado en su respuesta de "Sí, precisamente. Bien dicho" a mi comentario bajo el OP...

¿Podría aclarar qué es lo que está tratando de hacer? ¿Intentas que el propio shell script reenfoque la pestaña/ventana en la que se está ejecutando el shell script? En otras palabras, ¿quieres iniciar el shell script y que cuando pasen los 15 minutos, independientemente de la aplicación que esté en primer plano, quieras Terminal para venir de frente a la pestaña/ventana en la que se está ejecutando el shell script y que todo esto se haga mediante programación?

Lo siguiente ejemplo AppleScript código utilizado junto con osascript en un zsh shell script debe hacer lo que se quiere. Obviamente, el valor de la sleep comando es sólo para propósitos de prueba, use lo que sea que esté usando ahora como temporizador dentro de su actual zsh shell script .

#!/bin/zsh

    # First line of code of shell script.

winID="$(osascript -e 'id of window 1 of app "Terminal"')"

    # Function to refocus window of running script.

refocusWindow() {

        # Code to refocus window of the
        # running shell script using the 
        # window id retrieved from the first 
        # line of code in the shell script.

    osascript <<EOS
    tell app "Terminal"
        set frontmost of windows whose id = $winID to true
        activate
    end tell
EOS
}

# Do some stuff...
# Your other code goes here.

sleep 5

refocusWindow

Notas:

En Terminal No importa el número de pestañas/ventanas hay como sólo hay uno tab por window aunque la ventana parezca tener varios pestañas . En otras palabras, pedir Terminal a count windows y count tabs of windows se devolver lo mismo número . Por lo tanto, no es necesario bucle a través de tabs para lograr el objetivo aquí expuesto, sólo windows y, en realidad, en este caso no hay necesidad de bucle a través de windows .

Tenga en cuenta que MacOS Sierra cuál es la última versión en la que Terminal soportado múltiples tabs de un window programáticamente. En otras palabras, desde el UI un solo ventana con dos pestañas habría tab 1 of window 1 y tab 2 of window 1 pero como MacOS High Sierra de la UI un solo ventana con dos pestañas habría tab 1 of window 1 y tab 1 of window 2 y, por lo tanto, ya no es necesario bucle a través de tabs .

Hay todo así que no hay necesidad de hacer algo como set selected of tab j of window i to true como una vez que un determinado window se establece frontmost El valor de tab 1 of window i ya está ajustado a true como resultado.

El ejemplo shell script y AppleScript código que se muestra arriba, se probó en Terminal como un ejecutable shell script en MacOS Catalina y MacOS Big Sur con Lengua y región ajustes en Preferencias del sistema ajustado a Inglés (EE.UU.) - Primaria y me ha funcionado sin problemas 1 .

  • 1 Asume la configuración necesaria y adecuada en <strong>Preferencias del sistema </strong>> <strong>Seguridad y privacidad </strong>> <strong>Privacidad </strong>se han fijado/abordado según las necesidades.

Como no sabemos cómo tiene su zsh shell script codificado, tendrá que trabajar en el código que aquí se presenta para satisfacer sus necesidades.

0voto

Luke Miles Puntos 77

He aquí una forma poco elegante de hacerlo, adaptada de un SO de hace una década respuesta :

open_this_tab() {
    rand_string=$(openssl rand -base64 12)
    echo $rand_string
    osascript -e 'tell application "Terminal"
        set allWindows to number of windows

        repeat with i from 1 to allWindows
            set allTabs to number of tabs of window i
            repeat with j from 1 to allTabs
                if contents of tab j of window i contains '"\"$rand_string\""' then
                    set frontmost of window i to true
                    set selected of tab j of window i to true
                end if
            end repeat
        end repeat
        end tell'
}

Probándolo:

sleep 3
# (go to a different window or tab)
open_this_tab

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