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
сарказм mode on (но в любой шутке доля…)
Процитирую куски из поста, но в обратном порядке:
С джейсоном как-то попроще :-)
Только очевидно и json я не писал руками, а использовал wysiwyg-редактор типа такого
Вопрос к знатокам: Можно ли заставить Карабинер менять раскладку клавиатуры в зависимости от активного (находящегося в фокусе) приложения? И если можно, то как такое правило должно выглядеть для Goku? А то там в примерах одни «переопредели кнопку А в кнопку Б, позязя».
@Dimentium, Goku прям зашёл, очень быстро накидал себе мэппинг навигации со стрелок на Caps+IJKL
Но застрял с двумя вопросами:
Что-то я потерялся в примерах :(