Files
obsidian-vault/personal/tech/karabiner-keyboard-config.md
T

14 KiB
Raw Blame History

type, topic, tags, created, updated
type topic tags created updated
tech keyboard
karabiner
keyboard
macos
input-sources
russian-layout
2026-09-15T00:00:00.000Z 2026-09-15T00:00:00.000Z

Karabiner-Elements — конфиг, раскладки, символы

Конфиг клавиатуры Mac (Karabiner-Elements). Правила подмены символов в русской раскладке (RussianWin), переключение раскладок, горячие клавиши.

Файлы конфига

Путь Назначение
~/Documents/karabiner.json Рабочая копия (канон, редактируется)
~/.config/karabiner/karabiner.json Живой конфиг — его читает Karabiner
~/Documents/karabiner.json.bak Бэкап рабочей копии
~/.config/karabiner/assets/complex_modifications/*.json Импортированные наборы правил (не редактируются вручную)

⚠️ Расхождение канона и живого файла (обнаружено 2026-09-15)

На 2026-09-15 рабочая копия и живой конфиг РАЗЛИЧАЮТСЯ:

Файл md5 Права
~/Documents/karabiner.json 2ad1f7e1c8c8807739b636cc0650a527
~/.config/karabiner/karabiner.json 3d12713ff32ad49cb4d20a5f7b284746 -rw------- (600)

Два вывода, требующих внимания:

  1. Живой конфиг имеет права 600 вместо нужных 644. По известному поведению Karabiner это прямой риск: при restrictive-правах Karabiner молча сбрасывает конфиг на дефолт (спрашивает про тип виртуальной клавиатуры, все complex_modifications пропадают). Обязательно chmod 644 после каждого cp.
  2. md5 не совпадают → либо рабочая копия старше живого, либо правки вносились только в живой. Перед любой правкой сверить содержимое (не заливать рабочую копию поверх живого слепо — потеряются правки, которые есть только в живом).

Структура профиля (на 2026-09-15)

Один профиль: Default profile, selected=true. simple_modifications — пустой (0). Все правила — в complex_modifications.rules[].

Группы правил (индекс → название → число манипуляторов):

# Правило Манипуляторов
0 Launch Apps HotKeys 43
1 Russian @ from opt+cmd+2 1
2 Xcode Keyboard helpers 7
3 F Keys 8
4 Media Keys, F Keys 11
5 Smart Quotes 8
6 EN/ABC symbol keys 4
7 Russian symbol keys 27
8 Cmd+Space to switch language in RDP 1
9 Remap Keys in Microsoft Remote Desktop 1
10 Disable Cmd+H Hide (rev 2) 1
11 Sleep 1
12 Window Resize Mode 4

Все RU-символьные ремапы живут в группе #7 Russian symbol keys.

Ключевой паттерн группы «Russian symbol keys»

Каждый манипулятор:

  • from — клавиша + modifiers.mandatory
  • to — key_code + modifiers (обычно right_shift / right_option — правые модификаторы, чтобы не конфликтовать с левыми)
  • conditions: [{ "input_sources": [{"language": "ru"}], "type": "input_source_if" }] — срабатывает только в русской раскладке

Таблица ремапов (27 манипуляторов)

RU-нажатие Символ Как реализовано
opt+4 ($) 8 + right_option
₽ (opt+8) opt+shift+4
opt+shift+4 (€) $ 4 + right_option
opt+е (†) opt+shift+4
opt+9 («) [ grave + left_option
opt+0 (») ] grave + left_option+left_shift
ё [ grave + left_option
shift+ё ] grave + left_option+left_shift
opt+[ [ grave + left_option
opt+] ] grave + left_option+left_shift
opt+shift+[ { shift+9
opt+shift+] } shift+0
opt+slash / backslash + right_shift
opt+shift+slash ? 7 + right_shift ← см. раздел про Caps Lock
opt+; (ж) ; 4 + right_shift
opt+shift+; (Ж) : 6 + right_shift
opt+' (э) ' o + right_option
opt+2 (") « close_bracket + right_option
opt+shift+2 (") » close_bracket + right_option+right_shift
backslash ё grave_accent_and_tilde
backslash Ë grave + right_shift
§ § non_us_backslash + left_option
shift+§ (±) ± f + left_shift+left_option
opt+, (<) < comma + right_shift+right_option
opt+. (>) > period + right_shift+right_option
opt+shift+, (≤) comma + right_option
opt+shift+. (≥) period + right_option

Особый случай: @ (в отдельной группе #1)

@ нет ни в одной русской раскладке → используется select_input_source (временно переключиться на ABC, набрать, вернуться):

{
  "description": "Russian @ from opt+cmd+2",
  "from": { "key_code": "2", "modifiers": { "mandatory": ["left_command", "option"] } },
  "to": [
    { "select_input_source": { "input_source_id": "com.apple.keylayout.ABC", "language": "en" } },
    { "key_code": "2", "modifiers": ["right_shift"] },
    { "select_input_source": { "input_source_id": "com.apple.keylayout.RussianWin", "language": "ru" } }
  ],
  "type": "basic",
  "conditions": [
    { "input_sources": [{ "language": "ru" }], "type": "input_source_if" }
  ]
}

Это рабочий образец для символов, которых нет в RU-раскладке. Основной минус — короткий визуальный фликер раскладки.

🔴 Проблема: Caps Lock ломает подстановку ?

Запрос (2026-09-15): при нажатии cmd+shift+/ в русской раскладке без Caps вводится ?, при активном Caps Lock вводится Ї.

Диагноз

Манипулятор #13 из группы #7:

{
  "description": "alt+shift+slash -> ? (shift+7)",
  "from": { "key_code": "slash", "modifiers": { "mandatory": ["option", "shift"] } },
  "to": [ { "key_code": "7", "modifiers": ["right_shift"] } ],
  "type": "basic",
  "conditions": [ { "input_sources": [{"language": "ru"}], "type": "input_source_if" } ]
}

Установленные факты:

  1. Клавиши cmd+shift+/ в конфиге НЕТ вообще. Проверено: во всём karabiner.json нет ни одного манипулятора с key_code: "slash" и command в from.modifiers.mandatory (поиск по всем профилям и группам). Есть только два правила на slash: opt+slash и opt+shift+slash. Значит cmd+shift+/ сейчас обрабатывает сама macOS.
  2. key_code: "7" в конфиге не перехватывается — правил с from.key_code == "7" нет (единственные совпадения 7 — это f7, не цифра). То есть на выходе идёт чистый системный 7 + shift.
  3. Механика Caps Lock в RU-раскладке: при активном Caps Lock верхний регистр даёт не ?, а Ї (кириллическая буква). Caps инвертирует действие Shift. Поэтому 7 + right_shift, задуманный как ?, превращается в Ї.

Ключевой вывод

Смена модификатора optioncommand в from проблему Caps Lock НЕ решает. Caps инвертирует шифт одинаково для любого сочетания-триггера. Лечить надо выходную часть (to), а не входную.

План решения (на 2026-09-15 — НЕ применён, ждёт решения Alex)

Причина остановки: план озвучен, но Alex не подтвердил вариант и не ответил на вопрос о сочетании. Правка конфига не вносилась.

Незакрытый вопрос: какое сочетание делаем — cmd+shift+/, opt+shift+/, или оба? (Alex в запросе назвал cmd+shift+/, но в конфиге сейчас opt+shift+/.)

Предложенные шаги:

Шаг 1 — фикс Caps через select_input_source. Заменить to на трёхшаговую цепочку (как в правиле @): переключиться на ABC → slash + right_shift (Shift+/ даёт ? на US-раскладке, и Caps на ? не влияет — Caps влияет только на буквы) → вернуться в RussianWin:

"to": [
  { "select_input_source": { "input_source_id": "com.apple.keylayout.ABC", "language": "en" } },
  { "key_code": "slash", "modifiers": ["right_shift"] },
  { "select_input_source": { "input_source_id": "com.apple.keylayout.RussianWin", "language": "ru" } }
]

Шаг 2 — модификатор во from. ["option","shift"]["command","shift"] для cmd+shift+/; либо продублировать манипулятор, чтобы работали оба сочетания.

Шаг 3 — description переименовать, напр. "cmd+shift+slash -> ? (via ABC)".

Рассматривавшиеся альтернативы:

  • A: to = голый key_code: "7" без shift — работает при Caps, но теряется ?.
  • B (рекомендован): select_input_source через ABC (см. Шаг 1) — стабильный ? независимо от Caps, стилистически совпадает с правилом @.
  • C: вне Karabiner — macOS Text Replacements или skhd.

Процедура правки (когда решение будет принято)

  1. Сверить ~/Documents/karabiner.json и ~/.config/karabiner/karabiner.jsonсначала понять, где свежие правки (md5 разные!).
  2. Бэкап: cp ~/Documents/karabiner.json ~/Documents/karabiner.json.bak.20260915
  3. Правка рабочей копии скриптом через jq (не sed).
  4. Заливка в живой конфиг + права:
    cp ~/Documents/karabiner.json ~/.config/karabiner/karabiner.json
    chmod 644 ~/.config/karabiner/karabiner.json   # ОБЯЗАТЕЛЬНО
    
  5. Проверка: Karabiner подхватывает изменения немедленно, рестарт не нужен. Проверить через EventViewer или набрать сочетание в текстовом поле — при активном Caps Lock тоже.

Pitfalls

  • Права 600 → молчаливый сброс конфига. cp сохраняет режим ИСТОЧНИКА, а не целевого файла. После каждого cp в ~/.config/karabiner/karabiner.jsonchmod 644. Симптомы сброса: Karabiner спрашивает про тип виртуальной клавиатуры, все complex_modifications исчезли.
  • Правила без явного условия Caps Lock. Каждый манипулятор, чей to содержит shift/right_shift, при активном Caps Lock даст другой символ. Для символов, которых нет в RU-раскладке, безопаснее путь через select_input_source → US-раскладку.
  • Именование модификаторов: left_command/right_command (не left_gui); для левого option достаточно option; right_shift/right_option указывать явно.
  • Цепочка select_input_source → key → select_input_source выполняется мгновенно, задержки не нужны, но даёт короткий фликер раскладки.
  • Живой файл и канон разъезжаются — проверять md5 перед правкой.

Input Sources на этой системе

Раскладка Тип ID
ABC (US) Keyboard Layout com.apple.keylayout.ABC
RussianWin Keyboard Layout com.apple.keylayout.RussianWin
Unicode Hex Input Keyboard Layout

Список: defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleEnabledInputSources

Связанные правила по флагам Caps (для справки)

Проверено: ссылок на caps_lock ни в key_code, ни в from/to в конфиге нет (0 совпадений). Условий input_source_if с проверкой модификатора Caps Lock в этой версии Karabiner-конфига не используется.

References