Ich brauche eine Möglichkeit, Folgendes programmgesteuert festzulegen:
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.
@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/null
Am Ende des Standardbefehls hinzugefügt , damit nur Fehler zurückgegeben werden.
Sie können auch PlistBuddy
und 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 PlistBuddy
Befehl wird nicht benötigt, wenn kein vorhandener Eintrag für den Dienst vorhanden ist. Ersetzen Sie test2
durch den Namen des Dienstes. Beenden Sie Anwendungen und öffnen Sie sie erneut, um die Änderungen zu übernehmen.
^~@2
ist steuerung-option-befehl-2. Siehe http://osxnotes.net/keybindings.html .
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.
Tastenkombinationen für Dienste unterscheiden sich etwas von anwendungsspezifischen oder systemweiten Tastenkombinationen, obwohl sie mit defaults read
und 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 CFVendedServices
Schlüssel com.apple.ServicesMenu.Services
fü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 write
einfacheren 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
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?-data
es zu funktionieren. Ich werde es versuchen und sehen, ob ich etwas zum Laufen bringen kann. Dies scheint jedoch definitiv der richtige Weg zu sein! ^_^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.
CRGrün
CRGrün
CRGrün
Chris Knadler