Как полюбить Karabiner (MacOS)

 Публичный пост
17 марта 2021  3016

Disclaimer

Пост навеян полным боли комментарием из соседнего треда

Karabiner

Многие знают про Karabiner - утилиту позволяющую творить невообразимые штуки с клавиатурой в MacOS. Но мало кто знает про GokuRakuJoudo (или просто goku) - утилиту делающую использование карабинера легким и приятным, а не полным боли и недоумения.

Суть проблемы

Karabiner использует для хранения конфига формат JSON, который не всем нравится читать и, тем более, редактировать. Особенно руками. Поэтому многие в использовании карабинера ограничиваются копированием готовых правил из интернетов и испытывают затруднения при желании что-то изменить.
Вот так выглядит типичный кусок конфига карабинера (иллюстрация из соседнего треда про преключение раскладки одной кнопкой)


При одном взгляде на эту простыню охватывает трепет и мысль "а может не надо?" и "я всего лишь хотел переключать раскладку".

Как же быть?

К счастью есть решение. Можно писать конфигурацию для карабинера в EDN (Extensible Data Notation) формате и с помощью Goku конвертировать его в JSON!

Если вы, как и я совсем недавно, в первый раз слышите про EDN, не беда! Дальше вы увидите, что ничего страшного там нет (зловещий смех).

Вот так выглядит, к примеру, фрагмент конфига в EDN выполняющего аналогичную функцию фрагменту JSON показанному выше.


Как следует читать такую запись:

;; rule [:left_shift :left_shift     nil     {:alone {:input :en}}]
;;         |_______|    |________|    |___|     |__________________|
;;          <from>         <to>    <conditions>    <other options>

То есть:
нажатие left_shift (from) считать нажатием left_shift (to) без дополнительных условий (conditions: nil), но если left_shift был нажат и отпущен без других клавиш (alone), то переключить раскладку на объявленную как "en".

Магия!
Не только меньше писать, но и гораздо легче читать и понимать (особенно после привыкания :) ).

GokuRakuJoudo

Goku принимает на вход файл в формате EDN и конвертирует его в JSON.
Легко и просто. Умеет работать в фоне и срабатывать при обнаружении изменений, но я предпочитаю запускать ее руками.
Установить можно, как и сам Karabiner, через brew:

brew install yqrashawn/goku/goku

Либо руками по инструкции с домашней страницы утилиты.
Добавленные правила видны с указанными заголовками в инерфейсе Karabiner и их можно выпилить по одному из JSON (но в EDN они, конечно, останутся и после следующего запуска Goku вернутся)


На сайте утилиты есть как документация с примерами использования, так и ссылки на реальные конфиги людей серьезно использующих Karabiner и Goku. Там можно почерпнуть вдохновения на свои кастомизации (я так регулярно делаю и каждый раз пугаюсь насколько глубока кроличья нора).

Профит!

Если вы начинающий пользователь Karabiner , то очень советую как можно раньше начать использовать Goku. По той причине, что чем сложнее и больше ваш конфиг написанный в JSON, тем сложнее себя убедить переписать его в EDN. Утилиты для обратного конвертирования нет и вряд ли появится по очевидным причинам.
Я довольно поздно узнал про Goku, но с радостью перешел на его использование. И теперь как только возникает мысль о новом правиле для карабинера, то можно очень быстро его добавить буквально в одну строчку. Для этого у меня даже есть две строчки в конфиге:


Первая вешает запуск VSCode с конфигурацией в EDN на CMD+SHIFT+F12 (не спрашивайте почему такое сочетание - сам не вспомню как к нему пришел)
Вторая строчка запускает Goku по нажатию CMD+F12 и показывает результат вызова в Центре Уведомлений MacOS.

Например так:

Или вот так:

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

+линк на MacOS tips & tricks

Связанные посты
10 комментариев 👇
Андрей Писков человек-оркестр (директор по IT-продуктам) 17 марта 2021

сарказм mode on (но в любой шутке доля…)

Процитирую куски из поста, но в обратном порядке:

;; rule [:left_shift :left_shift     nil     {:alone {:input :en}}]
;;         |_______|    |________|    |___|     |__________________|
;;          <from>         <to>    <conditions>    <other options>

При одном взгляде […] охватывает трепет и мысль "а может не надо?" и "я всего лишь хотел переключать раскладку".

С джейсоном как-то попроще :-)

Только очевидно и json я не писал руками, а использовал wysiwyg-редактор типа такого

  Развернуть 1 комментарий

@piskov, кмк, один уже "интерфейс" WYSIWYG-редакторов, что я видел может вызвать нежелание связываться с карабинером. тот что по ссылке выше - не исключение :)
но, конечно, вкус фломастеров - дело тонкое.

  Развернуть 1 комментарий

@Dimentium, karabiner как-то не работал три-четыре(?) операционки назад. Эпл что-то там поменял для безопасности™ и karabiner пришлось переписывать с нуля (отсюда и вышел karabiner elements).

Темное было время. Пришлось поставить hammerspoon, разобраться в lua и на ней написать скрипт для смены языка по одной кнопке (левый комманд для английского, правый комманд — для русского).

Пользовался хаммерспуном год точно. Память в нем текла страшно (до гигабайта набиралась за несколько дней). Приходилось постоянно перезапускать.

Так что по сравнению с этим усилием, какрабинер что десяток лет назад, что сейчас — дар небес :-) Тем более с таким выбором опций: json, wysiwyg или ваше решение. Всяко лучше lua (наверное)

  Развернуть 1 комментарий
Михаил Санников Продюсер потребительской электроники 28 марта 2021

Вопрос к знатокам: Можно ли заставить Карабинер менять раскладку клавиатуры в зависимости от активного (находящегося в фокусе) приложения? И если можно, то как такое правило должно выглядеть для Goku? А то там в примерах одни «переопредели кнопку А в кнопку Б, позязя».

  Развернуть 1 комментарий

@Atarity, а нужно ли? В макосе можно сделать запоминания языка для каждого приложения.

Были в ворде с английской раскладкой, переключились на сообщения с русской, вернулись в ворд — язык по-прежнему английский.

См галку в системных настройках в настройках раскладок.

  Развернуть 1 комментарий

@piskov, Меня всегда в этой галке смущало название: automatically switch to a document's input source. Казалось что она именно про редактирование файлов, а не приложений. Но ты прав: пора уже её тыкнуть и попробовать как оно на самом деле.)

  Развернуть 1 комментарий

@Atarity, нет. Karabiner не про это.
Для запуска действий по активации окна нужно использовать другой софт - из наиболее распространенных это BetterTouchTool и Keyboard Maestro.
Еще можно использовать встроенную в MacOS утилиту - Automator. Вот решение такой задачи через него: https://stackoverflow.com/questions/64476525/trigger-an-apple-script-automator-when-an-application-comes-to-focus-in-mac
Единственно - для задания конкретной раскладки можно использовать стороннюю утилиту, например вот эту: https://github.com/vovkasm/input-source-switcher

  Развернуть 1 комментарий

@Dimentium, Goku прям зашёл, очень быстро накидал себе мэппинг навигации со стрелок на Caps+IJKL

{;; LAYERS
 :layers {:caps-mode {:key :caps_lock :alone {:key :escape}}} ;; layers

 ;; BINDINGS
 :main
 [{:des "Caps lock mode: quick reach for cursor etc."
   :rules [:caps-mode
          ;; caps lock : arrow mode
           [:##j :##left_arrow]
           [:##k :##down_arrow]
           [:##i :##up_arrow]
           [:##l :##right_arrow]
           [:h :!Oleft_arrow]
           [:semicolon :!Oright_arrow]
           [:u :!Cup_arrow]
           [:o :!Cdown_arrow]]}
  ]
}

Но застрял с двумя вопросами:

  • как в Caps+U/H (Cmd/Opt+Arrow Left) добавить поддержку нажатого shift
  • и как это всё перемапить на зажатый Cmd

Что-то я потерялся в примерах :(

  Развернуть 1 комментарий

@Seigiard
первое:

[:##h :!Oleft_arrow]
[:##u :!Cup_arrow]

второе - не уверен, что правильно понял вопрос, но если речь о том, чтобы активировать слой не только капсом, но и правым cmd (к примеру), то вот так можно:

[{:des "Additional activators for caps-mode"
    :rules [
        [:right_command [ "caps-mode"  1] nil {:afterup ["caps-mode" 0]}]
]}]

но тут нужно иметь в виду, что при этом правый cmd перестанет быть собой в плане, что не прописанные в явном виде хоткеи с его использованием работать перестанут. надо либо согласиться с этим, либо добавить в конфиг поведение для нужных хоткеев.

  Развернуть 1 комментарий

@Dimentium, походу, вчера я где-то в синтаксисе напутал и ##{KEY} вываливались с ошибкой. Сегодня всё завелось.

Завтра ещё почитаю про слои и сделаю подход к снаряду.

Спасибо! Goku действительно удобнее, чем голый Karabiner

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб