Comment modifier l'application par défaut pour tous les fichiers d'un type particulier via le Terminal dans OS X ?
Réponses
Trop de publicités?J'ai une solution plus simple. Vous devez Homebrew si vous ne l'avez pas encore :
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Installer le duti :
brew install duti
Vous devez maintenant 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 aussi l'utiliser pour *.md
au lieu de xcode.
Obtenir l'identifiant de l'application par défaut pour .sh
des dossiers :
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.
Utiliser cette application pour tous .md
des dossiers :
duti -s io.brackets.appshell .md all
Editer ~/Library/Preferences/com.apple.LaunchServices.plist
.
Ajouter une entrée sous LSHandlers
contenant l'infection urinaire (clé LSHandlerContentType
, par exemple public.plain-text
) et l'identifiant du paquet d'applications ( LSHandlerRoleAll
, par exemple com.macromates.textmate
).
Il se présente comme suit Éditeur de liste de propriétés :
Pour ce faire à partir de la ligne de commande, utilisez defaults
o /usr/libexec/PlistBuddy
. Les deux ont des pages de manuel détaillées.
Par exemple, pour ouvrir tous les .plist
à l'aide de Xcode
:
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'
Bien entendu, il faut s'assurer qu'il n'existe pas déjà une autre entrée pour l'infection urinaire. com.apple.property-list
déjà à l'intérieur.
Voici un script plus complet qui supprimera les entrées existantes pour un UTI et en ajoutera une nouvelle. Il ne peut gérer que les LSHandlerContentType
et fixera toujours LSHandlerRoleAll
et a codé en dur les identifiants des paquets au lieu des paramètres. Pour le reste, 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