В один прекрасный день, я пришел к необходимости назначать действия на глобальные шорткаты. Встроенный в систему способ (через создание сервиса в Automator) не подошел. У него куча ограничений — так, например, если у приложения нет системного меню или по какой-то причине недоступно конкретно меню с сервисами, то хоткей работать не будет. Вообще.
Полез искать 3rd-party решения. Их, конечно же, существует немало, но вот незадача — они либо кривые, либо перегружены ненужным (для меня) функционалом, либо стоят каких-то невозможных денег (в качестве самого яркого примера, вот тут у нас менеджер хоткеев за 60 баксов), либо все это в различных комбинациях.
Так как я большой любитель собственных велосипедов, вопрос что со всем этим делать решился достаточно быстро — писать свое. Открытое, бесплатное, без ненужных свистоперделок.
И написал таки, назвал в честь известного мема — iCanHazShortcut (всем же известно, что хороший софт на маке должен начинаться с буквы i).
Что умеет:
- задавать произвольные шорткаты
- привязывать к ним любые команды
- выполнять команды в выбранной оболочке
- показывать список команд в меню
- проверять обновления
Пара слов о технической стороне — шорткаты биндятся через древний, но рабочий Carbon, написано на PureBasic, общий объем кода на данный момент около 1000 строк, все иконки взяты из свободных сетов, лицензия Unlicense.
Текущий релиз (0.5.1) достаточно стабилен и функционален для ежедневного использования, но, безусловно, еще есть куда расти. Поэтому пожелания, предложения и багрепорты приветствуются.
github
dmg
UPD: обновлено до версии 0.5.3 с возможностью указывать одиночные хоткеи.
Комментарии (30)
vconst
21.07.2016 17:23Программа умеет назначить шорткат на плюсик в заголовке: «Развернуть окно приложения на весь экран»?
deseven
21.07.2016 17:45+2Программа ничего не умеет сама по себе кроме назначения хоткея на действие.
В качестве действия можно указать это:
osascript -e 'tell application "System Events"' -e 'set frontApplication to (get name of every process whose frontmost is true) as string' -e 'tell process frontApplication' -e 'click button 2 of window 1' -e 'end tell' -e 'end tell'
Или запихнуть это в отдельный скрипт для читаемости и вызывать так:
osascript maximizeWindow.scpt
Назначить любой желаемый хоткей и будет разворачивать.dvor
21.07.2016 18:03+1Тоже самое в hammerspoon. Как по мне, элегантнее решение, чем через AppleScript.
local hyper = {"cmd", "shift", "ctrl"} hs.hotkey.bind(hyper, "F", function() hs.window.focusedWindow():setFrame(currentScreenFrame()) end)
silvansky
21.07.2016 18:10Хм, это не совсем то же самое. Это изменение фрейма окна без учёта повешенного на зелёный крестик поведения. Кроме того, в текущей версии macOS/OS X нажатие на плюс без альта разворачивает окно в fullscreen.
dvor
21.07.2016 18:12Так изначально задача была
назначить шорткат на плюсик в заголовке: «Развернуть окно приложения на весь экран»
Что и происходит, окно разворачивается на весь экран по шорткату.silvansky
21.07.2016 18:15Нет, решается задача «развернуть на весь экран» при поставленной «нажать на системную кнопку в окне». И разные результаты гарантированы. ;)
Как минимум, при повторном нажатии на кнопку окно возвращается в предыдущее состояние. А при вызове Вашего скрипта — нет.vconst
21.07.2016 18:18В последнем иллюстраторе есть неприятный баг, очень часто файлы с картинками открываются узенькой полоской по левому краю монитора, первый раз столкнулся и не ясно как лечить, коллеги тоже не справились. Если ваша программа поможет — будет здорово
deseven
21.07.2016 18:39А можно скрипты, написанные под апи Hammerspoon вызывать отдельно? Такой гибридный вариант в моем представлении об удобстве имеет право на жизнь.
c10wn
22.07.2016 10:14а можно повесить смену раскладки на капслок с сохранением индикации?
deseven
22.07.2016 10:24Насколько мне известно, нет способа из коробки ловить капслок, для этого нужно сначала переназначить его на какую-то другую клавишу (например с помощью этого).
Для контроля индикации можно использовать maclight.
Для переключения раскладки — keyboardSwitcher.
Таким образом ответ на вопрос — да, думаю можно, но сложно.dion
22.07.2016 11:09Достаточно только seil. Вот тут написано, как это сделать
Оно реально работает. Но Caps пропадает полностью (Shift+Caps, как в linux не работает)deseven
22.07.2016 11:47Там написано «The green light on the actual key will not change as you change the input source». С maclight + keyboardSwitcher это можно сделать.
Текущую раскладку можно определять с помощью
keyboardSwitcher get
и в зависимости от этого включать или выключать подсветку капслока
maclight keyboard set -a 1 maclight keyboard set -a 0
Все сводится к коротенькому скрипту, который вешается на подмененный капслок.
deseven
22.07.2016 13:59+1Выше озвучили готовое решение, но я уже потратил время и таки разобрался, пусть лежит тут для истории, вдруг кому-нибудь пригодится.
1. Ставим Seil. CapsLock перебиндиваем на какую-нибудь другую ненужную кнопку (например F19 — код 80).
2. Ставим maclight и keyboardSwitcher.
3. Сохраняем куда-нибудь скрипт и делаем исполняемым, не забывая читать комментарии.
4. В iCHS в качестве шортката тыкаем на капслок, в качестве действия указываем скрипт (например $HOME/capsSwitch.sh).
Все, срабатывание моментальное.
Скрипт также можно заточить под несколько раскладок, добавить туда голосовое оповещение с помощью say или уведомление через terminal-notifier.alex__007
22.07.2016 22:27Я сделал немного по-другому:
1. Ставим Seil и перебиндиваем Caps Lock на PC Application (код 110) (кнопка Win Menu)
2. Ставим Karabiner
3. Сохраняем содержимое в private.xml у Karabiner
4. Включаем опции в секции «Change CapsLock»
Получаем переключение по CapsLock на English и Shift+CapsLock на Russianalex__007
22.07.2016 22:44К сожалению ссылки не прошли. Вот содержимое файла private.xml
<?xml version="1.0"?> <root> <item> <name>Change CapsLock Key</name> <item> <name>CapsLock to CapsLock</name> <appendix>(+ When you type CapsLock and Left Shift, change Input Source to Russian)</appendix> <identifier>remap.russian_capslock2capslock_russian</identifier> <autogen>__KeyOverlaidModifier__ KeyCode::PC_APPLICATION, ModifierFlag ::SHIFT_L, KeyCode::VK_CHANGE_INPUTSOURCE_RUSSIAN</autogen> </item> <item> <name>CapsLock to CapsLock</name> <appendix>(+ When you type CapsLock only, change Input Source to English)</appendix> <identifier>remap.russian_capslock2capslock_english</identifier> <autogen>__KeyOverlaidModifier__ KeyCode::PC_APPLICATION, ModifierFlag::NONE, KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH</autogen> </item> </item> </root>
deseven
22.07.2016 23:54Гляжу у нас тут образуется специальная олимпиада в стиле «Наиболее сложный способ повесить переключение раскладки на капс» :)
VadimVerenitsyn
22.07.2016 10:14Я себе купил BetterTouchTool. Работают хоткеи очень быстро, можно вешать глобальные и на конкретную программу (настроил лайтрум себе под левую руку, что бы все рядом). Настройки на клаву-мышь и всякого еще. Есть клиент для айфона, позволяет удаленно нажимать кнопки или курсором водить (у меня вместо пульта для просмотра киношек).
dvor
Рекомендую посмотреть hammerspoon. На lua можно делать много чего, в том числе задавать шорткаты или влючать музыку при подключении к домашнему Wi-Fi. Вот, например, шоркаты, которые использую я.
deseven
Спасибо за наводку, посмотрел. Очень интересная и мощная штука, мне оно симпатично вдвойне, потому что я пишу в том числе и на lua. Но — оверкилл. Я не хочу писать код чтобы забиндить шорткат и не хочу ограничивать себя одним языком.
dvor
Вы таки написали код, чтобы забиндить шорткат, и опубликовали его на гитхабе. :-)
deseven
Это пришлось сделать один раз :)
Valery4
Пробовал hammerspoon когда искал тайловый менеджер окон.
Но в сочитании с консольным Vim, получалось что он как-то постепенно меняет размер окна и в Vim каждый момент перерисововалось лесенкой всё содержимое файла.
Во время штатного изменения размера окна — такого эффекта нет.
Поэтому остановился пока на Amethyst
dvor