跳过正文
  1. Posts/

Vim 学习笔记 Day 001:编辑心智模型与模式,不再一写就乱

·3322 字·7 分钟
📖 阅读 --
DogDu
作者
DogDu
工作结束或者累了, 要不休息一会, 看会动漫吧 ~
目录
Vim 14 天 - 这篇文章属于一个选集。
§ 1: 本文

今日主题
#

  • 主主题:编辑心智模型与模式
  • 副主题:为什么普通模式才是主工作模式

学习目标
#

  • 解决“会进入 Vim,但一写就乱”的根因。
  • 明确 Vim 不是“随时都在输入文字”的编辑器,而是“先操作,再短暂输入”的编辑器。
  • 分清普通模式、插入模式、命令行模式各自负责什么。
  • 建立一个足够稳定的最小工作流:
    • 进入文件
    • 移动
    • 短暂插入
    • 退出插入
    • 保存 / 退出

前置回顾
#

  • Day 000 已经明确:
    • 主线目标是最终落到 nvim + LazyVim
    • 但前几天必须先把 vim 的底层编辑手感打稳
  • 当前本地环境已确认:
    • Vim 9.2
    • Neovim 0.12.0
    • vimtutor 可用
  • 所以 Day 001 仍先站在 vim 的最小编辑心智上,把最基础但最关键的手感讲清楚。

典型场景
#

这一篇要解决的是真实里最常见的几种混乱:

  • 打开文件后总想立刻输入,于是频繁卡在插入模式里乱删乱改。
  • 想移动到别处修改,结果先按了一堆方向键,再重新进插入。
  • 每次改动都像“重新打字”,而不是“先定位、再修改”。
  • 不确定自己现在到底处于哪种模式,按键结果总和预期不一致。

如果这些问题不解决,后面学更多命令只会更乱。

最小命令集
#

今天只保留最小集合,不追求多。

模式相关
#

  • Esc
    • 回到普通模式
  • i
    • 在光标前进入插入模式
  • a
    • 在光标后进入插入模式
  • o
    • 在当前行下方新开一行并进入插入模式

最小移动
#

  • h j k l
    • 左、下、上、右

最小编辑
#

  • x
    • 删除当前字符
  • u
    • 撤销
  • Ctrl-r
    • 重做刚才撤销的改动

保存与退出
#

  • :w
    • 保存
  • :q
    • 退出
  • :wq
    • 保存并退出
  • :q!
    • 不保存强制退出

它是怎么用的
#

核心心法:普通模式不是“退出态”,而是“工作态”
#

很多初学者会把 Vim 想成:

  • 进入编辑器
  • 赶紧进入插入模式
  • 像普通文本框一样一直打字

这正是“越写越乱”的起点。

Vim 更像这样工作:

  1. 先在普通模式观察和定位
  2. 决定接下来要做什么
  3. 只在需要输入新文字的那一小段时间进入插入模式
  4. 输入结束后立刻回到普通模式

所以普通模式不是“还没开始编辑”,而是“真正开始编辑”的地方。

插入模式应该短,不应该长住
#

插入模式当然重要,但它在 Vim 里更像是一个短暂停留区:

  • 想补几个字,用 i
  • 想接着当前字符后写,用 a
  • 想另起一行,用 o

输入完成就按 Esc 回来。

如果你长期待在插入模式里,会发生两件事:

  • 你会退化成“终端里的普通文本输入”
  • 你会失去 Vim 最值钱的地方:操作和移动的分离

uCtrl-r:让你敢于先动手,再回退
#

Day 001 虽然还没开始讲更复杂的编辑语法,但撤销和重做应该当天就会。

本地 undo.txt 里最基础的两条就是:

  • u
    • 撤销上一次 change
  • Ctrl-r
    • 把刚才撤销掉的 change 重做回来

它们的价值不只是“出错后补救”,而是让你更敢于练习:

  • 试一次 i
  • 补几处字
  • Esc
  • 发现不对就 u
  • 想拿回来就 Ctrl-r

先把这条保护绳建立起来,后面学移动、operator + motion、Visual 时都会更稳。

命令行模式负责“编辑器命令”,不是文本编辑
#

像下面这些命令:

  • :w
  • :q
  • :wq

它们不属于普通模式,也不属于插入模式,而是通过 : 进入的命令行模式。

这里的心智模型很简单:

  • 普通模式:移动和操作文本
  • 插入模式:输入文字
  • 命令行模式:对编辑器本身下命令

先把这三者职责分清,混乱会立刻少一半。

常见操作套路
#

套路 1:改几个字,而不是“重新输入一整段”
#

错误直觉:

  • 先用方向键蹭过去
  • 一直待在插入模式
  • 删一点、补一点、再挪一点

更稳的方式:

  1. Esc 确认回到普通模式
  2. h j k l 移动到目标位置
  3. ia 进入插入模式
  4. 输完就 Esc

这就是 Vim 最基本的工作节奏。

套路 2:发现自己乱了,先按 Esc
#

很多时候你不需要先分析错在哪,只需要先做一件事:

  • Esc

它的作用不是“取消一切”,而是“把你拉回可控状态”。

把这个反应练出来非常重要:

  • 不确定当前在哪个模式
  • 按键结果不对
  • 编辑节奏乱了

先按 Esc,再继续。

套路 3:保存和退出要分开理解
#

  • :w 是保存,不退出
  • :q 是退出,如果有未保存内容可能会失败
  • :wq 是保存并退出
  • :q! 是放弃修改并退出

不要把它们混成一团。第一天只需要先分清楚这四个就够了。

环境差异:vim / nvim / LazyVim
#

在今天这个主题上,三者的核心心智模型是一样的
#

无论是:

  • vim
  • nvim
  • nvim + LazyVim

普通模式、插入模式、命令行模式的基本职责并不会变。

这也是为什么 Day 001 先学 vim 完全合理。

当前本地环境的实际情况
#

  • 本地已确认有:
    • Vim 9.2
    • Neovim 0.12.0
    • vimtutor
  • 所以本篇虽然以 vim 为事实锚点,但在 nvim 里同样成立。

到了 LazyVim,模式不会消失
#

很多人误以为装了 LazyVim 之后就主要是记快捷键。其实不是。

LazyVim 只是给你:

  • 更现代的文件搜索
  • buffer 管理
  • 项目导航
  • LSP 工作流

但底层编辑动作仍然建立在今天讲的模式心智模型上。

今日练习(5-10 分钟)
#

今天的练习目标不是快,而是稳。

练习材料
#

随便新建一个文本文件,写入下面内容:

TXT 代码 · 共 3 行
today i want to learn vim
vim feels strange at first
but i want to stop editing in chaos

练习任务
#

  1. vim 打开这个文件。
  2. 不用方向键,只用 h j k l 在三行之间移动。
  3. 把第一行的 want 后面补上 really
  4. 把第二行行尾补上 for me
  5. 在第三行下面新开一行,输入:
TXT 代码 · 共 1 行
normal mode should be my default mode
  1. 故意在任意一行多输入几个字,再用 u 撤销一次,用 Ctrl-r 重做一次。
  2. 每做完一小步,都按一次 Esc 确认自己回到普通模式。
  3. 最后用 :wq 保存退出。

完成标准
#

  • 能清楚感受到“普通模式 -> 短暂插入 -> 再回普通模式”的节奏。
  • 能在乱掉时用 Esc 把自己拉回稳定状态。
  • 能把 u / Ctrl-r 当成练习时的安全网。
  • 不再把插入模式当作默认常驻模式。

今日问题与讨论
#

我的问题
#

问题 1:为什么一开始只学这么少的命令?
#

  • 简答:
    • 因为今天的核心不是扩大命令量,而是纠正编辑心智模型。
  • 场景:
    • 一上来学太多命令,最后还是卡在“我现在到底该不该先按 Esc”这种基本问题上。
  • 依据:
    • 当前阶段的目标是“不再一写就乱”,不是“命令数量增长”。
  • 当前结论:
    • Day 001 的成功标准不是会更多,而是更稳。
  • 是否需要后续回看:

问题 2:为什么 Esc 这么重要?
#

  • 简答:
    • 因为它是从混乱状态回到可控状态的最短路径。
  • 场景:
    • 不确定当前模式、误输入、编辑节奏断掉时。
  • 依据:
    • 本地 vim 实际行为与 Vim 基本模式设计。
  • 当前结论:
    • 把“乱了先 Esc”练成条件反射,是后续所有章节的基础。
  • 是否需要后续回看:
    • 到后面进入更复杂操作时仍然会反复用到。

问题 3:普通模式是不是只负责移动?
#

  • 简答:
    • 不是。普通模式既负责移动,也负责发起删除、复制、修改等操作。
  • 场景:
    • 初学者容易把普通模式理解成“移动模式”,然后一改东西就立刻钻进插入模式。
  • 依据:
    • Vim 的设计本身就是在普通模式里组织编辑动作。
  • 当前结论:
    • 普通模式是主工作模式,不只是导航模式。
  • 是否需要后续回看:
    • Day 003 的 operator + motion 会把这件事讲透。

外部高价值问题
#

问题 1:为什么有时按一次 u,会把刚才整段输入一起撤掉?
#

  • 问题:
    • 我只是刚才连续输入了一小段文字,为什么 u 会把这一段一起撤掉,而不是只撤一个字符?
  • 简答:
    • 因为 Vim 基础撤销默认按 change 工作,不是按字符工作;一次插入模式往往会形成一个 change。
  • 场景:
    • 你按 i 进入插入模式,连续打了一句,再按 Esc,随后按 u
  • 依据:
    • 本地 undo.txt
    • D:\program\Learn-Vim\ch10_undo.md
  • 当前结论:
    • Day 001 先记住 u / Ctrl-r 就够了;如果以后需要把长输入拆成更细的撤销块,再补 Ctrl-G u
  • 是否需要后续回看:

常见误区或易混点
#

  • 误区 1:进入 Vim 后应该马上进插入模式
    • 更稳的顺序是先观察和定位,再短暂插入。
  • 误区 2:普通模式只是拿来移动
    • 实际上它是后续所有编辑动作的组织中心。
  • 误区 3:一乱了就继续乱按
    • 更好的策略是先 Esc,再重新开始。
  • 误区 4::wq:q:q! 都差不多
    • 它们处理未保存修改的语义并不一样。

扩展内容
#

  • A / I / O
    • 仍然属于 Day 001 这一层的高频插入入口,只是主线先保留 i / a / o
  • Ctrl-G u
    • 在插入模式里主动打断 undo block,适合长段输入时分段撤销。
  • g- / g+ / :undolist
    • 用来回看更旧或更新的文本状态,先知道 Vim 的撤销不是只有一条直线。
  • vimtutor
    • 如果你想额外做入门练习,它仍然是不错的补充材料。

今日小结
#

Day 001 最重要的不是命令表,而是一句判断:

  • 普通模式是默认工作模式
  • 插入模式是短暂停留的输入模式

只要这件事真的建立起来,后面学习移动、删除、修改、文本对象时,手感会好很多;如果这件事没建立,后面学再多也容易退回“终端里打字”。

明日衔接
#

下一步建议进入:

  • Day 002:移动:从“硬挪”到“直接到位”

重点会开始真正解决:

  • 为什么 h j k l 还不够
  • 为什么按词、按行、按文件移动才是真正的提速点
  • 怎样减少“方向键式移动”

复习题
#

  1. 为什么说普通模式不是退出态,而是工作态?
  2. 为什么插入模式应该短,而不应该长住?
  3. 当你不确定自己现在状态对不对时,第一反应应该是什么?
  4. :w:q:wq:q! 分别代表什么?
  5. 为什么今天先不追求学更多命令,而是先追求更稳的节奏?
Vim 14 天 - 这篇文章属于一个选集。
§ 1: 本文