Отримання Preview.app для прийняття команд AppleScript
За замовчуванням AppleScripting Preview не працюватиме, оскільки у попередньому перегляді відсутній необхідний словник. Щоб виправити це, перевірте відповідь Лаурі тут , де пояснюється налаштування 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
:
скажіть програмі "Попередній перегляд" закрити (кожне вікно, ім'я якого " 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
Caveat: Автоматичне закриття 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
звідусіль.