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?
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?
Réponses:
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)"
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.
.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.
.mdfichiers:duti -s io.brackets.appshell .md all
osascript -e 'id of app "$appName"'pour obtenir l'ID de n'importe quelle application installée sur votre système
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
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 :

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
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"))'.
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.