Obtenir Preview.app pour accepter les commandes AppleScript
Par défaut, AppleScripting Preview ne fonctionnera pas car il manque le dictionnaire nécessaire à Preview. Pour résoudre ce problème, consultez la réponse de Lauri ici , ce qui explique le réglage NSAppleScriptEnabled
de Preview.app.
Quittez Preview.app, puis ouvrez un terminal et entrez:
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
Fermer une fenêtre à partir d'une application
1) Par index de fenêtre ou nom de la fenêtre
La commande pour fermer une fenêtre d'une application nommée ressemblerait à ceci:
tell application "Preview" to close window 1
… Ou si vous souhaitez fermer une fenêtre de document nommée, par exemple foo.jpg
:
dire à l'application "Aperçu" de se fermer (chaque fenêtre dont le nom est " foo.jpg ")
Donc, dans votre script shell, ce serait:
#!/bin/sh
osascript <<EOF
tell application "Preview"
close (every window whose name is "$1")
end tell
EOF
Ici, le premier argument transmis au script est le nom de la fenêtre que vous souhaitez fermer, par exemple ./quit.sh foo.jpg
. Notez que si votre fichier contient des espaces, vous devez citer le nom du fichier, par exemple ./quit.sh "foo bar.jpg"
.
Ou si vous souhaitez fermer des fenêtres arbitraires à partir de n'importe quelle application, utilisez ceci:
#!/bin/sh
osascript <<EOF
tell application "$1"
close (every window whose name is "$2")
end tell
EOF
Ici, vous utiliseriez ./quit.sh Preview foo.jpg
par exemple.
2) Par nom de fichier
Si vous souhaitez fermer une fenêtre qui appartient à un certain document, mais en fournissant le nom du fichier, vous avez besoin d'autre chose. Cela est dû au fait qu'un fichier PDF de plusieurs pages peut s'afficher en tant que foo.pdf (Page 1 of 42)
, mais vous souhaitez simplement passer foo.pdf
au AppleScript.
Ici, nous parcourons les fenêtres et comparons les noms de fichiers avec l'argument passé au script:
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
Maintenant, vous pouvez simplement appeler ./quit.sh foo.pdf
. De manière généralisée, pour toutes les applications avec des fenêtres de document nommées, ce serait:
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
Mise en garde: Aperçu à fermeture automatique.app
Preview.app est l'une de ces applications qui se ferme automatiquement une fois sa dernière fenêtre de document fermée. Il le fait pour économiser de la mémoire et "nettoyer". Pour désactiver ce comportement, exécutez ce qui suit:
defaults write -g NSDisableAutomaticTermination -bool TRUE
Bien sûr, pour annuler cela, passez TRUE
à FALSE
.
Utiliser des fonctions au lieu de scripts
Enfin, je vous suggère de mettre vos scripts dans une fonction qui est toujours disponible dans votre shell. Pour ce faire, ajoutez les scripts à votre ~/.bash_profile
. Créez ce fichier s'il n'existe pas.
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
}
Une fois que vous avez enregistré votre profil bash et redémarré le shell, vous pouvez appeler cw Preview foo.pdf
de partout.