强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

01 - Vim 的历史与哲学

“Vim is not just an editor. It’s a language for manipulating text.”

1.1 Vi 的诞生

1.1.1 Unix 时代的编辑器

1976 年,Bill Joy 在加州大学伯克利分校开发了 ex 行编辑器,随后在其基础上创建了 vi(Visual Editor 的缩写)。Vi 是第一个在 Unix 系统上全屏显示文件内容的编辑器,它的出现彻底改变了文本编辑的方式。

时间线事件
1976Bill Joy 编写 vi,随 BSD Unix 发布
1979vi 随 4BSD 广泛分发
1988Vim 1.0 发布(Bram Moolenaar)
1991Vim 1.14 首次在 Fred Fish 磁盘集发布
1996Vim 5.0 引入语法高亮
2006Vim 7.0 引入 Spell Check、Tabs
2016Neovim 首个稳定版
2022Vim 9.0 引入 Vim9 Script
2024Neovim 0.10 稳定 Lua API

1.1.2 为什么 Vi 如此重要

在 Vi 之前,编辑器主要有两种模式:

  1. 行编辑器(如 edex):一次只能操作一行
  2. 屏幕编辑器(如 emacs):始终处于编辑模式

Vi 的革命性创新是引入了模态编辑(Modal Editing)的概念——将"浏览文本"和"编辑文本"分离开来,通过不同模式高效处理不同任务。


1.2 模式编辑哲学

1.2.1 模式编辑 vs 非模式编辑

传统编辑器(如 VS Code):
┌──────────────────────────────────┐
│  按键 → 直接输入字符              │
│  Ctrl+S → 保存                   │
│  Ctrl+F → 查找                   │
│  需要 Ctrl/Alt/Shift 修饰键      │
└──────────────────────────────────┘

Vim 模态编辑:
┌──────────────────────────────────┐
│  Normal 模式 → 浏览/操作文本      │
│  Insert 模式 → 输入文本           │
│  Visual 模式 → 选择文本           │
│  Command 模式 → 执行命令          │
│  不依赖修饰键,按键即命令         │
└──────────────────────────────────┘

1.2.2 为什么要用模式编辑

场景对比:删除一个函数参数

VS Code 方式

  1. 用鼠标选中参数(或者 Shift+方向键慢慢选)
  2. 按 Delete 键
  3. 可能还需要删除多余的逗号

Vim 方式

daw    " delete a word(删除一个词并处理空格)
da,    " delete a comma-delimited argument
di(    " delete inside parentheses(删除括号内内容)

这就是 Vim 的动作语言(Motion Language)——每个操作都是 动作 + 范围 的组合,像自然语言一样可组合。

1.2.3 Vim 的核心模式

┌─────────────────────────────────────────────┐
│                                             │
│    ┌──────┐   Esc/i  ┌──────┐              │
│    │Normal│ ────────→│Insert│              │
│    │ 模式 │ ←─────── │ 模式 │              │
│    └──┬───┘   Esc    └──────┘              │
│       │                                     │
│  v/V/⌃-v                                    │
│       ↓                                     │
│    ┌──────┐   :      ┌──────┐              │
│    │Visual│ ────────→│Command│             │
│    │ 模式 │          │ 模式  │              │
│    └──────┘          └──────┘              │
│                                             │
└─────────────────────────────────────────────┘
模式进入方式主要用途
NormalEscCtrl-[浏览、移动、执行命令
Inserti, a, o, I, A, O输入文本
Visualv, V, Ctrl-v选择文本
Command-line:, /, ?执行命令、搜索
Terminal:terminal终端交互

1.3 Vim 的设计哲学

1.3.1 组合性(Composability)

Vim 最强大的特性是命令的组合性。每个操作由三部分组成:

[操作符] [次数] [动作/文本对象]
 operator  count  motion/text-object

示例

组合含义
d2w删除 2 个单词(delete 2 words)
c3j修改当前行及下方 3 行(change 3 lines down)
yiw复制当前单词(yank inner word)
>ap缩进整个段落(indent a paragraph)
gUaw将当前单词转为大写(uppercase a word)

这种组合方式意味着:

  • 你只需学习少量操作符和动作
  • 它们的组合能产生数以千计的操作
  • 学习曲线是"指数衰减"的——越学越快

1.3.2 操作符(Operator)一览

操作符功能示例
d删除(delete)dw 删除到下一词
c修改(change)ci" 修改引号内内容
y复制(yank)yy 复制当前行
>缩进(indent)>ip 缩进段落
<反缩进(dedent)<ip 反缩进段落
=自动缩进(format)=G 缩进到文件末尾
gU转大写gUiw 单词转大写
gu转小写gu$ 到行尾转小写
~大小写翻转~ 翻转当前字符
!外部过滤!Gsort 对后面内容排序

1.3.3 动作(Motion)与文本对象(Text Object)

动作(Motion)—— 移动光标:

动作含义
w / b下一个/上一个词首
e / ge当前/上一个词尾
0 / ^ / $行首/第一个非空字符/行尾
gg / G文件首/文件尾
} / {下一个/上一个段落
%匹配括号跳转
f{char}跳到当前行下一个字符
t{char}跳到当前行下一个字符之前

文本对象(Text Object)—— 结构化选择:

文本对象含义
iw / aw单词内/含空格
i" / a"引号内/含引号
i( / a(括号内/含括号
i{ / a{花括号内/含花括号
it / atXML 标签内/含标签
ip / ap段落内/含段落
is / as句子内/含句子

1.4 从 Vim 到 Neovim

1.4.1 为什么会有 Neovim

2014 年,由于对 Vim 开发方向的不满,社区发起 Neovim 项目。核心目标:

维度问题Neovim 的解决方案
代码质量Vim 代码库老化、难以贡献重构代码、清理历史包袱
可扩展性VimScript 性能差、不友好原生支持 Lua 作为配置语言
并发无异步支持Job Control、异步任务
嵌入难以嵌入其他应用RPC API、msgpack
社区单一维护者社区治理、开放贡献

1.4.2 Vim vs Neovim 对比

特性Vim 9+Neovim 0.10+
配置语言VimScript / Vim9 ScriptLua(主) / VimScript(兼容)
异步支持Job(有限)全面 Job + libuv
内置终端✅(更稳定)
LSP 客户端❌(需插件)✅ 内置
Tree-sitter❌(需插件)✅ 内置
浮动窗口✅(9.0+)✅(0.4+)
插件生态成熟但分化现代化、快速增长
发布周期较慢较快(0.x 递增)
跨平台
GUI 客户端多种多种(nvim-qt, Neovide 等)

1.4.3 兼容性

Neovim 大部分兼容 Vim,但有以下差异:

# Neovim 中不存在的 Vim 特性
- :version 中的编译选项不同
- :gui 不存在(使用独立 GUI 客户端)
- Vim9 Script 部分不兼容
- 部分 legacy 插件不兼容

# Neovim 独有特性
- Lua 配置(init.lua)
- 内置 LSP 客户端
- 内置 Tree-sitter
- vim.ui.select / vim.ui.input
- extmark / virtual text

1.5 选择 Vim 的理由

1.5.1 业务场景

场景为什么用 Vim
SSH 远程编辑服务器上只有 vi/vim 可用
快速修改配置命令行中快速编辑,不需启动重量级 IDE
大型代码库Vim 处理 GB 级文件依然流畅
键盘流工作流减少鼠标操作,保护手腕
多语言开发一套工具链覆盖所有语言
个人定制配置完全可控,打造专属编辑器

1.5.2 学习曲线

编辑效率
  ↑
  │            Vim 使用者
  │           ╱
  │          ╱
  │         ╱    ──────────── 传统编辑器
  │        ╱
  │       ╱
  │      ╱
  │  ___╱
  │ ╱
  └────────────────────────→ 时间
      ↑         ↑
    学习期    效率拐点(约 2-4 周)

注意:Vim 的学习曲线前期较陡,但一旦越过"效率拐点",编辑效率将超越传统编辑器并持续增长。


1.6 第一次打开 Vim

1.6.1 基本生存指南

当意外进入 Vim 时,记住以下命令:

:q!      " 强制退出(不保存)
:wq      " 保存并退出
:w       " 保存
Esc      " 回到 Normal 模式(万能恢复键)
:help    " 打开帮助

1.6.2 终端内体验

# 安装 Neovim
# Ubuntu/Debian
sudo apt install neovim

# macOS
brew install neovim

# 启动
nvim

# 或使用 Vim
vim

1.7 总结

概念要点
Vi 起源1976 年 Bill Joy 创建,Unix 标准编辑器
模态编辑Normal/Insert/Visual/Command 四大模式
组合性操作符 × 动作 × 次数 = 无限操作
Neovim现代化重构,内置 LSP/Tree-sitter/Lua
学习价值前期投入换来长期高效回报

下一步第 02 章 - 安装与配置 → 在你的系统上安装 Vim 或 Neovim,并配置一个现代化的开发环境。


扩展阅读