วิธีการเปลี่ยนแอพเริ่มต้นสำหรับไฟล์ทั้งหมดของไฟล์บางประเภทผ่านเทอร์มินัลใน OS X


30

ฉันจะเปลี่ยนแอพเริ่มต้นสำหรับไฟล์ทั้งหมดของไฟล์บางประเภทผ่านเทอร์มินัลใน OS X ได้อย่างไร


ไม่ใช่ผู้ล่อลวง แม้ว่าฉันจะตอบที่นั่น ขอโทษด้วยกับเรื่องนั้น.
Daniel Beck

สำหรับการใช้พลังงานฉันชอบ คำตอบที่ยอมรับ ภายใต้คำถามผู้ใช้ขั้นสูงเพิ่มเติม มีวิธีที่เร็วกว่าในการเปลี่ยนแอปเริ่มต้นที่เชื่อมโยงกับประเภทไฟล์ใน OS X หรือไม่ . เพื่อความเรียบง่ายฉันชอบ คำตอบของ Daniel ด้านล่าง .
Graham Perrin

คำตอบ:


34

ฉันมีวิธีที่ง่ายกว่า คุณจะต้องการ Homebrew หากคุณยังไม่มี:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

ติดตั้ง duti:

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

2
จะโหวต 50 ครั้งนี้ถ้าทำได้ ข้อมูลที่ดี ทำงานเหมือนเสน่ห์สำหรับฉันใน El Capitan
Ryan Walls

ทำงานในเซียร่าด้วย เคล็ดลับพิเศษ: UTIs เป็นความเจ็บปวด แต่คุณสามารถใช้ "mdls -name kMDItemContentType & lt; file & gt;" เพื่อค้นหา UTI สำหรับไฟล์ที่กำหนด (และดังนั้นจึงเป็นส่วนขยาย)
Adrian

1
หากคุณยังไม่ได้เชื่อมโยงแอพด้วยวิธีนี้ แต่รู้ชื่อแอพของคุณคุณสามารถทำได้ osascript -e 'id of app "$appName"' เพื่อรับรหัสของแอพใด ๆ ที่ติดตั้งในระบบของคุณ
GrayedFox

สำหรับการอ้างอิง: การรวมเคล็ดลับจาก @GrayedFox กับ duti: duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk

17

แก้ไข ~/Library/Preferences/com.apple.LaunchServices.plist.

เพิ่มรายการภายใต้ LSHandlersที่มี UTI (คีย์ LSHandlerContentType, เช่น. public.plain-text ) และตัวระบุกลุ่มแอปพลิเคชัน ( LSHandlerRoleAll, เช่น. com.macromates.textmate )

ดูเหมือนว่านี้ค่ะ ตัวแก้ไขรายการคุณสมบัติ :

alt text alt text

เมื่อต้องการทำสิ่งนี้จากบรรทัดคำสั่งให้ใช้ 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

3
วิธีที่ง่ายที่สุดน่าจะเป็น 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"))'.
Lri

@Lri ในทางใช่ แต่คำถามนี้เฉพาะเกี่ยวกับบรรทัดคำสั่ง ฉันคิดว่า TextEdit (หรือตัวแก้ไขรายการคุณสมบัติ / Xcode) ไม่ผ่านการรับรอง ฉันเพิ่งคัดลอกส่วนนั้นด้วยตัวแก้ไขรายการคุณสมบัติจากคำตอบอื่น ๆ ของฉันสำหรับวัตถุประสงค์ภาพประกอบ หมายเหตุที่เป็นประโยชน์เกี่ยวกับตัวระบุบันเดิล
Daniel Beck


หากมี ทำ มีรายการทางเลือกสำหรับ UTI คุณจะเห็นด้วยหรือไม่ว่า "การลบบรรทัดคำสั่งของพจนานุกรมเดียวจากอาเรย์อาจจะยากเกินความจำเป็น"
Graham Perrin

1
@ GrahamPerrin มันคือ เกินความจำเป็น ยากเพราะ defaults ดูเหมือนจะไม่สามารถทำได้และต้องการเพียงเล็กน้อย PlistBuddy โทร แต่มันเป็นไปได้ที่จะทำมันในเชลล์สคริปต์ที่ใช้ซ้ำได้
Daniel Beck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.