Skip to content

feat(page-mode): add native vim key sequence grammar and accessibility spike - #365

Open
bnema wants to merge 21 commits into
nextfrom
feat/native-vim-mode-tranche-1-2a
Open

feat(page-mode): add native vim key sequence grammar and accessibility spike#365
bnema wants to merge 21 commits into
nextfrom
feat/native-vim-mode-tranche-1-2a

Conversation

@bnema

@bnema bnema commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Vim mode natif — tranche 1 (grammaire clavier) et socle de la tranche 2a (spike accessibilité CEF).

Cette PR est empilée sur next, après le merge de Page Mode (#364).

Périmètre

Le vim mode absorbe Page Mode plutôt que de coexister avec lui : même ModePage, même Ctrl+Y, même arbre de config. Aucun mode nouveau.

Ce que la PR livre :

  • internal/domain/vimkeys — lexer, trie et matcher purs. C'est la brique manquante : ParseKeyString ne connaît que les chords séparés par +, donc 3j, ]], yah, <C-d> étaient hors de portée.
  • La config workspace.page_mode.actions accepte désormais des séquences multi-touches, avec sequence_timeout_ms et détection de collision sur la forme canonique (<CR>/<Return>, J/shift+j collisionnent).
  • Le dispatch GTK en PhaseCapture, avant que les touches n'atteignent le widget OSR.
  • L'état pending rendu dans le modeToaster existant : PAGE MODE · yPAGE MODE · yaPAGE MODE. Aucun widget créé.
  • Côté CEF : AccessibilityHandler installé au wrap du render handler, capture gated par DUMBER_A11Y_CAPTURE=1, activation idempotente une fois par WebView.

Ce que la PR ne livre pas, volontairement : aucune motion structurelle n'agit. SetOnSequenceAction est défini mais non câblé. Une séquence complétée met à jour le toaster et rien d'autre. Les hints, le curseur de bloc et le visual mode appartiennent aux tranches 2b à 5, qui ne seront planifiées qu'après la porte de mesure 2a.

Points d'attention pour la revue

  • Le handler a11y doit être non-nil dès le wrap. purego-cef n'installe l'override GetAccessibilityHandler que si le handler est non-nil au moment du wrap du RenderHandler. Retourner nil « en attendant » condamne définitivement la callback et rend SetAccessibilityState silencieusement sans effet.
  • WriteJson reste dans la callback UI, un seul appel FFI ; capture, stats et écriture disque partent sur une goroutine dédiée via une queue bornée non bloquante.
  • La composition renderer est intacte : popup_opener_renderer.go et renderer_bridge.go ne sont pas touchés, aucune extension V8 ni OnWebKitInitialized réactivé.
  • AccessibilityEnabler est une capacité optionnelle, pas un élargissement de l'interface WebView commune à WebKit — même modèle que PageScrollCanceler.
  • Limitation assumée : 2]] transporte un count, 3j retombe sur le scroll legacy sans l'appliquer. Le trie ne possède que les séquences que le lexer legacy ne sait pas lire ; les liaisons simples restent dans le chemin Page Mode existant. L'unification appartient à la tranche 2b.

Vérifications

Gate Résultat
make test 0 échec
golangci-lint run --new-from-rev=origin/next 0 issue
Couverture internal/domain/vimkeys 95,9 %
Pureté domaine (go list -deps) aucune dép. gdk/gtk/glib/purecef/ui/infrastructure
Commits signés 21/21

Validation runtime par le propriétaire le 2026-07-31, build CEF réel : Ctrl+Y entre en Page Mode, y puis a font vivre le toaster, yah se complète sans que le h final ne scrolle vers la gauche, j/k scrollent comme avant, Escape annule sans effet de bord.

Compatibilité

Changement additif. Aucune assertion préexistante retirée ni affaiblie — deux modifications de tests seulement, toutes deux prévues par le plan : le compteur assert.Len(t, bindings, 8) passe à 19 (les huit assertions historiques restent), et une liste de variables locales est étendue pour couvrir sequence_timeout_ms et preload_accessibility.

Les configs existantes restent valides : une liaison à un seul atome avec modificateurs est exactement le cas chord actuel.

Suite

La phase 5 du plan — la campagne de mesure 2a sur cinq pages réelles — reste à exécuter. Elle tranchera les deux inconnues structurelles dont dépendent les tranches 2b à 5 : les rects de OnAccessibilityLocationChange, et l'espace de coordonnées des bounding boxes.

Copilot AI review requested due to automatic review settings July 31, 2026 13:12

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 39 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: e64ac793-8e17-4a82-ae19-46c7a1312d79

📥 Commits

Reviewing files that changed from the base of the PR and between c649a8d and 91ce1d1.

📒 Files selected for processing (36)
  • internal/application/port/webview.go
  • internal/domain/entity/config_types.go
  • internal/domain/vimkeys/key.go
  • internal/domain/vimkeys/key_test.go
  • internal/domain/vimkeys/matcher.go
  • internal/domain/vimkeys/matcher_test.go
  • internal/domain/vimkeys/parse.go
  • internal/domain/vimkeys/parse_test.go
  • internal/domain/vimkeys/trie.go
  • internal/domain/vimkeys/trie_test.go
  • internal/infrastructure/cef/accessibility_capture.go
  • internal/infrastructure/cef/accessibility_capture_test.go
  • internal/infrastructure/cef/accessibility_enable_test.go
  • internal/infrastructure/cef/accessibility_handler.go
  • internal/infrastructure/cef/accessibility_handler_test.go
  • internal/infrastructure/cef/accessibility_trace.go
  • internal/infrastructure/cef/accessibility_trace_test.go
  • internal/infrastructure/cef/factory.go
  • internal/infrastructure/cef/render_handler_adapter.go
  • internal/infrastructure/cef/webview.go
  • internal/infrastructure/cef/webview_handlers.go
  • internal/infrastructure/config/defaults.go
  • internal/infrastructure/config/loader.go
  • internal/infrastructure/config/page_mode_config_test.go
  • internal/infrastructure/config/schema_provider.go
  • internal/infrastructure/config/schema_provider_test.go
  • internal/infrastructure/config/validation.go
  • internal/ui/app.go
  • internal/ui/app_browser_launch_test.go
  • internal/ui/app_page_mode_test.go
  • internal/ui/input/keyboard.go
  • internal/ui/input/shortcuts.go
  • internal/ui/input/vimkeys_bridge.go
  • internal/ui/input/vimkeys_bridge_test.go
  • internal/ui/input/vimkeys_dispatch.go
  • internal/ui/input/vimkeys_dispatch_test.go

Comment @coderabbitai help to get the list of available commands.

@bnema

bnema commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants