feat(keybindings): вкладка редактирования keyboard shortcuts как в VS Code - #297
Open
tihonove wants to merge 8 commits into
Open
feat(keybindings): вкладка редактирования keyboard shortcuts как в VS Code#297tihonove wants to merge 8 commits into
tihonove wants to merge 8 commits into
Conversation
…erializer KeybindingRegistry учится отдавать свои записи наружу — фундамент вкладки Keyboard Shortcuts: listBindings() со снапшотами, пометка источника записи (default/extension/user) у register(), возврат снятых записей из removeBindings() (для восстановления дефолтов при reset), публичный chordsEqual и serializeChord — сериализатор в spec-форму keybindings.json, обратный parseChord. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
…ns view Связка «InputElement в шапке + ListViewElement со скроллбаром» дублировалась дословно; вкладка Keyboard Shortcuts стала бы третьим потребителем — по конвенции #291 выносим общий контрол. FilteredListControl владеет только проводкой (запрос → onQueryChange, активация строки → onActivateRow, плейсхолдер пустого состояния); строки и модель данных остаются за потребителем. ExtensionsComponent мигрирован; Search не мигрируем (его шапка сложнее связки, потребует слота под доп. элементы) — статус в ListControls.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
Ctrl+K Ctrl+S теперь открывает вкладку Keyboard Shortcuts (VS Code parity): таблица всех команд с колонками Command | Keybinding | When | Source, строка поиска с fuzzy-фильтром и префиксом @source:, команды без биндинга — строками с тире. Прежнее поведение (открыть keybindings.json) уехало в новую команду workbench.action.openGlobalKeybindingsFile, как в VS Code. Вкладка — небуферная панель на FilteredListControl (схема keybindings:, дедуп по uri в openPane); модель строк и раскладка колонок — чистые функции (keybindingsEditorModel.ts, keybindingRows.ts), колонки пересчитываются на смену ширины приёмом ExtensionPageElement. Открытие — через шов KeybindingsEditorTargetDIToken (биндит новый preferencesModule). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
…ingsEditorService
Новый KeybindingsEditorService — единственный владелец user-слоя биндингов:
применяет правила keybindings.json на bootstrap (переезд applyUserKeybindings
из KeybindingDispatcher) и мутирует их из UI — define/remove/reset с
мгновенным применением к реестру И записью в файл. Запись — минимальные
JSONC-правки (keybindingsFileEditor: append/remove через jsonc-parser modify),
комментарии и форматирование пользователя выживают. Замена дефолта — VS
Code-пара «новое правило + -command-unbind»; сессионный леджер (что добавлено,
какие дефолты сняты) даёт reset без Reload Window. Ошибка записи — результат
{ok:false}, не исключение; null-путь (тесты/демо) — честный отказ.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
…uts tab Вкладка Keyboard Shortcuts стала редактором: Enter/двойной клик по строке открывает рекордер «Press desired key combination» — модальный оверлей, копящий части чорда (голый Enter принимает, голый Escape отменяет, Ctrl+Enter и прочие модифицированные — в чорд). Захват — сфокусированный корень со stopPropagation, закрытие — по парному keypress (пиннинг keypress к цели keydown). Контекст-меню строки: Change / Add / Remove / Reset (по леджеру user-правок) / Copy Command ID. Мутации применяются мгновенно и пишутся в keybindings.json; ошибка записи — строкой во вкладке. Терминальная специфика: непереносимая на legacy комбинация (эвристика requiresExtendedKeys) подсвечивается предупреждением, на legacy-tier рекордер несёт постоянную заметку о неразличимых сочетаниях. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
Конфликт-детекция во вкладке Keyboard Shortcuts: записи с одной комбинацией и потенциально пересекающимся when (отсутствующий when пересекается с любым, непустые сравниваются нормализованной строкой — честное упрощение, не SAT) подсвечиваются в колонке Keybinding цветом предупреждения. Chord-префиксы (ctrl+k против ctrl+k ctrl+s) конфликтом не считаются — их резолвер решает детерминированно. Фильтр @conflicts отбирает конфликтующие записи, пункт контекст-меню «Show Conflicts» сеет его с комбинацией строки — аналог VS Code «Show Same Keybindings». Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
Функциональный e2e (настоящий бинарь): открытие вкладки, поиск, запись биндинга рекордером с проверкой keybindings.json на диске и исполнения команды по новой комбинации в том же сеансе, фильтр @conflicts. Скриншот-демо keyboardShortcuts.scenario.ts — кадры tab / filter / conflicts / recorder (последний ловит и подсветку конфликта, и предупреждение legacy-терминала). Комментарий preferencesMenu.scenario обновлён под новую команду «Keyboard Shortcuts (JSON)». Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
Preferences-кластер в Workbench.md (вкладка, рекордер, сервис, конфликты, FilteredListControl), обновлена заметка про UI настроек в Configuration.md, добавлены KeybindingsEditor.md и строка в трекер. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvNGh9MrQQcDWGbrkmt8sR
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что
Вкладка редактирования keyboard shortcuts как в VS Code. Ctrl+K Ctrl+S теперь открывает UI-таблицу всех команд (
Command | Keybinding | When | Source) с поиском, рекордером комбинаций и конфликт-детекцией; самkeybindings.json— отдельной командойworkbench.action.openGlobalKeybindingsFile(VS Code parity).Скоуп (один PR, 8 коммитов)
refactor(keybinding)— реестр отдаёт записи наружу:listBindings()со снапшотами, источник (default/extension/user), возврат снятых записей изremoveBindings,serializeChord(обратныйparseChord), публичныйchordsEqual.refactor(workbench)— вынесен общий контролFilteredListControl(«поиск + список»), Extensions мигрирован на него (третий потребитель по конвенции feat(lsp): find all references — панель ссылок в сайдбаре #291).feat(keybindings)— read-only вкладка: модель и раскладка колонок чистыми функциями, схемаkeybindings:, дедуп по uri.feat(keybindings)—KeybindingsEditorService: применяетkeybindings.jsonна bootstrap (переезд изKeybindingDispatcher) и мутирует из UI (define/remove/reset) с мгновенным применением к реестру и записью JSONC (комментарии сохраняются). Сессионный леджер даёт reset без Reload Window.feat(keybindings)— рекордер «нажмите комбинацию» (модальный оверлей, закрытие по парному keypress), контекст-меню Change/Add/Remove/Reset/Copy/Show Conflicts, предупреждение о непереносимых на legacy-терминале комбинациях.feat(keybindings)— конфликт-детекция (та же комбинация + пересекающийся when) + фильтр@conflicts.test(e2e)— функциональный e2e на настоящем бинаре + скриншот-демо.docs— Workbench.md, Configuration.md, трекер.Осознанно НЕ в этом PR
File-watcher на keybindings.json (ручные правки — после Reload Window, как и раньше; откатываемый user-слой не строим), валидатор keybindings.json в редакторе, миграция Search на общий контрол. Детали и упрощения (конфликт-детекция по равенству when, порядок после reset) — в
docs/TODO/KeybindingsEditor.md.Демо
Кадр рекордера ловит сразу и подсветку конфликта (две строки на
Ctrl+Sцветом предупреждения:File: Save/Default иSelect All/User), и оверлей рекордера с заметкой про legacy-терминал.Сценарий-демо:
e2e/scenarios/keyboardShortcuts.scenario.ts(кадры tab / filter / conflicts / recorder).Проверки
npm run test:coverage— 100% (храповик).npm run valid-layers-check— OK (contract в common / impl в node / биндинг в diode).npm run test:e2e— функциональный сьют и сценарий зелёные.npm run test:mutation— прогоняется.🤖 Generated with Claude Code