pending-wrap-resolution
Pattern for resolving PendingWrap before forward cursor movement in the terminal Writer
来源信息
- 仓库
- Thraka/SadConsole
- 最近来源活动
- 2026年4月2日 22:51
- 检测到的 SKILL.md 语言
- 英语
- 星标
- 1,383
- 分支
- 128
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- pending-wrap-resolution
- description
- Pattern for resolving PendingWrap before forward cursor movement in the terminal Writer
- domain
- terminal-writer
- confidence
- high
- source
- audit
## Context
The SadConsole terminal Writer uses a deferred-wrap model (PendingWrap flag) per ECMA-48 §7.1. When the cursor reaches the right margin, the wrap is deferred until the next printable character. Cursor-movement handlers must decide whether to just clear the flag (most handlers) or resolve the wrap first (advance to next line, col 0).
## Pattern: Forward-Movement PendingWrap Resolution
Any handler that moves the cursor **forward along the line** (increasing column) must **resolve** PendingWrap, not just clear it. Without resolution, forward movement from the right margin is clamped to `width-1` → a no-op.
### Detection Rule
A handler is AT RISK if:
1. It moves the cursor forward (increasing column index)
2. The movement is relative to the current position
3. The target is clamped at `width - 1`
### Fix Template
```csharp
case 'X': // Forward-moving handler
if (State.PendingWrap && State.AutoWrap)
{
State.PendingWrap = false;
State.CursorColumn = 0;
LineFeed();
}
else
{
State.PendingWrap = false;
}
ApplyForwardMovement(Param(parameters, 0, 1));
break;
```
### Handlers That Need This
- CUF (CSI C) — forward cursor movement
- CHT (CSI I) — forward tab
- C0 HT (0x09) — tab character
### Handlers That Do NOT Need This
- Absolute positioning (CUP, CHA, VPA, DECSTBM, DECOM) — target is independent of current position
- Backward/vertical relative (CUU, CUD, CUB, CNL, CPL, CBT) — movement from right margin is meaningful, not clamped
## Anti-Patterns
- **Blanket PendingWrap=false in dispatcher epilogue** — this is the opt-out model that caused the original b5-ans01.ans bug. Each handler manages its own PendingWrap clearing.
- **Just clearing PendingWrap for forward movement** — clearing without resolution makes forward movement from the right margin a no-op.
## Examples
See `Writer.cs` CUF handler (case 'C'), CHT handler (case 'I'), and C0 HT in OnC0Control for the canonical implementations.
在 GitHub 查看