diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-07-21 22:57:54 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-07-21 22:57:54 +0800 |
| commit | 718d82e7261de03f97b3278925085171bab72a9a (patch) | |
| tree | 4e3c8cec2e0e5b46155f9d30dbef8f0de461c3b1 | |
| parent | 5a924883a29dcdd2d1e105d96b0dccaeea183ba9 (diff) | |
docs: clarify Backspace behavior for input vs replace modes
| -rw-r--r-- | ANSI-DRAW.md | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/ANSI-DRAW.md b/ANSI-DRAW.md index eec5042..053428d 100644 --- a/ANSI-DRAW.md +++ b/ANSI-DRAW.md @@ -424,7 +424,8 @@ cargo clippy -- -D warnings - 光标水平移动(MoveLeft / MoveRight):移动的步长 = 当前字符的显示宽度。例如,在宽度为 2 的汉字上按右箭头,光标跳 2 列而非 1 列 - 在输入模式/插入模式下输入字符:输入完成后光标右移的距离 = 该字符的显示宽度 -- Backspace(替换和输入模式):将光标处的字符替换为空格后,光标左移的距离 = 被删除字符的显示宽度 +- Backspace(替换模式):将光标处的字符替换为空格后,光标左移的距离 = 被替换字符的显示宽度 +- Backspace(输入模式):将光标左侧的字符替换为空格后,光标左移的距离 = 被替换字符的显示宽度 - BackspaceSquash(插入模式):删除光标左侧的字符后,光标左移的距离 = 被删除字符的显示宽度 - 渲染画布时:如果一个字符的宽度为 2,它在终端中占据 2 列。渲染完该字符后,渲染位置跳过 1 列(即同一行的下一个画布坐标,而非终端下一列),以保证后续字符对齐 - 在画布坐标计算中,所有坐标使用「格子索引」而非「终端列数」。即两个相邻格子坐标的差值是 1(不论格子中的字符宽度是多少)。Unicode 宽度只在渲染和光标移动时用于计算终端列数偏移量 @@ -479,7 +480,7 @@ cargo clippy -- -D warnings | Yank | y | 复制光标所在位置的格子(字符、前景色、背景色)到剪贴板的 `cell` 字段,同时清空剪贴板的 `cells` 字段 | 无区别 | 无 | | Paste | p | 将剪贴板内容粘贴到当前光标所在位置。行为依当前模式而定(见各模式下的粘贴描述) | 无区别 | 见下方「Paste 后处理规则」 | | BackspaceSquash | 无简写 | 删除光标左侧格子,将光标及右侧的本行所有格子左移一格填补空缺。自身不移动光标 | 无区别 | 执行 MarkModify,然后执行 MoveLeft 命令移动光标 | -| Backspace | 无简写 | 将光标所在位置的格子替换为默认格子(空格、白字黑底),然后将光标左移一格(以被替换字符的宽度为准,但坐标减 1) | 无区别 | 执行 MoveLeft | +| Backspace | 无简写 | 替换格子为默认格子,然后左移光标。替换的目标取决于当前模式:替换模式替换光标所在格子,输入模式替换光标左侧格子 | 无区别 | 执行 MoveLeft | | ModeInsert | 无简写 | 切换到插入模式 | 无区别 | 无 | | ModeInput | 无简写 | 切换到输入模式 | 无区别 | 无 | | ModeReplace | 无简写 | 切换到替换输入模式 | 无区别 | 无 | @@ -560,24 +561,34 @@ Hello[ ] orld (上次光标在空格,替换空格并左移) ### 输入模式 -按任意字符键,在光标所在位置插入一个字符: +按任意字符键,替换光标所在位置的字符,然后光标右移: -1. 将该字符写入光标所在格子 -2. 将光标右侧本行的所有格子向右移动一个位置(从最右侧开始逐一右移,或者用更高效的插入方式,只要能保证字符正确插入且后续字符不丢失) -3. 光标右移一格(以输入字符的显示宽度为准) +1. 将该字符写入光标所在格子(替换原来的字符。颜色保持原样不修改) +2. 光标右移一格(以输入字符的显示宽度为准) +3. 不移动该行其他任何格子 例如(`[ ]` 表示光标): ``` Hello,[ ] World 输入 A → -Hello,A[ ]World 输入 B → -Hello,AB[W]orld 输入 C → -Hello,ABC[o]rld +Hello,A[W]orld 输入 B → +Hello,AB[o]rld 输入 C → +Hello,ABCo[r]ld ``` +注意输入模式和替换模式的区别:替换模式光标不移动,输入模式光标右移一格。输入模式和插入模式的区别:输入模式不移动后续字符,插入模式将后续字符全部右移。 + 粘贴(P 键):将剪贴板内容逐个在光标处插入,每插入一个字符光标右移一格。完成后执行 MarkModify。 -退格(Backspace 键):将光标所在位置替换为默认格子,然后执行 MoveLeft。行为同替换输入模式。 +退格(Backspace 键):将光标**左侧**的格子替换为默认格子(空格、白字黑底),然后执行 MoveLeft 左移光标。不移动行内其他格子。 + +效果示例(`[_]` 表示光标): + +``` +12345[_]7890 按 Backspace → +1234[_]_7890 按 Backspace → +123[_]__7890 +``` ### 插入模式 @@ -587,10 +598,10 @@ Hello,ABC[o]rld 2. 将光标及光标右侧本行的所有格子向右移动一个位置 3. 光标右移一格(以输入字符的显示宽度为准) -与输入模式的区别:输入模式下光标位于已插入字符之后,后续字符向右被推;插入模式下光标位于新字符之前,光标本身也被右移。效果对比如下: +与输入模式的区别:输入模式下不移动后续字符,仅替换光标处字符然后右移光标;插入模式下将光标及后续字符全部右移后再写入新字符,光标也右移。效果对比如下: -输入模式:`Hello,[ ] World` → 输入 `A` → `Hello,A[ ]World` -插入模式:`Hello,[ ] World` → 输入 `A` → `Hello,A[ ] World` +输入模式:`Hello,[ ] World` → 输入 `A` → `Hello,A[W]orld`(W 在原位,被光标指到) +插入模式:`Hello,[ ] World` → 输入 `A` → `Hello,A[ ] World`(全部右移,光标仍指向空格) 粘贴(P 键):将剪贴板内容逐个在光标前方插入,光标右移。完成后执行 MarkModify。 |
