Belirli bir dosya türündeki tüm dosyalar için varsayılan uygulamayı OS X'deki Terminal aracılığıyla nasıl değiştirebilirim?
Belirli bir dosya türündeki tüm dosyalar için varsayılan uygulamayı OS X'deki Terminal aracılığıyla nasıl değiştirebilirim?
Yanıtlar:
Daha basit bir yolum var. Zaten sahip değilseniz, Homebrew'i isteyeceksiniz :
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install duti
Şimdi kullanmak istediğiniz uygulamanın kimliğini bulmanız ve onu kullanmak istediğiniz uzantıya atamanız gerekir. Bu örnekte, Parantez için zaten kullanıyorum *.shve ayrıca *.mdxcode yerine dosyalar için de kullanmak istiyorum .
.shDosyalar için varsayılan uygulama kimliğini alın :duti -x sh
output:
Brackets.app
/opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
io.brackets.appshell
Son satır kimliğidir.
.mddosyalar için bu uygulama kimliğini kullanın :duti -s io.brackets.appshell .md all
osascript -e 'id of app "$appName"'sisteminizde yüklü herhangi bir uygulamanın kimliğini almak için yapabilirsiniz
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Düzen ~/Library/Preferences/com.apple.LaunchServices.plist.
Bir giriş altında ekleyin LSHandlersidrar yolu enfeksiyonu (anahtarını içeren, LSHandlerContentTypeörneğin public.plain-text() ve uygulama paket tanımlayıcı LSHandlerRoleAll, örneğincom.macromates.textmate ) .
Özellik Listesi Düzenleyicisi'nde şöyle görünür :

Bunu komut satırından yapmak için defaultsveya tuşunu kullanın./usr/libexec/PlistBuddy . Her ikisinde de geniş man sayfaları var.
Örneğin, tüm .plistdosyaları kullanarak Xcodeşunları açmak için :
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'
Tabii ki, UTI için zaten başka bir giriş olmadığından emin olmanız gerekir. com.apple.property-list zaten orada .
İşte bir UTI için mevcut girişleri kaldıracak ve yeni bir tane ekleyecek daha eksiksiz bir script. Yalnızca işleyebilir LSHandlerContentTypeve her zaman ayarlayacaktır LSHandlerRoleAllve parametreler yerine kodlanmış paket kimlikleri vardır. Bunun dışında oldukça iyi çalışması gerekir.
#!/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 $xbu LSHandlers girişlerini kopyalayıp yapıştırmaktır. Paket tanımlayıcısını almak için yapabilirsiniz osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
defaultsbunu yapabilecek kapasitede görünmüyor ve birkaç PlistBuddyçağrı gerektiriyor . Ancak tekrar kullanılabilir bir kabuk betiğinde bunu yapmak mümkündür.