[2026-09-15] eagle: personal/tech/karabiner-keyboard-config.md
This commit is contained in:
@@ -7,6 +7,7 @@ tags:
|
||||
- macos
|
||||
- input-sources
|
||||
- russian-layout
|
||||
- caps-lock
|
||||
created: 2026-09-15T00:00:00.000Z
|
||||
updated: 2026-09-15T00:00:00.000Z
|
||||
---
|
||||
@@ -22,20 +23,25 @@ updated: 2026-09-15T00:00:00.000Z
|
||||
| `~/Documents/karabiner.json` | **Рабочая копия** (канон, редактируется) |
|
||||
| `~/.config/karabiner/karabiner.json` | **Живой** конфиг — его читает Karabiner |
|
||||
| `~/Documents/karabiner.json.bak` | Бэкап рабочей копии |
|
||||
| `~/Documents/karabiner.json.bak.20260915` | Бэкап перед первой правкой Caps-фикса (md5 `2ad1f7e1c8c8807739b636cc0650a527`) |
|
||||
| `~/.config/karabiner/assets/complex_modifications/*.json` | Импортированные наборы правил (не редактируются вручную) |
|
||||
|
||||
### ⚠️ Расхождение канона и живого файла (обнаружено 2026-09-15)
|
||||
|
||||
На 2026-09-15 **рабочая копия и живой конфиг РАЗЛИЧАЮТСЯ**:
|
||||
На 2026-09-15 при первом осмотре **рабочая копия и живой конфиг РАЗЛИЧАЛИСЬ**:
|
||||
|
||||
| Файл | md5 | Права |
|
||||
| Файл | 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 не совпадают → либо рабочая копия старше живого, либо правки вносились только в живой. **Перед любой правкой сверить содержимое** (не заливать рабочую копию поверх живого слепо — потеряются правки, которые есть только в живом).
|
||||
1. Живой конфиг имел права **600** вместо нужных **644**. По известному поведению Karabiner это прямой риск: при restrictive-правах Karabiner **молча сбрасывает конфиг на дефолт** (спрашивает про тип виртуальной клавиатуры, все complex_modifications пропадают). Обязательно `chmod 644` после каждого `cp`. **Статус: исправлено** — после правок живой файл приведён к `644`.
|
||||
2. md5 не совпадали → расхождение канона и живого. Причина не установлена; `~/.config/karabiner/karabiner.json` меньшего размера (111 KB) чем канон (156 KB), в нём присутствуют лишние файлы-артефакты (`karabiner new.json`, `karabiner.json.06072026.bak`). После правок канон и живой были синхронизированы (`cp` канон→живой). **Перед любой правкой сверять содержимое, не заливать канон поверх живого слепо.**
|
||||
|
||||
### Состояние файлов на конец сессии 2026-09-15
|
||||
|
||||
Откат выполнен: живой конфиг = `~/Documents/karabiner.json.bak.20260915`, md5 `2ad1f7e1c8c8807739b636cc0650a527`, права `644`. Правило `#13` группы `#7` — в исходном виде (`to` = `7`+`right_shift`, `from.mandatory` = `["option","shift"]`). **Задача Caps-фикса НЕ решена.**
|
||||
|
||||
## Структура профиля (на 2026-09-15)
|
||||
|
||||
@@ -124,41 +130,83 @@ updated: 2026-09-15T00:00:00.000Z
|
||||
|
||||
## 🔴 Проблема: Caps Lock ломает подстановку `?`
|
||||
|
||||
**Запрос (2026-09-15):** при нажатии `cmd+shift+/` в русской раскладке без Caps вводится `?`, **при активном Caps Lock вводится `Ї`**.
|
||||
**Запрос (2026-09-15):** в русской раскладке `opt+shift+/` без Caps вводит `?`, **при активном Caps Lock вводит `Ї`**.
|
||||
|
||||
### Диагноз
|
||||
### ✅ Диагноз (ПОДТВЕРЖДЁН Alex, 2026-09-15)
|
||||
|
||||
Манипулятор #13 из группы #7:
|
||||
**Правило не срабатывает при активном Caps Lock.** Подтверждено Alex напрямую.
|
||||
|
||||
Следствие: нажатие не перехватывается манипулятором, уходит в систему напрямую, и RussianWin отдаёт свой **стандартный символ** на позиции `opt+shift+/` — это и есть `Ї`. `Ї` — не результат инверсии выхода `to`, а именно «сырой» системный символ, который возникает, когда Karabiner пропускает нажатие.
|
||||
|
||||
Это подтверждается и косвенно: если бы правило срабатывало, на выход пошёл бы `7`+shift, и Caps инвертировал бы его в другой символ — но не в `Ї`.
|
||||
|
||||
### ⚠️ Что НЕ является причиной
|
||||
|
||||
- **Смена модификатора `option` → `command` в `from`** — не имеет отношения к делу, комбинация-триггер тут не при чём.
|
||||
- **Инверсия выхода `to` под Caps** — этой гипотезы придерживался агент в первой части сессии, она **неверна**. Лечить надо входную часть (`from`), а не выходную (`to`).
|
||||
|
||||
### Правка (подготовлена, ждёт подтверждения Alex)
|
||||
|
||||
Добавить `caps_lock` в **`optional`** модификаторы `from`, оставив `mandatory` нетронутым:
|
||||
|
||||
```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" } ]
|
||||
"from": {
|
||||
"key_code": "slash",
|
||||
"modifiers": {
|
||||
"mandatory": ["option", "shift"],
|
||||
"optional": ["caps_lock"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Установленные факты:
|
||||
**Почему именно так (важно, не повторить ошибку):**
|
||||
- **`shift` НЕЛЬЗЯ переводить из `mandatory` в `optional`.** Shift — часть combo `opt+shift+/`. Если сделать его опциональным, правило начнёт срабатывать и на `opt+/`, что сломает соседнее правило `opt+slash -> /`. Это предложение агента было ошибочным, Alex его отклонил.
|
||||
- `mandatory: ["option","shift"]` остаётся как есть — оба обязательны.
|
||||
- Активный Caps перестаёт блокировать матч за счёт его явного указания в `optional`.
|
||||
- `to` (`7`+`right_shift`), `conditions`, `description` — не трогать.
|
||||
|
||||
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`, задуманный как `?`, превращается в `Ї`.
|
||||
**Незакрытый риск:** Alex поставил вопрос — не инвертирует ли Caps и выход `to` (`7`+`right_shift`)? Если при Caps правило сработает, но на выходе снова получится не `?` — потребуется дополнительно сбрасывать Caps в `to`. Определяется только проверкой фактом после применения.
|
||||
|
||||
### Ключевой вывод
|
||||
### Ошибки агента в этой сессии — НЕ повторять
|
||||
|
||||
**Смена модификатора `option` → `command` в `from` проблему Caps Lock НЕ решает.** Caps инвертирует шифт одинаково для любого сочетания-триггера. Лечить надо выходную часть (`to`), а не входную.
|
||||
| Что было сделано | Результат | Вывод |
|
||||
|---|---|---|
|
||||
| Замена `to.modifiers`: `right_shift` → `right_option` | Вместо `?` пошёл `&` | В RussianWin `opt+7` = `&`. Менять модификатор в `to` вслепую нельзя — раскладка не является аналогом US |
|
||||
| Замена `from.modifiers.mandatory`: `["option","shift"]` → `["option"]` + `optional:["shift"]` | Не применено (черновик) | Сломало бы `opt+/` — shift обязателен, он часть combo |
|
||||
| Гипотеза «Caps инвертирует выход `to`» | Неверна | Реальная причина — матч `from` не проходит |
|
||||
|
||||
### План решения (на 2026-09-15 — НЕ применён, ждёт решения Alex)
|
||||
**Корневая ошибка:** агент дважды правил конфиг **без подтверждённого диагноза**, гадая между `from` и `to`. Оба раза мимо; первая правка попала в живой конфиг и сломала Alex раскладку (`&`), пришлось откатывать. **Правило: не править, пока причина не подтверждена фактом (EventViewer / прямой ответ Alex).**
|
||||
|
||||
**Причина остановки:** план озвучен, но Alex не подтвердил вариант и не ответил на вопрос о сочетании. **Правка конфига не вносилась.**
|
||||
### Процедура правки (когда решение будет принято)
|
||||
|
||||
Незакрытый вопрос: какое сочетание делаем — `cmd+shift+/`, `opt+shift+/`, или оба? (Alex в запросе назвал `cmd+shift+/`, но в конфиге сейчас `opt+shift+/`.)
|
||||
1. Сверить `~/Documents/karabiner.json` и `~/.config/karabiner/karabiner.json` — **сначала понять, где свежие правки** (md5 разные!).
|
||||
2. Бэкап: `cp ~/Documents/karabiner.json ~/Documents/karabiner.json.bak.20260915`
|
||||
3. Правка рабочей копии через `jq` (не sed, не in-place). **Проверить diff изменённых путей** — должен измениться ровно один путь:
|
||||
```bash
|
||||
/usr/bin/jq '.profiles[0].complex_modifications.rules[7].manipulators[13].from.modifiers
|
||||
= {"mandatory":["option","shift"],"optional":["caps_lock"]}' \
|
||||
~/Documents/karabiner.json > /tmp/k.json \
|
||||
&& /usr/bin/jq -e . /tmp/k.json > /dev/null \
|
||||
&& diff <(/usr/bin/jq -r 'paths(scalars) as $p | "\($p|join("."))=\(getpath($p))"' ~/Documents/karabiner.json) \
|
||||
<(/usr/bin/jq -r 'paths(scalars) as $p | "\($p|join("."))=\(getpath($p))"' /tmp/k.json)
|
||||
```
|
||||
Индексы: группа `"Russian symbol keys"` = **7**, правило `alt+shift+slash -> ? (shift+7)` = **13**.
|
||||
4. Заливка в живой конфиг + права:
|
||||
```bash
|
||||
cp /tmp/k.json ~/Documents/karabiner.json
|
||||
cp ~/Documents/karabiner.json ~/.config/karabiner/karabiner.json
|
||||
chmod 644 ~/.config/karabiner/karabiner.json # ОБЯЗАТЕЛЬНО
|
||||
```
|
||||
5. Проверка: Karabiner подхватывает изменения немедленно, рестарт не нужен. Набрать `opt+shift+/` при **включённом Caps** → должно быть `?`; при выключенном → тоже `?` (регрессии быть не должно).
|
||||
6. **Откат:**
|
||||
```bash
|
||||
cp ~/Documents/karabiner.json.bak.20260915 ~/.config/karabiner/karabiner.json
|
||||
chmod 644 ~/.config/karabiner/karabiner.json
|
||||
```
|
||||
|
||||
Предложенные шаги:
|
||||
### Альтернатива, если фикс через `optional: caps_lock` не сработает
|
||||
|
||||
**Шаг 1 — фикс Caps через `select_input_source`.** Заменить `to` на трёхшаговую цепочку (как в правиле `@`): переключиться на ABC → `slash` + `right_shift` (Shift+/ даёт `?` на US-раскладке, и **Caps на `?` не влияет** — Caps влияет только на буквы) → вернуться в RussianWin:
|
||||
Заменить `to` на трёхшаговую цепочку через ABC-раскладку (как в правиле `@`): переключиться на ABC → `slash` + `right_shift` (Shift+/ = `?` на US, Caps на пунктуацию не влияет) → вернуться в RussianWin:
|
||||
|
||||
```json
|
||||
"to": [
|
||||
@@ -168,34 +216,27 @@ updated: 2026-09-15T00:00:00.000Z
|
||||
]
|
||||
```
|
||||
|
||||
**Шаг 2 — модификатор во `from`.** `["option","shift"]` → `["command","shift"]` для `cmd+shift+/`; либо продублировать манипулятор, чтобы работали оба сочетания.
|
||||
Минус — короткий фликер раскладки. Применять только если `optional: caps_lock` не даёт результата.
|
||||
|
||||
**Шаг 3 — `description`** переименовать, напр. `"cmd+shift+slash -> ? (via ABC)"`.
|
||||
### Черновик правки `to` (собран, НЕ применён)
|
||||
|
||||
Рассматривавшиеся альтернативы:
|
||||
- **A:** `to` = голый `key_code: "7"` без shift — работает при Caps, но теряется `?`.
|
||||
- **B (рекомендован):** `select_input_source` через ABC (см. Шаг 1) — стабильный `?` независимо от Caps, стилистически совпадает с правилом `@`.
|
||||
- **C:** вне Karabiner — macOS Text Replacements или `skhd`.
|
||||
Файл `/tmp/k3.json` — версия с `to` через ABC. В живой конфиг и канон **не заливался**. `diff` показал изменение только путей внутри `manipulators.13.to`.
|
||||
|
||||
### Процедура правки (когда решение будет принято)
|
||||
### Терминологическая поправка
|
||||
|
||||
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 тоже.
|
||||
Alex в изначальном запросе назвал комбинацию `cmd+shift+/`, но фактическое правило в конфиге — `opt+shift+/` (`alt+shift+slash`). Правила на `cmd+shift+/` в конфиге **нет вообще** (проверено: ни одного манипулятора с `key_code: "slash"` + `command` в `mandatory`). Работаем с существующим правилом `opt+shift+/`.
|
||||
|
||||
## 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-раскладку.
|
||||
- **Правила без явного условия Caps Lock.** Каждый манипулятор, чей `from` содержит `shift`, при активном Caps Lock **может перестать матчиться вообще** — нажатие уходит в систему и раскладка отдаёт свой стандартный символ (для `opt+shift+/` в RussianWin это `Ї`). Лечится добавлением `"optional": ["caps_lock"]` в `from.modifiers`, не трогая `mandatory`.
|
||||
- **Не переводить `shift` из `mandatory` в `optional`.** Если shift — часть combo (как в `opt+shift+/`), это расширит правило на более короткое сочетание (`opt+/`) и сломает соседнее правило.
|
||||
- **Не менять модификатор в `to` вслепую.** RussianWin **не является** аналогом US-раскладки: `opt+7` там = `&`, а не `?`. Замена `right_shift` → `right_option` в `to` даёт мусорный символ. Сначала проверить, что реально лежит на позиции в раскладке.
|
||||
- **Не править конфиг без подтверждённого диагноза.** Определить, ломается ли матч `from` или инвертируется выход `to` — можно только фактом (EventViewer или прямой ответ пользователя). Гадание между `from` и `to` в этой сессии привело к порче раскладки и откату.
|
||||
- **Именование модификаторов:** `left_command`/`right_command` (не `left_gui`); для левого option достаточно `option`; `right_shift`/`right_option` указывать явно.
|
||||
- **Цепочка `select_input_source` → key → `select_input_source`** выполняется мгновенно, задержки не нужны, но даёт короткий фликер раскладки.
|
||||
- **Живой файл и канон разъезжаются** — проверять md5 перед правкой.
|
||||
- **Перед применением правки проверять diff `jq paths(scalars)`** — должен измениться ровно ожидаемый путь и ничего больше. Это ловит и ошибку индекса, и случайные изменения.
|
||||
|
||||
## Input Sources на этой системе
|
||||
|
||||
@@ -209,7 +250,7 @@ updated: 2026-09-15T00:00:00.000Z
|
||||
|
||||
## Связанные правила по флагам Caps (для справки)
|
||||
|
||||
Проверено: ссылок на `caps_lock` ни в `key_code`, ни в `from`/`to` в конфиге **нет** (0 совпадений). Условий `input_source_if` с проверкой модификатора Caps Lock в этой версии Karabiner-конфига не используется.
|
||||
Проверено на 2026-09-15: ссылок на `caps_lock` ни в `key_code`, ни в `from`/`to` в конфиге **нет** (0 совпадений). Ни один манипулятор не декларирует Caps в `optional` — именно поэтому Caps-состояние ломает матчинг у правил, где `shift` обязателен.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
Reference in New Issue
Block a user