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?
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)"
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.
.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.
.md
:duti -s io.brackets.appshell .md all
Éditez ~/Library/Preferences/com.Apple.LaunchServices.plist
.
Ajoutez une entrée sous LSHandlers
name__, contenant l'UTI (clé LSHandlerContentType
name__, par exemple public.plain-text
) et l'identificateur de l'ensemble d'applications (LSHandlerRoleAll
name__, par exemple com.macromates.textmate
).
Cela ressemble à ceci dans éditeur de liste de propriétés:
Pour ce faire, utilisez la ligne defaults
ou /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 Xcode
name__:
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 LSHandlerContentType
et définira toujours LSHandlerRoleAll
name__. 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