Programmaticamente / Script-atically modificando l'impostazione Open-With predefinita


8

C'è un modo per cambiare quale app apre un tipo di file a livello di codice / con uno script?

Fondamentalmente, a volte sto lavorando su un sito Web e voglio impostare l'apertura di tutti i file Web con un editor di testo (* .php, * .html, * .htm, ecc ...).

Tuttavia, altre volte, voglio solo visualizzare i file, quindi voglio che si aprano con un browser.

In questo momento, sto trascinando gli elementi sulle icone del dock, che funziona, ma è lento, in particolare quando sto attraversando un gran numero di file solo con la tastiera.

Fondamentalmente, quello che voglio è un piccolo apice / qualunque cosa che cambi tutte le impostazioni open-with.
In questo modo, posso avere uno script per ogni programma open-with e cambiare avanti e indietro.

Grazie.

Risposte:


10

Questo è fattibile, ma probabilmente non è così semplice come potresti pensare. Dovrai acquisire familiarità con gli identificatori di tipo uniforme. Guarda la pagina Identificatore di tipo uniforme di Wikipedia .

OS X memorizza le informazioni sulle associazioni di file preferite in un file di preferenze con il nome com.apple.LaunchServices.plist. Prima di provare a trovare e modificare quel file, ti suggerisco di familiarizzare con la gerarchia di domini di OS X per impostazione predefinita (ovvero "impostazioni"). Un articolo decente su questo può essere trovato qui . (Dichiarazione di non responsabilità: sembrano vendere qualcosa su quel sito. Non so cosa sia e non ho alcuna associazione con loro, la spiegazione è solo buona.)

Ora che sai tutto sui valori predefiniti e UTI (er, non di tipo medico), ora possiamo parlare di impostare le associazioni di file da una riga di script / comando.

Innanzitutto, devi conoscere il modo corretto di identificare i file per i quali desideri creare un'associazione.

Ricordi come ho detto che le IVU erano importanti? Esistono diversi modi per identificare un file. Dipende se il tipo è stato formalmente dichiarato sul tuo sistema o meno. Ad esempio, editor di testo decenti come TextMate o TextWrangler aggiungeranno alcune dichiarazioni di tipo alla gerarchia dei tipi quando le si utilizza sul proprio sistema. Se, tuttavia, non si dispone di tali applicazioni, è possibile che tali tipi non vengano dichiarati.

OK, basta parlare. Esempi:

Ottieni UTI per un file:

$ mdls myFile.xml
...
kMDItemContentType             = "public.xml"
kMDItemContentTypeTree         = (
    "public.xml",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
...

Ok bello. Un tipo di contenuto esplicito che possiamo usare. Scrivilo da qualche parte.

$ mdls myFile.myExtn
...
kMDItemContentType             = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree         = (
    "public.data",
    "public.item"
)
...

Ops. OS X non conosce i file ".myExtn". Quindi, ha creato un UTI dinamico che non possiamo usare per nulla. E i tipi principali sono troppo generici per essere utili.

Ora che sappiamo quali sono i nostri file, diamo un'occhiata al file LaunchServices.plist e vediamo cosa possiamo fare:

$defaults read com.apple.LaunchServices
{
    ...
    LSHandlers =     (
                {
            LSHandlerContentType = "public.html";
            LSHandlerRoleAll = "com.apple.safari";
            LSHandlerRoleViewer = "com.google.chrome";
        },
    ...
                {
            LSHandlerContentTag = myExtn;
            LSHandlerContentTagClass = "public.filename-extension";
            LSHandlerRoleAll = "com.macromates.textmate";
        },
    ...
    );
    ...
}

Quindi, quando hai un tipo di contenuto "buono" da usare, il primo costrutto è migliore. Altrimenti l'altro costrutto. Nota, ci sono altri costrutti in quel file, ma non sono rilevanti per quello che hai chiesto. Basta sapere che sono lì quando guardi attraverso l'output.

Come puoi vedere, dovrai trovare l'UTI per l'applicazione che desideri utilizzare. Le UTI per Safar e TextMate sono nel mio esempio sopra, ma per trovare genericamente la UTI per un'applicazione:

$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
        <key>CFBundleIdentifier</key>
        <string>com.apple.Safari</string>
...

NOTA: Non ho alcuna idea di ciò che costituisce la differenza tra LSHandlerRoleAll e LSHandlerRoleViewer. Non riesco a trovare documentazione su questo da nessuna parte. Quello che faccio vedere è che il 99% del tempo LSHandlerRoleAll è l'unico set (vale a dire non v'è alcun LSHandlerRoleViewer a tutti) e che sia impostato sul UTI per l'applicazione che si desidera associare il tipo con.

Dopo averti portato così lontano, ho intenzione di lasciare HOW per impostare i valori desiderati come esercizio per il lettore. Fare confusione con queste cose può essere alquanto pericoloso. È del tutto possibile rovinare un file e non far funzionare NESSUNA delle tue associazioni di file. Quindi devi eliminare il file e ricominciare.

Alcuni suggerimenti:

  • Continua a leggere defaults writee la sua sintassi
  • Dai un'occhiata PlistBuddy. man PlistBuddye/usr/libexec/PlistBuddy -h
  • Salta tutte queste sciocchezze del tutto e usa RCDefaultApp

RCDefault è programmabile tramite script? Ho guardato il loro sito e non sembra.
Nome falso

Non importa, ho dichiarazioni di tipo per tutti i tipi di file che mi interessano.
Nome falso

Ottima scrittura. Per quanto LSHandlerRoleViewermi riguarda , mi chiedo se potrebbe essere correlato all'essere il valore predefinito per la visualizzazione anziché per la modifica ( apple.stackexchange.com/a/49998/206073 mi ha messo su quelle righe). Non so però in quali contesti si possa determinare se si sta aprendo per la visualizzazione o la modifica, tuttavia ... (fuori tema, CFBundleTypeRolesembra che accetti valori simili)
Brett Zamir

Inoltre, sembra che com.apple.LaunchServices/com.apple.launchservices.securepotrebbe essere il dominio nei sistemi MacOS successivi ...
Brett Zamir,

2

Un'opzione è modificare ~/Library/Preferences/.GlobalPreferences.plist:

defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'

È possibile utilizzare PlistBuddy per verificare se le voci esistono già , ma non ho trovato alcun modo per applicare le modifiche senza riavviare o ricostruire il database di Servizi di avvio.

Utilizzando duti , è possibile eseguire duti ~/.dutidopo averlo salvato come ~/.duti:

net.sourceforge.skim-app.skim .pdf all

1

In realtà non risponde alla tua domanda, ma potrebbe essere una soluzione.

L' ispettore nel Finder presenta le informazioni per il selezionato file o file:

+ +I

La finestra Informazioni di riepilogo di Finder è utile quando sono selezionati più file :

^+ +I

Se selezioni più file dello stesso tipo, entrambi i metodi sopra ti permetteranno di cambiare facilmente la proprietà Apri con: per quei file.


0

Non una risposta alla tua domanda esatta, ma un'altra possibile soluzione. È possibile aprire un documento con un'applicazione specifica dalla riga di comando con l'argomento -a da aprire.

Ad esempio, apri tutti i file html nella directory corrente.

> open -a 'Google Chrome' *.html

Apri index.html e i file del controller javascript nell'editor di testo Atom:

> open -a 'atom' index.html js/controllers/*.js

A seconda delle esigenze, è possibile modificarlo in un servizio Automator a cui potrebbe essere assegnato un tasto di scelta rapida, prendendo come argomento i percorsi dei file selezionati.

Ecco un esempio di Automator AppleScript che riceve i file come input e apre i file selezionati in Chrome:

on run {input, parameters}
set openFiles to "open -a 'Google Chrome' " --note the trailing space
set filePaths to {}

--covert the filePaths to posix style
repeat with i from 1 to count of input
    set aFile to input's item i as alias
    set aFile to quoted form of POSIX path of aFile
    set filePaths's end to aFile
end repeat

--convert filePaths list to a string delimited by spaces
set tid to text item delimiters
set text item delimiters to " "
set filePaths to filePaths as text
set text item delimiters to tid

--Open files via commandline
do shell script openFiles & filePaths
return input

fine corsa

Ovviamente, è possibile modificare l'editor di testo "Sublime" del nome dell'app, salvarlo come un altro servizio e assegnare entrambi i tasti di scelta rapida.

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.