Vim 学习速成
一、Vim 的优势
Vim 通过全键盘快捷键完成操作,长期使用效率高于依赖鼠标的编辑器(VS Code、Sublime Text 等)。类比竞技游戏:高阶操作绑定快捷键,规避鼠标移动带来的延迟;Vim 不需要做到全部快捷键最优,掌握前 20% 的常用功能,即可相比鼠标编辑器获得 80% 的效率提升。
学习误区:仅运行vimtutor练习一周后放弃,回归图形编辑器。
正确路径:在日常、非常规工作流中持续使用 Vim,而非只在固定场景使用。
同任务对比演示:修改 JSON 格式化 C 程序
任务目标:为缩进函数增加可配置缩进宽度参数,从固定 2 空格改为可传入数值。
- Vim 流程
- 搜索定位函数声明
static void indent,在形参列表添加int width - 修改
printf格式化字符串,使用%*s,由后续传入的width参数控制填充长度 - 同步修改
print_json函数签名,增加width参数 - 修改
main:启用命令行参数解析,width采用三元表达式,有入参则转换为整数,无入参默认值 2 - 编译报错后,借助 quickfix 错误列表遍历报错位置,使用
.重复上一次修改操作批量补全参数 - 重新编译,验证传入不同宽度参数的输出效果
- 全程手不离开主键位区,无需鼠标点击、窗口切换
- 搜索定位函数声明
- VS Code 流程
- 查找、修改代码时需要多次鼠标点击、光标拖拽、窗口切换
- 跳转编译错误需要
Ctrl+点击 - 默认界面包含侧边文件树、状态栏、标题栏等冗余元素,可视代码区域更小
- 手需要反复离开主键位区操作鼠标,单次修改可完成,但长期高频编辑损耗更高
二、Vim 的模式
Vim 以模式为运行框架,本部分覆盖普通模式(Normal)、插入模式(Insert)
- 普通模式:默认模式,用于光标移动、文本操作、命令执行
- 插入模式:用于输入文本
不深入模式底层定义,优先掌握实操。
三、光标移动
3.1 水平移动
| 按键 | 作用 |
|---|---|
h | 光标左移一格 |
l | 光标右移一格 |
w | 向前跳至下一个单词开头 |
b | 向后跳至上一个单词开头 |
e | 向前跳至当前单词末尾 |
[数字]w/[数字]b | 一次性跳转指定数量单词 |
f{char} | 本行向后查找字符char,光标落在目标字符上 |
F{char} | 本行向前查找字符char,光标落在目标字符上 |
; | 重复上一次f/F查找(同方向) |
, | 重复上一次f/F查找(反方向) |
0 | 跳至本行首字符 |
$ | 跳至本行末尾 |
^ | 跳至本行第一个非空白字符 |
3.2 垂直移动
| 按键 | 作用 |
|---|---|
j | 下移一行 |
k | 上移一行 |
[数字]j/[数字]k | 一次性上下跳转指定行数;配合相对行号使用体验更佳 |
Ctrl+d | 向下翻半页 |
Ctrl+u | 向上翻半页 |
} | 跳到下一个段落(以空行分隔文本块) |
{ | 跳到上一个段落 |
gg | 跳转到文件首行 |
G | 跳转到文件末行 |
% | 跳转到匹配的成对符号:()[]{} |
/pattern | 向下搜索文本pattern,回车确认 |
n | 跳到下一个搜索匹配项 |
N | 跳到上一个搜索匹配项 |
[数字]n/[数字]N | 一次性跳转多个匹配结果 |
Ctrl+c | 退出搜索 |
尽量不使用方向键,避免手离开主键位区。
四、Vim 操作语法:动词 + 数量 + 名词(动作语法)
结构:动词 [数量] 动作对象
- 动词:定义操作
d:删除(delete)c:修改(change,删除目标内容并进入插入模式)y:复制(yank)
- 名词:文本范围/移动动作
.:重复上一次修改操作
示例
dw:删除当前单词cw:修改当前单词yw:复制当前单词d3w:删除后面 3 个单词c3w:修改后面 3 个单词df{char}:删除到目标字符(包含该字符)dt{char}:删除到目标字符(不包含该字符)
文本选择范围(inner / around,i/a)
i(inner):内部,不含包裹符号a(around):包含包裹符号以及周边空白
| 快捷键 | 效果 |
|---|---|
diw | 删除单词内部 |
daw | 删除整个单词(含后方空格) |
di( | 删除括号内部内容 |
da( | 删除括号+括号内全部内容 |
di{/da{ | 花括号块 |
di"/da" | 双引号内文本 |
di'/da' | 单引号内文本 |
dip | 删除段落内部 |
dap | 删除整个段落 |
dit | 删除 HTML 标签内部内容 |
dat | 删除 HTML 标签 + 内部全部内容 |
粘贴
p:粘贴到光标之后P:粘贴到光标之前
复制内容存入寄存器,可多次粘贴复用。
行操作
V:行可视模式,选中整行Vyp:复制当前行,在下方粘贴,快速复制一行
五、缓冲区、文件浏览、跳转
- Netrw(Vim 内置文件浏览器)
:e .打开目录浏览- 普通模式移动快捷键同样生效,回车进入文件/文件夹
- 缓冲区(buffer)
:ls列出所有打开缓冲区:bn下一个缓冲区:bp上一个缓冲区
- 跳转历史
Ctrl+o:回到上一个跳转位置Ctrl+i:前进到下一个跳转位置>
依靠缓冲区与跳转历史,可替代文件树、标签页
LSP 配套快捷键
gd:跳转到标识符定义处K:悬浮查看文档/类型信息
Telescope(插件):Space ff全局搜索文件
六、适用场景
Vim 不限于代码编辑:
- 编辑各类配置文件(Wayland 合成器、DWM、locale 配置等)
- Linux TTY 无图形界面环境,无鼠标可用
- 日常纯文本、Markdown 文件查看修改
七、学习路线总结
- 抛弃方向键,全程使用
hjkl移动光标 - 依次掌握移动、基础删除/修改、复制粘贴、
.重复操作 - 在真实工作流持续使用,而非单独刷教程
- 进阶内容(本教程未覆盖,后续进阶内容):查找替换、高级宏、插件配置等
- 目标:形成肌肉记忆,手保持在主键位区,减少鼠标切换开销
Vim 映射命令分类表
| 命令 | 模式范围 | 是否递归 | 说明 |
|---|---|---|---|
map | Normal、Visual、Select、Operator-pending | 是 | 多模式递归映射,范围较广,容易在意外模式下触发 |
noremap | Normal、Visual、Select、Operator-pending | 否 | 上述多模式的非递归版本 |
nmap | Normal | 是 | 普通模式递归映射 |
nnoremap | Normal | 否 | 普通模式非递归映射;自定义快捷键通常优先使用 |
vmap | Visual、Select | 是 | 可视/选择模式递归映射 |
vnoremap | Visual、Select | 否 | 可视/选择模式非递归映射 |
imap | Insert | 是 | 插入模式递归映射 |
inoremap | Insert | 否 | 插入模式非递归映射 |
cmap | Command-line | 是 | 命令行模式递归映射 |
cnoremap | Command-line | 否 | 命令行模式非递归映射 |
omap | Operator-pending | 是 | 操作符等待模式递归映射,如输入d、y、c后等待运动对象的阶段 |
map! | Insert、Command-line | 是 | 插入模式与命令行模式的递归映射 |
noremap! | Insert、Command-line | 否 | 插入模式与命令行模式的非递归映射 |
术语解释
<leader>:Vim 中的用户自定义前缀键,用于构造个人快捷键前缀。默认通常为\,常见配置为let mapleader = ","。例如nnoremap <leader>w :w<CR>表示在普通模式下按下,w执行保存。- 寄存器
"+:系统剪贴板寄存器,对应操作系统的 CLIPBOARD。"+y将选中文本复制到系统剪贴板,"+p从系统剪贴板粘贴。该功能要求 Vim 编译时启用+clipboard。 <M-...>:Alt / Meta 组合键。例如<M-F2>表示 Alt+F2。<C-...>:Control 组合键。例如<C-c>表示 Ctrl+C。<CR>:回车键,等价于 Enter / Return。在映射中常用于提交 Ex 命令,如:w<CR>表示执行保存并确认。
使用建议
- 自定义快捷键优先使用非递归形式:
nnoremap、vnoremap、inoremap、cnoremap。 - 避免使用
map绑定普通快捷键,因其会在 Operator-pending 等模式下意外生效。 - 需要与系统剪贴板交互时,使用
"+y、"+p,并确认 Vim 支持+clipboard。
vimrc 配置片段
" ============================================================================= " 基础设置 " ============================================================================= set nocompatible " 关闭 vi 兼容模式 set encoding=utf-8 " 文件编码 set fileencodings=utf-8,gbk,latin1 set number " 显示行号 set relativenumber " 显示相对行号 set cursorline " 高亮当前行 set showmode " 底部显示当前模式 set showcmd " 显示未完成的命令 set hidden " 允许隐藏未保存的缓冲区 set history=1000 " 命令历史记录数 " ============================================================================= " 缩进与空白 " ============================================================================= set tabstop=4 " Tab 显示宽度 set shiftwidth=4 " 自动缩进宽度 set softtabstop=4 " 编辑时 Tab 退格宽度 set expandtab " Tab 转换为空格 set smartindent " 智能缩进 set autoindent " 保持上一行缩进 " ============================================================================= " 搜索设置 " ============================================================================= set hlsearch " 高亮搜索结果 set incsearch " 增量搜索 set ignorecase " 搜索忽略大小写 set smartcase " 含大写字母时区分大小写 " ============================================================================= " 界面与分割 " ============================================================================= set splitbelow " 水平分割窗口在下方 set splitright " 垂直分割窗口在右侧 set scrolloff=8Reference
- 29 分钟 Vim 速成:无需记忆,理解快捷键丨2026 年底,你还在用 Vim 吗?_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV18JxF6SEw2/