Edite ~/Library/Preferences/com.apple.LaunchServices.plist
.
Adicione uma entrada em LSHandlers
, contendo a UTI (chave LSHandlerContentType
, por exemplo, public.plain-text
) e o identificador do pacote de aplicativos ( LSHandlerRoleAll
, por exemplo, com.macromates.textmate
).
Parece com isso no Editor da lista de propriedades :
Para fazer isso na linha de comando, use defaults
ou /usr/libexec/PlistBuddy
. Ambos têm manpages extensas.
Por exemplo, para abrir todos os arquivos .plist
usando Xcode
:
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'
É claro que você precisa ter certeza de que ainda não há outra entrada para o UTI com.apple.property-list
.
Este é um script mais completo que remove as entradas existentes de uma UTI e adiciona uma nova. Ele só pode manipular LSHandlerContentType
e sempre definirá LSHandlerRoleAll
, além de ter IDs de bundle codificados em vez de parâmetros. Fora isso, deve funcionar muito bem.
#!/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