Как сделать удобный ремап клавиш и макросы в Karabiner-Elements
Переназначить клавиши и сделать «макросы» в macOS через Karabiner-Elements можно так: простые замены делайте в Simple Modifications, а всё с логикой (tap/hold, одновременные нажатия, запуск команд) — в Complex Modifications через JSON-правила.
Оглавление
Установка и права macOS: что проверить
- Установите Karabiner-Elements удобным способом (пакет или через менеджер пакетов).
- Если «ничего не работает», почти всегда причина в разрешениях:
- Input Monitoring для Karabiner-Elements.
- Разрешение для фоновых компонентов (Login Items/Background).
- Разрешение системного расширения виртуального HID-устройства (если система его запрашивает).
После обновления macOS или миграции на новый Mac помогает сценарий: выключить разрешения → перезапустить Mac → запустить Karabiner → выдать разрешения заново.
Simple Modifications: быстрый ремап без JSON
Используйте Simple Modifications, когда нужно «клавиша A стала клавишей B»:
caps_lock→escapeleft_command↔left_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, но мешает в браузере.