1. 模式切换与基础操作 (The Foundation)
Vim 的核心在于不同模式间的快速切换,以实现精准编辑。
| 命令 | 模式 | 描述 |
|---|---|---|
i / a | Insert | 在光标 当前位置 / 后一位置 进入插入模式。 |
o / O | Insert | 在 当前行下方 / 上方 插入新行并进入插入模式。 |
v / V | Visual | 进入 字符 / 行 可视化模式。 |
<C-v> | Visual Block | 进入 块 可视化模式(适用于列编辑)。 |
u / <C-r> | Normal | 撤销 (Undo) / 重做 (Redo)。 |
. | Normal | 重复 上一个编辑命令(强大的宏级操作)。 |
<Esc> | - | 返回 Normal 模式。 |
2. 移动与跳转 (Navigation)
2.1 行内与跨行移动
| 命令 | 范围 | 描述 |
|---|---|---|
w / b | 单词 | 向前 / 向后跳转到一个单词开头。 |
e | 单词 | 跳转到当前单词末尾。 |
0 / ^ / $ | 行 | 移动到 绝对行首 / 第一个非空字符 / 行尾。 |
f{char} | 字符 | 行内向右查找并跳转到 {char}。重复用 ;,反向用 ,。 |
gg / G | 文件 | 移动到文件 首行 / 末行。 |
{num}G | 行 | 跳转到指定行号。 |
2.2 屏幕与跳转列表
| 命令 | 描述 |
|---|---|
H / M / L | 移动到屏幕 顶部 (High) / 中间 (Middle) / 底部 (Low)。 |
<C-f> / <C-b> | 向前 / 向后滚动一整屏。 |
% | 在匹配的括号 () [] {} 之间跳转。 |
<C-o> / <C-i> | 跳转到 上一个 / 下一个 光标位置 (Jumplist)。 |
3. Vim 语法核心:操作符与文本对象 (The Grammar)
Vim 的编辑公式:[操作符] + [动作/文本对象]。
3.1 常用操作符 (Operators)
d(Delete): 删除(剪切)。c(Change): 删除并进入插入模式。y(Yank): 复制。p/P: 在光标 后 / 前 粘贴。
- =:自动化格式代码
3.2 文本对象 (Text Objects)
使用 i (inner) 或 a (around) 配合对象:
w(word):ciw改写单词,caw改写单词及空格。(/[/{:ci{修改花括号内的内容。"/':ci"修改引号内的字符串。t(tag):cit修改 HTML/XML 标签内部内容。
4. 空间管理:缓冲区、窗口与标签页 (Workspace)
理解三者的包含关系:Tab (布局) > Window (视窗) > Buffer (内存副本)。
4.1 缓冲区管理 (Buffers)
Vim 建议通过 Buffer 切换而非频繁开 Tab。
| 命令 | 描述 |
|---|---|
:ls | 列出所有缓冲区。 |
:b {N/name} | 按编号或名称切换。 |
<C-^> | 神技:在最近两个 Buffer 之间快速闪现。 |
:bd | 删除当前缓冲区。 |
:set hidden | 必设:允许在未保存时切换 Buffer。 |
4.2 窗口分割 (Windows)
所有命令以 <C-w> 开头。
| 命令 | 描述 |
|---|---|
<C-w> s / v | 水平 / 垂直分割窗口。 |
<C-w> h/j/k/l | 在窗口间移动。 |
<C-w> w | 循环切换窗口。 |
<C-w> o | Only:关闭除当前窗口外的所有窗口。 |
<C-w> = | 平均分布窗口大小。 |
5. 搜索与文件查找 (Search & Files)
5.1 原生搜索与路径
| 命令 | 描述 |
|---|---|
:find {file} | 在 path 下查找并打开文件。 |
**:set path+=$PWD/** | 将当前项目及其子目录加入搜索路径。 |
/pattern | 向下搜索。n/N 切换匹配项。 |
* / # | 搜索光标下的单词。 |
5.2 LazyVim (Telescope) 高效搜索
LazyVim 用户应优先使用以下快捷键:
| 快捷键 | 功能 |
|---|---|
<leader>ff | 模糊查找文件 (Find Files)。 |
<leader>sg | 全局实时搜索内容 (Live Grep,依赖 ripgrep)。 |
<leader>fw | 搜索光标下的单词。 |
<leader>/ | 在当前文件内模糊搜索。 |
<leader>fb | 在已打开的 Buffer 中搜索。 |
6. 全局替换与批处理 (Global Operations)
6.1 搜索语法 (FZF/Telescope)
在搜索框内使用提高精度:
^abc: 以 abc 开头。xyz$: 以 xyz 结尾。'word: 精确匹配。!temp: 排除包含 temp 的项。
6.2 批量替换流程
- 搜索并收集:使用
<leader>sg搜索。 - 送入列表:按
<C-q>将 Telescope 结果发送到 Quickfix 列表。 - 执行批处理:
:cdo %s/旧词/新词/g | update- 注:
cdo对 Quickfix 每一行执行,update自动保存。
- 手动筛选替换:
- 使用
:bufdo %s/old/new/g | update对所有打开的 Buffer 执行。
- 使用
提示:在 LazyVim 中,使用 <leader>e 调出 neo-tree 侧边栏进行文件管理。
7. 寄存器:Vim 的多重剪贴板
寄存器是 Vim 存储文本的“口袋”。使用方法:在操作前加上 "{register}。
7.1 常用寄存器类型
| 寄存器 | 名称 | 描述 |
|---|---|---|
"" | 无名寄存器 | 默认:存储最近一次的删除(d)或复制(y)内容。 |
"0 | 复制寄存器 | 专门存储 最近一次复制(y) 的内容(删除不会覆盖它)。 |
"1-9 | 数字寄存器 | 存储最近 9 次大于一行的 删除 内容(类似历史栈)。 |
"a-z | 有名寄存器 | 手动存储。使用小写字母会覆盖,使用 大写字母 ("A) 会 追加。 |
"_ | 黑洞寄存器 | 真正的删除。内容不会存入任何寄存器(用于防止覆盖默认剪贴板)。 |
"+ | 系统剪贴板 | 与系统其他软件(如浏览器)共享内容。 |
"= | 表达式寄存器 | 计算器。输入后接数学运算或函数,回车后插入结果。 |
". | 只读寄存器 | 存储最后一次插入的文本。 |
"% | 只读寄存器 | 存储当前文件的路径。 |
7.2 寄存器实战技巧
- 查看寄存器:输入
:reg查看当前所有寄存器的内容。 - 指定寄存器复制/粘贴:
"ayiw:将当前单词复制到寄存器a。"ap:粘贴寄存器a中的内容。
- 不覆盖粘贴:
- 先选中一段文本,按
"_d(丢进黑洞),再按p粘贴。这样你原本的复制内容就不会因为这次删除而被顶掉。
- 先选中一段文本,按
- 插入模式下调用:
- 按
<C-r>{register}。例如在输入时按<C-r>+直接插入系统剪贴板内容。
- 按
LazyVim 提示:LazyVim 默认通常配置了 clipboard = "unnamedplus",这意味着你的 y 和 d 操作会自动同步到系统剪贴板 ("+)。如果想进行不污染剪贴板的删除,请务必习惯使用 "_d。
8. 撤销与高级跳转
Vim 的撤销机制并非简单的线性堆栈,而是一个 撤销树 (Undo Tree)。即使你撤销后做了新修改,之前的“未来”也不会消失。
8.1 基础操作
| 命令 | 描述 |
|---|---|
u | 撤销上一个操作 (Undo)。 |
<C-r> | 重做上一个撤销 (Redo)。 |
U | 行撤销:撤销对当前行所做的所有最新更改。 |
8.2 撤销树与时间旅行 (Chronological Navigation)
当你撤销后进行了新编辑,Vim 会开辟一个新的分支。使用以下命令可以跨分支跳转。
| 命令 | 描述 |
|---|---|
g- | 回退到前一个状态(按 时间先后,忽略分支)。 |
g+ | 前进到后一个状态(按 时间先后)。 |
:undolist | 列出当前所有的撤销树叶子节点(包含编号和时间)。 |
:undo {num} | 跳转到 :undolist 中指定的更改编号。 |
8.3 基于时间的撤销
你可以直接命令 Vim “回到五分钟前”。
| 命令 | 示例 | 描述 |
|---|---|---|
:earlier {time} | :earlier 5m | 回到 5 分钟前的状态(支持 s, m, h)。 |
:later {time} | :later 10s | 前进到 10 秒后的状态。 |
:earlier {n}f | :earlier 2f | 回到前 2 次保存 (file write) 时的状态。 |
8.4 持久化撤销 (Persistent Undo)
默认情况下,退出 Vim 后撤销历史会丢失。开启此配置可将历史保存在本地磁盘。
-- LazyVim/Neovim 配置示例
vim.opt.undofile = true
vim.opt.undodir = vim.fn.expand("~/.local/share/nvim/undo") -- 撤销文件存放路径LazyVim 提示:
-
LazyVim 通常内置了
undotree插件。 -
快捷键通常为
<leader>uu,它会打开一个可视化的树状侧边栏,让你直观地在不同分支间跳转。
9. 可视化模式进阶
可视化模式允许先“选中”一段文本,再对其执行操作。它将“移动”与“编辑”解耦,使复杂选取更直观。
9.1 三种可视化子模式
| 命令 | 模式 | 描述 |
|---|---|---|
v | 字符可视化 | 按字符选取,最基础的模式。 |
V | 行可视化 | 按整行选取。 |
<C-v> | 块可视化 | 矩形区域选取,常用于列编辑(Column Editing)。 |
9.2 选区调整技巧
| 命令 | 功能 | 描述 |
|---|---|---|
o | 切换端点 | 将光标跳转到选区的 另一端,方便调整起始边界。 |
O | 切换角点 | 在块模式 (<C-v>) 下,在矩形的对角之间跳转。 |
gv | 重新选中 | 神技:快速选中上一次操作过的可视化区域。 |
9.3 块模式 (Block Mode) 强大操作
块可视化模式最强大的地方在于 列插入:
- 进入:按
<C-v>并移动光标选中多行的某一列。 - 插入:
- 按
I(大写):在选中的列 之前 批量插入。 - 按
A(大写):在选中的列 之后 批量插入。
- 按
- 生效:输入内容后按两次
<Esc>,所作更改会同步应用到选中的所有行。
9.4 选区内的常用命令
选中区域后,可直接按以下单键执行操作:
d/y/c: 删除 / 复制 / 修改选中的文本。~: 反转选中区域的大小写。u/U: 将选区强制转为 小写 / 大写。>/<: 增加或减少缩进(Vim 会在操作后退出可视化模式)。r{char}: 将选中区域的所有字符替换为同一个{char}。
LazyVim 提示:
- 在 LazyVim 中,使用
<leader>v有时会绑定到插件(如可视化搜索),但在原生模式下,v系列依然是核心。 - 结合
treesitter:你可以使用v进入可视化模式,然后按enter不断扩大选区(增量选中对象),按backspace缩小选区。这是现代 Neovim 编辑器的强大补充。
10. 搜索与替换进阶
本章将搜索与替换从简单的字面匹配提升到 正则模式匹配 (Regex Pattern Matching) 的层面。
10.1 搜索增强技巧
| 命令 | 功能 | 描述 | |
|---|---|---|---|
\C / \c | 强制区分/忽略大小写 | 在搜索词前加上,如 /\Chello 仅匹配小写 hello。 | |
// | 重复搜索 | 重复上一个搜索模式,等同于 n。 | |
\v | Very Magic | 神技:开启后,除字母数字外的特殊字符(如 () {})均视为正则元字符,无需转义。 | |
\zs / \ze | 匹配边界 | 仅高亮/操作 \zs 和 \ze 之间的部分。例:/11\zsvim\ze22 仅选中被 11 和 22 包围的 vim。 |
10.2 常用模式匹配 (Regex)
| 模式 | 描述 | 示例 |
|---|---|---|
\d / \D | 数字 / 非数字 | /\d\{3\} 匹配三位数字。 |
\s / \S | 空格 / 非空格 | 匹配空格、制表符等。 |
[a-z] | 字符范围 | /[0-9a-f] 匹配十六进制字符。 |
\{n,m\} | 重复次数 | \d\{2,4\} 匹配 2 到 4 位数字。 |
* / \+ | 0或多 / 1或多 | \+ 需要转义(除非开启 \v)。 |
{-} | 非贪婪匹配 | 匹配尽可能短的内容。例:/a.\{-}1。 |
10.3 替换操作 (Substitute)
语法格式::[range]s/{pattern}/{string}/[flags]
| 命令/标志 | 功能 | 描述 |
|---|---|---|
& | 重复替换 | 在 Normal 模式下按 & 重复上一次替换命令(不含标志)。 |
:&& | 重复含标志替换 | 重复上一次替换命令及其所有标志(如 /g)。 |
\0 或 & | 引用全文 | 在替换后项中使用,表示匹配到的整个内容。 |
\1, \2 | 引用分组 | 引用前面 \( \) 或 \v( ) 捕获的括号内容。 |
\U / \L | 大小写转换 | 在替换后项中使用,如 :s/word/\U&/ 将单词转为大写。 |
:s+old+new+ | 修改定界符 | 当路径包含 / 时,可用 + 或其他符号代替 / 作为分隔符。 |
10.4 标志位 (Flags)
g(Global): 替换行内所有匹配项(默认仅首个)。c(Confirm): 每次替换前询问确认。i(Ignore case): 单词替换时忽略大小写。
10.5 跨文件批量处理
Vim 处理多文件替换的标准流:
- 定义范围:
:args *.txt(捕获所有 txt 文件)。 - 执行命令:
:argdo %s/old/new/g。 - 保存结果:
:argdo update。
配置提示:
建议在 init.lua 中设置:
vim.opt.ignorecase = true -- 搜索忽略大小写
vim.opt.smartcase = true -- 如果搜索词含大写,则自动转为区分大小写