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

Vim / Neovim 完全指南 / 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 系统上全屏显示文件内容的编辑器,它的出现彻底改变了文本编辑的方式。

时间线 事件
1976 Bill Joy 编写 vi,随 BSD Unix 发布
1979 vi 随 4BSD 广泛分发
1988 Vim 1.0 发布(Bram Moolenaar)
1991 Vim 1.14 首次在 Fred Fish 磁盘集发布
1996 Vim 5.0 引入语法高亮
2006 Vim 7.0 引入 Spell Check、Tabs
2016 Neovim 首个稳定版
2022 Vim 9.0 引入 Vim9 Script
2024 Neovim 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│             │
│    │ 模式 │          │ 模式  │              │
│    └──────┘          └──────┘              │
│                                             │
└─────────────────────────────────────────────┘
模式 进入方式 主要用途
Normal EscCtrl-[ 浏览、移动、执行命令
Insert i, a, o, I, A, O 输入文本
Visual v, 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 / at XML 标签内/含标签
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 Script Lua(主) / 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,并配置一个现代化的开发环境。


扩展阅读