Lecture 3_Editors(vim)
Overview
本视频([00:00])是“Missing Semester”课程的第三讲,其核心论题是:对于程序员而言,文本编辑器是至关重要的工具,而 vim 是一款设计精良、功能强大且影响深远的模态编辑器 [03:06]。视频的结论是,尽管 vim 存在一定的学习曲线 [01:26],但其独特的“模态编辑”理念 [04:52] 和“将接口视为编程语言”的设计哲学 [19:32],使得程序员一旦熟练掌握,就能极大提升编辑效率,实现“以思考的速度编辑代码” [20:16]。视频强烈建议投入时间学习 vim,因为这种投资将在整个职业生涯中带来巨大的回报 [00:12, 48:03]。
按照主题来梳理
主题一:为什么选择 Vim?—— 程序员的编辑器哲学
本讲座首先探讨了为什么程序员需要专门的文本编辑器 [00:30]。与撰写普通文章(如使用 Microsoft Word)不同,编程涉及大量非线性的活动:阅读代码、在文件各处导航、以及进行小范围的精确修改 [00:37]。因此,为编程而设计的编辑器(如 vim, Emacs, VS Code 等)针对这些活动进行了优化。
讲座选择了 vim 作为教学工具,原因有三 [03:12]:
-
讲师的偏好与经验:所有讲师都长期使用
vim作为主要编辑器,并对其效果非常满意 [03:17]。 -
核心思想的价值:
vim背后蕴含着许多有趣且强大的设计思想 [03:23]。即使学习者未来不以vim为主,理解这些思想本身也极具价值。 -
广泛的影响力:
vim的理念非常成功,以至于许多其他流行的工具都支持“vim 仿真模式” (vim emulation mode) [03:35]。例如,VS Code中(当时)最流行的vim插件已有约 140 万次下载 [03:43]。这种模式还存在于 Shell、Python REPL、Jupyter Notebook 甚至浏览器中 [03:56]。
讲座强调了学习 vim 的心态 [01:02]:
-
克服初期障碍:刚开始切换到
vim这样的复杂工具时,效率可能会暂时下降 [01:26]。 -
坚持投入:讲师估计,大约需要 20 小时的编程练习,学习者就能恢复到原来的编辑速度 [01:38]。
-
终身学习:
vim易于上手基础,但需要“一生去精通” (a lifetime to master) [01:49]。关键在于,当感觉操作效率低下时,要主动查找更好的方法(例如使用 Google 或寻求帮助)[02:01],因为这些工具是“程序员为程序员编写的” [02:05],你遇到的问题几乎总有现成的解决方案。
主题二:Vim 的基石 —— 模态编辑 (Modal Editing)
vim 最核心且最与众不同的理念是“模态编辑” [04:52]。这意味着编辑器有多种操作“模式” (mode),每种模式下,键盘按键的含义完全不同 [04:54]。这是基于“编程时会做不同类型事情”的观察(如阅读、小幅修改、大量输入)[05:00]。
-
Normal Mode (普通模式):
-
Insert Mode (插入模式):
-
Command-line Mode (命令行模式):
-
Visual Mode (可视化模式):
-
Replace Mode (替换模式):
由于 Esc 键在模式切换中至关重要 [08:40],而它在现代键盘上位置偏僻,许多 vim 用户会重映射 (rebind) Caps Lock (大写锁定键) 来充当 Esc,因为它在主行 (home row) 上,更易于访问 [08:50]。
主题三:Vim 基础操作 —— 启动、保存与 Buffer 概念
掌握了模式切换后,你需要知道如何执行最基本的文件操作。这通常在命令行模式(按 :)下完成:
-
启动 Vim:在 shell 中输入
vim启动程序 [09:28],或输入vim <filename>(如vim editors.MD) 来打开特定文件 [10:07]。 -
保存文件 (Write):输入
:w[14:19]。w代表write(写入)。 -
退出 (Quit):输入
:q[13:15]。 -
保存并退出:可以组合使用
:wq。 -
强制退出:如果文件已修改但不想保存,需使用
:q!(强制退出)。 -
获取帮助 (Help):输入
:help[14:50]。可以查询特定命令,如:help :w查询:w命令的用法 [15:04],或:help w查询w键(在 Normal Mode 下)的用法 [15:25]。
讲座还澄清了 vim 中一个独特且重要的概念:Buffer (缓冲区)、Window (窗口) 和 Tab (标签页) 的关系 [17:09]。
与 VS Code 或 Sublime Text 不同,vim 中的 Buffer 和 Window 不是一一对应的 [17:46]。你可以在一个 Tab 页中打开多个 Window(例如通过“分屏” [17:58]),并且多个 Window 可以显示同一个 Buffer [18:02]。这非常有用,比如你可以同时查看一个文件的顶部(如 import 语句)和底部(你正在编辑的代码)[18:12]。
主题四:Vim 的核心 —— 将接口视为编程语言
这是本讲座最核心的理念 [19:32]:Vim 的 Normal Mode 本身就是一种编程语言 [19:46]。
你不是在“操作”编辑器,而是在“编程”编辑器。你通过组合不同的“命令”(按键)来构建复杂的编辑操作 [19:54]。一旦形成肌肉记忆,你就能以极高的效率编辑 [20:16]。
这种“语言”由几个基本构件组成:
构件一:Movement (移动/导航)
这是 vim 语言中的“名词”或“范围”,它们定义了操作的“对象”。
-
基本移动:
-
词汇移动:
-
行内移动:
-
行间移动(文件级):
-
查找移动:
-
搜索移动:
构件二:Edit (编辑操作)
这是 vim 语言中的“动词” (Operators),它们定义了要“做什么”。
-
i(insert):在光标前进入 Insert Mode [25:43]。 -
o(open):在光标下方打开一个新行,并进入 Insert Mode [26:09]。 -
O(大写 O):在光标上方打开一个新行,并进入 Insert Mode [26:29]。 -
x:删除光标下的单个字符 [28:44]。 -
r{char}(replace):替换光标下的单个字符为{char}[28:56]。 -
u(undo):撤销上一步操作 [29:15]。 -
Ctrl-r(redo):重做(恢复)上一步的撤销 [29:30]。 -
.(点):重复上一次的编辑命令 [41:06]。这是一个极其强大的命令,用于自动化重复任务。
构件三:Operators (操作符) + Compositions (组合)
vim 强大的地方在于,许多“动词”(编辑操作)可以和“名词”(移动)组合起来,形成“动宾短语”。
-
d(delete):删除 [26:44]。它本身不做什么,它在等待一个“移动”命令来告诉它要删除_什么_。 -
c(change):修改 [27:39]。它类似d,但执行后会自动进入 Insert Mode,方便你立即输入新内容 [27:48]。 -
p(paste):粘贴 [30:36]。将在光标后粘贴y或d操作的内容(d删除的内容也会被放入剪贴板)[30:49]。
构件四:Count (计数)
这是 vim 语言中的“数字”,用于指定动作的重复次数 [33:07]。
-
4j:4(计数) +j(向下) = 向下移动 4 行 [33:32]。 -
7dw或d7w:7(计数) +dw(删除一个词) = 删除 7 个词 [34:02]。 -
3e:3(计数) +e(到词尾) = 移动 3 个词的词尾 [33:53]。
构件五:Modifier (修饰符)
这是 vim 语言中的“介词”,它们与 a (around) 和 i (inside) 配合使用,用于操作“文本对象” (text objects),如括号、引号等 [34:59]。
假设光标在 (hello world) 的中间:
-
di(:d(删除) +i(内部) +((括号) = 删除括号内的内容 (即 “hello world”),保留括号 [36:38]。 -
da(:d(删除) +a(周围) +((括号) = 删除括号及内部的所有内容 (即 “(hello world)”) [36:55]。
假设光标在 [link text] 的中间:
ci[:c(修改) +i(内部) +[(方括号) = 修改方括号内的内容 [36:02]。vim会删除 “link text”,并让你进入 Insert Mode。
主题五:实战演示 —— 修复 FizzBuzz
讲座通过一个修复有问题的 FizzBuzz 程序的实例 [37:40],演示了上述“语言”的流畅组合。
-
问题:
main函数未被调用。- 操作:
G(跳到文件末尾) ->o(在下方打开新行) -> (输入main()等) ->Esc(返回 Normal Mode) [38:24]。
- 操作:
-
问题:循环从 0 开始,应为 1 到
limit+1。- 操作:
/range(搜索 “range”) ->Enter(跳转) ->ww(移动两个词到limit) ->i(插入) -> (输入1,) ->Esc->e(到limit词尾) ->a(在词后附加) -> (输入+1) ->Esc[39:00]。
- 操作:
-
问题:打印 “fizz” 的地方应为 “fizzbuzz”。
- 操作:
/fizz(搜索 “fizz”) ->Enter->n(跳转到下一个) ->e(到 “fizz” 词尾) ->ci"(Change Inside Quotes,修改引号内的内容) -> (输入fizzbuzz) ->Esc[40:02]。
- 操作:
-
问题:打印
fizz和buzz时应在同一行。 -
问题:
limit硬编码为 10,应改为命令行参数。
主题六:Vim 的定制化与扩展
vim 不仅接口是可编程的,它本身也是高度可配置的 [44:19]。
-
配置文件 (
.vimrc): -
插件 (Plugins):
框架 & 心智模型 (Framework & Mindset)
心智模型:克服“效率深谷” (The Productivity Dip) 的投资心态
视频建立了一个关于学习复杂工具(如 vim)的清晰心智模型,其核心是“短期投资换取长期回报” [00:17]。
-
认识“效率深谷”:
-
当你从熟悉的工具(如 VS Code 搭配鼠标)切换到
vim时,你的效率几乎必然会立即下降 [01:26]。这是因为vim的操作逻辑(模态编辑、纯键盘驱动)与你过去的肌肉记忆完全相悖。 -
在这个阶段,你会感到沮丧,用
vim完成简单任务的速度可能比原来慢得多。
-
-
跨越“盈亏平衡点”:
-
享受“复利效应”:
-
采用“持续改进”的元认知:
框架:Vim 的“命令语法”—— 一门微型编程语言
视频中最重要的框架,就是将 Normal Mode 的操作视为一种具有明确语法的“编程语言” [19:38, 25:06]。理解这个语法是精通 vim 的关键。
这个语言的基本“句子结构”可以被抽象为:
[Count] [Operator] [Modifier/Motion]
(计数) + (操作/动词) + (修饰符/移动/名词)
我们来拆解这个框架:
-
1.
[Motion](移动/名词):最简单的句子 -
2.
[Count] + [Motion](计数 + 移动) -
3.
[Operator] + [Motion](操作 + 移动):核心的“动宾结构”-
这是
vim语言中最常见的句式。“Operator”(操作符/动词)指定_做什么_,“Motion”(移动/名词)指定_对谁做_。 -
动词
d(delete):-
dw-> “删除 (d) 一个词 (w)。” [27:03] -
d$-> “删除 (d) 到行尾 ($)。”
-
-
动词
c(change):-
ce-> “修改 © 到词尾 (e)。” [27:53] -
c/foo-> “修改 © 到下一个 “foo” 出现的地方 (/)。”
-
-
动词
y(yank):yw-> “复制 (y) 一个词 (w)。” [31:00]
-
动词
v(visual): (严格来说v是进入另一种模式,但其组合逻辑类似)vw-> “选中 (v) 一个词 (w)。” [31:41]
-
-
4.
[Operator] + [Operator](操作 + 操作):作用于“行”的特殊句式 -
5.
[Count] + [Operator] + [Motion](计数 + 操作 + 移动):完整的复杂句子-
这是将所有元素组合起来,形成精确而高效的命令。
-
7dw-> “删除 (d) 接下来的七 (7) 个词 (w)。” [34:02] -
2cc-> “修改 © 当前行及下一行,共两 (2) 行 ©。”
-
-
6.
[Operator] + [Modifier] + [Text Object](操作 + 修饰符 + 文本对象):更高级的“介词短语”
通过这个“语言框架”来思考,vim 就不再是一堆孤立的快捷键,而是一个具有内在逻辑、可组合、可预测的强大系统。你的目标就是学会这个语言的“词汇”(各种 Motions 和 Operators)和“语法”(组合规则),最终实现“说出”命令(ci")来替代“手动选择并删除再按下插入”的繁琐操作。

