Isso é possível, mas provavelmente não é tão simples quanto você imagina. Você precisará se familiarizar com os Identificadores de tipo uniformes. Consulte a página Identificador de tipo uniforme da Wikipedia .
O OS X armazena informações sobre associações de arquivos preferenciais em um arquivo de preferência com o nome com.apple.LaunchServices.plist
. Antes de tentar encontrar e modificar esse arquivo, sugiro que você se familiarize com a hierarquia de domínio do OS X para padrões (também conhecidos como "configurações"). Um artigo decente sobre isso pode ser encontrado aqui . (Isenção de responsabilidade: eles parecem estar vendendo algo nesse site. Eu não sei o que é e não tenho associação com eles, a explicação é apenas uma boa.)
Agora que você sabe tudo sobre padrões e UTIs (er, não do tipo médico), agora podemos falar sobre a configuração de associações de arquivos a partir de uma linha de script / comando.
Primeiro, você precisará saber a maneira correta de identificar os arquivos para os quais deseja fazer uma associação.
Lembra como eu disse que as ITUs eram importantes? Existem várias maneiras de identificar um arquivo. Depende se o tipo foi formalmente declarado no seu sistema ou não. Por exemplo, editores de texto decentes como TextMate ou TextWrangler adicionam algumas declarações de tipo à hierarquia de tipos quando você as usa em seu sistema. Se, no entanto, você não tiver esses aplicativos, poderá não ter esses tipos declarados.
OK, chega de conversa. Exemplos:
Obtenha a UTI para um arquivo:
$ mdls myFile.xml
...
kMDItemContentType = "public.xml"
kMDItemContentTypeTree = (
"public.xml",
"public.text",
"public.data",
"public.item",
"public.content"
)
...
OK legal. Um tipo de conteúdo explícito que podemos usar. Escreva isso em algum lugar.
$ mdls myFile.myExtn
...
kMDItemContentType = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree = (
"public.data",
"public.item"
)
...
Opa O OS X não sabe sobre os arquivos ".myExtn". Então, criou uma UTI dinâmica que não podemos usar para nada. E os tipos pai são genéricos demais para serem úteis.
Agora que sabemos quais são nossos arquivos, vamos olhar para o arquivo LaunchServices.plist e ver o que podemos fazer:
$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";
},
...
);
...
}
Portanto, quando você tem um tipo de conteúdo "bom" para usar, a primeira construção é melhor. Caso contrário, a outra construção. Observe que existem outras construções nesse arquivo, mas elas não são relevantes para o que você pediu. Apenas saiba que eles estão lá quando você olha através da saída.
Como você pode ver, você precisará encontrar a UTI do aplicativo que deseja usar. As UTIs para Safar e TextMate estão no meu exemplo acima, mas para encontrar genericamente a UTI para um aplicativo:
$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
<key>CFBundleIdentifier</key>
<string>com.apple.Safari</string>
...
NOTA: Não faço ideia do que constitui a diferença entre LSHandlerRoleAll e LSHandlerRoleViewer. Não consigo encontrar documentação sobre isso em nenhum lugar. O que fazer ver é que 99% do tempo LSHandlerRoleAll é o único conjunto (ou seja, não há nenhuma LSHandlerRoleViewer em tudo) e que está definido para a UTI para o aplicativo que você deseja associar o tipo de com.
Tendo levado você até aqui, vou deixar COMO definir os valores que você deseja como exercício para o leitor. Mexer com essas coisas pode ser um pouco perigoso. É perfeitamente possível que você estrague um arquivo e não tenha QUALQUER uma das suas associações de arquivos funcionando. Então você tem que jogar fora o arquivo e começar de novo.
Algumas dicas:
- Leia
defaults write
e sua sintaxe
- Dê uma olhada
PlistBuddy
. man PlistBuddy
e/usr/libexec/PlistBuddy -h
- Ignore toda essa bobagem e use RCDefaultApp