Skip to content

Commit e7bd186

Browse files
author
SqlRush
committed
Preserve mode request params
1 parent ce9617b commit e7bd186

4 files changed

Lines changed: 12 additions & 5 deletions

File tree

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ test/parity/ # golden tests against TS/official behavior
411411
- 本轮补充:terminal CSI parser 把 DECREQTPARM terminal-parameters (`CSI x`) 归入 report action,保留 code/private marker。
412412
- 本轮补充:terminal CSI parser 现在保留 DECREPTPARM/terminal-parameters response 的完整参数列表,例如 `CSI 2;1;1;112;112;1;0x` 不再只留下 report code。
413413
- 本轮补充:terminal CSI parser 把 DECRQM mode request (`CSI Ps $ p` / `CSI ? Ps $ p`) 归入 report action,保留 mode code 和 DEC private marker。
414+
- 本轮补充:terminal CSI parser 现在保留 DECRQM mode-request 的完整参数列表,例如 `CSI ?25;1000$p` 会同时暴露首个 mode code 和原始 params。
414415
- 本轮补充:terminal CSI parser 把 CPR cursor-position responses (`CSI row;col R` / DEC private `CSI ? row;col R`) 归入 report action,结构化暴露 row/column 并保持 visible-text stripping。
415416
- 本轮补充:terminal CSI parser 继续补齐 DEC 私有 DSR/CPR,`CSI ?6n` 现在归入 cursor-position report query,`CSI ?row;col;page R` 会保留 page 元数据。
416417
- 本轮补充:terminal CSI parser 把 xterm window manipulation/report (`CSI t`) 归入 report action,覆盖常见 `CSI 14t`/`CSI 18t` 查询,并把 `CSI 4;height;width t``CSI 8;rows;cols t` 的 pixel/text-area 尺寸参数结构化暴露。

docs/first-second-parity-audit.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ M7 progress now includes:
382382
- `internal/tui`: terminal CSI parsing now preserves the complete parameter list from DECREPTPARM/terminal-parameter responses such as `CSI 2;1;1;112;112;1;0x` instead of dropping fields after the report code.
383383
- `internal/tui`: terminal CSI parsing now preserves the complete code list from multi-parameter DA/device-attributes responses such as `CSI ?62;1;2;6c` instead of dropping capability flags after the first code.
384384
- `internal/tui`: terminal CSI parsing now emits report actions for DECRQM mode requests such as `CSI 4$p` and `CSI ?25$p`, preserving mode code and private marker fields.
385+
- `internal/tui`: terminal CSI parsing now preserves complete DECRQM mode-request parameter lists such as `CSI ?25;1000$p` while keeping the existing first-code field.
385386
- `internal/tui`: terminal CSI parsing now emits report actions for xterm window manipulation/report queries such as `CSI 14t` and `CSI 18t`, preserving code/private marker fields and structured dimensions for `CSI 4;height;width t` and `CSI 8;rows;cols t`.
386387
- `internal/tui`: terminal CSI parsing now preserves complete xterm window report parameter lists such as `CSI 3;x;y t`, `CSI 4;height;width t`, and `CSI 8;rows;cols t` while keeping the existing structured size fields.
387388
- `internal/tui`: terminal CSI parsing now preserves complete DECRPM mode-status parameter lists such as `CSI ?25;2$y` while keeping the existing structured code/status fields.

internal/tui/terminal_csi.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ func ParseCSISequence(sequence string) (CSIAction, bool) {
476476
return CSIAction{Type: CSIActionReset}, true
477477
}
478478
if intermediate == "$" {
479-
return csiModeRequest(csiParamDefault(params, 0, 0), privateMode), true
479+
return csiModeRequest(csiParamDefault(params, 0, 0), params, privateMode), true
480480
}
481481
case CSICommandTerminalParams:
482482
return csiTerminalParameters(rawP0, params, privateMode), true
@@ -653,10 +653,14 @@ func csiWindowReport(params []int, privateMode byte) CSIAction {
653653
}
654654
}
655655

656-
func csiModeRequest(code int, privateMode byte) CSIAction {
656+
func csiModeRequest(code int, params []int, privateMode byte) CSIAction {
657+
report := CSIReportAction{Type: CSIReportActionModeRequest, Code: code, PrivateMode: privateMode}
658+
if len(params) > 1 {
659+
report.Params = append([]int(nil), params...)
660+
}
657661
return CSIAction{
658662
Type: CSIActionReport,
659-
Report: CSIReportAction{Type: CSIReportActionModeRequest, Code: code, PrivateMode: privateMode},
663+
Report: report,
660664
}
661665
}
662666

internal/tui/tui_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5289,6 +5289,7 @@ func TestParseCSISequenceActions(t *testing.T) {
52895289
{seq: CSISequence("?7;8;2R"), want: CSIReportAction{Type: CSIReportActionCursorPosition, PrivateMode: '?', Row: 7, Column: 8, Page: 2}},
52905290
{seq: CSISequence("4$p"), want: CSIReportAction{Type: CSIReportActionModeRequest, Code: 4}},
52915291
{seq: CSISequence("?25$p"), want: CSIReportAction{Type: CSIReportActionModeRequest, Code: 25, PrivateMode: '?'}},
5292+
{seq: CSISequence("?25;1000$p"), want: CSIReportAction{Type: CSIReportActionModeRequest, Code: 25, Params: []int{25, 1000}, PrivateMode: '?'}},
52925293
{seq: CSISequence("4;1$y"), want: CSIReportAction{Type: CSIReportActionModeStatus, Code: 4, Params: []int{4, 1}, Status: 1}},
52935294
{seq: CSISequence("?25;2$y"), want: CSIReportAction{Type: CSIReportActionModeStatus, Code: 25, Params: []int{25, 2}, Status: 2, PrivateMode: '?'}},
52945295
{seq: CSISequence("?25;2;99$y"), want: CSIReportAction{Type: CSIReportActionModeStatus, Code: 25, Params: []int{25, 2, 99}, Status: 2, PrivateMode: '?'}},
@@ -5446,8 +5447,8 @@ func TestParseCSISequenceActions(t *testing.T) {
54465447
t.Fatalf("terminal parser column edit actions = %#v", actions)
54475448
}
54485449

5449-
actions = parser.Feed(CSISequence("?25$p"))
5450-
if len(actions) != 1 || actions[0].Type != TerminalActionReport || actions[0].Report.Type != CSIReportActionModeRequest || actions[0].Report.Code != 25 || actions[0].Report.PrivateMode != '?' {
5450+
actions = parser.Feed(CSISequence("?25;1000$p"))
5451+
if len(actions) != 1 || actions[0].Type != TerminalActionReport || actions[0].Report.Type != CSIReportActionModeRequest || actions[0].Report.Code != 25 || actions[0].Report.PrivateMode != '?' || !reflect.DeepEqual(actions[0].Report.Params, []int{25, 1000}) {
54515452
t.Fatalf("terminal parser mode request actions = %#v", actions)
54525453
}
54535454

0 commit comments

Comments
 (0)