From 40532a8ed793a308b142b12aa000fe3845cb42f7 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 15 Sep 2026 13:22:44 +0600 Subject: [PATCH] [2026-09-15] eagle: personal/tech/karabiner-keyboard-config.md --- personal/tech/karabiner-keyboard-config.md | 50 ++++++++++++++++++---- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/personal/tech/karabiner-keyboard-config.md b/personal/tech/karabiner-keyboard-config.md index 14a1e83b..7fb8653f 100644 --- a/personal/tech/karabiner-keyboard-config.md +++ b/personal/tech/karabiner-keyboard-config.md @@ -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 ` + проверку `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` текущего в `.rolledback.`; (2) сверить `devices[]`, число правил, размер; (3) только потом заливать. В этой сессии откат на `.bak.20260915` **без страховки и сверки** убил 43 app-комбо и потребовал возврата `.new`. +- **Не строить вывод на одном источнике, если он противоречит остальным.** Трижды подряд гипотеза («нет обвязки в бэкапе» → «devices нет в `.new`» → «права отозваны») опровергалась следующим же `jq`-запросом. Прежде чем объявлять причину — проверять её сразу двумя независимыми фактами. +- **Проверка бандлов через `osascript -e "id of app"` даёт ложноотрицательный результат** — в этой системе вернула «НЕ НАЙДЕН» для всех, включая работающие. Для проверки приложения: `open -b ` + `pgrep -x `. +- **`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 перед правкой.