第 5 章 · 02 光标与模式:致敬 Vim 本节摘要:有了缓冲区,下一步是「用户怎么操作」。本节讲两件事:光标的逻辑位置(第几行第几列)与终端物理坐标的换算;以及模式设计——重点讲 Vim 风格的 normal/insert 双模式为什么是「效率神器」。理解模式,你不仅会造一个能编辑的编辑器,更懂得为什么 Vim/Emacs 这类「老古董」至今无可替代。 内容来源:基于编辑器设计整理的导读。 学习目标 阅读完本节,你应当能够: 说清光标的「逻辑位置」(行号、列号)与「物理位置」(终端坐标)的换算。 处理光标的边界情况:行尾、空行、长行折行。 解释 Vim 风格的 normal/insert 双模式为什么提升效率。
本节摘要:有了缓冲区,下一步是「用户怎么操作」。本节讲两件事:光标的逻辑位置(第几行第几列)与终端物理坐标的换算;以及模式设计——重点讲 Vim 风格的 normal/insert 双模式为什么是「效率神器」。理解模式,你不仅会造一个能编辑的编辑器,更懂得为什么 Vim/Emacs 这类「老古董」至今无可替代。
内容来源:基于编辑器设计整理的导读。
阅读完本节,你应当能够:
很多人觉得 Vim 难学,是因为它的模式反直觉——「为什么按 i 才能打字?」。但模式的真正价值是:让双手不离开主键区,把导航、删除、复制、粘贴都变成高效按键组合。
无模式编辑器(如记事本),你要不断伸手去够方向键、鼠标、Ctrl 组合;Vim 的 normal 模式,hjkl 在主键区,dd 删行、yy 复制、p 粘贴,全不用离键。长期用下来速度差异巨大。本节带你体会这个设计,并在你的编辑器里实现一个简化版。
(row, col)——第几行(从 0)、该行第几字符。(y, x) 坐标。换算:y = row + 顶部偏移(滚动)、x = col + 左边距。光标移动要同时更新逻辑位置与物理位置(后者通过终端转义码移动)。
Normal 模式: 默认, 按键是"命令"(导航/删除/复制) h/j/k/l: 左下上右 w/b: 下一词/上一词 gg/G: 文件首/尾 dd: 删整行 yy/p: 复制行/粘贴 i/a/o: 进入 insert(光标前/后/下方新行) Insert 模式: 按键是"输入字符" 字符直接插入缓冲区 Esc: 回到 normal Command 模式(可选): :w :q 等命令
模式状态机:normal 为默认;按 i/a/o 进 insert;insert 里 Esc 回 normal。每个模式下按键语义不同。
无模式:导航用方向键(伸手)、删除用退格(定位+多次按)、复制粘贴要鼠标选中。Vim normal:导航 hjkl(主键区)、删行 dd(两键)、复制行 yy+粘贴 p。所有高频操作都在主键区,手指不离位。
mode 变量(normal/insert)。下一节讲文件 IO 与原子性保存。