Applescript per aprire una NUOVA finestra del terminale nello spazio corrente


14

Sì, sto vivendo una terribile esperienza da principiante con Apple Script.

Devo aprire una nuova finestra Terminale nello spazio desktop corrente. NON spostarmi in un altro spazio in cui è in esecuzione un Terminale e quindi aprire un'altra finestra Terminale.

Naturalmente, se Terminal non è in esecuzione, dovrebbe iniziare un nuovo processo Terminal.

Risposte:


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

Sembra strano ma sfrutta una stranezza nel modo in cui Terminal gestisce i comandi "do script" in entrata; crea una nuova finestra per ognuno. Potresti effettivamente sostituirlo con qualcosa di utile se vuoi; eseguirà quello che vuoi subito dopo aver aperto la nuova finestra.


1
Funziona ma OSX sposta ancora gli spazi automaticamente su qualunque spazio avesse finestre terminali aperte. Se disabilito quella funzione nelle preferenze di sistema, la risolve ma ora tutte le altre mie applicazioni non mi spostano più in uno spazio con finestre aperte per quell'app. Odio lanciare un'app solo per scoprire che non appare alcuna finestra, solo la barra dei menu in alto mostra che l'applicazione ha lo stato attivo. Così bizzarro.
Chev,

15

Se non è presente alcun testo tra lo script do "", non verrà visualizzato un prompt dei comandi aggiuntivo nel terminale.

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

1
Penso che vada bene se lo lasciamo come una risposta - in alternativa potresti suggerire una modifica sulla risposta di @ jfm per migliorarla ulteriormente ed eliminare la tua.
slhck,

8

Mi vengono in mente tre modi diversi per farlo (i primi due rubati da qualche altra parte ma dimentico dove). Uso il terzo, che chiama uno script di shell dallo scripting, perché voglio aprire una nuova finestra ogni volta e perché è il più breve.

A differenza dello script integrato in OS X almeno dal 10.10, tutti questi aprono il terminale in qualunque directory sia la directory di lavoro corrente nella finestra del Finder (cioè non è necessario avere una cartella selezionata per aprirlo).

Incluse anche un paio di funzioni bash per completare il cerchio Finder> Terminale> Finder.

1. Riutilizzare una scheda esistente o creare una nuova finestra Terminale:

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. Riutilizzare una scheda esistente o creare una nuova scheda Terminale:

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. Generare una nuova finestra ogni volta tramite uno script di shell chiamato da un comando apple

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. (BONUS) Bash alias per aprire una nuova finestra di ricerca per la directory di lavoro corrente nel tuo terminale

Aggiungi questo alias al tuo .bash_profile.

alias f='open -a Finder ./' 

5. (BONUS) Cambia la directory nella finestra del tuo terminale nel percorso della finestra del Finder anteriore

Aggiungi questa funzione al tuo .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
}

0

Le risposte sopra funzionano solo se Terminal è già in esecuzione. Altrimenti apre due finestre Terminale contemporaneamente - una a causa deldo script e una a causa della activate.

Puoi evitarlo con un semplice se ... altrimenti:

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

Bonus:

Se vuoi eseguire direttamente i comandi puoi farlo tramite i tasti (Non molto elegante, lo so! Ma funziona)

[...]
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.