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

218 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: tech
topic: keyboard
tags:
- karabiner
- keyboard
- macos
- input-sources
- russian-layout
created: 2026-09-15T00:00:00.000Z
updated: 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, набрать, вернуться):
```json
{
"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:
```json
{
"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`, задуманный как `?`, превращается в `Ї`.
### Ключевой вывод
**Смена модификатора `option` → `command` в `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:
```json
"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. Заливка в живой конфиг + права:
```bash
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.json` → `chmod 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
- [Karabiner select_input_source](https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/to/select-input-source/)
- [KE complex_modifications JSON spec](https://karabiner-elements.pqrs.org/docs/json/complex-modifications-manipulator-definition/basic/)