web-dev-qa-db-fra.com

Comment changer l'application par défaut pour tous les fichiers d'un type de fichier particulier via un terminal sous OS X?

Comment puis-je modifier l'application par défaut pour tous les fichiers d'un type de fichier particulier via le terminal sous OS X?

31
yashodhan

J'ai un moyen plus simple. Vous voudrez Homebrew si vous ne l'avez pas déjà:

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

Installez Duti:

brew install duti

Maintenant, vous devez trouver l'identifiant de l'application que vous souhaitez utiliser et l'affecter à l'extension pour laquelle vous souhaitez l'utiliser. Dans cet exemple, j'utilise déjà Brackets pour *.sh et je veux également l'utiliser pour les fichiers *.md au lieu de xcode.

Obtenez l'ID d'application par défaut pour les fichiers .sh:

duti -x sh

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

La dernière ligne est l'identifiant.

Utilisez cet identifiant d'application pour tous les fichiers .md:

duti -s io.brackets.appshell .md all
36
matt burns

Éditez ~/Library/Preferences/com.Apple.LaunchServices.plist.

Ajoutez une entrée sous LSHandlersname__, contenant l'UTI (clé LSHandlerContentTypename__, par exemple public.plain-text) et l'identificateur de l'ensemble d'applications (LSHandlerRoleAllname__, par exemple com.macromates.textmate).

Cela ressemble à ceci dans éditeur de liste de propriétés:

alt textalt text

Pour ce faire, utilisez la ligne defaultsou /usr/libexec/PlistBuddy à l’aide de la ligne de commande. Les deux ont de nombreuses pages de manuel.

Par exemple, pour ouvrir tous les fichiers .plist en utilisant Xcodename__:

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

Bien sûr, vous devez vous assurer qu'il n'y a pas déjà une autre entrée pour le UTI com.Apple.property-list déjà dedans.

Voici un script plus complet qui supprime les entrées existantes d’une UTI et en ajoute une nouvelle. Il ne peut gérer que LSHandlerContentTypeet définira toujours LSHandlerRoleAllname__. Cela mis à part, cela devrait fonctionner assez bien.

#!/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
17
Daniel Beck