1. 模式切换与基础操作 (The Foundation)

Vim 的核心在于不同模式间的快速切换,以实现精准编辑。

命令模式描述
i / aInsert在光标 当前位置 / 后一位置 进入插入模式。
o / OInsert当前行下方 / 上方 插入新行并进入插入模式。
v / VVisual进入 字符 / 可视化模式。
<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> oOnly:关闭除当前窗口外的所有窗口。
<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 批量替换流程

  1. 搜索并收集:使用 <leader>sg 搜索。
  2. 送入列表:按 <C-q> 将 Telescope 结果发送到 Quickfix 列表。
  3. 执行批处理
    • :cdo %s/旧词/新词/g | update
    • 注:cdo 对 Quickfix 每一行执行,update 自动保存。
  4. 手动筛选替换
    • 使用 :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",这意味着你的 yd 操作会自动同步到系统剪贴板 ("+)。如果想进行不污染剪贴板的删除,请务必习惯使用 "_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) 强大操作

块可视化模式最强大的地方在于 列插入

  1. 进入:按 <C-v> 并移动光标选中多行的某一列。
  2. 插入
    • I (大写):在选中的列 之前 批量插入。
    • A (大写):在选中的列 之后 批量插入。
  3. 生效:输入内容后按两次 <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
\vVery 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 处理多文件替换的标准流:

  1. 定义范围:args *.txt (捕获所有 txt 文件)。
  2. 执行命令:argdo %s/old/new/g
  3. 保存结果:argdo update

配置提示: 建议在 init.lua 中设置:

vim.opt.ignorecase = true  -- 搜索忽略大小写
vim.opt.smartcase = true   -- 如果搜索词含大写,则自动转为区分大小写