Come posso chiudere una finestra da un'applicazione, passando il nome del file?


9

Sto provando a produrre un comando shell basato su Applescript che dice all'applicazione Anteprima da Mac OS X di chiudere una finestra particolare.

#!/bin/sh

osascript <<EOF
tell application "Preview"
   close "$1"
end tell
EOF

Ma questo non funziona: ricevo il messaggio di errore

25:52: execution error: Preview got an error: "musixdoc.pdf" doesn’t understand the close message. (-1708)

Domanda correlata: come posso chiudere un'applicazione OS X dalla riga di comando usando un alias definito nel mio .bash_profile?


Questo dovrebbe funzionare come previsto. Come stai chiamando esattamente la tua sceneggiatura? Nota: lo script non chiuderà una finestra particolare. Uscirà dall'applicazione, chiudendo così tutte le finestre dei documenti che l'applicazione potrebbe avere aperta. Per chiudere un particolare documento che l'applicazione ha aperto ma non chiudere l'applicazione di per sé, è necessario uno script diverso. Mentre la maggior parte delle applicazioni si chiude quando viene chiusa la finestra dell'ultimo documento, non tutte lo fanno: ciò dipende anche dalla versione di OS X in uso.
slhck

@slhck: "chiudere un documento particolare che l'applicazione ha aperto ma non chiudere l'applicazione in sé" è esattamente ciò di cui ho bisogno. Ti capita di sapere da qualche parte dove viene spiegata una "sceneggiatura diversa"?
Ewan Delanoy,

Risposte:


10

Ottenere Preview.app per accettare i comandi AppleScript

Per impostazione predefinita, l'anteprima di AppleScript non funziona perché in Anteprima manca il dizionario necessario. Per risolvere questo problema, controlla qui la risposta di Lauri , che spiega le impostazioni NSAppleScriptEnableddi Preview.app.

Esci da Preview.app, quindi apri un terminale e inserisci:

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


Chiudere una finestra da un'applicazione

1) Per indice della finestra o nome della finestra

Il comando per chiudere una finestra di qualsiasi applicazione denominata sarebbe simile al seguente:

tell application "Preview" to close window 1

... o se si desidera chiudere una finestra del documento con nome, ad esempio foo.jpg:

di chiudere l'applicazione "Anteprima" (ogni finestra il cui nome è " foo.jpg ")

Quindi, nel tuo script shell sarebbe:

#!/bin/sh
osascript <<EOF
tell application "Preview"
  close (every window whose name is "$1")
end tell
EOF

Qui, il primo argomento passato allo script è il nome della finestra che si desidera chiudere, ad es ./quit.sh foo.jpg. Nota che se il tuo file contiene spazi, devi citare il nome del file, ad es ./quit.sh "foo bar.jpg".

O se vuoi chiudere finestre arbitrarie da qualsiasi applicazione, usa questo:

#!/bin/sh
osascript <<EOF
tell application "$1"
  close (every window whose name is "$2")
end tell
EOF

Qui, useresti ./quit.sh Preview foo.jpgper esempio.

2) Per nome file

Se si desidera chiudere una finestra che appartiene a un determinato documento, ma fornendo il nome del file, è necessario qualcos'altro. Questo perché un PDF multipagina potrebbe essere visualizzato come foo.pdf (Page 1 of 42), ma vorresti solo passare foo.pdfad AppleScript.

Qui passiamo attraverso le finestre e confrontiamo i nomi dei file con l'argomento passato allo 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

Ora puoi semplicemente chiamare ./quit.sh foo.pdf. In modo generalizzato, per tutte le app con finestre di documenti con nome, sarebbe:

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


Avvertenza: Preview.app con chiusura automatica

Preview.app è una di queste applicazioni che si chiude automaticamente una volta chiusa la finestra dell'ultimo documento. Lo fa per risparmiare memoria e "ripulire". Per disabilitare questo comportamento, eseguire quanto segue:

defaults write -g NSDisableAutomaticTermination -bool TRUE

Naturalmente, per annullare ciò, passare TRUEa FALSE.


Utilizzo delle funzioni anziché degli script

Infine, suggerirei di inserire i tuoi script in una funzione che è sempre disponibile nella tua shell. Per fare ciò, aggiungi gli script al tuo ~/.bash_profile. Crea questo file se non esiste.

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
}

Dopo aver salvato il tuo profilo bash e riavviato la shell, puoi chiamare cw Preview foo.pdfda qualsiasi luogo.


Ci ho provato Questa volta non ricevo alcun messaggio di errore, ma lo script continua a non funzionare: la finestra rimane visibile sullo schermo.
Ewan Delanoy,

Ha funzionato per me. Se apri un documento in Preview.app, quindi apri AppleScript Editor e inserisci tell application "Preview" to windows, ti dà qualche risultato? Quale script esatto stai eseguendo?
slhck,

Non uso l'editor AppleScript, utilizzo solo il "codice applecript incorporato" in uno script bash, come spiegato nell'OP, memorizzato in un file .sh.
Ewan Delanoy,

In effetti, di solito sono abbastanza contento degli script di shell e questo è il mio primo script di mele. Ho appena fatto ciò che mi hai consigliato nel tuo ultimo commento e ho ottenuto: "{id finestra 113 dell'applicazione" Anteprima "}" come risposta. È quello che dovrei ottenere?
Ewan Delanoy,

Inoltre, quando compilo << dì all'applicazione "Anteprima" di chiudere "musixdoc.pdf" >> con l'editor di mele, non funziona neanche: la finestra musixdoc.pdf rimane visibile sullo schermo.
Ewan Delanoy,

0

La risposta di Slhck sembra buona e approfondita. Attenzione, eseguendo la terza riga di codice :

sudo codesign -f -s - /Applications/Preview.app

'sembra' aver causato l'arresto anomalo di Preview ad ogni avvio con il seguente:

Application Specific Information:
XPC domain creation failed: The code signature is not valid: The operation couldn’t be completed. (OSStatus error -67061.)

Secondo il manuale del codesign, ciò -fsta forzando il "segno di codice per sostituire e la firma esistente" e quello -sdi "firmare il codice nel percorso indicato" ... in questo caso-

Apparentemente, l'anteprima è ora firmata in modo errato e inutilizzabile. :(

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.