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

27

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

    
por yashodhan 21.04.2011 / 18:59

2 respostas

30

Eu tenho um jeito mais simples. Você vai querer Homebrew se você ainda não tem:

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

Instalar 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 Brackets para *.sh e também quero usá-lo para *.md arquivos em vez de xcode.

Obtenha o ID do aplicativo padrão para .sh arquivos:

duti -x sh

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

A última linha é o id.

Use este ID de aplicativo para todos os arquivos .md :

duti -s io.brackets.appshell .md all
    
por 22.06.2016 / 13:29
17

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

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

Parece com isso no Editor da lista de propriedades :

Para fazer isso na linha de comando, use defaults ou /usr/libexec/PlistBuddy . Ambos têm manpages extensas.

Por exemplo, para abrir todos os arquivos .plist usando Xcode :

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

É claro que você precisa ter certeza de que ainda não há outra entrada para o UTI com.apple.property-list .

Este é um script mais completo que remove as entradas existentes de uma UTI e adiciona uma nova. Ele só pode manipular LSHandlerContentType e sempre definirá LSHandlerRoleAll , além de ter IDs de bundle codificados 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
    
por 21.04.2011 / 19:25