Como alterar o aplicativo padrão para todos os arquivos desse tipo de arquivo através do terminal no OS X?


32

Como posso alterar o aplicativo padrão para todos os arquivos de um tipo de arquivo específico através do Terminal no OS X?


Não é um idiota, mesmo que eu tenha respondido lá. Me desculpe por isso.
Daniel Beck

Respostas:


38

Eu tenho uma maneira mais simples. Você quer o Homebrew se ainda não o possui:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Instale o duti:

brew install duti

Agora você precisa encontrar o ID do aplicativo que deseja usar e atribuí-lo à extensão para a qual deseja usá-lo. Neste exemplo, eu já uso colchetes para *.she também quero usá-lo para *.mdarquivos em vez de xcode.

Obtenha o ID do aplicativo padrão para .sharquivos:

duti -x sh

output:
  Brackets.app
  /opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
  io.brackets.appshell

A última linha é a identificação.

Use este ID de aplicativo para todos os .mdarquivos:

duti -s io.brackets.appshell .md all

3
Voto isso 50 vezes se eu pudesse. Ótima informação. Funcionou como um encanto para mim em El Capitan.
Ryan Walls

1
Trabalhando na Sierra também. Dica extra: as UTIs são um problema, mas você pode usar "mdls -name kMDItemContentType <file>" para encontrar a UTI de um determinado arquivo (e, portanto, extensão).
Adrian

2
Se você ainda não associou um aplicativo a algo dessa maneira, mas sabe o nome do seu aplicativo, pode fazer isso osascript -e 'id of app "$appName"'para obter o ID de qualquer aplicativo instalado no seu sistema
#

1
Só para referência: combinando dica de @GrayedFox com duti:duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk 11/11/18

18

Edit ~/Library/Preferences/com.apple.LaunchServices.plist.

Adicione uma entrada em LSHandlers, contendo a UTI (chave LSHandlerContentType, por exemplo public.plain-text) e o identificador de pacote de aplicativos ( LSHandlerRoleAll, por exemplo com.macromates.textmate).

É assim no Editor de lista de propriedades :

texto alternativo texto alternativo

Para fazer isso na linha de comando, use defaultsou /usr/libexec/PlistBuddy. Ambos têm extensas páginas de manual.

Por exemplo, para abrir todos os .plistarquivos usando Xcode:

defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'

Claro, você precisa se certificar de que ainda não existe outra entrada para a UTI com.apple.property-list.

Aqui está um script mais completo que remove as entradas existentes para uma UTI e adiciona uma nova. Ele só pode manipular LSHandlerContentType, e sempre será definido LSHandlerRoleAll, e possui IDs de pacotes embutidos em vez de parâmetros. Fora isso, deve funcionar muito bem.

#!/usr/bin/env bash

PLIST="$HOME/Library/Preferences/com.apple.LaunchServices.plist"
BUDDY=/usr/libexec/PlistBuddy

# the key to match with the desired value
KEY=LSHandlerContentType

# the value for which we'll replace the handler
VALUE=public.plain-text

# the new handler for all roles
HANDLER=com.macromates.TextMate

$BUDDY -c 'Print "LSHandlers"' $PLIST >/dev/null 2>&1
ret=$?
if [[ $ret -ne 0 ]] ; then
        echo "There is no LSHandlers entry in $PLIST" >&2
        exit 1
fi

function create_entry {
        $BUDDY -c "Add LSHandlers:$I dict" $PLIST
        $BUDDY -c "Add LSHandlers:$I:$KEY string $VALUE" $PLIST
        $BUDDY -c "Add LSHandlers:$I:LSHandlerRoleAll string $HANDLER" $PLIST
}

declare -i I=0
while [ true ] ; do
        $BUDDY -c "Print LSHandlers:$I" $PLIST >/dev/null 2>&1
        [[ $? -eq 0 ]] || { echo "Finished, no $VALUE found, setting it to $HANDLER" ; create_entry ; exit ; }

        OUT="$( $BUDDY -c "Print 'LSHandlers:$I:$KEY'" $PLIST 2>/dev/null )"
        if [[ $? -ne 0 ]] ; then 
                I=$I+1
                continue
        fi

        CONTENT=$( echo "$OUT" )
        if [[ $CONTENT = $VALUE ]] ; then
                echo "Replacing $CONTENT handler with $HANDLER"
                $BUDDY -c "Delete 'LSHandlers:$I'" $PLIST
                create_entry
                exit
        else
                I=$I+1 
        fi
done

3
A maneira mais fácil é provavelmente x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xcopiar e colar essas entradas do LSHandlers. Para obter o identificador de pacote, você pode fazer osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
Lri

@ Lri De certa forma, sim, mas esta pergunta é especificamente sobre a linha de comando. Imaginei que o TextEdit (ou o Editor de lista de propriedades / Xcode) não se qualifica; Acabei de copiar essa parte com o Property List Editor da minha outra resposta para fins ilustrativos. Observação útil sobre o identificador de pacote.
Daniel Beck


Se não faz existir uma entrada alternativa para a UTI, você concordaria que "a remoção de linha de comando de um único dicionário de uma matriz pode ser desnecessariamente difícil"?
Graham Perrin

1
@GrahamPerrin É desnecessariamente difícil, porque defaultsnão parece ser capaz de fazê-lo, e requer algumas PlistBuddychamadas. Mas é possível fazer isso em um script de shell reutilizável.
Daniel Beck
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.