[2026-09-15] eagle: personal/index.md personal/tech/karabiner-keyboard-config.md
This commit is contained in:
@@ -139,6 +139,7 @@ Hub: [[personal/projects/media-pipeline-tracker-parsers|Media Pipeline Roadmap]]
|
||||
- [[OpenRouter setup|OpenRouter Setup]]
|
||||
- [[openclaw gmail setup|OpenClaw Gmail Setup]]
|
||||
- [[setup SSH macOS VM VirtualBuddy|SSH macOS VM VirtualBuddy]]
|
||||
- [[personal/tech/karabiner-keyboard-config|⌨️ Karabiner — конфиг, раскладки, символы]]
|
||||
- [[personal/music-download-practices|Music Download Practices]]
|
||||
- [[personal/spotify-library|Spotify Library]]
|
||||
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
---
|
||||
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/)
|
||||
Reference in New Issue
Block a user