Applescript para abrir uma NOVA janela de terminal no espaço atual

Applescript para abrir uma NOVA janela de terminal no espaço atual

Sim, estou tendo uma péssima experiência de novato com o Apple Script.

Preciso abrir uma nova janela do Terminal no espaço da área de trabalho atual. NÃO me mova para outro espaço que tenha um Terminal em execução e abra outra janela do Terminal.

Claro, se o Terminal não estiver em execução, ele deverá iniciar um novo processo do Terminal.

Responder1

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

Parece estranho, mas tira vantagem de uma estranheza na forma como o Terminal lida com comandos "do script" recebidos; ele cria uma nova janela para cada uma. Na verdade, você pode substituir isso por algo útil, se quiser; ele executará o que você quiser logo após abrir a nova janela.

Responder2

Se você não tiver nenhum texto entre o script do " ", não receberá um prompt de comando extra no terminal.

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

Responder3

Posso pensar em três maneiras diferentes de fazer isso (as duas primeiras roubadas de outro lugar, mas esqueci onde). Eu uso o terceiro, que chama um shell script do applescript, porque quero abrir uma nova janela toda vez e porque era a mais curta.

Ao contrário do script incorporado ao OS X desde pelo menos 10.10, todos eles abrem o terminal em qualquer diretório que seja o diretório de trabalho atual na janela do Finder (ou seja, você não precisa ter uma pasta selecionada para abri-lo).

Também foram incluídas algumas funções bash para completar o círculo Finder > Terminal > Finder.

1. Reutilize uma guia existente ou crie uma nova janela do 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. Reutilize uma guia existente ou crie uma nova guia 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. Gere uma nova janela a cada vez por meio de um script de shell chamado de um applescript

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. (BÔNUS) Alias ​​do Bash para abrir uma nova janela do Finder para o diretório de trabalho atual em seu terminal

Adicione este alias ao seu .bash_profile.

alias f='open -a Finder ./' 

5. (BÔNUS) Mude o diretório na janela do seu terminal para o caminho da janela frontal do Finder

Adicione esta função ao seu .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
}

Responder4

As respostas acima só funcionam se o Terminal já estiver em execução. Caso contrário, ele abre duas janelas do Terminal ao mesmo tempo - uma por causa do do scripte outra por causa de activate.

Você pode evitar isso com um simples if...else:

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

Bônus:

Se você deseja executar comandos diretamente, você pode fazer isso pressionando as teclas (não muito elegante - eu sei! Mas 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

informação relacionada