ฉันจะเปลี่ยนแอพเริ่มต้นสำหรับไฟล์ทั้งหมดของไฟล์บางประเภทผ่านเทอร์มินัลใน OS X ได้อย่างไร
ฉันจะเปลี่ยนแอพเริ่มต้นสำหรับไฟล์ทั้งหมดของไฟล์บางประเภทผ่านเทอร์มินัลใน OS X ได้อย่างไร
คำตอบ:
ฉันมีวิธีที่ง่ายกว่า คุณจะต้องการ Homebrew หากคุณยังไม่มี:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install duti
ตอนนี้คุณต้องค้นหารหัสของแอพที่คุณต้องการใช้และกำหนดให้กับส่วนขยายที่คุณต้องการใช้ ในตัวอย่างนี้ฉันได้ใช้ตัวยึดสำหรับ *.sh
และฉันต้องการใช้เพื่อ *.md
ไฟล์แทน xcode
.sh
ไฟล์: duti -x sh
output:
Brackets.app
/opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
io.brackets.appshell
บรรทัดสุดท้ายคือ id
.md
ไฟล์: duti -s io.brackets.appshell .md all
osascript -e 'id of app "$appName"'
เพื่อรับรหัสของแอพใด ๆ ที่ติดตั้งในระบบของคุณ
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
แก้ไข ~/Library/Preferences/com.apple.LaunchServices.plist
.
เพิ่มรายการภายใต้ LSHandlers
ที่มี UTI (คีย์ LSHandlerContentType
, เช่น. public.plain-text
) และตัวระบุกลุ่มแอปพลิเคชัน ( LSHandlerRoleAll
, เช่น. com.macromates.textmate
)
ดูเหมือนว่านี้ค่ะ ตัวแก้ไขรายการคุณสมบัติ :
เมื่อต้องการทำสิ่งนี้จากบรรทัดคำสั่งให้ใช้ defaults
หรือ /usr/libexec/PlistBuddy
. ทั้งสองมี manpages ที่กว้างขวาง
ตัวอย่างเช่นการเปิดทั้งหมด .plist
ไฟล์ที่ใช้ Xcode
:
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'
แน่นอนคุณต้องตรวจสอบให้แน่ใจว่ายังไม่มีรายการอื่นสำหรับ UTI com.apple.property-list
แล้วในนั้น
นี่คือสคริปต์ที่สมบูรณ์ยิ่งขึ้นที่จะลบรายการที่มีอยู่สำหรับ UTI และเพิ่มรายการใหม่ มันสามารถจัดการได้ LSHandlerContentType
และจะตั้งค่าเสมอ LSHandlerRoleAll
และมีรหัสบันเดิลแบบ Hard-coded แทนพารามิเตอร์ นอกจากนั้นควรใช้งานได้ดี
#!/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
และคัดลอกและวางรายการ LSHandlers เหล่านั้น ในการรับตัวระบุกลุ่มที่คุณสามารถทำได้ osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'
.
defaults
ดูเหมือนจะไม่สามารถทำได้และต้องการเพียงเล็กน้อย PlistBuddy
โทร แต่มันเป็นไปได้ที่จะทำมันในเชลล์สคริปต์ที่ใช้ซ้ำได้