Secara terprogram / Script-atically mengubah pengaturan Open-With default

8

Apakah ada cara untuk mengubah aplikasi apa yang membuka jenis file secara terprogram / dengan skrip?

Pada dasarnya, kadang-kadang saya bekerja di situs web, dan saya ingin mengatur semua file web untuk dibuka dengan editor teks (* .php, * .html, * .htm, dll ...).

Namun, di lain waktu, saya hanya ingin melihat file, jadi saya ingin mereka membuka dengan browser.

Saat ini, saya menyeret item ke ikon dock, yang berfungsi, tetapi lambat, terutama ketika saya akan melalui sejumlah besar file dengan keyboard saja.

Pada dasarnya, yang saya inginkan adalah applescript kecil / apa pun yang mengubah semua pengaturan open-with.
Dengan begitu, saya dapat memiliki satu skrip untuk setiap program terbuka, dan mengubah bolak-balik.

Terima kasih.

Nama palsu
sumber

Jawaban:

10

Ini bisa dilakukan, tetapi mungkin tidak semudah yang Anda kira. Anda harus terbiasa dengan Pengenal Jenis Seragam. Lihatlah halaman Pengidentifikasi Jenis Seragam Wikipedia .

OS X menyimpan informasi tentang asosiasi file pilihan dalam file preferensi dengan nama com.apple.LaunchServices.plist. Sebelum Anda mencoba mencari dan memodifikasi file itu, saya sarankan Anda membiasakan diri dengan hierarki domain OS X untuk default (alias "pengaturan"). Artikel yang layak tentang ini dapat ditemukan di sini . (Penafian: mereka sepertinya menjual sesuatu di situs itu. Saya tidak tahu apa itu dan tidak memiliki hubungan dengan mereka, penjelasannya hanya bagus.)

Sekarang setelah Anda mengetahui semua tentang default dan UTI (eh, bukan jenis medis), sekarang kita dapat berbicara tentang pengaturan asosiasi file dari skrip / baris perintah.

Pertama, Anda harus mengetahui cara yang tepat untuk mengidentifikasi file yang ingin Anda hubungkan.

Ingat bagaimana saya mengatakan ISK penting? Ada beberapa cara untuk mengidentifikasi file. Itu tergantung pada apakah jenisnya telah dinyatakan secara resmi di sistem Anda atau tidak. Sebagai contoh, editor teks yang layak seperti TextMate atau TextWrangler akan menambahkan beberapa jenis deklarasi ke hirarki jenis ketika Anda menggunakannya di sistem Anda. Namun, jika Anda tidak memiliki aplikasi-aplikasi itu, Anda mungkin tidak memiliki tipe-tipe yang dideklarasikan.

OK, cukup bicara. Contoh:

Dapatkan UTI untuk file:

$ mdls myFile.xml
...
kMDItemContentType             = "public.xml"
kMDItemContentTypeTree         = (
    "public.xml",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
...

OK keren. Jenis konten eksplisit yang dapat kita gunakan. Tuliskan itu di suatu tempat.

$ mdls myFile.myExtn
...
kMDItemContentType             = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree         = (
    "public.data",
    "public.item"
)
...

Ups. OS X tidak tahu tentang file ".myExtn". Jadi, itu menciptakan UTI dinamis yang tidak bisa kita gunakan untuk apa pun. Dan tipe induknya terlalu generik untuk berguna.

Sekarang kita tahu apa file kita, mari kita lihat file LaunchServices.plist dan lihat apa yang bisa kita lakukan:

$defaults read com.apple.LaunchServices
{
    ...
    LSHandlers =     (
                {
            LSHandlerContentType = "public.html";
            LSHandlerRoleAll = "com.apple.safari";
            LSHandlerRoleViewer = "com.google.chrome";
        },
    ...
                {
            LSHandlerContentTag = myExtn;
            LSHandlerContentTagClass = "public.filename-extension";
            LSHandlerRoleAll = "com.macromates.textmate";
        },
    ...
    );
    ...
}

Jadi, ketika Anda memiliki tipe konten "baik" untuk digunakan, konstruk pertama lebih baik. Kalau tidak, konstruk lainnya. Catatan, ada konstruksi lain di file itu, tetapi mereka tidak relevan dengan apa yang Anda minta. Ketahuilah mereka ada di sana ketika Anda melihat melalui output.

Seperti yang Anda lihat, Anda harus menemukan UTI untuk aplikasi yang ingin Anda gunakan. UTI untuk Safar dan TextMate ada dalam contoh saya di atas, tetapi untuk menemukan UTI secara umum untuk suatu aplikasi:

$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
        <key>CFBundleIdentifier</key>
        <string>com.apple.Safari</string>
...

CATATAN: Saya tidak tahu apa yang merupakan perbedaan antara LSHandlerRoleAll dan LSHandlerRoleViewer. Saya tidak dapat menemukan dokumentasi di mana pun itu. Apa yang saya lakukan lihat adalah bahwa 99% dari waktu LSHandlerRoleAll adalah hanya satu set (yaitu tidak ada LSHandlerRoleViewer sama sekali) dan bahwa itu diatur ke ISK untuk aplikasi yang Anda inginkan untuk mengasosiasikan jenis dengan.

Setelah membawa Anda sejauh ini, saya akan meninggalkan BAGAIMANA untuk menetapkan nilai-nilai yang Anda inginkan sebagai latihan untuk pembaca. Bercak dengan hal-hal ini bisa agak berbahaya. Sangat mungkin bagi Anda untuk mengacaukan file dan tidak memiliki APAPUN dari asosiasi file Anda bekerja. Maka Anda harus membuang file dan memulai dari awal.

Beberapa petunjuk:

  • Baca terus defaults writedan sintaksnya
  • Lihatlah PlistBuddy. man PlistBuddydan/usr/libexec/PlistBuddy -h
  • Lewati semua omong kosong ini sama sekali dan gunakan RCDefaultApp
dbingham
sumber
Apakah RCDefault dapat skrip? Saya melihat-lihat situs mereka, dan sepertinya tidak.
Nama Palsu
Nevermind, saya punya tipe deklarasi untuk semua tipe file yang saya minati.
Fake Name
Tulisan yang bagus. Sejauh ini LSHandlerRoleViewer, saya bertanya-tanya apakah itu mungkin berhubungan dengan menjadi default untuk melihat sebagai lawan mengedit ( apple.stackexchange.com/a/49998/206073 membuat saya mengerti). Namun saya tidak tahu dalam konteks apa seseorang dapat menentukan apakah seseorang membuka untuk melihat atau mengedit, (di luar topik, CFBundleTypeRolesepertinya ia menerima nilai yang sama)
Brett Zamir
Juga, sepertinya com.apple.LaunchServices/com.apple.launchservices.secureini adalah domain dalam sistem MacOS yang lebih baru ...
Brett Zamir
2

Salah satu opsi adalah mengedit ~/Library/Preferences/.GlobalPreferences.plist:

defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'

Anda dapat menggunakan PlistBuddy untuk memeriksa apakah entri sudah ada , tetapi saya belum menemukan cara untuk menerapkan perubahan tanpa memulai ulang atau membangun kembali basis data Layanan Peluncuran.

Menggunakan duti , Anda dapat menjalankan duti ~/.dutisetelah menyimpan ini sebagai ~/.duti:

net.sourceforge.skim-app.skim .pdf all
Lri
sumber
1

Itu tidak benar-benar menjawab pertanyaan Anda, tetapi mungkin menjadi solusi.

The Inspektur di Finder menyajikan informasi untuk saat ini dipilih file, atau file:

+ +I

Jendela Ringkasan Info Finder berguna ketika beberapa file dipilih:

^+ +I

Jika Anda memilih beberapa file dengan tipe yang sama, maka metode mana pun di atas akan memungkinkan Anda untuk dengan mudah mengganti properti Open with: untuk file-file itu.

Loïc Wolff
sumber
0

Bukan jawaban untuk pertanyaan persis Anda, tetapi solusi lain yang mungkin. Anda dapat membuka dokumen dengan aplikasi spesifik dari baris perintah dengan argumen -a untuk dibuka.

Misalnya, buka semua file html di direktori saat ini.

> open -a 'Google Chrome' *.html

Buka index.html dan file pengontrol javascript di editor teks Atom:

> open -a 'atom' index.html js/controllers/*.js

Bergantung pada kebutuhan Anda, Anda dapat memodifikasi ini menjadi layanan Automator yang dapat ditetapkan sebagai tombol pintas, dengan mengambil jalur file yang dipilih sebagai argumen.

Berikut ini contoh Automator AppleScript yang menerima file sebagai input dan membuka file yang dipilih di Chrome:

on run {input, parameters}
set openFiles to "open -a 'Google Chrome' " --note the trailing space
set filePaths to {}

--covert the filePaths to posix style
repeat with i from 1 to count of input
    set aFile to input's item i as alias
    set aFile to quoted form of POSIX path of aFile
    set filePaths's end to aFile
end repeat

--convert filePaths list to a string delimited by spaces
set tid to text item delimiters
set text item delimiters to " "
set filePaths to filePaths as text
set text item delimiters to tid

--Open files via commandline
do shell script openFiles & filePaths
return input

akhirnya jalankan

Jelas, Anda dapat mengubah nama aplikasi "Sublime" editor teks, menyimpannya sebagai layanan lain, dan menetapkan keduanya tombol pintasan.

Hurston
sumber