Alterando de forma programática / por script a configuração padrão Abrir com


8

Existe uma maneira de alterar qual aplicativo abre um tipo de arquivo programaticamente / com um script?

Basicamente, às vezes estou trabalhando em um site e quero definir todos os arquivos da web para abrir com um editor de texto (* .php, * .html, * .htm, etc ...).

No entanto, outras vezes, eu quero apenas visualizar os arquivos, então quero que eles abram com um navegador.

No momento, estou arrastando itens para os ícones do dock, o que funciona, mas é lento, principalmente quando estou passando por um grande número de arquivos apenas com o teclado.

Basicamente, o que eu quero é um pequeno AppleScript / o que quer que mude todas as configurações de abrir com.
Dessa forma, posso ter um script para cada programa aberto e mudar de um lado para outro.

Obrigado.

Respostas:


10

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 writee sua sintaxe
  • Dê uma olhada PlistBuddy. man PlistBuddye/usr/libexec/PlistBuddy -h
  • Ignore toda essa bobagem e use RCDefaultApp

O RCDefault é programável? Eu olhei o site deles e não parece.
Fake Name

Não importa, eu tenho declarações de tipo para todos os tipos de arquivos que eu estou interessado.
Falso Nome

Ótima redação. Tanto quanto LSHandlerRoleViewer, eu me pergunto se isso pode estar relacionado ao padrão para visualização, em vez de edição ( apple.stackexchange.com/a/49998/206073 me colocou nessas linhas). Eu não sei embora em que contextos se pode determinar se um é a abertura para visualização ou edição, no entanto ... (off topic, CFBundleTypeRoleparece que aceita valores semelhantes)
Brett Zamir

Além disso, parece que com.apple.LaunchServices/com.apple.launchservices.securepode ser o domínio em sistemas MacOS posteriores ...
Brett Zamir

2

Uma opção é editar ~/Library/Preferences/.GlobalPreferences.plist:

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

Você pode usar o PlistBuddy para verificar se já existem entradas , mas não encontrei nenhuma maneira de aplicar alterações sem reiniciar ou reconstruir o banco de dados dos Serviços de Ativação.

Usando duti , você pode executar duti ~/.dutidepois de salvar isso como ~/.duti:

net.sourceforge.skim-app.skim .pdf all

1

Realmente não responde à sua pergunta, mas pode ser uma solução.

O Inspetor no Finder apresenta informações para o arquivo atualmente selecionado , ou arquivos:

+ +I

A janela Informações de resumo do Finder é útil quando vários arquivos são selecionados:

^+ +I

Se você selecionar vários arquivos do mesmo tipo, qualquer um dos métodos acima permitirá que você alterne facilmente a propriedade Abrir com: para esses arquivos.


0

Não é uma resposta para sua pergunta exata, mas outra solução possível. Você pode abrir um documento com um aplicativo específico na linha de comando com o argumento -a para abrir.

Por exemplo, abra todos os arquivos html no diretório atual.

> open -a 'Google Chrome' *.html

Abra index.html e os arquivos do controlador javascript no editor de texto Atom:

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

Dependendo das suas necessidades, você pode modificá-lo para ser um serviço do Automator ao qual pode ser atribuída uma tecla de atalho, considerando os caminhos de arquivo selecionados como argumento.

Aqui está um exemplo do AppleScript do Automator que recebe arquivos como entrada e abre os arquivos selecionados no 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

corrida final

Obviamente, você pode alterar o nome do aplicativo "Sublime" editor de texto, salvá-lo como outro serviço e atribuir as duas teclas de atalho.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.