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 write
dan sintaksnya
- Lihatlah
PlistBuddy
. man PlistBuddy
dan/usr/libexec/PlistBuddy -h
- Lewati semua omong kosong ini sama sekali dan gunakan RCDefaultApp