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

14

Sim, estou tendo uma terrível experiência de novato com o Apple Script.

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

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

zaf
fonte

Respostas:

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

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

Justin Mrkva
fonte
1
Isso funciona, mas o OSX ainda move os espaços automaticamente para qualquer espaço que tenha janelas de terminal abertas. Se eu desabilitar esse recurso nas preferências do sistema, ele será corrigido, mas agora todos os meus outros aplicativos não me moverão mais para um espaço com janelas abertas para esse aplicativo. Eu odeio iniciar um aplicativo apenas para descobrir que nenhuma janela aparece, apenas a barra de menus na parte superior mostra que o aplicativo está focado. Tão bizarro.
Chev
15

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
Adão
fonte
1
Acho que tudo bem se deixarmos como resposta - você pode sugerir uma edição na resposta do @ jfm para melhorá-lo e excluir o seu.
slhck
8

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

Diferente do script incorporado no 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 seu localizador (ou seja, você não precisa ter uma pasta selecionada para abri-la).

Também incluíram algumas funções do bash para concluir 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 toda vez através de um shell script 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 localizador para o diretório de trabalho atual no seu terminal

Adicione esse alias ao seu .bash_profile.

alias f='open -a Finder ./' 

5. (BÔNUS) Altere o diretório na janela do 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
}
shibaku
fonte
0

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

Você pode evitar isso com um simples se ... 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, 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
Peter Piper
fonte