Applescript, чтобы открыть новое окно терминала в текущем пространстве

14

Да, у меня ужасный опыт новичка с Apple Script.

Мне нужно открыть новое окно терминала в текущем пространстве рабочего стола. НЕ перемещайте меня в другое место, где работает Терминал, а затем откройте другое окно Терминала.

Конечно, если Терминал не запущен, он должен запустить новый процесс Терминала.

ZAF
источник

Ответы:

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

Это кажется странным, но оно использует странность в том, как Терминал обрабатывает входящие команды "do script"; это создает новое окно для каждого. Вы можете заменить это чем-нибудь полезным, если хотите; он будет выполнять все, что вы хотите, сразу после открытия нового окна.

Джастин Мрква
источник
1
Это работает, но OSX по-прежнему автоматически перемещает пробелы в любую область, в которой были открытые окна терминала. Если я отключаю эту функцию в системных настройках, это исправляет ее, но теперь все другие мои приложения больше не перемещают меня в пространство с открытыми окнами для этого приложения. Я ненавижу запускать приложение только для того, чтобы обнаружить, что окна не появляются, просто строка меню вверху показывает, что приложение имеет фокус. Так странно.
Chev
15

Если у вас нет текста между сценарием do "", вы не получите дополнительную командную строку в терминале.

tell application "Terminal"  
    do script ""  
    activate  
end tell
Адам
источник
1
Я думаю, что все в порядке, если мы оставим это как ответ - вы можете предложить изменить ответ @ jfm, чтобы улучшить его и удалить свой.
Slhck
8

Я могу придумать три разных способа сделать это (первые два украдены откуда-то еще, но я забываю, где). Я использую третий, который вызывает скрипт оболочки из appleScript, потому что я хочу каждый раз открывать новое окно, и потому что оно было самым коротким.

В отличие от скрипта, встроенного в OS X начиная с версии 10.10, все они открывают терминал в любом каталоге, являющемся текущим рабочим каталогом в окне поиска (т.е. вам не нужно выбирать папку, чтобы открыть ее).

Также имеется пара функций bash для завершения круга Finder> Terminal> Finder.

1. Используйте существующую вкладку или создайте новое окно терминала:

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. Повторно используйте существующую вкладку или создайте новую вкладку «Терминал»:

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. Создайте новое окно каждый раз через скрипт оболочки, вызываемый из 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. (БОНУС) Bash псевдоним, чтобы открыть новое окно поиска для текущего рабочего каталога в вашем терминале

Добавьте этот псевдоним в ваш .bash_profile.

alias f='open -a Finder ./' 

5. (БОНУС) Измените каталог в окне вашего терминала на путь переднего окна Finder

Добавьте эту функцию в ваш .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
источник
0

Ответы выше работают только если терминал уже запущен. В противном случае он открывает сразу два окна терминала - одно из-за do scriptи одно из-за activate.

Вы можете предотвратить это с помощью простого 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

Бонус:

Если вы хотите напрямую запускать команды, вы можете сделать это с помощью нажатия клавиш (Не очень элегантно - я знаю! Но это работает)

[...]
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
Питер Пайпер
источник