Встановити сполучення клавіш служби через скрипт OSX

Мені потрібен спосіб:

keyboard shortcut

Зокрема, для ярликів у службі, якщо це має значення. Мені цікаво, якщо це можливо через оболонку або AppleScript?

EDIT:

Я бачив https://stackoverflow.com/questions/7219134/ programmatically-add-keyboard-shortcut-to-mac-system-preferences , але я все ще не знаю, як встановити ярлик для існуючої служби.

4

5 Відповіді

@chrisKnadler зробив хороший момент використовувати Applescript для цього.

Я використовував це раніше в минулому, але знижував його через нову проблему в Mavericks від переваги, що кешується системою.

Це означає, що ви можете використовувати тільки команду unix

за замовчуванням записувати ...

щоб змінити результати, а не вручну змінити їх або скористатися командами Applescript plist .

Але тільки тепер оглянувшись знайшли пропозицію, що ви можете просто змити кеш і ініціювати систему, щоб знову прочитати налаштування, просто викликавши

за замовчуванням читати ...

у файлі plist змінено. Це дійсно працює.

  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

Вам можуть знадобитися окремі програми для показу змін (як це нормально)


UPDATE: Small change.

Added > /dev/null to the end of the defaults command so only errors are returned.

5
додано
додано Автор Marten Zander, джерело

Також можна використовувати PlistBuddy і значення за замовчуванням :

/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 = "^[email protected]";}'

Команда PlistBuddy не потрібна, якщо не існує існуючого запису для служби. Замініть test2 на назву служби. Закрийте та знову відкрийте додатки, щоб застосувати зміни.

^[email protected] is control-option-command-2. See http://osxnotes.net/keybindings.html.

4
додано
Я помітив, що деякі словники NSServiceStatus мають більше одного елемента. Включити сервісне меню і контекстні меню. Команда plistBuddy видалила б їх усі. Але дефолти не беруть це до уваги. Наскільки важливі ці налаштування, я не впевнений на 100%. Не всі диктують їх, але можуть бути включені. Я думаю, це залежить від того, як створюється послуга. Тобто автоматом або програмою.
додано Автор kalindi saxena, джерело

Як і більшість налаштувань, клавіатурні скорочення можна встановити за допомогою команд "defaults write" у терміналі. Корисно, якщо у вас є багато ярликів, які потрібно визначити, або якщо у вас є декілька Mac для налаштування. Тим не менш, синтаксис не зовсім такий, як звичайні команди для встановлення ключа на значення.

Для команд, що стосуються конкретних додатків, використовуйте наступне:

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

Мета-ключі встановлюються як @ для команд, $ для Shift, ~ для Alt і ^ для Ctrl. k у цьому прикладі - це немета-ключ, який потрібно використовувати.

Для загальносистемних ярликів можна використовувати -g замість ідентифікатора програми, наприклад,

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

Зауважте, що вам знадобиться перезапустити програму, перш ніж вона почне діяти. Також ви можете побачити, чи були вони успішними в System Preferences - які також потребуватимуть перезапуску, щоб показати зміни.

3
додано
Чи дійсно це відповідає на питання про додавання ярлика до існуючого сервісного меню?
додано Автор kalindi saxena, джерело

Комбінації клавіш служб трохи відрізняються від ярликів для конкретних або загальносистемних програм, хоча їх можна керувати за допомогою defaults read і defaults write .

Найпростіший спосіб виявити такий вигляд:

defaults read > /tmp/a

Змініть комбінацію клавіш вручну за допомогою налаштувань системи

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

Для конкретного випадку клавіатурних скорочень для служб, в OS-X 10.8 важливими доменами є "com.apple.ServicesMenu.Services" і "pbs". Потрібно подивитися на Домен com.apple.ServicesMenu.Services, щоб отримати інформацію, необхідну для створення запису в домені pbs.

Наприклад:

Ключ CFVendedServices з com.apple.ServicesMenu.Services для "Unarchive to Current Folder:

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

Щоб створити для нього клавіатурне скорочення, ключ pss NSServices будується з NSBundleIdentifier, NSMenuItem і NSMessage. Приклад:

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

На жаль, домен pbs будується як вкладені словники, які не можна обробляти за допомогою defaults write , як це простіші випадки для інших комбінацій клавіш. Вам потрібно буде прочитати весь ключ NSServicesStatus, вставити новий запис, а потім написати його назад:

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

Також може знадобитися, щоб змусити pbs вимити кеш:

/System/Library/CoreServices/pbs -flush
1
додано
З сторінок-користувачів, здається, що -data буде працювати. Я дам йому постріл і побачу, якщо я не можу отримати щось робоче. Це безумовно здається люблять шлях поїхати про це хоч! ^ _ ^
додано Автор Marten Zander, джерело
Це виглядає ще одним способом зробити це: discussions.apple.com/thread/4709713?tstart = 0
додано Автор Marten Zander, джерело
У мене була п'єса вчора, але не розмістила її. (Я використовував копію bps plist, щоб працювати). Я читав у NSServicesStatus і використовував sed для зміни частини, яку я хотів змінити. Але хоча це працює при зміні словника, коли я написав його назад до plist, будь-яке число або bool буде змінено на рядок. Ви над цим прийшли.
додано Автор kalindi saxena, джерело

Я ледачий - я використовую інструмент, як FastScripts для встановлення глобальних клавіатурних скорочень і виклику скриптів.

Це безкоштовно, якщо вам не потрібно 11 або більше ярликів. Крім того, автор є прекрасним джентльменом, який робить якісне програмне забезпечення та підтримує користувачів далеко за межі того, що можна очікувати від одного магазину.

0
додано
Не треба турбуватися про голосування. Я ціную хороші коментарі і важкі питання, як це більше, ніж будь-які 100 голосів, які приходять, коли увага до Інтернету містить одне питання або відповідь. Я буду тримати мої очі очищені для інших варіантів, але, схоже, легкі рішення були запропоновані в інших відповідях тут.
додано Автор Oskar, джерело
Це чудово, але я намагаюся зробити цей ярлик частиною інсталятора. Я хочу спробувати зробити це без використання будь-якого стороннього програмного забезпечення. Тим не менш, це круто, і я безумовно використовувати його в цілому. Дякую! (проголосував би, якби я міг ^ _ ^)
додано Автор Marten Zander, джерело