diff options
| -rw-r--r-- | ANSI-DRAW.md | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/ANSI-DRAW.md b/ANSI-DRAW.md index 053428d..7d94baf 100644 --- a/ANSI-DRAW.md +++ b/ANSI-DRAW.md @@ -425,7 +425,7 @@ cargo clippy -- -D warnings - 光标水平移动(MoveLeft / MoveRight):移动的步长 = 当前字符的显示宽度。例如,在宽度为 2 的汉字上按右箭头,光标跳 2 列而非 1 列 - 在输入模式/插入模式下输入字符:输入完成后光标右移的距离 = 该字符的显示宽度 - Backspace(替换模式):将光标处的字符替换为空格后,光标左移的距离 = 被替换字符的显示宽度 -- Backspace(输入模式):将光标左侧的字符替换为空格后,光标左移的距离 = 被替换字符的显示宽度 +- Backspace(输入模式):将光标左侧的字符替换为空格,左移的距离 = 该字符的显示宽度(清除 width 格,左移 width 格) - BackspaceSquash(插入模式):删除光标左侧的字符后,光标左移的距离 = 被删除字符的显示宽度 - 渲染画布时:如果一个字符的宽度为 2,它在终端中占据 2 列。渲染完该字符后,渲染位置跳过 1 列(即同一行的下一个画布坐标,而非终端下一列),以保证后续字符对齐 - 在画布坐标计算中,所有坐标使用「格子索引」而非「终端列数」。即两个相邻格子坐标的差值是 1(不论格子中的字符宽度是多少)。Unicode 宽度只在渲染和光标移动时用于计算终端列数偏移量 @@ -561,13 +561,14 @@ Hello[ ] orld (上次光标在空格,替换空格并左移) ### 输入模式 -按任意字符键,替换光标所在位置的字符,然后光标右移: +按任意字符键,替换光标所在位置的字符,然后光标按字符宽度右移: 1. 将该字符写入光标所在格子(替换原来的字符。颜色保持原样不修改) -2. 光标右移一格(以输入字符的显示宽度为准) -3. 不移动该行其他任何格子 +2. 如果字符的显示宽度 `W` 大于 1,将光标右侧连续 `W - 1` 个格子清空为默认格子(防止宽字符与后续内容视觉重叠) +3. 光标向右移动 `W` 格 +4. 不移动该行其他任何格子 -例如(`[ ]` 表示光标): +例如,单宽字符(`[ ]` 表示光标): ``` Hello,[ ] World 输入 A → @@ -576,11 +577,18 @@ Hello,AB[o]rld 输入 C → Hello,ABCo[r]ld ``` -注意输入模式和替换模式的区别:替换模式光标不移动,输入模式光标右移一格。输入模式和插入模式的区别:输入模式不移动后续字符,插入模式将后续字符全部右移。 +例如,双宽字符: -粘贴(P 键):将剪贴板内容逐个在光标处插入,每插入一个字符光标右移一格。完成后执行 MarkModify。 +``` +[1]23456 输入 '你'(宽度 2)→ +你[3]456 1→你,2 被清空,光标向右跳 2 格指向 3 +``` + +注意输入模式和替换模式的区别:替换模式光标不移动,输入模式光标右移。输入模式和插入模式的区别:输入模式不移动后续字符(仅清空被宽字符占据的格子),插入模式将后续字符全部右移。 + +粘贴(P 键):将剪贴板内容逐个在光标处替换,每替换一个字符光标右移一格(依字符宽度)。完成后执行 MarkModify。 -退格(Backspace 键):将光标**左侧**的格子替换为默认格子(空格、白字黑底),然后执行 MoveLeft 左移光标。不移动行内其他格子。 +退格(Backspace 键):删除光标**左侧**的字符。读取该字符的显示宽度 `W`,将左侧连续 `W` 个格子清空为默认格子,然后光标向左移动 `W` 格。不移动行内其他格子。 效果示例(`[_]` 表示光标): @@ -590,6 +598,13 @@ Hello,ABCo[r]ld 123[_]__7890 ``` +双宽字符退格: + +``` +你[3]456 按 Backspace → +[_]3456 你(宽度 2)被清掉 2 格,光标左移 2 格指向 3 +``` + ### 插入模式 按任意字符键,在光标前方插入一个字符: |
