Bagaimana cara mengubah aplikasi default untuk semua file jenis file tertentu melalui terminal di OS X?


32

Bagaimana saya bisa mengubah aplikasi default untuk semua file dari jenis file tertentu melalui Terminal di OS X?


Bukan penipuan, meskipun saya agak menjawabnya di sana. Maaf soal itu.
Daniel Beck

Untuk penggunaan daya, saya suka jawaban yang diterima di bawah pertanyaan Pengguna Super yang lebih baru, Apakah ada cara yang lebih cepat untuk mengubah aplikasi default yang terkait dengan jenis file pada OS X? . Untuk kesederhanaan, saya suka jawaban Daniel di bawah ini .
Graham Perrin

Jawaban:


39

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)"

Instal duti:

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 *.shdan saya ingin juga menggunakannya untuk *.mdfile, bukan xcode.

Dapatkan id aplikasi default untuk .shfile:

duti -x sh

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

Baris terakhir adalah id.

Gunakan id aplikasi ini untuk semua .mdfile:

duti -s io.brackets.appshell .md all

3
Akan mengungguli ini 50 kali jika saya bisa. Info bagus Bekerja seperti pesona bagi saya di El Capitan.
Ryan Walls

1
Bekerja di Sierra juga. Kiat tambahan: ISK menyakitkan, tetapi Anda dapat menggunakan "mdls -name kMDItemContentType <file>" untuk menemukan ISK untuk file yang diberikan (dan karenanya ekstensi).
Adrian

2
Jika Anda belum menghubungkan suatu aplikasi dengan sesuatu dengan cara ini tetapi mengetahui nama aplikasi Anda, Anda dapat melakukannya osascript -e 'id of app "$appName"'untuk mendapatkan id aplikasi apa pun yang terinstal di sistem Anda
GrayedFox

1
Hanya untuk referensi: menggabungkan tip dari @GrayedFox dengan duti:duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk

18

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 :

teks alternatif teks alternatif

Untuk melakukan ini dari baris perintah, gunakan defaultsatau /usr/libexec/PlistBuddy. Keduanya memiliki halaman buku yang luas.

Misalnya untuk membuka semua .plistfile 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-listsudah 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

3
Cara termudah adalah dengan x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xmenyalin dan menempelkan entri LSHandlers tersebut. Untuk mendapatkan pengidentifikasi bundel, Anda dapat melakukannya osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
Lri

@Lri Di satu sisi, ya, tapi pertanyaan ini secara khusus tentang baris perintah. Saya pikir TextEdit (atau Editor Daftar Properti / Xcode) tidak memenuhi syarat; Saya hanya menyalin bagian itu dengan Editor Daftar Properti dari jawaban saya yang lain untuk tujuan ilustrasi. Komentar yang berguna pada pengidentifikasi bundel.
Daniel Beck

Kredit untuk Daniel, saya meminjam dari ini untuk jawaban atas pertanyaan di Ask Different, Can Finder dan perintah "terbuka" memperlakukan file dengan .sh atau ekstensi khas lainnya seperti file .command? .
Graham Perrin

Jika memang ada entri alternatif untuk UTI, apakah Anda setuju bahwa "penghapusan baris perintah dari satu kamus dari array mungkin tidak perlu sulit"?
Graham Perrin

1
@ GrahamPerrin Ini tidak perlu sulit karena defaultstampaknya tidak mampu melakukannya, dan memerlukan beberapa PlistBuddypanggilan. Tetapi dimungkinkan untuk melakukannya dalam skrip shell yang dapat digunakan kembali.
Daniel Beck
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.