Questo è fattibile, ma probabilmente non è così semplice come potresti pensare. Dovrai acquisire familiarità con gli identificatori di tipo uniforme. Guarda la pagina Identificatore di tipo uniforme di Wikipedia .
OS X memorizza le informazioni sulle associazioni di file preferite in un file di preferenze con il nome com.apple.LaunchServices.plist
. Prima di provare a trovare e modificare quel file, ti suggerisco di familiarizzare con la gerarchia di domini di OS X per impostazione predefinita (ovvero "impostazioni"). Un articolo decente su questo può essere trovato qui . (Dichiarazione di non responsabilità: sembrano vendere qualcosa su quel sito. Non so cosa sia e non ho alcuna associazione con loro, la spiegazione è solo buona.)
Ora che sai tutto sui valori predefiniti e UTI (er, non di tipo medico), ora possiamo parlare di impostare le associazioni di file da una riga di script / comando.
Innanzitutto, devi conoscere il modo corretto di identificare i file per i quali desideri creare un'associazione.
Ricordi come ho detto che le IVU erano importanti? Esistono diversi modi per identificare un file. Dipende se il tipo è stato formalmente dichiarato sul tuo sistema o meno. Ad esempio, editor di testo decenti come TextMate o TextWrangler aggiungeranno alcune dichiarazioni di tipo alla gerarchia dei tipi quando le si utilizza sul proprio sistema. Se, tuttavia, non si dispone di tali applicazioni, è possibile che tali tipi non vengano dichiarati.
OK, basta parlare. Esempi:
Ottieni UTI per un file:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
Ok bello. Un tipo di contenuto esplicito che possiamo usare. Scrivilo da qualche parte.
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
Ops. OS X non conosce i file ".myExtn". Quindi, ha creato un UTI dinamico che non possiamo usare per nulla. E i tipi principali sono troppo generici per essere utili.
Ora che sappiamo quali sono i nostri file, diamo un'occhiata al file LaunchServices.plist e vediamo cosa possiamo fare:
$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";
},
...
);
...
}
Quindi, quando hai un tipo di contenuto "buono" da usare, il primo costrutto è migliore. Altrimenti l'altro costrutto. Nota, ci sono altri costrutti in quel file, ma non sono rilevanti per quello che hai chiesto. Basta sapere che sono lì quando guardi attraverso l'output.
Come puoi vedere, dovrai trovare l'UTI per l'applicazione che desideri utilizzare. Le UTI per Safar e TextMate sono nel mio esempio sopra, ma per trovare genericamente la UTI per un'applicazione:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
NOTA: Non ho alcuna idea di ciò che costituisce la differenza tra LSHandlerRoleAll e LSHandlerRoleViewer. Non riesco a trovare documentazione su questo da nessuna parte. Quello che faccio vedere è che il 99% del tempo LSHandlerRoleAll è l'unico set (vale a dire non v'è alcun LSHandlerRoleViewer a tutti) e che sia impostato sul UTI per l'applicazione che si desidera associare il tipo con.
Dopo averti portato così lontano, ho intenzione di lasciare HOW per impostare i valori desiderati come esercizio per il lettore. Fare confusione con queste cose può essere alquanto pericoloso. È del tutto possibile rovinare un file e non far funzionare NESSUNA delle tue associazioni di file. Quindi devi eliminare il file e ricominciare.
Alcuni suggerimenti:
- Continua a leggere
defaults write
e la sua sintassi
- Dai un'occhiata
PlistBuddy
. man PlistBuddy
e/usr/libexec/PlistBuddy -h
- Salta tutte queste sciocchezze del tutto e usa RCDefaultApp