У меня есть два окна/вкладки, настроенные для запуска в Terminal.app: «syd» и «mel». то есть в оболочке | Новое окно, "syd" и "mel" перечислены. Как я могу открыть эти конфигурации терминала с помощью AppleScript?
AppleScript для открытия именованного окна терминала
Ответы (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. Он требует «доступа для вспомогательных устройств», но код намного проще и имеет меньше проблемных мест (основная проблема с этим кодом — локализация).
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
~/Library/Application Support/Terminal
— это изменилось? Конфигурация, похоже, сейчас находится в ~/Library/Preferences/com.apple.Terminal.plist
.
- person mjs; 27.11.2009