Как сделать удобный ремап клавиш и макросы в Karabiner-Elements

Переназначить клавиши и сделать «макросы» в macOS через Karabiner-Elements можно так: простые замены делайте в Simple Modifications, а всё с логикой (tap/hold, одновременные нажатия, запуск команд) — в Complex Modifications через JSON-правила.

Оглавление

Установка и права macOS: что проверить

  1. Установите Karabiner-Elements удобным способом (пакет или через менеджер пакетов).
  2. Если «ничего не работает», почти всегда причина в разрешениях:
  • Input Monitoring для Karabiner-Elements.
  • Разрешение для фоновых компонентов (Login Items/Background).
  • Разрешение системного расширения виртуального HID-устройства (если система его запрашивает).

После обновления macOS или миграции на новый Mac помогает сценарий: выключить разрешения → перезапустить Mac → запустить Karabiner → выдать разрешения заново.

Simple Modifications: быстрый ремап без JSON

Используйте Simple Modifications, когда нужно «клавиша A стала клавишей B»:

  • caps_lockescape
  • left_commandleft_option (если меняете раскладку под привычки)
  • исправление «кривых» клавиш на внешней клавиатуре

Сначала выберите конкретное устройство (вкладка Devices / выбор девайса вверху), чтобы правило применялось только к внешней клавиатуре, а не ко всем.

Complex Modifications: tap/hold, simultaneous и «макросы»

Complex-правила нужны, когда есть условия и тайминги. Прежде чем писать JSON, откройте Karabiner-EventViewer и уточните реальный key_code — это экономит часы отладки.

Tap vs Hold: одна клавиша — два действия

Пример: удержание = Control, тап = Escape.

{
  "description": "Left Control: hold = Control, tap = Escape",
  "manipulators": [
    {
      "type": "basic",
      "from": { "key_code": "left_control", "modifiers": { "optional": ["any"] } },
      "to": [{ "key_code": "left_control" }],
      "to_if_alone": [{ "key_code": "escape" }]
    }
  ]
}

Hyper Key на Caps Lock (база для десятков хоткеев)

Идея: удержание caps_lock даёт «гипер-модификатор» (cmd+ctrl+opt+shift), а по одиночному нажатию Caps Lock можно оставить, например, escape.

{
  "description": "CapsLock as Hyper (hold), Escape (tap)",
  "manipulators": [
    {
      "type": "basic",
      "from": { "key_code": "caps_lock", "modifiers": { "optional": ["any"] } },
      "to": [
        {
          "key_code": "left_shift",
          "modifiers": ["left_command", "left_control", "left_option"]
        }
      ],
      "to_if_alone": [{ "key_code": "escape" }]
    }
  ]
}

Одновременное нажатие (simultaneous)

Подходит, если хотите «мини-аккорды» вместо модификаторов.

{
  "description": "a+s+d simultaneously = Mission Control",
  "manipulators": [
    {
      "type": "basic",
      "from": {
        "simultaneous": [{ "key_code": "a" }, { "key_code": "s" }, { "key_code": "d" }],
        "modifiers": { "optional": ["any"] }
      },
      "to": [{ "apple_vendor_keyboard_key_code": "mission_control" }]
    }
  ]
}

«Макросы» через запуск команды (shell_command)

Karabiner лучше всего работает с клавишами, а «действия» делаются через shell_command (запуск скрипта/команды).

{
  "description": "Right Command+S запускает команду",
  "manipulators": [
    {
      "type": "basic",
      "from": { "key_code": "s", "modifiers": { "mandatory": ["right_command"] } },
      "to": [{ "shell_command": "open -a 'Safari.app'" }]
    }
  ]
}

Окружение у shell_command может отличаться от вашего терминала (PATH, переменные). Для надёжности вызывайте конкретный интерпретатор и полный путь к скрипту.

Где лежит конфиг и как бэкапить

Основной файл настроек: ~/.config/karabiner/karabiner.json

Практичный бэкап:

  • храните копию файла/папки ~/.config/karabiner/ (например, в отдельной папке бэкапа);
  • перед крупными изменениями делайте копию karabiner.json, чтобы быстро откатиться.

Частые ошибки

  • Ремап «не срабатывает», потому что выбран не тот key_code (проверьте в EventViewer).
  • Нет разрешения Input Monitoring, поэтому Karabiner не перехватывает ввод.
  • Complex-правило ниже другого правила, которое совпадает раньше: порядок важен, срабатывает первое подходящее.
  • Забыли modifiers.optional: ["any"] и правило ломается, если вы держите лишний Shift/Option.
  • Слишком агрессивные тайминги tap/hold: увеличьте basic.to_if_alone_timeout_milliseconds.

FAQ

Можно ли сделать вставку текста (текстовый макрос)?
Напрямую Karabiner — про события клавиатуры. Текст обычно вставляют через shell_command (например, вызов системного скрипта), но надёжнее выносить «сниппеты» в отдельный инструмент, а Karabiner использовать как триггер.

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

Как ограничить правило одним приложением?
Добавьте conditions по приложению (bundle identifier). Это удобно, когда один и тот же хоткей нужен в IDE, но мешает в браузере.