aboutsummaryrefslogtreecommitdiff
path: root/ANSI-DRAW.md
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-21 22:49:54 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-21 22:49:54 +0800
commit5a924883a29dcdd2d1e105d96b0dccaeea183ba9 (patch)
tree62a43ceaf548d0b69986f9ffe37c4988a0a33708 /ANSI-DRAW.md
parent368ababb633453b2be6c9f207ed4584341c7768b (diff)
docs: update main loop description with IME and event filtering details
Diffstat (limited to 'ANSI-DRAW.md')
-rw-r--r--ANSI-DRAW.md31
1 files changed, 25 insertions, 6 deletions
diff --git a/ANSI-DRAW.md b/ANSI-DRAW.md
index 45f049d..eec5042 100644
--- a/ANSI-DRAW.md
+++ b/ANSI-DRAW.md
@@ -166,18 +166,37 @@ cargo clippy -- -D warnings
- `visual_anchor`:可选的坐标对。仅在选择模式下有值,为进入选择模式时光标所在的位置。退出选择模式时重置为无值
- `cmd_buffer`:字符串,命令输入模式下的输入缓冲区。初始为空字符串
- `msg`:可选的字符串,用于在状态栏右侧显示临时消息。显示一次后应被消费并重置为无值
+- `ime_composing`:布尔值,标记 IME 是否正在组合中。初始为 false
+- `last_key_event`:(仅 Windows)记录上一次按键事件和时间的元组,用于检测重复事件。初始为无值
---
## 主循环
-程序主循环按以下顺序反复执行:
+### 事件驱动架构
-1. **渲染**:根据当前 App 状态绘制一帧画面到终端
-2. **等待输入**:等待一个键盘事件,设置一个合适的超时时间(建议 100 毫秒),使画面能以合理帧率刷新
-3. **解析绑定**:将键盘事件与当前模式一起传入绑定解析函数,得到一组待执行的命令
-4. **执行命令**:按顺序逐一执行这组命令,每条命令可能会修改 App 的任意字段
-5. 回到第 1 步
+主循环使用**阻塞式事件读取**(而非定时轮询),以保证连续按键输入不丢帧、不卡顿。
+
+### 输入缓冲清理
+
+进入主循环前,先执行一次输入缓冲清理:轮询所有已排队的事件并丢弃。这可以防止启动前(如命令执行期间)残留的按键进入编辑器。
+
+### 初始渲染
+
+清理完毕后,执行第一次渲染。
+
+### 事件循环
+
+然后进入循环,反复执行以下步骤:
+
+1. **阻塞等待事件**:调用阻塞的 `event::read()` 等待下一个事件。不设超时
+2. **忽略非按键事件**:`Resize` 事件只更新终端尺寸(重新获取即可),`KeyEventKind::Release`(键盘释放事件)直接忽略
+3. **IME 组合过滤**:如果事件来自 IME 组合过程(控制字符、组合进行中的中间字符),忽略
+4. **重复事件去重**:(仅 Windows)如果同一个按键事件在 20 毫秒内重复到达,忽略第二次。这是 Windows 终端驱动在某些情况下会重复发送同一个事件
+5. **解析绑定**:将键盘事件与当前模式一起传入绑定解析函数,得到一组待执行的命令
+6. **执行命令**:按顺序逐一执行这组命令
+7. **渲染**:渲染一帧
+8. 回到第 1 步
退出条件:`Quit` 命令执行成功后,退出循环并恢复终端。