Programmaticamente / Scripticamente modificando l'impostazione predefinita Open-With

8

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

In sostanza, a volte sto lavorando su un sito web e voglio impostare tutti i file web da aprire 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 oggetti sulle icone del dock, il che funziona, ma è lento, soprattutto quando sto attraversando un gran numero di file con la sola tastiera.

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

Grazie.

    
posta Fake Name 09.03.2011 - 16:59
fonte

4 risposte

10

Questo è fattibile, ma probabilmente non è così semplice come si potrebbe pensare. Avrai bisogno di familiarizzare con gli identificatori di tipo uniforme. Guarda la Identificatore di tipo uniforme di Wikipedia

.

OS X memorizza le informazioni sulle associazioni di file preferite in un file delle preferenze con il nome com.apple.LaunchServices.plist . Prima di andare cerca di trovare e modificare quel file, ti suggerisco di familiarizzare con la gerarchia dei domini di OS X per i default (a.k.a. "settings"). Un articolo decente su questo può essere trovato qui . (Disclaimer: sembra che stiano vendendo qualcosa su quel sito, non so cosa sia e non abbiano alcuna associazione con loro, la spiegazione è giusta).

Ora che sai tutto su default e UTI (ehm, non sul tipo medico), ora possiamo parlare di impostare le associazioni di file da uno script / riga di comando.

In primo luogo, è necessario conoscere il modo corretto per identificare i file per i quali si desidera creare un'associazione.

Ricordi come ho detto che le UTI erano importanti? Esistono diversi modi per identificare un file. Dipende se il tipo è stato dichiarato formalmente 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 li si utilizza sul proprio sistema. Se, tuttavia, non hai queste applicazioni, potresti non aver dichiarato quei tipi.

OK, basta parlare. Esempi:

Ottieni l'UTI per un file:

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

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

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

Spiacenti. 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, vediamo il 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 si utilizza un tipo di contenuto "buono", 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 si guarda 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 l'UTI per un'applicazione:

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

NOTA: ho un'idea no che cosa costituisce la differenza tra LSHandlerRoleAll e LSHandlerRoleViewer. Non riesco a trovare documentazione su questo ovunque. Quello che io do vedere è che il 99% delle volte LSHandlerRoleAll è l'unico set (cioè non c'è affatto LSHandlerRoleViewer) e che è impostato sull'UTI per l'applicazione che si desidera associare digita con.

Dopo averti portato così lontano, lascerò COME impostare i valori che desideri come esercizio per il lettore. Pasticciare con queste cose può essere un po 'pericoloso. È completamente possibile rovinare un file e non avere QUALUNQUE delle tue associazioni di file funzionino. Quindi devi buttare via il file e ricominciare da capo.

Alcuni suggerimenti:

  • Leggi su defaults write e la sua sintassi
  • Dai un'occhiata a PlistBuddy . man PlistBuddy e /usr/libexec/PlistBuddy -h
  • Salta tutte queste assurdità del tutto e usa RCDefaultApp
risposta data 09.03.2011 - 20:28
fonte
1

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

Il Inspector nel Finder presenta le informazioni per il file attualmente selezionato o per i file:

+ + I

La finestra di informazioni riepilogative del Finder è utile quando più file sono selezionati:

^ + + I

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

    
risposta data 09.03.2011 - 17:11
fonte
1

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;}'

Puoi usa 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 Launch Services.

Usando duti , potresti eseguire duti ~/.duti dopo averlo salvato come ~/.duti :

net.sourceforge.skim-app.skim .pdf all
    
risposta data 10.03.2011 - 15:55
fonte
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 per 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 come servizio Automator a cui è possibile assegnare un tasto di scelta rapida, includendo i percorsi di file selezionati come argomento.

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" dell'app, salvarlo come un altro servizio e assegnargli entrambi i tasti di scelta rapida.

    
risposta data 24.04.2017 - 19:25
fonte

Leggi altre domande sui tag