Jabłkowy skrypt, aby otworzyć NOWE okno terminala w bieżącej przestrzeni

14

Tak, mam okropne doświadczenie dla początkujących z Apple Script.

Muszę otworzyć nowe okno terminala w bieżącym obszarze pulpitu. NIE przenieś mnie do innej przestrzeni, w której działa Terminal, a następnie otwórz inne okno Terminalu.

Oczywiście, jeśli Terminal nie działa, powinien rozpocząć nowy proces Terminal.

zaf
źródło

Odpowiedzi:

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

Wydaje się to dziwne, ale wykorzystuje dziwność w tym, jak Terminal obsługuje przychodzące polecenia „do script”; tworzy dla każdego nowe okno. Możesz faktycznie zastąpić to czymś przydatnym, jeśli chcesz; wykona wszystko, co chcesz zaraz po otwarciu nowego okna.

Justin Mrkva
źródło
1
Działa to, ale OSX nadal automatycznie przenosi spacje do dowolnej przestrzeni, w której były otwarte okna terminali. Jeśli wyłączę tę funkcję w preferencjach systemowych, naprawię ją, ale teraz wszystkie inne moje aplikacje nie przenoszą mnie już w przestrzeń z otwartymi oknami dla tej aplikacji. Nienawidzę uruchamiania aplikacji tylko po to, by stwierdzić, że nie pojawiają się żadne okna, tylko pasek menu u góry pokazuje, że aplikacja jest aktywna. Taki dziwny.
Chev
15

Jeśli nie ma żadnego tekstu pomiędzy skryptem do, nie pojawi się dodatkowy wiersz polecenia w terminalu.

tell application "Terminal"  
    do script ""  
    activate  
end tell
Adam
źródło
1
Myślę, że jest w porządku, jeśli zostawimy to jako odpowiedź - możesz alternatywnie zasugerować edycję odpowiedzi @ jfm, aby dalej ją poprawić i usunąć swoją.
slhck
8

Mogę wymyślić trzy różne sposoby na zrobienie tego (pierwsze dwa skradzione gdzieś indziej, ale zapominam gdzie). Korzystam z trzeciego, który wywołuje skrypt powłoki z applecript, ponieważ chcę za każdym razem otwierać nowe okno i ponieważ było ono najkrótsze.

W przeciwieństwie do skryptu wbudowanego w OS X od co najmniej 10.10, wszystkie otwierają terminal w jakimkolwiek katalogu, w którym znajduje się bieżący katalog roboczy w oknie wyszukiwarki (tzn. Nie musisz mieć wybranego folderu, aby go otworzyć).

Zawiera także kilka funkcji bash, aby uzupełnić Finder> Terminal> Okrąg Findera.

1. Użyj ponownie istniejącej karty lub utwórz nowe okno 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. Ponownie użyj istniejącej karty lub utwórz nową kartę 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. Wygeneruj nowe okno za każdym razem za pomocą skryptu powłoki wywoływanego z skryptu jabłkowego

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) Alias ​​Bash, aby otworzyć nowe okno wyszukiwarki dla bieżącego katalogu roboczego w twoim terminalu

Dodaj ten alias do swojego .bash_profile.

alias f='open -a Finder ./' 

5. (BONUS) Zmień katalog w oknie terminala na ścieżkę przedniego okna Findera

Dodaj tę funkcję do swojego .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
źródło
0

Powyższe odpowiedzi działają tylko wtedy, gdy Terminal już działa. W przeciwnym razie otwiera dwa okna terminala naraz - jedno z powodu do scripti jedno z powodu activate.

Możesz temu zapobiec za pomocą prostego, jeśli ...

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

Premia:

Jeśli chcesz bezpośrednio uruchamiać polecenia, możesz to zrobić poprzez naciśnięcia klawiszy (Niezbyt elegancki - wiem! Ale to działa)

[...]
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
źródło