Bagaimana saya bisa mengubah aplikasi default untuk semua file dari jenis file tertentu melalui Terminal di OS X?
Bagaimana saya bisa mengubah aplikasi default untuk semua file dari jenis file tertentu melalui Terminal di OS X?
Jawaban:
Saya punya cara yang lebih sederhana. Anda akan menginginkan Homebrew jika Anda belum memilikinya:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install duti
Sekarang Anda perlu menemukan id aplikasi yang ingin Anda gunakan, dan menetapkannya untuk ekstensi yang ingin Anda gunakan. Dalam contoh ini, saya sudah menggunakan tanda kurung untuk *.sh
dan saya ingin juga menggunakannya untuk *.md
file, bukan xcode.
.sh
file:duti -x sh
output:
Brackets.app
/opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
io.brackets.appshell
Baris terakhir adalah id.
.md
file:duti -s io.brackets.appshell .md all
osascript -e 'id of app "$appName"'
untuk mendapatkan id aplikasi apa pun yang terinstal di sistem Anda
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Edit ~/Library/Preferences/com.apple.LaunchServices.plist
.
Tambahkan entri di bawah LSHandlers
, yang berisi UTI (kunci LSHandlerContentType
, mis. public.plain-text
) Dan pengidentifikasi bundel aplikasi ( LSHandlerRoleAll
, mis com.macromates.textmate
.).
Ini terlihat seperti ini di Editor Daftar Properti :
Untuk melakukan ini dari baris perintah, gunakan defaults
atau /usr/libexec/PlistBuddy
. Keduanya memiliki halaman buku yang luas.
Misalnya untuk membuka semua .plist
file menggunakan Xcode
:
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'
Tentu saja, Anda harus memastikan tidak ada entri lain untuk UTI yang com.apple.property-list
sudah ada di sana.
Berikut ini skrip yang lebih lengkap yang akan menghapus entri yang ada untuk ISK dan menambahkan yang baru. Ia hanya dapat menangani LSHandlerContentType
, dan akan selalu disetel LSHandlerRoleAll
, dan memiliki ID bundel hard-coded alih-alih parameter. Selain itu, itu harus bekerja dengan baik.
#!/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
menyalin dan menempelkan entri LSHandlers tersebut. Untuk mendapatkan pengidentifikasi bundel, Anda dapat melakukannya osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'
.
defaults
tampaknya tidak mampu melakukannya, dan memerlukan beberapa PlistBuddy
panggilan. Tetapi dimungkinkan untuk melakukannya dalam skrip shell yang dapat digunakan kembali.