[2026-09-15] eagle: personal/tech/karabiner-keyboard-config.md
This commit is contained in:
@@ -10,7 +10,7 @@ tags:
|
||||
- caps-lock
|
||||
- devices-remap
|
||||
created: 2026-09-15T00:00:00.000Z
|
||||
updated: 2026-09-15T00:00:00.000Z
|
||||
updated: 2026-09-15T13:10:00.000Z
|
||||
---
|
||||
|
||||
# Karabiner-Elements — конфиг, раскладки, символы
|
||||
@@ -40,9 +40,11 @@ updated: 2026-09-15T00:00:00.000Z
|
||||
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-фикса НЕ решена.**
|
||||
На момент первой правки Caps-фикса откат выполнялся: живой конфиг был = `~/Documents/karabiner.json.bak.20260915`, md5 `2ad1f7e1c8c8807739b636cc0650a527`, права `644`. Правило `#13` группы `#7` — в исходном виде (`to` = `7`+`right_shift`, `from.mandatory` = `["option","shift"]`). **Задача Caps-фикса НЕ решена.**
|
||||
|
||||
⚠️ **Это состояние УСТАРЕЛО.** Во второй сессии Alex приказал вернуть `.new` — актуальный статус см. в разделе «Файловое состояние (актуально, после возврата `.new` в 13:06)» ниже по документу.
|
||||
|
||||
## 🔴🔴 ГЛАВНАЯ НАХОДКА: `right_control` ремапнут в `devices[].simple_modifications`
|
||||
|
||||
@@ -97,10 +99,23 @@ updated: 2026-09-15T00:00:00.000Z
|
||||
|
||||
### ⚠️ Что НЕ является причиной
|
||||
|
||||
- «`to` содержит `shell_command`, значит не может печатать символы» — **верно технически, но это следствие, не причина.** `shell_command` просто не даёт вывода в раскладку; `≈` приходит из системы, потому что матч провалился. Не путать: сам факт `shell_command` не ломает запуск приложения.
|
||||
- **Права Input Monitoring / Accessibility у Karabiner.** Проверялось и **опровергнуто фактом**: модификаторные правила работают, значит Karabiner нажатия видит. `core_service.log` содержит перемежающиеся `core_service_daemon_client connect_failed: Permission denied`, но каждая такая запись завершается `is connected` — это штатный ре-коннект сокета после sleep/wake, **не** отозванные права. Не путать с поломкой.
|
||||
- **`shell_command` не может печатать символы** — верно технически, но это следствие, не причина. `shell_command` просто не даёт вывода в раскладку; `≈` приходит из системы, потому что матч провалился. Сам факт `shell_command` запуск приложения не ломает.
|
||||
- **Несуществующий бандл приложения.** Проверено: `open -b com.apple.dt.xcode` → exit 0, Xcode запускается. Команда из правила валидна. Ошибка в логе `shell_command stderr: ... Photoshop CC 2018.app does not exist` относится к другому, действительно удалённому приложению.
|
||||
- **Проверка бандлов через `osascript -e "id of app \"$b\""`** — **недостоверна** в этой системе: вернула «НЕ НАЙДЕН» для всех бандлов, включая рабочие. Не использовать этот способ как доказательство отсутствия приложения; применять `open -b <id>` + проверку `pgrep`.
|
||||
- Отсутствие `optional: caps_lock` — к `right_control`-комбо отношения не имеет.
|
||||
- Права 644 / md5 канона и живого — были в порядке, конфиг не сбрасывался.
|
||||
|
||||
### 📋 Диагностика: где смотреть факты
|
||||
|
||||
| Источник | Путь | Что даёт |
|
||||
|---|---|---|
|
||||
| Лог console_user_server | `~/.local/share/karabiner/log/console_user_server.log` | `Load ...karabiner.json` + `core_configuration is updated` (подхват конфига), `shell_command stderr` (ошибки команд) |
|
||||
| Лог core_service | `~/.local/share/karabiner/log/core_service.log` | sleep/wake, ре-коннекты сокета, `Permission denied` (обычно штатный ре-коннект) |
|
||||
| EventViewer | GUI Karabiner-Elements | есть ли событие нажатия вообще (единственный способ отличить «права» от «правила») |
|
||||
|
||||
Проверка, подхватил ли Karabiner правку: `tail -3 ~/.local/share/karabiner/log/console_user_server.log` — должна появиться строка `core_configuration is updated` (свежая правка подхватывается без рестарта, обычно в ту же секунду).
|
||||
|
||||
### Пути решения (обсуждались, ждут выбора Alex)
|
||||
|
||||
**Вариант A — вернуть `.new` (текущее рабочее состояние, ремапа нет):**
|
||||
@@ -115,17 +130,30 @@ chmod 644 ~/.config/karabiner/karabiner.json
|
||||
|
||||
**Статус: НЕ применено. Ждёт команды Alex.**
|
||||
|
||||
### Файловое состояние на конец второй сессии
|
||||
### Файловое состояние (актуально, после возврата `.new` в 13:06)
|
||||
|
||||
Alex приказал вернуть `.new` на место — канон и живой снова = рабочая версия.
|
||||
|
||||
| Файл | md5 | Размер | Роль |
|
||||
|---|---|---|---|
|
||||
| `~/Documents/karabiner.json` | `2ad1f7e1c8c8807739b636cc0650a527` | 155 937 | канон (откаченный, app-комбо мертвы) |
|
||||
| `~/.config/karabiner/karabiner.json` | `2ad1f7e1c8c8807739b636cc0650a527` | 155 937, права **644** | живой = канон |
|
||||
| `~/Documents/karabiner.json.new` | `4f643933f9565330fd2111973c865563` | 96 877 | **рабочая версия, app-комбо живы** |
|
||||
| `~/Documents/karabiner.json.bak.20260915` | `2ad1f7e1c8c8807739b636cc0650a527` | 155 937 | бэкап, на который откатились |
|
||||
| `~/Documents/karabiner.json` | `4f643933f9565330fd2111973c865563` | 96 877 | **канон — рабочая версия** |
|
||||
| `~/.config/karabiner/karabiner.json` | `4f643933f9565330fd2111973c865563` | 96 877, права **644** | живой = канон, подхвачен в 13:06:21 (`core_configuration is updated`) |
|
||||
| `~/Documents/karabiner.json.new` | `4f643933f9565330fd2111973c865563` | 96 877 | источник возврата (теперь дубль канона) |
|
||||
| `~/Documents/karabiner.json.rolledback.20260915` | `2ad1f7e1c8c8807739b636cc0650a527` | 155 937 | **страховка: откаченное состояние** (ремап `right_control→right_option` внутри) |
|
||||
| `~/Documents/karabiner.json.bak.20260915` | `2ad1f7e1c8c8807739b636cc0650a527` | 155 937 | бэкап, на который откатывались |
|
||||
| `~/Documents/karabiner.json.bak.20260915.keep` | `2ad1f7e1c8c8807739b636cc0650a527` | 155 937 | страховочная копия бэкапа |
|
||||
| `~/Documents/karabiner.json.bak` | `44ca420798be5ab38ff3c1d54c1c6fb9` | 153 847, Jun 15 | старый бэкап |
|
||||
|
||||
**Процедура возврата `.new` (выполнена):**
|
||||
```bash
|
||||
cp -p ~/Documents/karabiner.json ~/Documents/karabiner.json.rolledback.20260915 # страховка текущего
|
||||
cp -p ~/Documents/karabiner.json.new ~/Documents/karabiner.json
|
||||
cp -p ~/Documents/karabiner.json ~/.config/karabiner/karabiner.json
|
||||
chmod 644 ~/.config/karabiner/karabiner.json
|
||||
```
|
||||
|
||||
**Статус задачи app-комбо на конец сессии:** конфиг возвращён на рабочую версию, но Alex **не подтвердил**, что комбо ожили. Если `≈` остаётся и на `4f643933…` — гипотеза о ремапе `devices[]` неполна, и следующий шаг: смотреть живой лог `console_user_server.log` **сразу после нажатия** `right_control+x` (там пишутся `shell_command stderr`), плюс EventViewer.
|
||||
|
||||
## Структура профиля (на 2026-09-15)
|
||||
|
||||
Один профиль: `Default profile`, `selected=true`. `simple_modifications` — пустой (0). Все правила — в `complex_modifications.rules[]`.
|
||||
@@ -320,6 +348,10 @@ Alex в изначальном запросе назвал комбинацию
|
||||
- **Не менять модификатор в `to` вслепую.** RussianWin **не является** аналогом US-раскладки: `opt+7` там = `&`, а не `?`. Замена `right_shift` → `right_option` в `to` даёт мусорный символ. Сначала проверить, что реально лежит на позиции в раскладке.
|
||||
- **Не править конфиг без подтверждённого диагноза.** Определить, ломается ли матч `from` или инвертируется выход `to` — можно только фактом (EventViewer / прямой ответ пользователя). Гадание между `from` и `to` в первой сессии привело к порче раскладки и откату.
|
||||
- **Не мешать кириллицу с ASCII в shell-командах.** Поиск кириллических `key_code` строкой в `jq` (`== "х"`) блокируется tirith как `confusable_text`. Использовать регулярку по диапазону: `test("[^\\x00-\\x7F]")` — без кириллицы в командной строке.
|
||||
- **Перед ДЕСТРУКТИВНЫМ откатом — сначала скопировать текущее состояние, потом сверить структуру.** Приказ откатить конфиг на бэкап исполнять так: (1) `cp -p` текущего в `<file>.rolledback.<date>`; (2) сверить `devices[]`, число правил, размер; (3) только потом заливать. В этой сессии откат на `.bak.20260915` **без страховки и сверки** убил 43 app-комбо и потребовал возврата `.new`.
|
||||
- **Не строить вывод на одном источнике, если он противоречит остальным.** Трижды подряд гипотеза («нет обвязки в бэкапе» → «devices нет в `.new`» → «права отозваны») опровергалась следующим же `jq`-запросом. Прежде чем объявлять причину — проверять её сразу двумя независимыми фактами.
|
||||
- **Проверка бандлов через `osascript -e "id of app"` даёт ложноотрицательный результат** — в этой системе вернула «НЕ НАЙДЕН» для всех, включая работающие. Для проверки приложения: `open -b <bundle-id>` + `pgrep -x <App>`.
|
||||
- **`connect_failed: Permission denied` в `core_service.log` — не признак отозванных прав.** Это штатный ре-коннект сокета после sleep/wake; следующая строка всегда `is connected`. Настоящую потерю прав проверять только EventViewer'ом.
|
||||
- **Именование модификаторов:** `left_command`/`right_command` (не `left_gui`); для левого option достаточно `option`; `right_shift`/`right_option` указывать явно.
|
||||
- **Цепочка `select_input_source` → key → `select_input_source`** выполняется мгновенно, задержки не нужны, но даёт короткий фликер раскладки.
|
||||
- **Живой файл и канон разъезжаются** — проверять md5 перед правкой.
|
||||
|
||||
Reference in New Issue
Block a user