Vim 编辑器使用教程:从零开始
Vim 编辑器使用教程:从零开始
1. 概述
Vim 是一个诞生于 1991 年的文本编辑器,以其独特的模式编辑理念在开发者社区中经久不衰。学习 Vim 的曲线确实陡峭,但一旦上手,编辑效率会有质的飞跃。
本文面向零基础读者,从最基础的概念讲起,目标是让你在读完本文后能流畅使用 Vim 进行日常开发。本文不涉及特定操作系统的安装细节,重点放在 Vim 本身的用法上。你可以在 Zed、VS Code(Vim 插件)、或者原生 Vim 中实践本文的内容。
学习建议:不要试图一次性记住所有快捷键。先掌握前 3 章的内容(模式切换 + 移动 + 简单编辑),用到熟练后,再逐步扩展学习后面的章节。
2. 核心理念:模式编辑
Vim 最大的特点是有多种模式,不同模式下按键的作用不同:
┌─────────────────────────────────────────────────┐
│ Vim 模式 │
│ │
│ Esc / Ctrl+[ i / a / o / s / ... │
│ ┌──────────┐ ──────────────────────→ ┌──────┐ │
│ │ 普通模式 │ ←────────────────────── │插入模式│ │
│ │ (Normal) │ Esc │(Insert)│ │
│ └──────────┘ └──────┘ │
│ │ ↑ │ │
│ │ │ v / V / Ctrl+v │ │
│ v └─────────────────────────────── │ │
│ ┌──────────┐ │ │
│ │ 可视模式 │ ←─────────────────────── │ │
│ │ (Visual) │ Esc │ │
│ └──────────┘ │ │
│ │ │ │
│ v │ │
│ ┌──────────┐ │ │
│ │ 命令行模式 │ │ │
│ │(Command) │ │ │
│ └──────────┘ │ │
└─────────────────────────────────────────────────┘
2.1 四种核心模式
| 模式 | 用途 | 如何进入 |
|------|------|----------|
| 普通模式 (Normal) | 导航、复制、删除、粘贴等操作 | 启动 Vim 时默认在此模式,按 Esc 从任何模式返回 |
| 插入模式 (Insert) | 输入和编辑文本 | i(光标前)、a(光标后)、o(新行)等 |
| 可视模式 (Visual) | 选择文本块 | v(字符)、V(行)、Ctrl+v(矩形块) |
| 命令行模式 (Command) | 保存、退出、搜索、替换等 | :(Ex 命令)、/(搜索) |
2.2 最重要的原则:尽量少用插入模式
Vim 的设计哲学是:在普通模式下完成大多数操作,只在真正需要输入文字时才进入插入模式。
- 想删除一行?在普通模式下按
dd,不需要进入插入模式 - 想复制一行?在普通模式下按
yy - 想移动光标?在普通模式下按
hjkl - 想修改单词?在普通模式下按
ciw
新手最常见的错误:习惯性地一直按
i进入插入模式,然后用方向键移动、用退格键删除。这样做就失去了 Vim 的意义。正确的做法是:用完插入模式后立即按Esc回到普通模式。
3. 光标移动
Vim 不依赖方向键(虽然也支持),而是使用 hjkl 四键:
↑
k
← h l →
j
↓
3.1 基础移动
| 按键 | 说明 |
|------|------|
| h | 向左移动一个字符 |
| j | 向下移动一行 |
| k | 向上移动一行 |
| l | 向右移动一个字符 |
| 0 | 跳到行首 |
| ^ | 跳到行首第一个非空字符 |
| $ | 跳到行尾 |
| w | 跳到下一个单词开头 |
| b | 跳到上一个单词开头 |
| e | 跳到当前单词结尾 |
| ge | 跳到上一个单词结尾 |
3.2 单词的概念
Vim 中的"单词"分两种:
- 小单词(word):由字母/数字/下划线组成,遇到符号就分割
- 大单词(WORD):遇到空格才分割
| 操作 | 小单词 | 大单词 |
|------|--------|--------|
| 向后 | w | W |
| 向前 | b | B |
| 到结尾 | e | E |
例如在 hello.world foo bar 上:
w会跳转到.→foo→barW会跳转到foo→bar(跳过hello.world整体)
3.3 行间跳转
| 按键 | 说明 |
|------|------|
| gg | 跳到文件第一行 |
| G | 跳到文件最后一行 |
| :n | 跳到第 n 行(:42 跳到第 42 行) |
| Ctrl + D | 向下翻半页 |
| Ctrl + U | 向上翻半页 |
| Ctrl + F | 向下翻一页 |
| Ctrl + B | 向上翻一页 |
| H | 跳到屏幕顶部 |
| M | 跳到屏幕中间 |
| L | 跳到屏幕底部 |
| zz | 把当前行置于屏幕中央 |
| zt | 把当前行置于屏幕顶部 |
| zb | 把当前行置于屏幕底部 |
3.4 括号与段落
| 按键 | 说明 |
|------|------|
| % | 跳到匹配的括号 ()/[]/{} |
| { | 跳到上一个空行(段落分隔) |
| } | 跳到下一个空行 |
| ( | 跳到上一个句子 |
| ) | 跳到下一个句子 |
3.5 数字前缀
几乎所有移动命令前都可以加数字,表示重复执行:
5j # 向下移动5行
3w # 向前跳3个单词
2gg # 跳到第2行
10k # 向上移动10行
4. 文本编辑基础
4.1 进入插入模式
| 按键 | 说明 |
|------|------|
| i | 在光标前插入 |
| a | 在光标后插入 |
| I | 在行首插入 |
| A | 在行尾插入 |
| o | 在当前行下方新建一行并插入 |
| O | 在当前行上方新建一行并插入 |
| s | 删除光标处字符并插入 |
| S | 删除当前行并插入 |
| gi | 回到上一次插入的位置并进入插入模式 |
4.2 删除
| 按键 | 说明 |
|------|------|
| x | 删除光标处字符(像退格键的相反方向) |
| X | 删除光标前一个字符 |
| dd | 删除当前行 |
| D | 删除光标到行尾 |
| dw | 删除一个单词 |
| d$ | 删除光标到行尾(同 D) |
| d0 | 删除光标到行首 |
| dG | 删除光标到文件末尾 |
| dgg | 删除光标到文件开头 |
4.3 复制(Yank)与粘贴
| 按键 | 说明 |
|------|------|
| yy | 复制当前行 |
| Y | 复制当前行(同 yy) |
| yw | 复制一个单词 |
| y$ | 复制光标到行尾 |
| p | 在光标后粘贴 |
| P | 在光标前粘贴 |
| dd + p | 剪切并粘贴(移动行) |
理解删除/复制/粘贴的关系:
d(delete)、y(yank, 复制)、c(change, 删除并进入插入模式)都会把被操作的内容存入寄存器。然后可以用p粘贴出来。所以dd相当于剪切,yy相当于复制。
4.4 撤销与重做
| 按键 | 说明 |
|------|------|
| u | 撤销 |
| Ctrl + R | 重做 |
| . | 重复上一次操作(最强大的 Vim 命令之一) |
4.5 修改与替换
| 按键 | 说明 |
|------|------|
| r | 替换光标处的一个字符 |
| R | 进入替换模式(覆盖式输入) |
| c | 修改(删除并进入插入模式) |
| cc | 修改当前行 |
| C | 修改光标到行尾 |
| ciw | 修改当前单词 |
| ci" | 修改双引号内的内容 |
| ci( | 修改括号内的内容 |
| ~ | 切换光标处字符的大小写 |
4.6 缩进
| 按键 | 说明 |
|------|------|
| >> | 向右缩进当前行 |
| << | 向左缩进当前行 |
| == | 自动缩进当前行 |
| >G | 从当前行缩进到文件末尾 |
| >} | 缩进到当前段落末尾 |
5. 组合操作:Vim 的语法
Vim 的强大之处在于它的可组合性。大多数操作遵循这样的语法:
[数字] + 操作符 + 移动命令
5.1 基本公式
d w → 删除一个单词(delete word)
3 d w → 删除三个单词
操 移 动
作 动
符 命
令
示例:
d2j → 向下删除两行(delete 2 down)
y3k → 向上复制三行(yank 3 up)
c$ → 从光标修改到行尾(change to end of line)
dap → 删除整个段落(delete a paragraph)
yip → 复制当前段落内部(yank inner paragraph)
ciw → 修改当前单词(change inner word)
ca" → 修改双引号及内容(change around quotes)
5.2 操作符
| 操作符 | 说明 |
|--------|------|
| d | 删除 (delete) |
| y | 复制 (yank) |
| c | 修改 (change) → 删除后进入插入模式 |
| v | 选中 (visual) |
| > | 缩进 |
| < | 取消缩进 |
| g~ | 切换大小写 |
| gu | 转为小写 |
| gU | 转为大写 |
5.3 文本对象
文本对象是 Vim 最强大的特性之一,可以把光标放在文本块内部直接操作:
c i w → 修改当前单词(change inner word)
d i " → 删除双引号内的内容
y a ( → 复制括号及内容
| 对象 | 含义 | 示例 |
|------|------|------|
| iw | 当前单词内部 | ciw 修改单词 |
| aw | 当前单词及周围空格 | daw 删除单词 |
| ip | 当前段落内部 | yip 复制段落 |
| ap | 当前段落 | dap 删除段落 |
| i( / i) | 括号内部 | ci( 修改括号内容 |
| a( / a) | 括号及内容 | da) 删除括号及内容 |
| i" | 引号内部 | ci" 修改引号内容 |
| i[ / i{ | 方/花括号内部 | ci{ 修改花括号内容 |
| it | HTML/XML 标签内部 | cit 修改标签内容 |
| at | HTML/XML 标签及内容 | dat 删除整个标签 |
5.4 练习示例
假设光标停在下面这行代码的 Rust 上:
fn main() { println!("Hello, Rust 世界!"); }
| 按键组合 | 效果 |
|----------|------|
| ciw | 删除 Rust 并进入插入模式,输入新内容 |
| ci( | 删除 () 内的内容并进入插入模式 |
| ci" | 删除 "Hello, Rust 世界!" 并进入插入模式 |
| da" | 删除 "Hello, Rust 世界!" 及引号 |
| dt) | 删除从光标到 ) 前的所有内容 |
| df) | 删除从光标到 ) 及括号本身 |
| y3w | 复制从 Rust 开始的三个单词 |
| d2b | 向后删除两个单词 |
6. 搜索与替换
6.1 行内搜索
| 按键 | 说明 |
|------|------|
| f{char} | 行内向右搜索字符(fx 跳到下一个 x) |
| F{char} | 行内向左搜索字符 |
| t{char} | 行内向右搜索字符前(tx 跳到 x 前一字符) |
| T{char} | 行内向左搜索字符前 |
| ; | 重复上一次行内搜索 |
| , | 反向重复上一次行内搜索 |
6.2 全文搜索
| 按键 | 说明 |
|------|------|
| /{pattern} | 向下搜索 |
| ?{pattern} | 向上搜索 |
| n | 下一个匹配 |
| N | 上一个匹配 |
| * | 搜索光标下的单词(向下) |
| # | 搜索光标下的单词(向上) |
| :noh | 清除搜索高亮 |
6.3 搜索与替换
# 将当前行的第一个 "foo" 替换为 "bar"
:s/foo/bar/
# 将当前行的所有 "foo" 替换为 "bar"
:s/foo/bar/g
# 将全文的所有 "foo" 替换为 "bar"
:%s/foo/bar/g
# 全局替换,每次询问确认
:%s/foo/bar/gc
# 在 10-20 行之间替换
:10,20s/foo/bar/g
# 替换时确认(c = confirm)
:%s/foo/bar/gc
# 确认选项:y=是 n=否 a=全部 q=退出 l=替换当前并退出
7. 文件操作
| 命令 | 说明 |
|------|------|
| :w | 保存文件 |
| :q | 退出(如果文件未保存会报错) |
| :q! | 强制退出(放弃修改) |
| :wq | 保存并退出 |
| :x | 保存并退出(同 :wq) |
| ZZ | 保存并退出(普通模式下) |
| :e! | 重新加载文件(放弃所有修改) |
| :e file.rs | 打开 file.rs |
| :new | 水平分屏打开新文件 |
| :vnew | 垂直分屏打开新文件 |
| :Explore | 打开文件浏览器(需要 netrw 插件) |
8. 可视模式
8.1 三种可视模式
| 按键 | 模式 | 说明 |
|------|------|------|
| v | 字符可视模式 | 选择连续的字符 |
| V | 行可视模式 | 选择整行 |
| Ctrl + v | 块可视模式 | 矩形块选择(最强大) |
8.2 可视模式常用操作
选择文本后:
| 按键 | 说明 |
|------|------|
| d / x | 删除选中内容 |
| y | 复制选中内容 |
| c | 删除并进入插入模式 |
| ~ | 切换大小写 |
| > / < | 缩进/取消缩进 |
| J | 合并选中行 |
| r | 批量替换字符(块可视模式) |
| I | 块前插入(块可视模式) |
| A | 块后插入(块可视模式) |
8.3 块可视模式实战
块可视模式可以进行非常高效的批量编辑:
要求:在以下每行前面加上 "- ":
苹果 → - 苹果
香蕉 → - 香蕉
橘子 → - 橘子
操作步骤:
1. 光标移到第一行的行首
2. Ctrl + v 进入块可视模式
3. jj 向下选择两行(选中三行行首)
4. I 进入块前插入模式
5. 输入 "- "
6. Esc 应用修改到所有选中行
9. 多文件与分屏
| 命令 | 说明 |
|------|------|
| :sp file.rs | 水平分屏打开 |
| :vs file.rs | 垂直分屏打开 |
| Ctrl + w + h/j/k/l | 在分屏间移动光标 |
| Ctrl + w + w | 循环切换分屏 |
| Ctrl + w + = | 等分屏大小 |
| Ctrl + w + _ | 最大化当前分屏高度 |
| Ctrl + w + \| | 最大化当前分屏宽度 |
| :q | 关闭当前分屏 |
| :only | 只保留当前分屏 |
| :tabnew | 新建标签页 |
| gt | 下一个标签页 |
| gT | 上一个标签页 |
| :bnext / :bprev | 切换缓冲区 |
10. 寄存器与宏
10.1 寄存器基础
Vim 的删除/复制内容存储在寄存器中,可以用 "{reg} 指定:
"ayy # 复制当前行到寄存器 a
"ap # 粘贴寄存器 a 的内容
"ad3w # 删除三个单词到寄存器 a
"+yy # 复制到系统剪贴板(X11 系统)
"*yy # 复制到系统剪贴板(macOS/Win)
"+p # 从系统剪贴板粘贴
10.2 宏录制
宏可以录制一系列操作并重复执行:
qa # 开始录制宏到寄存器 a
... # 执行一系列操作
q # 停止录制
@a # 播放宏 a
5@a # 播放宏 a 5次
@@ # 重复上一次宏
宏实战示例:将以下文本中的每行用引号包裹:
苹果 → "苹果",
香蕉 → "香蕉",
橘子 → "橘子",
操作步骤:
1. 光标移到第一行行首
2. qa 开始录制宏到 a
3. i" 在行首插入 "
4. Esc 回到普通模式
5. A", 在行尾添加 ",(A = 行末插入)
6. j 移动到下一行
7. q 停止录制
8. 2@a 对剩余两行执行宏
11. Vim 配置入门
11.1 配置文件
Vim 的配置文件是 ~/.vimrc(Linux/macOS)或 ~/_vimrc(Windows)。Neovim 使用 ~/.config/nvim/init.lua。
11.2 基础配置示例
" ── 基础设置 ──
set nocompatible " 不兼容传统 Vi
set number " 显示行号
set relativenumber " 显示相对行号
set cursorline " 高亮当前行
set expandtab " 用空格代替 Tab
set tabstop=2 " Tab 宽度 2
set shiftwidth=2 " 缩进宽度 2
set autoindent " 自动缩进
set smartindent " 智能缩进
set wrap " 自动换行
set ignorecase " 搜索忽略大小写
set smartcase " 有大小写时不忽略
set incsearch " 增量搜索
set hlsearch " 搜索高亮
set showcmd " 显示命令
" ── 快捷键 ──
" 取消搜索高亮
nnoremap <Esc><Esc> :noh<CR>
" 用 jk 代替 Esc(最受欢迎的 Vim 映射)
inoremap jk <Esc>
" 与系统剪贴板交互(需要 +clipboard 特性)
set clipboard=unnamedplus
" 保存时自动去除行尾空格
autocmd BufWritePre * :%s/\s\+$//e
11.3 Vim 的哲学:养成习惯
1. 用完插入模式立刻 Esc
2. 能用组合键不用多次按键
3. 能复用 . 就不用重复操作
4. 能用宏就不用手工操作
5. 能使用文本对象就不手动选择
12. Vim 学习资源
:help— Vim 内置帮助系统,最权威的资料vimtutor— 终端中执行vimtutor,交互式教程(约 30 分钟)- Vim Adventures — 游戏化学习 Vim
- Open Vim — 在线交互式 Vim 教程
13. 总结
三周学习计划
| 阶段 | 内容 | 产出 |
|------|------|------|
| 第 1 周 | 模式切换、hjkl 移动、i/a/o 插入、dd/yy/p | 能完成基础文本编辑 |
| 第 2 周 | w/b/0/$/gg/G、ciw/di( 文本对象、搜索替换 | 编辑效率明显提升 |
| 第 3 周 | 可视模式、块操作、寄存器、宏录制 | 批量处理任务轻松掌握 |
核心快捷键速查
移动: h j k l | w b e | 0 ^ $ | gg G | % | { }
编辑: i a o | dd yy p | c d y | u Ctrl+r | .
搜索: / ? | n N | * # | f t F T
文件: :w :q | :wq ZZ | :e | :sp :vs
视图: zz zt zb | Ctrl+d Ctrl+u
高级: . | q + 宏 | Ctrl+v 块操作 | ci" ci(
最后,Vim 的学习没有终点。即使使用十年以上的 Vim 用户,也常常能发现新的技巧。关键是先把基础操作练到肌肉记忆,再逐步扩展。