Come modificare l'app predefinita per tutti i file di un determinato tipo di file tramite il terminale in OS X?


32

Come posso modificare l'app predefinita per tutti i file di un determinato tipo di file tramite il Terminale in OS X?


Non è un imbecille, anche se in qualche modo ho risposto lì. Mi dispiace per quello.
Daniel Beck

Per quanto riguarda il consumo energetico, mi piace la risposta accettata in una domanda Super User più recente, Esiste un modo più rapido per modificare le app predefinite associate ai tipi di file su OS X? . Per semplicità, mi piace la risposta di Daniel qui sotto .
Graham Perrin,

Risposte:


39

Ho un modo più semplice. Ti consigliamo Homebrew se non l'hai già:

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

Installa duti:

brew install duti

Ora devi trovare l'ID dell'app che desideri utilizzare e assegnarla all'estensione per cui desideri utilizzarla. In questo esempio, uso già le parentesi per *.she voglio usarlo anche per i *.mdfile anziché per xcode.

Ottieni l'ID app predefinito per i .shfile:

duti -x sh

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

L'ultima riga è l'id.

Usa questo ID app per tutti i .mdfile:

duti -s io.brackets.appshell .md all

3
Voterei questo 50 volte se potessi. Informazioni fantastiche. Ha funzionato come un incanto per me a El Capitan.
Ryan Walls,

1
Funziona anche in Sierra. Suggerimento extra: le UTI sono una seccatura, ma puoi usare "mdls -name kMDItemContentType <file>" per trovare la UTI per un determinato file (e quindi l'estensione).
Adrian,

2
Se non hai già associato un'app a qualcosa in questo modo ma conosci il nome della tua app, puoi fare osascript -e 'id of app "$appName"'per ottenere l'id di qualsiasi app installata sul tuo sistema
GrayedFox

1
Solo per riferimento: combinando la punta di @GrayedFox con duti:duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk,

18

Modifica ~/Library/Preferences/com.apple.LaunchServices.plist.

Aggiungi una voce sotto LSHandlers, contenente l'UDI (chiave LSHandlerContentType, ad es. public.plain-text) E l'identificatore del bundle dell'applicazione ( LSHandlerRoleAll, ad es com.macromates.textmate.).

È simile a questo nell'editor dell'elenco proprietà :

testo alternativo testo alternativo

Per fare ciò dalla riga di comando, utilizzare defaultso /usr/libexec/PlistBuddy. Entrambi hanno ampie manpage.

Ad esempio per aprire tutti i .plistfile usando Xcode:

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

Ovviamente, dovresti assicurarti che non ci sia già un'altra voce per l'UTI com.apple.property-listgià presente.

Ecco uno script più completo che rimuoverà le voci esistenti per una UTI e ne aggiungerà una nuova. Può solo gestire LSHandlerContentType, sarà sempre impostato LSHandlerRoleAlle ha ID bundle codificati anziché parametri. A parte questo, dovrebbe funzionare abbastanza bene.

#!/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
Il modo più semplice è probabilmente x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xcopiare e incollare le voci LSHandlers. Per ottenere l'identificatore del bundle puoi farlo osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
Lri,

@Lri In un certo senso, sì, ma questa domanda riguarda specificamente la riga di comando. Ho pensato che TextEdit (o Editor elenco proprietà / Xcode) non fosse idoneo; Ho appena copiato quella parte con l'Editor elenco proprietà dall'altra mia risposta a scopo illustrativo. Nota utile sull'identificatore del bundle.
Daniel Beck

Ringraziando Daniel, ho preso in prestito da questo per una risposta a una domanda in Ask Different, Can Finder e il comando "open" trattano i file con .sh o altre estensioni tipiche proprio come i file .command? .
Graham Perrin,

Se non ci si fa esiste una voce alternativa per l'UTI, sei d'accordo che "la rimozione della riga di comando di un singolo dizionario da un array può essere inutilmente difficile"?
Graham Perrin,

1
@GrahamPerrin È inutilmente difficile perché defaultsnon sembra essere in grado di farlo, e richiede alcune PlistBuddychiamate. Ma è possibile farlo in uno script di shell riutilizzabile.
Daniel Beck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.