AppleScript для открытия именованного окна терминала

У меня есть два окна/вкладки, настроенные для запуска в Terminal.app: «syd» и «mel». то есть в оболочке | Новое окно, "syd" и "mel" перечислены. Как я могу открыть эти конфигурации терминала с помощью AppleScript?


person mjs    schedule 25.11.2009    source источник


Ответы (2)


Несколько недель назад я перенес новую машину Snow Leopard (10.6) с машины Tiger (10.4). Терминал от Tiger хранил свои настройки в файлах «.term» (обычно в ~/Library/Application Support/Terminal/, но их можно было сохранять/перемещать куда угодно); Терминал Snow Leopard централизовал свои настройки в файле настроек.

До перехода на Snow Leopard часть одного из моих обычных рабочих процессов заключалась в использовании Finder для двойного щелчка по сохраненному файлу «.term», чтобы открыть окно Terminal с предустановленным размер и начальная команда. Сегодня я заметил, что каждый раз, когда я выполнял этот Терминал, создавался дубликат «набора настроек». Итак, я начал искать способ запустить сохраненную настройку, не предполагающую открытие файла «.term» (чтобы дублирующиеся настройки не накапливались); AppleScript был моей первой остановкой, так как у меня уже был небольшой опыт работы с ним.

Короче говоря, кажется, что нет прямого способа запустить новое окно/вкладку с определенным «установленным параметром» с помощью команд AppleScript терминала. Обычный подход состоял бы в том, чтобы сделать что-то с использованием make new window (или make new tab), но я не смог найти вариант, который принял бы Терминал. Я придумал три альтернативных решения (последнее, на мой взгляд, лучшее).

Создайте окно, затем измените настройки

Если ваши настройки не включают начальную команду или размер, отличный от настроек по умолчанию (например, только настройки цвета/клавиатуры/поведения отличаются от настроек по умолчанию), вы можете использовать команду do script Terminal (без «текстовый» параметр), чтобы создать новое новое окно, а затем изменить его settings set на тот, который вы хотели.

tell application "Terminal"
    set newTab to do script -- create a new window with no initial command
    set current settings of newTab to settings set "Grass"
end tell

Это может сработать для вас, но не подходит для моих нужд, поэтому я продолжил поиски.

default settings терминала

Затем я посмотрел на свойство default settings. Я подумал, что можно будет временно изменить настройку по умолчанию, создать новое окно, а затем сбросить настройки по умолчанию. Такой подход в итоге удался, но оказался довольно некрасивым (помимо безобразия временного изменения дефолтных).

Я использовал команду keystroke System Events, чтобы отправить ⌘N на терминал для создания нового окна. Оказывается, Терминал иногда создает новое окно немного медленнее, и мой сценарий заканчивал тем, что сбрасывал значения по умолчанию до того, как Терминал имел возможность использовать временное значение ранее часть сценария устроила. do script был бы синхронным, но также аннулировал бы любую начальную команду, сохраненную как часть настроек. В итоге я прибегнул к подсчету количества окон до ⌘N и ждал, пока количество окон увеличится. Если запущенная команда приводит к очень быстрому открытию и закрытию окна, есть вероятность, что этот цикл может застрять. Я мог бы ограничить число итераций, но к этому моменту меня сильно разочаровал общий вид кода (хотя я пошел дальше и расширил его, добавив новые вкладки, а не только окна).

to newTerminal(settingSetName, asTab)
    tell application "Terminal"
        if asTab is true then
            set countRef to a reference to tabs of first window
            set newKey to "t"
        else
            set countRef to a reference to windows
            set newKey to "n"
        end if
        set originalDefault to name of default settings
        set default settings to settings set settingSetName
    end tell
    try
        set initialCount to count of countRef
        tell application "System Events"
            -- keystrokes always go to the frontmost application
            set frontmost of application process "Terminal" to true
            keystroke newKey using command down
        end tell
        repeat until (count of countRef) > initialCount
            beep
            delay 0.1
        end repeat

        tell application "Terminal" to set default settings to settings set originalDefault
    on error m number n
        try
            tell application "Terminal" to set default settings to settings set originalDefault
        end try
        error m number n
    end try
end newTerminal

newTerminal("Grass", false)

Щелкните элемент меню через Системные события.

С помощью Системных событий можно напрямую активировать пункты меню Shell > Новая вкладка и Shell > < strong>Новое окно. Для этого требуется, чтобы был включен «доступ для вспомогательных устройств» (в нижней части панели настроек универсального доступа; я обычно включаю его, потому что сценарии графического интерфейса, которые затем можно выполнить с помощью системных событий, часто являются единственным (хороший) способ выполнить некоторые задачи автоматизации). Хотя в предыдущем варианте также используются Системные события, его очень ограниченное использование не требует «доступа для вспомогательных устройств».

(* makeNewTerminal(settingsSetName, asTab)

    Bring Terminal.app to the front and
        click the menu item named <settingsSetName>.
        If <asTab> is true, then use the menu item under Shell > New Tab,
            otherwise use the menu item under Shell > New Window
*)
to makeNewTerminal(settingsSetName, asTab)
    tell application "Terminal" to launch
    if asTab is true then
        set submenuName to "New Tab"
    else
        set submenuName to "New Window"
    end if
    tell application "System Events"
        set terminal to application process "Terminal"
        set frontmost of terminal to true
        click menu item settingsSetName of ¬
            first menu of menu item submenuName of ¬
            first menu of menu bar item "Shell" of ¬
            first menu bar of terminal
    end tell
end makeNewTerminal

makeNewTerminal("Grass", true)

Такой подход буквально автоматизирует выбор и активацию одного из пунктов меню Shell. Он требует «доступа для вспомогательных устройств», но код намного проще и имеет меньше проблемных мест (основная проблема с этим кодом — локализация).

person Chris Johnsen    schedule 23.01.2011
comment
ПРИМЕЧАНИЕ. do script возвращает спецификатор объекта для новой вкладки/окна. Просто используйте результат этого для отправки дополнительных команд на этот терминал. Не программируйте жестко first tab of first window. например: set theTerminal to do script, set current settings of theTerminal to settings set "Grass" - person Chris Page; 06.04.2012

Должно быть что-то вроде этого:

tell application "Finder"
   open file "MyDisk:Users:myhome:Library:Application Support:Terminal:myconfig.terminal"
end tell
person markratledge    schedule 25.11.2009
comment
Я использую Snow Leopard (10.6), и у меня нет каталога ~/Library/Application Support/Terminal — это изменилось? Конфигурация, похоже, сейчас находится в ~/Library/Preferences/com.apple.Terminal.plist. - person mjs; 27.11.2009
comment
Должен иметь; У меня нет машины SL, чтобы посмотреть. Существует iterm.sourceforge.net в качестве замены Терминала, который поддерживает AppleScript, вкладки и закладки. - person markratledge; 27.11.2009