Imposta scorciatoia da tastiera Servizi tramite script OSX

4

Ho bisogno di un modo per impostare quanto segue a livello di codice:

SpecificamenteperlescorciatoieinServizi,sequestofaladifferenza.MichiedosequestoèpossibiletramiteshelloAppleScript?

EDIT:

Hovisto link ma io sono ancora non chiaro su come impostare una scorciatoia per un servizio esistente.

    
posta Chris Knadler 29.12.2013 - 21:55
fonte

5 risposte

5

@chrisKnadler ha fatto un buon punto di utilizzo di Applescript per farlo.

L'ho usato in passato, ma lo ho scontato a causa del nuovo problema di Mavericks che preferiva essere inserito nella cache del sistema.

Il che significa che puoi usare solo il comando unix

defaults write...

per ottenere che i risultati cambino effettivamente invece di modificarli manualmente o utilizzare i comandi plist item di Applescript.

Ma solo ora dare un'occhiata in giro ha trovato un suggerimento che puoi semplicemente svuotare la cache e avviare un sistema per leggere nuovamente la preferenza semplicemente chiamando un

defaults read ...

sul file plist che hai cambiato. Sembra davvero funzionare.

  set theServiceName to "(null) - Print to PDF - runWorkflowAsService"
set libPrefPath to POSIX path of (path to preferences folder from user domain as text)
set PlistFile to "pbs.plist"
set PlistPath to libPrefPath & PlistFile as text
set mainPropertyItem to "NSServicesStatus"
set theKey to "key_equivalent"

tell application "System Events"

    set gp to (get property list item theServiceName of property list item mainPropertyItem of property list file PlistPath)

    tell gp
        --set value of property list item "enabled_services_menu" to true
        --set value of property list item "enabled_context_menu" to true
        set value of property list item theKey to "@^h"

    end tell

end tell

do shell script " defaults read " & quoted form of PlistPath & > /dev/null

Potresti avere bisogno di app piuttosto singole per mostrare la modifica (come è normale)

UPDATE: Piccolo cambiamento.

Aggiunto > /dev/null alla fine del comando defaults in modo che vengano restituiti solo gli errori.

    
risposta data 02.01.2014 - 15:16
fonte
4

Puoi anche utilizzare PlistBuddy e defaults :

/usr/libexec/PlistBuddy -c 'Delete NSServicesStatus:"(null) - test2 - runWorkflowAsService"' ~/Library/Preferences/pbs.plist 2>/dev/null;defaults write pbs NSServicesStatus -dict-add '"(null) - test2 - runWorkflowAsService"' '{key_equivalent = "^~@2";}'

Il comando PlistBuddy non è necessario se non esiste una voce esistente per il servizio. Sostituisci test2 con il nome del servizio. Chiudi e riapri le applicazioni per applicare le modifiche.

^~@2 è control-option-command-2. Vedi link .

    
risposta data 03.01.2014 - 01:52
fonte
3

Come la maggior parte delle preferenze, le scorciatoie da tastiera possono essere impostate usando i comandi "default write" nel Terminale. Utile se hai molte scorciatoie che vuoi definire, o se hai più di un Mac da configurare. Tuttavia, la sintassi non è esattamente la stessa dei soliti comandi per l'impostazione di una chiave per un valore.

Per i comandi specifici dell'applicazione, usa quanto segue:

defaults write com.developer.app NSUserKeyEquivalents -dict-add "Menu Item" -string "@$~^k"

I meta-tasti sono impostati come @ per Comando, $ per Maiusc, ~ per Alt e ^ per Ctrl. k in questo esempio è la non-meta-chiave che si desidera utilizzare.

Per le scorciatoie a livello di sistema, puoi utilizzare -g anziché l'identificativo dell'app, ad es.

defaults write -g NSUserKeyEquivalents -dict-add "Menu Item" -string "@$~^k" 

Tieni presente che dovrai riavviare l'app prima che abbiano effetto. Inoltre, puoi vedere se hanno avuto successo in Preferenze di sistema, che richiederà anche un riavvio per mostrare le modifiche.

    
risposta data 01.01.2014 - 10:49
fonte
1

Le scorciatoie da tastiera dei servizi sono leggermente diverse dalle scorciatoie specifiche dell'applicazione o del sistema, sebbene possano essere gestite utilizzando defaults read e defaults write .

Il modo più semplice che ho trovato per capire questo genere di cose è:

defaults read > /tmp/a

Cambia la scorciatoia da tastiera manualmente usando le Preferenze di Sistema

defaults read > /tmp/b
diff /tmp/[ab]

Per il caso specifico delle scorciatoie da tastiera per i servizi, in OS-X 10.8 i domini importanti sono "com.apple.ServicesMenu.Services" e "pbs". Devi guardare il dominio com.apple.ServicesMenu.Services per ottenere le informazioni necessarie per creare una voce nel dominio pbs.

Ad esempio:

La chiave CFVendedServices da com.apple.ServicesMenu.Services per "Unarchive to Current Folder is:

{
    NSBundleIdentifier = "cx.c3.theunarchiver";
    NSBundlePath = "/opt/homebrew-cask/Caskroom/the-unarchiver/3.9.1/The Unarchiver.app";
    NSKeyEquivalent = { };
    NSMenuItem = {
        default = "The Unarchiver/Unarchive To Current Folder";
    };
    NSMessage = unarchiveToCurrentFolderWithPasteboard;
    NSPortName = "The Unarchiver";
    NSSendTypes = (
        NSFilenamesPboardType
    );
    NSUUID = <be1910e8 cb1a3475 90854bc5 09f0c0ab>;
},

Per creare una scorciatoia da tastiera, la chiave NSServices pbs viene creata da NSBundleIdentifier, NSMenuItem e NSMessage. Esempio:

defaults read pbs
{
        "cx.c3.theunarchiver - The Unarchiver/Unarchive To Current Folder - unarchiveToCurrentFolderWithPasteboard" =         {
            "enabled_context_menu" = 1;
            "enabled_services_menu" = 1;
            "key_equivalent" = "@~^u";
        };
        "org.vim.MacVim - MacVim/New MacVim Buffer Here - newFileHere" =         {
            "key_equivalent" = "@~^v";
        };
    };
}

Sfortunatamente, il dominio pbs è costruito come dizionari nidificati che non possono essere gestiti da defaults write come questi casi più semplici per altre scorciatoie da tastiera. Dovrai leggere l'intera chiave NSServicesStatus, inserire la nuova voce, quindi riscriverla:

defaults write pbs NSServicesStatus '{
    "com.cocoatech.PathFinder - Path Finder/Show Info - getInfoInPathFinderService" =     {
        "key_equivalent" = "@~^$i";
    };
    "cx.c3.theunarchiver - The Unarchiver/Unarchive To Current Folder - unarchiveToCurrentFolderWithPasteboard" =     {
        "enabled_context_menu" = 1;
        "enabled_services_menu" = 1;
        "key_equivalent" = "@~^u";
    };
    "org.vim.MacVim - MacVim/New MacVim Buffer Here - newFileHere" =     {
        "key_equivalent" = "@~^v";
    };
}'

Potrebbe anche essere necessario forzare i pbs a svuotare la cache:

/System/Library/CoreServices/pbs -flush
    
risposta data 01.01.2014 - 18:39
fonte
1

Sono pigro - uso uno strumento come FastScripts per impostare scorciatoie da tastiera globali e invocare script.

È gratuito a meno che non sia necessario definire 11 o più scorciatoie. Inoltre, l'autore è un raffinato gentiluomo che produce software di qualità e supporta gli utenti ben oltre ciò che ci si potrebbe aspettare da un negozio monomarca.

    
risposta data 02.01.2014 - 08:16
fonte

Leggi altre domande sui tag