CPLAT-12440: keep the pre-rebind shortcut keys working as aliases - #169
Merged
Merged
Conversation
CPLAT-12413 moved ten actions off bare uppercase letters because a 2-set Korean layout cannot produce them — K/J arrive as ㅏ/ㅓ, which the langmap turns into lowercase k/j (list up/down), so the uppercase binding was genuinely unreachable. That much was right. What it got wrong was treating the rebind as a swap rather than an addition. Terminal apps are usually driven in English, where K/J worked fine and had been the region-nav keys since CPLAT-10969. Replacing them took a working binding away from everyone not typing in Korean, and the migration rewrote their config.yaml so they could not fall back either. It surfaced as "shift+hjkl used to move between resources and execution contexts and now does nothing". Both groups can have it. The new key stays the default and the one the help shows; the old key is accepted as an alias: session V D -> v d actions F M X -> b a z conversation A K J L I -> a ctrl+p ctrl+n ctrl+l w preview F -> u config/plugins reverse search N -> b resolveLegacyKey(scope, key) rewrites an old key to whatever triggers that action now. It runs once per view, past the text-input and pane-proxy guards, so a pre-rebind key typed into a filter or forwarded to tmux stays literal. An alias is skipped when that key is bound to something else in the same scope, so a user's own override always wins rather than being shadowed. The region-nav help row shows "^P / ^N (K/J)" while the defaults are in effect, since K/J is the spelling fingers reach for. Three guards, each verified by removing an alias and confirming the test fails. TestLegacyAliasesCoverEveryRebind ties the alias table to the migration table in state.go, so a future rebind cannot quietly drop a key people still press. Region nav is also exercised end-to-end through the real Update loop with both spellings.
|
| Commit | Scanned at | New | Resolved | Net |
|---|---|---|---|---|
c833db4 < |
2026-09-29 04:42 UTC | 0 | 0 | 0 |
Last scanned: c833db4 · 2026-09-29 04:42 UTC
|
| Commit | Scanned at | New | Resolved | Net |
|---|---|---|---|---|
c833db4 < |
2026-09-29 04:42 UTC | 0 | 0 | 0 |
Last scanned: c833db4 · 2026-09-29 04:42 UTC
Kairo-Kim
approved these changes
Sep 29, 2026
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.
JIRA: https://sendbird.atlassian.net/browse/CPLAT-12440
Regression from #167 (CPLAT-12413), reported as "shift+hjkl used to switch between resources / execution contexts and now doesn't".
What #167 got right, and what it got wrong
It moved ten actions off bare uppercase letters because a 2-set Korean layout genuinely cannot produce them —
K/Jarrive asㅏ/ㅓ, which the langmap turns into lowercasek/j(list up/down), so the uppercase binding was unreachable. I re-verified that; it holds.The mistake was treating the rebind as a swap rather than an addition. Terminal apps are usually driven in English, where
K/Jworked fine and had been the region-nav keys since CPLAT-10969. Replacing them took a working, muscle-memory binding away from everyone not typing in Korean — and the migration rewrote theirconfig.yaml, so they could not fall back either.Both groups can have it
The new key stays the default and the one the help shows; the old key is accepted as an alias.
V,Dv,dF,M,Xb,a,zA,K,J,L,Ia,ctrl+p,ctrl+n,ctrl+l,wFuNbresolveLegacyKey(scope, key)rewrites an old key to whatever triggers that action now. It runs once per view, past the text-input and pane-proxy guards, so a pre-rebind key typed into a filter or forwarded to tmux stays literal. An alias is skipped when that key is bound to something else in the same scope, so a user's own override always wins rather than being shadowed.The region-nav help row shows
^P / ^N (K/J)while the defaults are in effect, sinceK/Jis the spelling fingers reach for.Test plan
go build ./... && go vet ./... && go test ./...greenTestLegacyKeysStillWork— every moved key resolves to its replacement; unrelated keys pass through untouchedTestLegacyAliasYieldsToUserBinding— an alias never shadows a key the user bound themselvesTestLegacyAliasesCoverEveryRebind— ties the alias table to the migration table instate.go, so a future rebind cannot quietly drop a key people still pressUpdateloop with both spellings (K/ctrl+p,J/ctrl+n) against the existing conversation fixtureㅏ/ㅓ->k/j, never uppercaseNotes for reviewers
migrateKeymapDefaults's rewrite list.TestLegacyAliasesCoverEveryRebindasserts that relationship rather than leaving the two to drift.scopeKeysis only built when an alias actually matches, so the common path is one map lookup.config.yamlwas rewritten by CPLAT-12413: make shortcuts reachable under a Korean input source #167's migration keep the new key and regain the old one; no further migration needed.Security checklist
0.0.0.0/0inbound