Legen Sie die Tastenkombination für Dienste über das Skript OSX fest

Ich brauche eine Möglichkeit, Folgendes programmgesteuert festzulegen:

Tastaturkürzel

Speziell für Verknüpfungen unter Dienste, falls das einen Unterschied macht. Ich frage mich, ob dies über Shell oder AppleScript möglich ist?

BEARBEITEN:

Ich habe https://stackoverflow.com/questions/7219134/programmatically-add-keyboard-shortcut-to-mac-system-preferences gesehen , aber mir ist immer noch nicht klar, wie ich eine Verknüpfung für einen vorhandenen Dienst festlegen kann.

Könnte für Mavericks eine andere Geschichte sein, aber siehe stackoverflow.com/questions/7219134/… Oder es gibt den langen (GUI-Scripting) Weg: rngtng.com/2010/10/29/applescript-to-create-keyboard-shortcuts
... aber denken Sie daran, dass Mavericks das Zulassen von GUI-Skripten mit Systemereignissen anders handhabt als früher, da Sie dem ausführenden Skript (Skriptanwendung, Skripteditor) die Berechtigung erteilen müssen.
Entschuldigung, ich habe nicht gesehen, dass Sie diesen Beitrag bereits gesehen haben ... was haben Sie also bisher versucht?
@CRGreen Ich habe mit mehreren Plists herumgespielt, um einen Weg zu finden, diese bestimmte Verknüpfung festzulegen. Der letzte Link, den Sie bereitgestellt haben, bringt mich definitiv näher. Ich sehe diese spezifische Eigenschaft dort.

Antworten (5)

@chrisKnadler hat dafür Applescript verwendet.

Ich habe dies in der Vergangenheit schon einmal verwendet, es aber aufgrund des neuen Problems in Mavericks der Präferenz, systemweit zwischengespeichert zu werden, abgezinst.

Das heißt, Sie können nur den Unix-Befehl verwenden

Voreinstellungen schreiben...

um die Ergebnisse tatsächlich zu ändern, anstatt sie manuell zu ändern oder Applescript plist item -Befehle zu verwenden.

Aber gerade jetzt, als ich mich umschaute, fand ich einen Vorschlag, dass Sie einfach den Cache leeren und das System veranlassen können, die Einstellung erneut zu lesen, indem Sie einfach a aufrufen

Voreinstellungen lesen ...

in der Plist-Datei haben Sie Änderung. Das scheint tatsächlich zu funktionieren.

  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

Möglicherweise müssen Sie noch ganz einzelne Apps auswählen, damit sie die Änderung anzeigen (wie es normal ist).


UPDATE: Kleine Änderung.

> /dev/nullAm Ende des Standardbefehls hinzugefügt , damit nur Fehler zurückgegeben werden.

Sie können auch PlistBuddyund verwenden 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";}'

Der PlistBuddyBefehl wird nicht benötigt, wenn kein vorhandener Eintrag für den Dienst vorhanden ist. Ersetzen Sie test2durch den Namen des Dienstes. Beenden Sie Anwendungen und öffnen Sie sie erneut, um die Änderungen zu übernehmen.

^~@2ist steuerung-option-befehl-2. Siehe http://osxnotes.net/keybindings.html .

Mir ist aufgefallen, dass einige der NSServiceStatus-Wörterbücher mehr als ein Element haben. Dh Servicemenü und Kontextmenüs aktivieren. Der plistBuddy-Befehl würde sie alle löschen. Aber die Standardwerte berücksichtigen das nicht. Wie wichtig diese Einstellungen sind, bin ich mir nicht 100% sicher. Nicht alle Diktate haben sie, können aber dennoch aktiviert sein. Ich denke, es hängt davon ab, wie der Dienst erstellt wird. Dh per Automator oder einer App.

Wie die meisten Einstellungen können Tastaturkürzel mit den Befehlen "Standardwerte schreiben" im Terminal festgelegt werden. Nützlich, wenn Sie viele Verknüpfungen definieren möchten oder wenn Sie mehr als einen Mac einrichten müssen. Die Syntax ist jedoch nicht ganz dieselbe wie bei den üblichen Befehlen zum Setzen eines Schlüssels auf einen Wert.

Verwenden Sie für anwendungsspezifische Befehle Folgendes:

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

Die Meta-Tasten sind als @ für Command, $ für Shift, ~ für Alt und ^ für Ctrl festgelegt. k ist in diesem Beispiel der Nicht-Meta-Schlüssel, den Sie verwenden möchten.

Für systemweite Verknüpfungen können Sie -g anstelle der App-ID verwenden, z

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

Beachten Sie, dass Sie die App neu starten müssen, bevor diese wirksam werden. Sie können auch sehen, ob sie in den Systemeinstellungen erfolgreich waren – die ebenfalls einen Neustart benötigen, um die Änderungen anzuzeigen.

Beantwortet dies tatsächlich die Frage, ob ein Shortcut zu einem bestehenden Servicemenü hinzugefügt werden soll?

Tastenkombinationen für Dienste unterscheiden sich etwas von anwendungsspezifischen oder systemweiten Tastenkombinationen, obwohl sie mit defaults readund verwaltet werden können defaults write.

Der einfachste Weg, den ich gefunden habe, um so etwas herauszufinden, ist:

defaults read > /tmp/a

Ändern Sie die Tastenkombination manuell über die Systemeinstellungen

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

Für den speziellen Fall von Tastenkombinationen für Dienste in OS-X 10.8 sind die wichtigen Domänen "com.apple.ServicesMenu.Services" und "pbs". Sie müssen sich die Domäne com.apple.ServicesMenu.Services ansehen, um die Informationen zu erhalten, die zum Erstellen eines Eintrags in der Domäne pbs erforderlich sind.

Zum Beispiel:

Der CFVendedServicesSchlüssel com.apple.ServicesMenu.Servicesfür "Unarchive to Current Folder" lautet:

{
    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>;
},

Um eine Tastenkombination dafür zu erstellen, wird der Schlüssel pbs NSServices aus NSBundleIdentifier, NSMenuItem und NSMessage konstruiert. Beispiel:

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

Leider ist die pbs-Domain als verschachtelte Wörterbücher aufgebaut, was in defaults writeeinfacheren Fällen für andere Tastaturkürzel nicht so gehandhabt werden kann. Sie müssen den gesamten NSServicesStatus-Schlüssel lesen, Ihren neuen Eintrag einfügen und ihn dann zurückschreiben:

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

Es kann auch notwendig sein, pbs zu zwingen, seinen Cache zu leeren:

/System/Library/CoreServices/pbs -flush
Ich hatte gestern ein Theaterstück dabei, aber ich habe es nicht gepostet. (Ich habe eine Kopie der bps plist verwendet, um daran zu arbeiten) Ich habe den NSServicesStatus gelesen und verwendet sed, um den Teil zu ändern, den ich ändern wollte. Aber obwohl das beim Ändern des Wörterbuchs funktioniert, als ich es in die Plist zurückgeschrieben habe, würde jede Zahl oder Bool in eine Zeichenfolge geändert werden. Hast du das überstanden?
Aus den Manpages scheint -dataes zu funktionieren. Ich werde es versuchen und sehen, ob ich etwas zum Laufen bringen kann. Dies scheint jedoch definitiv der richtige Weg zu sein! ^_^
Dies scheint eine andere Möglichkeit zu sein: Discussions.apple.com/thread/4709713?tstart=0

Ich bin faul - ich verwende ein Tool wie FastScripts, um globale Tastaturkürzel festzulegen und Skripte aufzurufen.

Es ist kostenlos, es sei denn, Sie müssen 11 oder mehr Verknüpfungen definieren. Außerdem ist der Autor ein feiner Gentleman, der Qualitätssoftware herstellt und Benutzer weit über das hinaus unterstützt, was Sie von einem Ein-Mann-Shop erwarten würden.

Das ist fabelhaft, aber ich versuche tatsächlich, diese Verknüpfung als Teil eines Installationsprogramms zu erstellen. Ich möchte versuchen, dies zu erreichen, ohne Software von Drittanbietern zu verwenden. Trotzdem ist das cool und ich werde es auf jeden Fall im Allgemeinen verwenden. Danke! (würde upvoten wenn ich könnte ^_^)
Keine Sorge bei der Abstimmung. Ich schätze gute Kommentare und schwierige Fragen wie diese mehr als alle 100 Stimmen, die kommen, wenn die Aufmerksamkeit des Internets auf eine Frage oder Antwort fällt. Ich werde nach anderen Optionen Ausschau halten, aber es sieht so aus, als ob die einfachen Lösungen alle in anderen Antworten hier vorgeschlagen wurden.