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で見る