Получение Preview.app для принятия команд AppleScript
По умолчанию предварительный просмотр AppleScripting не работает, поскольку в предварительном просмотре отсутствует необходимый словарь. Чтобы это исправить, проверьте ответ Лаури здесь , который объясняет настройку NSAppleScriptEnabled
Preview.app.
Выйдите из Preview.app, затем откройте терминал и введите:
sudo defaults write /Applications/Preview.app/Contents/Info NSAppleScriptEnabled -bool true
sudo chmod 644 /Applications/Preview.app/Contents/Info.plist
sudo codesign -f -s - /Applications/Preview.app
Закрытие окна из приложения
1) По индексу окна или названию окна
Команда для закрытия окна любого именованного приложения будет выглядеть примерно так:
tell application "Preview" to close window 1
... или если вы хотите закрыть именованное окно документа, например foo.jpg
:
сказать приложению «Preview» о закрытии (каждое окно с именем « foo.jpg »)
Итак, в вашем сценарии оболочки это будет:
#!/bin/sh
osascript <<EOF
tell application "Preview"
close (every window whose name is "$1")
end tell
EOF
Здесь первый аргумент, передаваемый скрипту, - это имя окна, которое вы хотите закрыть, например ./quit.sh foo.jpg
. Обратите внимание, что если ваш файл содержит пробелы, вы должны указать имя файла, например ./quit.sh "foo bar.jpg"
.
Или, если вы хотите закрыть произвольные окна из любого приложения, используйте это:
#!/bin/sh
osascript <<EOF
tell application "$1"
close (every window whose name is "$2")
end tell
EOF
Вот, вы бы использовали, ./quit.sh Preview foo.jpg
например.
2) По имени файла
Если вы хотите закрыть окно, принадлежащее определенному документу, но указав имя файла, вам нужно что-то еще. Это связано с тем, что многостраничный PDF-файл может отображаться как foo.pdf (Page 1 of 42)
, но вы просто хотите перейти foo.pdf
к AppleScript.
Здесь мы перебираем окна и сравниваем имена файлов с аргументом, переданным скрипту:
osascript <<EOF
tell application "Preview"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$1") then
close window x
end if
end repeat
end tell
EOF
Теперь вы можете просто позвонить ./quit.sh foo.pdf
. В общем случае для всех приложений с именованными окнами документов это будет:
osascript <<EOF
tell application "$1"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$2") then
close window x
end if
end repeat
end tell
EOF
Предостережение: автоматическое закрытие Preview.app
Preview.app - одно из этих приложений, которое автоматически закрывается после закрытия последнего окна документа. Это делается для того, чтобы сохранить память и «очистить». Чтобы отключить это поведение, выполните следующее:
defaults write -g NSDisableAutomaticTermination -bool TRUE
Конечно, чтобы отменить это, измените TRUE
на FALSE
.
Использование функций вместо скриптов
Наконец, я бы предложил поместить ваши скрипты в функцию, которая всегда доступна в вашей оболочке. Для этого добавьте скрипты к себе ~/.bash_profile
. Создайте этот файл, если он не существует.
cw() {
osascript <<EOF
tell application "$1"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$2") then
close window x
end if
end repeat
end tell
EOF
}
После сохранения профиля bash и перезапуска оболочки вы можете звонить cw Preview foo.pdf
откуда угодно .