Applescript para abrir una NUEVA ventana de terminal en el espacio actual

14

Sí, estoy teniendo una experiencia de novato terrible con Apple Script.

Necesito abrir una nueva ventana de Terminal en el espacio de escritorio actual. NO me mueva a otro espacio que tenga una Terminal ejecutándose y luego abra otra ventana de Terminal.

Por supuesto, si Terminal no se está ejecutando, debería comenzar un nuevo proceso de Terminal.

zaf
fuente

Respuestas:

18
tell application "Terminal"  
    do script " "  
    activate  
end tell

Parece extraño, pero aprovecha una rareza en cómo Terminal maneja los comandos entrantes "do script"; crea una nueva ventana para cada uno. En realidad, podría reemplazar eso con algo útil si lo desea; ejecutará lo que quiera justo después de abrir la nueva ventana.

Justin Mrkva
fuente
1
Esto funciona, pero OSX todavía mueve espacios automáticamente a cualquier espacio que tenga ventanas de terminal abiertas. Si desactivo esa característica en las preferencias del sistema, la corrige, pero ahora todas mis otras aplicaciones ya no me mueven a un espacio con ventanas abiertas para esa aplicación. Odio iniciar una aplicación solo para descubrir que no aparecen ventanas, solo la barra de menú en la parte superior muestra que la aplicación tiene el foco. Tan extraño
Chev
15

Si no tiene ningún texto entre el script do "", no obtendrá un símbolo del sistema adicional en el terminal.

tell application "Terminal"  
    do script ""  
    activate  
end tell
Adán
fuente
1
Creo que está bien si lo dejamos como respuesta; alternativamente, podría sugerir una edición en la respuesta de @ jfm para mejorarla y eliminar la suya.
slhck
8

Puedo pensar en tres formas diferentes de hacerlo (las dos primeras robadas de otro lugar pero se me olvida dónde). Utilizo el tercero, que llama un script de shell desde el applecript, porque quiero abrir una nueva ventana cada vez y porque era la más corta.

A diferencia del script integrado en OS X desde al menos 10.10, todos estos abren el terminal en cualquier directorio que sea el directorio de trabajo actual en la ventana del buscador (es decir, no es necesario tener una carpeta seleccionada para abrirlo).

También incluyó un par de funciones bash para completar el círculo Finder> Terminal> Finder.

1. Reutilice una pestaña existente o cree una nueva ventana de Terminal:

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if (exists window 1) and not busy of window 1 then
        do script "cd " & quoted form of myDir in window 1
    else
        do script "cd " & quoted form of myDir
    end if
    activate
end tell

2. Reutilice una pestaña existente o cree una nueva pestaña Terminal:

tell application "Finder" to set myDir to POSIX path of (insertion location as alias)
tell application "Terminal"
    if not (exists window 1) then reopen
        activate
    if busy of window 1 then
        tell application "System Events" to keystroke "t" using command down
    end if
    do script "cd " & quoted form of myDir in window 1
end tell

3. Genere una nueva ventana cada vez a través de un script de shell llamado desde un applecript

tell application "Finder"
    set myDir to POSIX path of (insertion location as alias)
    do shell script "open -a \"Terminal\" " & quoted form of myDir
end tell

4. (BONIFICACIÓN) Bash alias para abrir una nueva ventana de búsqueda para el directorio de trabajo actual en su terminal

Agregue este alias a su .bash_profile.

alias f='open -a Finder ./' 

5. (BONIFICACIÓN) Cambie el directorio en la ventana de su terminal a la ruta de la ventana del Finder frontal

Agregue esta función a su .bash_profile.

cdf() {
      target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
        if [ "$target" != "" ]; then
            cd "$target"; pwd
        else
            echo 'No Finder window found' >&2
        fi
}
shibaku
fuente
0

Las respuestas anteriores solo funcionan si Terminal ya se está ejecutando. De lo contrario, abre dos ventanas de Terminal a la vez, una por causa de do scripty otra por causa de activate.

Puede evitar esto con un simple si ... si no:

if application "Terminal" is running then
    tell application "Terminal"
        do script ""
        activate
    end tell
else
    tell application "Terminal"
        activate
    end tell
end if

Prima:

Si desea ejecutar comandos directamente, puede hacerlo presionando las teclas (no es muy elegante, ¡lo sé! Pero funciona)

[...]
else
    tell application "Terminal"
        activate
        tell application "System Events" to keystroke "ls -la" 
        tell application "System Events" to key code 36
    end tell
end if
Pedro gaitero
fuente