the night i lost control

В один прекрасный день, я пришел к необходимости назначать действия на глобальные шорткаты. Встроенный в систему способ (через создание сервиса в Automator) не подошел. У него куча ограничений — так, например, если у приложения нет системного меню или по какой-то причине недоступно конкретно меню с сервисами, то хоткей работать не будет. Вообще.

Полез искать 3rd-party решения. Их, конечно же, существует немало, но вот незадача — они либо кривые, либо перегружены ненужным (для меня) функционалом, либо стоят каких-то невозможных денег (в качестве самого яркого примера, вот тут у нас менеджер хоткеев за 60 баксов), либо все это в различных комбинациях.

Так как я большой любитель собственных велосипедов, вопрос что со всем этим делать решился достаточно быстро — писать свое. Открытое, бесплатное, без ненужных свистоперделок.

И написал таки, назвал в честь известного мема — iCanHazShortcut (всем же известно, что хороший софт на маке должен начинаться с буквы i).
iCanHazShortcut
Что умеет:
  • задавать произвольные шорткаты
  • привязывать к ним любые команды
  • выполнять команды в выбранной оболочке
  • показывать список команд в меню
  • проверять обновления


Пара слов о технической стороне — шорткаты биндятся через древний, но рабочий Carbon, написано на PureBasic, общий объем кода на данный момент около 1000 строк, все иконки взяты из свободных сетов, лицензия Unlicense.

Текущий релиз (0.5.1) достаточно стабилен и функционален для ежедневного использования, но, безусловно, еще есть куда расти. Поэтому пожелания, предложения и багрепорты приветствуются. Также, если кто-то хочет помочь проекту и нарисовать оригинальную иконку — буду благодарен. Иконка нарисована хорошим человеком denboroda.

github
dmg

UPD: обновлено до версии 0.5.3 с возможностью указывать одиночные хоткеи.
Поделиться с друзьями
-->

Комментарии (30)


  1. dvor
    21.07.2016 15:37
    +4

    Рекомендую посмотреть hammerspoon. На lua можно делать много чего, в том числе задавать шорткаты или влючать музыку при подключении к домашнему Wi-Fi. Вот, например, шоркаты, которые использую я.


    1. deseven
      21.07.2016 16:20

      Спасибо за наводку, посмотрел. Очень интересная и мощная штука, мне оно симпатично вдвойне, потому что я пишу в том числе и на lua. Но — оверкилл. Я не хочу писать код чтобы забиндить шорткат и не хочу ограничивать себя одним языком.


      1. dvor
        21.07.2016 17:24

        Вы таки написали код, чтобы забиндить шорткат, и опубликовали его на гитхабе. :-)


        1. deseven
          21.07.2016 17:40

          Это пришлось сделать один раз :)


    1. Valery4
      21.07.2016 18:17

      Пробовал hammerspoon когда искал тайловый менеджер окон.
      Но в сочитании с консольным Vim, получалось что он как-то постепенно меняет размер окна и в Vim каждый момент перерисововалось лесенкой всё содержимое файла.

      Во время штатного изменения размера окна — такого эффекта нет.
      Поэтому остановился пока на Amethyst


      1. dvor
        21.07.2016 18:20

        hs.window.animationDuration = 0
        помогает, перерисовка происходит мгновенно.


  1. vconst
    21.07.2016 17:23

    Программа умеет назначить шорткат на плюсик в заголовке: «Развернуть окно приложения на весь экран»?


    1. 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
      

      Назначить любой желаемый хоткей и будет разворачивать.


      1. 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)
        


        1. silvansky
          21.07.2016 18:10

          Хм, это не совсем то же самое. Это изменение фрейма окна без учёта повешенного на зелёный крестик поведения. Кроме того, в текущей версии macOS/OS X нажатие на плюс без альта разворачивает окно в fullscreen.


          1. dvor
            21.07.2016 18:12

            Так изначально задача была

            назначить шорткат на плюсик в заголовке: «Развернуть окно приложения на весь экран»

            Что и происходит, окно разворачивается на весь экран по шорткату.


            1. silvansky
              21.07.2016 18:15

              Нет, решается задача «развернуть на весь экран» при поставленной «нажать на системную кнопку в окне». И разные результаты гарантированы. ;)

              Как минимум, при повторном нажатии на кнопку окно возвращается в предыдущее состояние. А при вызове Вашего скрипта — нет.


              1. vconst
                21.07.2016 18:18

                В последнем иллюстраторе есть неприятный баг, очень часто файлы с картинками открываются узенькой полоской по левому краю монитора, первый раз столкнулся и не ясно как лечить, коллеги тоже не справились. Если ваша программа поможет — будет здорово


        1. deseven
          21.07.2016 18:39

          А можно скрипты, написанные под апи Hammerspoon вызывать отдельно? Такой гибридный вариант в моем представлении об удобстве имеет право на жизнь.


      1. vconst
        21.07.2016 18:16

        Хм… Спасиб, надо будет попробовать


    1. deseven
      21.07.2016 17:52

      Вот тут нашел хороший набор скриптов для контроля окон. В инете гуглится еще с десяток решений разной степени проработанности.


      1. vconst
        21.07.2016 18:18

        И это попробую :)


  1. MagiC
    22.07.2016 08:11

    Я использую Spectacle для управления размером и положения окон.


  1. c10wn
    22.07.2016 10:14

    а можно повесить смену раскладки на капслок с сохранением индикации?


    1. deseven
      22.07.2016 10:24

      Насколько мне известно, нет способа из коробки ловить капслок, для этого нужно сначала переназначить его на какую-то другую клавишу (например с помощью этого).

      Для контроля индикации можно использовать maclight.

      Для переключения раскладки — keyboardSwitcher.

      Таким образом ответ на вопрос — да, думаю можно, но сложно.


      1. dion
        22.07.2016 11:09

        Достаточно только seil. Вот тут написано, как это сделать

        Оно реально работает. Но Caps пропадает полностью (Shift+Caps, как в linux не работает)


        1. 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
          

          Все сводится к коротенькому скрипту, который вешается на подмененный капслок.


          1. dion
            22.07.2016 14:40

            Да. Так точнее. Мне просто LED индикатор не нужен )


    1. bonus_tm
      22.07.2016 13:25

      Я для этого довольно давно использую Keybroad II (www.keybroadapp.com). Можно указать в настройках для какой раскладки лампочка включена, а для какой выключена. У меня включена для русской, например.


      1. c10wn
        22.07.2016 13:31

        спасибо!


    1. deseven
      22.07.2016 13:59
      +1

      Выше озвучили готовое решение, но я уже потратил время и таки разобрался, пусть лежит тут для истории, вдруг кому-нибудь пригодится.

      1. Ставим Seil. CapsLock перебиндиваем на какую-нибудь другую ненужную кнопку (например F19 — код 80).
      2. Ставим maclight и keyboardSwitcher.
      3. Сохраняем куда-нибудь скрипт и делаем исполняемым, не забывая читать комментарии.
      4. В iCHS в качестве шортката тыкаем на капслок, в качестве действия указываем скрипт (например $HOME/capsSwitch.sh).

      Все, срабатывание моментальное.
      Скрипт также можно заточить под несколько раскладок, добавить туда голосовое оповещение с помощью say или уведомление через terminal-notifier.


      1. 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 на Russian


        1. alex__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>
          


          1. deseven
            22.07.2016 23:54

            Гляжу у нас тут образуется специальная олимпиада в стиле «Наиболее сложный способ повесить переключение раскладки на капс» :)


  1. VadimVerenitsyn
    22.07.2016 10:14

    Я себе купил BetterTouchTool. Работают хоткеи очень быстро, можно вешать глобальные и на конкретную программу (настроил лайтрум себе под левую руку, что бы все рядом). Настройки на клаву-мышь и всякого еще. Есть клиент для айфона, позволяет удаленно нажимать кнопки или курсором водить (у меня вместо пульта для просмотра киношек).