从几分钟上手,到熟练编辑文本与代码
这份教程分为两条学习路径:先用“常用速成”学会打开、编辑、保存和退出;再按“详细教程”逐步掌握模式、移动、修改、搜索替换、窗口、配置与练习方法。遇到不确定的命令,先在小文件中试用,并记住 Vim 内置帮助可以随时查阅。
前言
Vim 是一款以键盘操作为核心的文本编辑器。它的关键特点是“模式”:普通模式用于移动和发出编辑命令,插入模式用于输入文字,命令行模式用于保存、退出、设置和搜索替换。初学者常觉得按键没有反应,通常是因为当前模式与预期不同。先看屏幕底部提示,按 Esc 回到普通模式,再继续操作。
本教程面向第一次使用 Vim 的读者,也适合把 Vim 当作代码编辑器的人。示例中的按键区分大小写;例如 x 与 X、w 与 W 是不同命令。尖括号表示特殊按键,例如 <Esc>、<Enter>、<Ctrl-r>,不需要真的输入尖括号。
官方资料
| 资料 | 用途 | 链接 |
|---|---|---|
| Vim 网站 | 学习Vi和Vims | Vim 实战教程 |
| Vim 官方文档入口 | 帮助文件、手册与相关资料索引 | Vim 官方文档入口 |
| Vim 在线帮助 | 可搜索的在线帮助页与参考手册 | Vim 在线帮助 |
| 用户手册目录 | 按章节循序学习的 User Manual | 用户手册目录 |
| Vim FAQ | 常见问题与解决方法 | Vim FAQ |
在 Vim 内输入 :help 可打开帮助首页;输入 :help usr_02 可阅读第一步入门章节;输入 :help 某个命令(如 :help :w 或 :help dd)可查具体说明。按 Ctrl-] 可跟随帮助标签,按 Ctrl-o 可返回。
第一部分 常用速成
如果你只想尽快完成编辑,先记住下面这组操作。整个流程可以概括为:进入普通模式 → 移动与修改 → 保存 → 退出。
1 五分钟完成一次编辑
- 打开文件:在终端输入 vim 文件名,例如 vim notes.txt。文件不存在时,Vim 会准备创建它。
- 进入插入模式:按 i,在光标前开始输入;也可以按 a 在光标后输入,按 o 在下一行新建一行并开始输入。
- 结束输入:按 Esc。回到普通模式后,底部通常不再显示 -- INSERT --。
- 保存:输入 :w,再按 Enter。
- 退出:输入 :q,再按 Enter。若已保存且没有未保存改动,也可以输入 :wq 一次保存并退出。
vim notes.txt # 打开或新建文件
i # 开始输入
<Esc> # 返回普通模式
:w # 保存
:q # 退出
常见退出命令::q 在没有未保存修改时退出;:q! 放弃本次未保存修改并强制退出;:wq 保存后退出。:q! 会丢弃当前文件未保存的改动,使用前确认确实不需要这些内容。
2 最常用的移动与编辑键
| 按键 | 作用 | 记忆提示 |
|---|---|---|
| h / j / k / l | 左 / 下 / 上 / 右移动一格 | 基础方向键;也可用方向键 |
| w / b / e | 跳到下一个词首 / 上一个词首 / 当前词尾 | 小写词以空格和标点等边界区分 |
| 0 / ^ / $ | 行首 / 行内第一个非空白字符 / 行尾 | ^ 常用于缩进代码的行首 |
| gg / G | 文件第一行 / 最后一行 | 跳到文件两端 |
| 数字G | 跳到指定行,例如 25G | 也可用 :25 |
| x / X | 删除光标字符 / 删除前一个字符 | 像 Delete / Backspace |
| dd / yy / p | 剪切当前行 / 复制当前行 / 在光标后粘贴 | Vim 将删除内容放入寄存器 |
| u / Ctrl-r | . | 撤销 / 重做 / 重复上次修改命令 |
| i / a / o | 光标前插入 / 光标后插入 / 下方新行插入 | 按 Esc 结束输入 |
| r / R | 替换一个字符 / 连续替换 | r 后按一个替换字符 |
数字可以与多数动作组合:3w 向前跨过三个词;5j 向下移动五行;2dd 删除两行;3p 粘贴三次。初学阶段先熟悉少量可靠组合,避免盲目输入不熟悉的命令。
3 搜索与快速修改
| 操作 | 示例 | 说明 |
|---|---|---|
| 向后搜索 | /error 然后 Enter | n 到下一个匹配,N 到上一个匹配 |
| 向前搜索 | ?warning 然后 Enter | 搜索方向与 / 相反 |
| 清除搜索高亮 | :nohlsearch | 清除当前高亮;可配置为按键映射 |
| 替换当前行第一个匹配 | :s/旧/新/ | 例如 :s/cat/dog/ |
| 替换当前行所有匹配 | :s/旧/新/g | g 表示本行全部匹配 |
| 替换整个文件 | :%s/旧/新/g | % 表示所有行 |
| 逐个确认替换 | :%s/旧/新/gc | c 会询问是否替换每一处 |
正则表达式中的特殊字符有额外含义。若要按字面查找这些字符,需转义或使用 very nomagic 模式;不确定时可先使用 :%s/旧/新/gc 逐项确认。
4 速查:最常见的命令行命令
| 命令 | 作用 |
|---|---|
| :w | 保存 |
| :w 文件名 | 另存为指定文件 |
| :q | 退出 |
| :wq 或 :x | 保存并退出 |
| :q! | 不保存并强制退出 |
| :e 文件名 | 打开另一个文件 |
| :set number | 显示行号 |
| :set nonumber | 隐藏行号 |
| :help | 打开帮助 |
| :!命令 | 在 Vim 中执行外部命令,例如 :!ls |
第二部分 详细教程
本部分从操作模型开始,逐章介绍常见编辑任务。建议边读边在练习文件中操作,而不是只背命令。每条操作都可以拆成“动作范围 + 操作”:例如 dw 表示删除从光标开始的一个词,d$ 表示删除到行尾。
1 Vim 的模式与操作思路
| 模式 | 进入方式 | 主要用途 | 退出或切换 |
|---|---|---|---|
| 普通模式 | 启动 Vim 后默认进入;Esc 返回 | 移动光标、删除、复制、粘贴、执行组合命令 | 按 i/a/o 等进入插入模式;按 : 进入命令行 |
| 插入模式 | i、a、o、I、A、O、s、c 等 | 输入和修改文本 | Esc 回普通模式 |
| 可视模式 | v(字符)、V(行)、Ctrl-v(块) | 选择文本区域,再操作选择内容 | Esc 取消选择 |
| 命令行模式 | :、/、? | 保存、退出、设置、搜索、替换 | Enter 执行;Esc 取消 |
| 替换模式 | R | 逐字覆盖已有文本 | Esc 结束 |
理解模式比死记按键更重要。普通模式下按 i 是“进入输入”,插入模式下按 i 则是输入字母 i。若按键行为不符合预期,按 Esc 回到普通模式,确认屏幕状态后再操作。
2 打开文件与退出
vim file.txt # 打开文件
vim file1.txt file2.txt # 一次打开多个文件
vim +42 file.txt # 打开后跳到第 42 行
vim +/TODO file.txt # 打开后定位到 TODO
退出前先判断是否有未保存内容。Vim 通常会在状态信息中提示文件已修改。:w 保存当前文件,:q 退出,:wq 保存并退出;:q! 强制放弃改动。:qa 退出所有窗口;:wqa 保存所有文件并退出。遇到“有未保存修改”提示,不要反复按 q!,先确认是否需要保存。
3 移动光标与定位
| 命令 | 含义 |
|---|---|
| h j k l | 左、下、上、右移动;同一命令前可加数字 |
| w / b / e | 下一个词首 / 上一个词首 / 当前词尾 |
| W / B / E | 按空白字符划分的大词移动 |
| 0 / ^ / $ | 行首 / 首个非空白字符 / 行尾 |
| gg / G / nG | 第一行 / 最后一行 / 第 n 行 |
| { / } | 向上 / 向下移动一个段落(按空行等边界) |
| H / M / L | 屏幕顶部 / 中部 / 底部附近 |
| Ctrl-f / Ctrl-b | 向下 / 向上翻一屏 |
| Ctrl-d / Ctrl-u | 向下 / 向上翻半屏 |
| % | 在括号、方括号、花括号等匹配符之间跳转 |
精确定位行号也可使用 :42;输入 :set number 可以显示行号。若长行在屏幕上折行显示,gj 和 gk 按屏幕显示行移动,j 和 k 则按文件中的实际行移动。
4 插入、追加与替换文本
| 命令 | 操作 |
|---|---|
| i / a | 在光标前插入 / 在光标后追加 |
| I / A | 在本行第一个非空白字符前 / 行尾追加 |
| o / O | 在下方 / 上方新建一行并进入插入模式 |
| s / S | 替换光标字符并插入 / 替换整行内容并插入 |
| r{字符} | 将光标处单个字符替换为指定字符 |
| R | 进入连续覆盖模式 |
| C | 删除光标到行尾并进入插入模式 |
在插入模式中,Backspace、方向键等行为会受终端、配置和 Vim 版本影响。尽量用普通模式完成定位,再进入插入模式输入,这样更容易保持操作可控。
5 删除、复制、剪切与粘贴
Vim 的 d、y、c 是操作符:它们后面接一个移动命令来决定范围。d 表示删除,y 表示复制(yank),c 表示删除并进入插入模式。重复操作符表示整行,例如 dd、yy、cc。
| 命令 | 结果 | 备注 |
|---|---|---|
| dw / daw | 删除到下个词首 / 删除整个词(含周围空格的文本对象) | |
| d$ 或 D | 删除到行尾 | |
| d0 | 删除到行首 | |
| dd / 3dd | 删除一行 / 删除三行 | |
| yy / 3yy | 复制一行 / 复制三行 | |
| p / P | 在光标后 / 前粘贴;行内容会粘到下一行 / 上一行 | |
| x / X | 删除字符 / 删除光标前字符 | |
| ciw | 修改光标所在的词:删除词并进入插入模式 | |
| di( | 删除括号内内容;da( | 连同括号删除 |
文本对象通常由 i(inside,内部)或 a(around,包含边界)加对象组成,例如 ci" 修改引号内内容,da{ 删除一对花括号及其中内容(具体对象和语法支持取决于 Vim)。
6 撤销、重做与重复
| 按键 | 作用 |
|---|---|
| u | 撤销最近一次修改 |
| Ctrl-r | 重做刚撤销的修改 |
| . | 重复上一次普通模式的修改命令 |
| U | 撤销本行最近一次修改(行为受版本和配置影响;初学优先用 u) |
| Ctrl-g u | 在插入模式下断开撤销块,适合将一串输入拆成独立撤销步骤 |
建议每完成一个小步骤就检查结果。若误操作,尽早按 u 撤销;若撤销过头,按 Ctrl-r 恢复。Vim 的撤销历史通常按编辑会话管理,是否跨会话保留取决于持久撤销配置。
7 搜索与替换详解
- 按 / 输入要找的文字并回车,向文件后方搜索;按 ? 则向前搜索。
- 按 n 跳到下一个匹配,N 跳到相反方向的上一个匹配。
- 使用 :s/旧/新/ 替换本行第一个匹配;加 g 替换本行全部匹配。
- 使用 :%s/旧/新/g 替换全文件;若结果重要,改用 :%s/旧/新/gc 并逐项确认。
:s/foo/bar/ " 本行第一个 foo
:s/foo/bar/g " 本行所有 foo
:%s/foo/bar/g " 全文件所有 foo
:%s/foo/bar/gc " 全文件逐个确认
:10,20s/foo/bar/g " 第 10 到 20 行
命令结构可读作 :范围 s/查找/替换/标志。范围常用 . 表示当前行、s/a/b/g 从当前行替换到文件末尾。搜索模式支持正则表达式,斜杠本身出现在模式中时需转义或换用其他分隔符。
8 可视模式与批量操作
| 按键 | 选择方式 | 常见用途 |
|---|---|---|
| v | 字符区域 | 选中一段文字后按 d 删除、y 复制、c 修改 |
| V | 整行区域 | 选择多行后统一缩进或删除 |
| Ctrl-v | 矩形块区域 | 对齐列、批量插入或删除 |
| gv | 重新选中上一次的区域 | 重复相似的批量操作 |
| > / < | 增加 / 减少缩进 | 通常对所选行生效;按两次可缩进整行 |
块选择后按 I 可在每行前插入文字;输入完成后按 Esc,Vim 会将输入应用到选中的各行。若终端不支持 Ctrl-v 或把它用作粘贴键,可使用 :set virtualedit=block、图形版 Vim,或改用替代流程。
9 多文件、缓冲区与窗口
Vim 中的缓冲区是编辑中的文件内容;窗口是显示缓冲区的视口;标签页则是一组窗口布局。理解这三个概念有助于在多个文件间切换。
| 命令 | 作用 |
|---|---|
| :e file | 在当前窗口打开文件 |
| :ls | 列出缓冲区 |
| :bnext / :bn | 切换到下一个缓冲区 |
| :bprevious / :bp | 切换到上一个缓冲区 |
| :b 文件名片段 | 切换到匹配的缓冲区 |
| :split file 或 :sp file | 水平分屏 |
| :vsplit file 或 :vsp file | 垂直分屏 |
| Ctrl-w h/j/k/l | 切换到左 / 下 / 上 / 右侧窗口 |
| :q | 关闭当前窗口 |
| :tabnew file | 打开新标签页并加载文件 |
| gt / gT | 下一个 / 上一个标签页 |
窗口尺寸:Ctrl-w = 尽量均分,Ctrl-w + 增高,Ctrl-w - 减高,Ctrl-w > 和 Ctrl-w < 调整宽度。命令中的空格表示先按 Ctrl-w 组合键,再按后续字母。
10 配置与常用设置
Vim 的用户配置通常放在 ~/.vimrc;Windows 环境可使用 $HOME/_vimrc 或 Vim 识别的配置路径,具体取决于安装方式。配置行可直接在普通模式输入冒号命令执行,也可以写进配置文件,每次启动生效。
set number " 显示行号
set relativenumber " 显示相对行号
set ignorecase " 搜索默认忽略大小写
set smartcase " 搜索含大写字母时区分大小写
set incsearch " 输入搜索词时即时跳转
set hlsearch " 高亮所有匹配
set expandtab " Tab 输入为空格
set tabstop=4 " 文件中的 Tab 显示宽度
set shiftwidth=4 " 自动缩进宽度
set autoindent " 延续上一行缩进
syntax on " 语法高亮(部分发行版默认已启用)
若配置修改后不生效,可在 Vim 中输入 :source $MYVIMRC 重新加载。:set 命令可以查看或临时修改设置,例如 :set number。不同版本、发行包及终端能力会影响部分选项的效果。
11 寄存器与系统剪贴板
Vim 的复制和删除内容通常进入寄存器。未指定寄存器时使用默认寄存器;命名寄存器可用双引号指定,例如 "ayy 将当前行复制到 a 寄存器,"ap 从 a 寄存器粘贴。系统剪贴板一般通过 + 或 * 寄存器访问,但需要 Vim 编译时包含 clipboard 支持,且终端或图形环境必须提供相应能力。
"ayy " 将当前行复制到 a 寄存器
"ap " 粘贴 a 寄存器内容
"+yy " 复制整行到系统剪贴板(需支持 +clipboard)
"+p " 从系统剪贴板粘贴
可用 :version 查看编译特性;若输出中没有 +clipboard,系统剪贴板寄存器可能不可用。
12 宏与重复任务
宏可以记录一组按键并重复执行。先将光标移到合适位置,按 qa 开始录制到 a 寄存器;完成操作后按 q 停止;按 @a 播放一次,按 @@ 重放最近一次宏。也可用 10@a 执行十次。
qa " 开始录制到寄存器 a
... " 执行要重复的操作
q " 结束录制
@a " 播放宏 a
@@ " 再次播放上一个宏
宏会忠实重放按键,因此应先在少量、结构一致的内容上试运行,并在批量执行前保存或确认可撤销。若每一行结构不完全相同,宏可能移动到错误位置。
13 常见问题排查
| 现象 | 处理方法 |
|---|---|
| 输入的字母没有写进文件 | 按 i 或 a 进入插入模式;确认屏幕有 -- INSERT -- 提示 |
| 不知道如何退出 | 先按 Esc,再输入 :q 并回车;有未保存内容时先选择保存或 :q! |
| 方向键插入 A/B/C 等字符 | 多见于终端或兼容配置问题;先用 h/j/k/l,检查终端设置和 Vim 版本 |
| 粘贴代码后缩进乱掉 | 粘贴前尝试 :set paste,完成后 :set nopaste;现代版本也可使用系统剪贴板粘贴 |
| 替换范围弄不清 | 使用 :%s/旧/新/gc 逐个确认,或先对少量行验证 |
| 命令行输错了 | 按 Esc 取消;在命令行中可用 Backspace 编辑后再执行 |
| 误删或误改 | 立即按 u;如果撤销过头,按 Ctrl-r 重做 |
| 文件显示乱码 | 检查文件编码;可用 :set fileencoding? 查询,必要时用 :edit ++enc=utf-8 文件名 重新打开 |
14 新手练习路线
- 练习一:新建 scratch.txt,输入三行文字,保存并退出。
- 练习二:用 gg、G、0、^、$ 定位;用 3j、2w 练习带数字的移动。
- 练习三:用 dd 删除一行、yy 和 p 复制粘贴,再用 u 恢复。
- 练习四:用 / 查找一个词,用 n/N 浏览匹配;用 :%s/旧/新/gc 逐个确认替换。
- 练习五:用 V 选中多行,按 > 增加缩进;用 Ctrl-v 选中矩形后批量插入字符。
- 练习六:打开两个文件并分屏,用 Ctrl-w h/j/k/l 切换窗口,再用 :ls 与 :bn 切换缓冲区。
熟练的目标不是记住所有 Vim 命令,而是建立稳定习惯:不确定时按 Esc 回到普通模式;先确认作用范围再执行修改;善用 u 撤销;用 :help 查命令;把频繁使用的设置逐步写入配置文件。
附录 常用按键一览
| 类别 | 快速记忆 |
|---|---|
| 模式 | Esc 回普通模式;i/a/o 输入;v/V/Ctrl-v 选择 |
| 保存退出 | :w 保存;:q 退出;:wq 保存退出;:q! 放弃改动退出 |
| 移动 | h j k l;w/b;0/^/$;gg/G;nG |
| 修改 | x 删除字符;dd 删除行;yy 复制行;p/P 粘贴;u 撤销;Ctrl-r 重做 |
| 搜索 | /词、?词;n/N 下一个/上一个;:%s/a/b/gc 全文逐个确认 |
| 帮助 | :help;:help 命令;Ctrl-] 跳帮助标签;Ctrl-o 返回 |
常见任务组合
| 目标 | 操作顺序 |
|---|---|
| 修改整行内容 | 将光标放在行内,按 cc,输入新内容,再按 Esc。 |
| 修改光标所在单词 | 按 ciw,输入替换内容,再按 Esc。 |
| 删除括号内内容 | 将光标放入括号内,按 di(;需要连括号一起删时按 da( |
| 在多行前添加相同字符 | 按 Ctrl-v 选中多行的列位置,按 I,输入字符,按 Esc。 |
| 全文替换但先检查结果 | 输入 :%s/旧内容/新内容/gc,逐项按 y 确认或 n 跳过。 |
| 复制当前行并在下方插入 | 按 yy 复制整行,再按 p 粘贴到下一行。 |
| 快速到文件末尾并另存 | 按 G 到末行,输入 :w 新文件名 并回车。 |
批量修改前先在练习文件中操作;范围较大的替换可逐项确认,确保修改目标正确。