Làm cách nào để thay đổi ứng dụng mặc định cho tất cả các tệp thuộc loại tệp cụ thể thông qua thiết bị đầu cuối trong OS X?


32

Làm cách nào để thay đổi ứng dụng mặc định cho tất cả các tệp của một loại tệp cụ thể thông qua Terminal trong OS X?


Không phải là một bản dupe, mặc dù tôi đã trả lời nó ở đó. Xin lỗi vì điều đó.
Daniel Beck

Câu trả lời:


39

Tôi có một cách đơn giản hơn. Bạn sẽ muốn Homebrew nếu bạn chưa có nó:

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

Cài đặt duti:

brew install duti

Bây giờ bạn cần tìm id của ứng dụng bạn muốn sử dụng và gán nó cho tiện ích mở rộng bạn muốn sử dụng. Trong ví dụ này, tôi đã sử dụng Chân đế cho *.shvà tôi cũng muốn sử dụng nó cho *.mdcác tệp thay vì xcode.

Lấy id ứng dụng mặc định cho .shcác tệp:

duti -x sh

output:
  Brackets.app
  /opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
  io.brackets.appshell

Dòng cuối cùng là id.

Sử dụng id ứng dụng này cho tất cả .mdcác tệp:

duti -s io.brackets.appshell .md all

3
Sẽ upvote này 50 lần nếu tôi có thể. Thông tin tuyệt vời. Làm việc như một cơ duyên đối với tôi ở El Capitan.
Ryan Walls

1
Làm việc ở Sierra cũng vậy. Mẹo thêm: UTI là một nỗi đau, nhưng bạn có thể sử dụng "mdls -name kMDItemContentType <file>" để tìm UTI cho một tệp nhất định (và do đó là phần mở rộng).
Adrian

2
Nếu bạn chưa liên kết ứng dụng với thứ gì đó theo cách này nhưng biết tên ứng dụng của mình, bạn có thể làm osascript -e 'id of app "$appName"'để lấy id của bất kỳ ứng dụng nào được cài đặt trên hệ thống của bạn
GrayedFox

1
Chỉ để tham khảo: kết hợp mẹo từ @GrayedFox với duti:duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk 11/12/18

18

Chỉnh sửa ~/Library/Preferences/com.apple.LaunchServices.plist.

Thêm một mục bên dưới LSHandlers, chứa UTI (khóa LSHandlerContentType, ví dụ public.plain-text) và mã định danh gói ứng dụng ( LSHandlerRoleAllví dụ com.macromates.textmate).

Nó trông như thế này trong Trình soạn thảo danh sách tài sản :

văn bản thay thế văn bản thay thế

Để làm điều này từ dòng lệnh, sử dụng defaultshoặc /usr/libexec/PlistBuddy. Cả hai đều có nhiều trang.

Ví dụ: để mở tất cả .plistcác tệp bằng cách sử dụng Xcode:

defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'

Tất nhiên, bạn cần chắc chắn rằng chưa có mục nào khác cho UTI com.apple.property-listđã có trong đó.

Đây là một tập lệnh hoàn chỉnh hơn sẽ loại bỏ các mục hiện có cho UTI và thêm một mục mới. Nó chỉ có thể xử lý LSHandlerContentTypevà sẽ luôn được đặt LSHandlerRoleAllvà có ID gói được mã hóa cứng thay vì tham số. Ngoài ra, nó nên hoạt động khá tốt.

#!/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
Cách dễ nhất có lẽ là x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xsao chép và dán các mục LSHandlers đó. Để có được định danh gói bạn có thể làm osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
Lri

@Lri Theo một cách nào đó, có, nhưng câu hỏi này cụ thể là về dòng lệnh. Tôi hình dung rằng TextEdit (hoặc Trình soạn thảo danh sách tài sản / Xcode) không đủ điều kiện; Tôi chỉ sao chép phần đó với Trình soạn thảo danh sách tài sản từ câu trả lời khác của tôi cho mục đích minh họa. Nhận xét hữu ích về định danh bó.
Daniel Beck


Nếu có không tồn tại một mục thay thế cho các nhiễm trùng đường niệu, bạn sẽ đồng ý rằng "dòng lệnh loại bỏ một cuốn từ điển duy nhất từ một mảng có thể không cần thiết khó khăn"?
Graham Perrin

1
@GrahamPerrin Thật khó khăn không cần thiết bởi vì defaultsdường như không có khả năng thực hiện nó và nó đòi hỏi một vài PlistBuddycuộc gọi. Nhưng nó có thể làm điều đó trong một kịch bản shell có thể tái sử dụng.
Daniel Beck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.