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


32

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


Pas dupe, même si j'y ai répondu. Désolé pour ça.
— Daniel Beck

Pour la consommation d'énergie, j'aime la réponse acceptée sous une question plus récente de super utilisateur, existe-t-il un moyen plus rapide de modifier les applications par défaut associées aux types de fichiers sur OS X? . Pour plus de simplicité, j'aime la réponse de Daniel ci-dessous .
— Graham Perrin

Réponses:


39

J'ai une manière 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

Vous devez maintenant trouver l'ID de l'application que vous souhaitez utiliser et l'attribuer à l'extension pour laquelle vous souhaitez l'utiliser. Dans cet exemple, j'utilise déjà des supports pour *.shet je veux également l'utiliser pour des *.mdfichiers au lieu de xcode.

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

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 .mdfichiers:

duti -s io.brackets.appshell .md all

3
Je voterais 50 fois si je le pouvais. Grande info. A fonctionné comme un charme pour moi à El Capitan.
— Ryan Walls

1
Travailler à Sierra aussi. Astuce supplémentaire: les UTI sont un problème, mais vous pouvez utiliser "mdls -name kMDItemContentType <file>" pour trouver l'UTI pour un fichier donné (et donc une extension).
— Adrian

2
Si vous n'avez pas déjà associé une application à quelque chose de cette façon mais que vous connaissez le nom de votre application, vous pouvez faire osascript -e 'id of app "$appName"'pour obtenir l'ID de n'importe quelle application installée sur votre système
— GrayedFox

1
Juste pour la référence: combiner la pointe de @GrayedFox avec duti:duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
— Strajk

18

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

Ajoutez une entrée sous LSHandlers, contenant l'UTI (clé LSHandlerContentType, par exemple public.plain-text) et l'identifiant du bundle d'application ( LSHandlerRoleAll, par exemple com.macromates.textmate).

Il ressemble à ceci dans l' éditeur de liste de propriétés :

texte alternatif texte alternatif

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

Par exemple pour ouvrir tous les .plistfichiers en utilisant Xcode:

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 l'UTI com.apple.property-listlà-dedans.

Voici un script plus complet qui supprimera les entrées existantes pour une UTI et en ajoutera une nouvelle. Il ne peut gérer LSHandlerContentTypeet sera toujours défini LSHandlerRoleAll, et a des ID de paquet codés en dur au lieu de paramètres. En dehors de cela, 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

3
Le moyen le plus simple consiste probablement à x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xcopier et coller ces entrées LSHandlers. Pour obtenir l'identifiant du bundle, vous pouvez le faire osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
— Lri

@Lri D'une certaine manière, oui, mais cette question concerne spécifiquement la ligne de commande. J'ai pensé que TextEdit (ou l'éditeur de liste de propriétés / Xcode) ne se qualifie pas; Je viens de copier cette partie avec l'éditeur de liste de propriétés de mon autre réponse à des fins d'illustration. Remarque utile sur l'identifiant du bundle.
— Daniel Beck


S'il n'existe une autre entrée pour l'infection urinaire, seriez - vous d' accord que « la suppression de la ligne de commande d'un dictionnaire unique d'un tableau peut être inutilement difficile »?
— Graham Perrin

1
@GrahamPerrin C'est inutilement difficile car defaultsne semble pas être capable de le faire, et cela nécessite quelques PlistBuddyappels. Mais il est possible de le faire dans un script shell réutilisable.
— Daniel Beck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.