命令行文本编辑器应以状态机驱动交互:输入为命令源,输出为状态反馈,流程控制是二者桥梁;按初始、编辑、查找、保存确认、退出询问等状态划分,各状态仅响应特定输入;标准流分层使用,stdin为命令通道,stdout为视图快照,stderr专用于错误提示;操作遵循“解析→执行→刷新”闭环,文件I/O原子化且有明确反馈。

命令行文本编辑器的关键不在堆砌控制流语句,而在于用清晰的状态流转驱动交互——输入是命令源,输出是状态反馈,流程控制就是这两者之间的逻辑桥梁。
用状态机组织主循环,避免嵌套if堆砌
把编辑过程拆成明确状态:初始空文档、编辑中、查找模式、保存确认、退出前询问。每个状态只响应特定输入,其余忽略或提示无效。
- 用户输入 :q → 进入 EXITING 状态,显示“确定退出?(y/n)”并等待单字符
- 输入 /word → 进入 FINDING 状态,提取 word 并高亮首次匹配行
- 在 EDITING 状态下按方向键,只更新光标变量 cursorRow 和 cursorCol,不触发任何I/O
标准流按语义分层使用,不混用用途
stdin 不是“按键流”,而是带上下文的命令通道;stdout 不是“打印流”,而是当前视图的完整快照;stderr 专用于错误与提示,确保重定向时不影响主界面。
- 读取命令统一用 Scanner.nextLine()(Java)或 std::getline()(C++),避免 scanf/cin 因空格或换行中断解析
- 每次重绘屏幕先输出 \033[2J\033[H(ANSI清屏归位),再逐行打印可视区域内的文本行
- 文件打开失败、非法行号等一律写到 System.err.println() 或 std::cerr
流程控制围绕“操作-反馈-刷新”三步闭环
每一轮用户输入都走固定路径:解析意图 → 执行内存操作 → 更新显示 → 等待下次输入。中间不插入异步或延迟,保证响应可预期。
- 输入 i 进入插入模式:设标志 isInserting = true,后续字符直接拼接到当前行
- 输入 Enter:在当前行后插入新空行,光标移至下一行首列
- 输入 Esc:退出插入模式,清空临时缓冲,回到普通编辑态
- 每次操作后调用 renderView(),只刷新变动部分(如光标位置、当前行内容)
文件I/O作为独立事务,不打断编辑流
读写文件必须原子化、有反馈、可中断。不能让 save 操作卡住整个界面,也不能让 open 失败导致程序崩溃。
- 加载文件时,先用 Files.readAllLines() 一次性读入内存,失败则弹出错误到 stderr 并保持空文档
- 保存时生成临时文件,写入成功后再原子替换原文件,失败则提示“保存失败:磁盘已满”并保留编辑状态
- 所有文件操作完成后,主动打印一行状态:“已保存为 test.txt(12 行)”,不依赖用户猜测是否生效

















