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 *.sh
ve ayrıca *.md
xcode yerine dosyalar için de kullanmak istiyorum .
.sh
Dosyalar 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.
.md
dosyalar 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 LSHandlers
idrar 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 defaults
veya tuşunu kullanın./usr/libexec/PlistBuddy
. Her ikisinde de geniş man sayfaları var.
Örneğin, tüm .plist
dosyaları 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 LSHandlerContentType
ve her zaman ayarlayacaktır LSHandlerRoleAll
ve 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 $x
bu 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"))'
.
defaults
bunu 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.