aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ANSI-DRAW.md31
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
+```
+
### 插入模式
按任意字符键,在光标前方插入一个字符: