Bagaimana cara menutup jendela dari aplikasi, melewati nama file?

9

Saya mencoba membuat perintah shell berbasis Applescript yang memberi tahu aplikasi Preview dari Mac OS X untuk menutup jendela tertentu.

#!/bin/sh

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

Tapi ini tidak berhasil: Saya mendapatkan pesan kesalahan

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

Pertanyaan terkait: Bagaimana cara menutup aplikasi OS X dari baris perintah menggunakan alias yang didefinisikan dalam .bash_profile saya?

Ewan Delanoy
sumber
Ini harus bekerja seperti yang diharapkan. Bagaimana tepatnya Anda memanggil skrip Anda? Catatan: Skrip Anda tidak akan menutup jendela tertentu. Ini akan keluar dari aplikasi, sehingga menutup semua jendela dokumen yang mungkin dibuka oleh aplikasi. Untuk menutup dokumen tertentu aplikasi telah dibuka tetapi tidak keluar dari aplikasi itu sendiri, Anda memerlukan skrip yang berbeda. Sementara sebagian besar aplikasi berhenti ketika jendela dokumen terakhir ditutup, tidak semua melakukannya — ini juga tergantung pada versi OS X yang Anda gunakan.
slhck
@ slhck: "tutup dokumen tertentu aplikasi telah dibuka tetapi tidak keluar dari aplikasi per se" adalah persis apa yang saya butuhkan. Apakah Anda tahu di suatu tempat di mana "naskah yang berbeda" dijelaskan?
Ewan Delanoy

Jawaban:

10

Mendapatkan Preview.app untuk menerima perintah AppleScript

Secara default, Pratinjau AppleScripting tidak berfungsi karena Pratinjau tidak memiliki kamus yang diperlukan. Untuk memperbaikinya, periksa jawaban Lauri di sini , yang menjelaskan pengaturan NSAppleScriptEnableduntuk Preview.app.

Keluar dari Preview.app, lalu buka terminal dan masukkan:

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


Menutup jendela dari aplikasi

1) Dengan indeks jendela atau nama jendela

Perintah untuk menutup jendela aplikasi apa pun akan menjadi sesuatu seperti ini:

tell application "Preview" to close window 1

... atau jika Anda ingin menutup jendela dokumen bernama, misalnya foo.jpg:

beri tahu aplikasi "Pratinjau" untuk menutup (setiap jendela yang namanya " foo.jpg ")

Jadi, dalam skrip shell Anda itu adalah:

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

Di sini, argumen pertama yang diteruskan ke skrip adalah nama jendela yang ingin Anda tutup, misalnya ./quit.sh foo.jpg. Perhatikan bahwa jika file Anda mengandung spasi, Anda harus mengutip nama file, misalnya ./quit.sh "foo bar.jpg".

Atau jika Anda ingin menutup jendela sembarang dari aplikasi apa pun, gunakan ini:

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

Di sini, Anda akan menggunakan ./quit.sh Preview foo.jpgmisalnya.

2) Dengan nama file

Jika Anda ingin menutup jendela yang dimiliki dokumen tertentu, tetapi memberikan nama file, Anda memerlukan sesuatu yang lain. Ini karena PDF multi-halaman dapat ditampilkan sebagai foo.pdf (Page 1 of 42), tetapi Anda hanya ingin meneruskan foo.pdfke AppleScript.

Di sini kita beralih melalui jendela dan membandingkan nama file dengan argumen yang diteruskan ke skrip:

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

Sekarang Anda cukup menelepon ./quit.sh foo.pdf. Secara umum, untuk semua aplikasi dengan jendela dokumen bernama, itu akan menjadi:

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


Peringatan: Auto-closing Preview.app

Preview.app adalah salah satu aplikasi ini yang secara otomatis berhenti setelah jendela dokumen terakhir ditutup. Itu dilakukan untuk menghemat memori dan "membersihkan". Untuk menonaktifkan perilaku ini, jalankan yang berikut:

defaults write -g NSDisableAutomaticTermination -bool TRUE

Tentu saja, untuk membatalkan itu, ubah TRUEke FALSE.


Menggunakan fungsi alih-alih skrip

Akhirnya, saya sarankan menempatkan skrip Anda ke dalam fungsi yang selalu tersedia di shell Anda. Untuk melakukan ini, tambahkan skrip ke ~/.bash_profile. Buat file ini jika tidak ada.

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
}

Setelah Anda menyimpan profil bash dan memulai kembali shell, Anda dapat menelepon cw Preview foo.pdfdari mana saja.

slhck
sumber
Saya mencoba ini. Kali ini saya tidak mendapatkan pesan kesalahan, tetapi skripnya masih tidak berfungsi: jendela tetap terlihat di layar.
Ewan Delanoy
Ini berhasil untuk saya. Jika Anda membuka dokumen di Preview.app, lalu buka AppleScript Editor, dan masukkan tell application "Preview" to windows, apakah itu memberi Anda hasil? Skrip apa yang Anda jalankan?
slhck
Saya tidak menggunakan editor AppleScript, saya hanya menggunakan "kode applescript tertanam" dalam skrip bash, seperti yang dijelaskan dalam OP, disimpan dalam file .sh.
Ewan Delanoy
Bahkan, saya biasanya cukup senang dengan skrip shell dan ini adalah applescript pertama saya. Saya baru saja melakukan apa yang Anda sarankan dalam komentar terakhir Anda, dan mendapat: "{window id 113 dari aplikasi" Preview "}" sebagai jawaban. Apakah itu yang harus saya dapatkan?
Ewan Delanoy
Juga, ketika saya mengkompilasi << kirim aplikasi "Pratinjau" untuk menutup "musixdoc.pdf" >> dengan editor applescript, itu tidak berfungsi baik: jendela musixdoc.pdf tetap terlihat di layar.
Ewan Delanoy
0

Jawaban oleh slhck terlihat bagus dan teliti. Hati-hati, mengeksekusi baris kode ketiga :

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

'tampaknya' menyebabkan Pratinjau macet di setiap peluncuran dengan yang berikut:

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

Menurut manual codesign, yang -fmemaksa 'tanda kode untuk mengganti dan tanda tangan yang ada' dan -sadalah untuk 'menandatangani kode di jalur yang diberikan' ... dalam hal ini-

Rupanya, Pratinjau sekarang ditandatangani dengan tidak benar dan tidak dapat digunakan. :(

David C
sumber