Vim 完全指南:架构与实战
Vim(Vi IMproved)是由 Bram Moolenaar 创建的跨平台文本编辑器,基于 UNIX Vi 编辑器大幅增强。当前最新版本为 9.2,源代码以 C(~40%)和 Vim Script(~54%)为主,托管于 github.com/vim/vim。
核心定位:Vim 是一个模态编辑器,通过模式(Mode)分离"导航"与"编辑"操作,支持终端和 GUI 两种界面。设计坚持 Vi 兼容、跨平台、高扩展性。
本指南分两大部分:第 1-5 节分析 Vim 的系统架构(行为图、结构图、设计原则、插件生态);第 6-16 节及附录是实战使用手册(移动、编辑、搜索替换、窗口、配置、宏与速查表)。
1. Vim 概述
| 属性 | 说明 |
| 语言 | C 核心 + Vim Script 运行时 |
| 许可证 | Vim License(GPL 兼容,慈善软件) |
| 作者 | Bram Moolenaar (1961-2023) |
| 首个版本 | 1991 年(基于 Stevie) |
| 平台 | Linux / macOS / Windows / BSD / VMS / Haiku |
| 代码行数 | ~30 万行 C + ~10 万行运行时脚本 |
| 关键特性 | 多级撤销、语法高亮、拼写检查、多窗口/标签页、插件系统、终端支持 |
2. 行为图 — 系统"做什么"
2.1 用例图
从用户视角描述 Vim 的核心功能边界:编辑、导航、配置、脚本扩展、文件管理。GitHub CI 等外部参与者触发自动化构建与测试。
图 1:Vim 核心用例图
2.2 活动图 — 编辑工作流
典型的 Vim 编辑会话流程:从启动初始化(加载 vimrc、runtime 文件),进入 Normal 模式的文件导航/编辑循环,直到保存退出。
图 2:Vim 编辑会话活动图(带泳道)
2.3 状态机 — 模式切换
Vim 的核心设计是模态编辑,共 7 种基础模式(Normal、Insert、Visual、Select、Command-line、Ex、Terminal-Job),通过快捷键在模式间切换。
图 3:Vim 模式切换状态机
2.4 序列图 — 编辑会话交互
用户打开文件、编辑、保存时的内部交互流程:终端的原始输入 → Vim 核心事件循环 → 模式分发 → 缓冲区/窗口管理 → 保存到文件系统。
图 4:Vim 编辑会话序列图
3. 结构图 — 系统"由什么组成"
3.1 组件图 — 系统架构
Vim 的宏观架构分为终端界面层和GUI 界面层(二选一),底层是共享的核心引擎,提供缓冲区管理、搜索/替换、撤销树、命令解析、语法引擎等核心能力,上层接入脚本接口和运行时文件。
图 5:Vim 组件架构图
3.2 包图 — 源码目录结构
Vim 源码仓库的组织结构。 src/ 是 C 核心引擎,runtime/ 包含全部运行时文件(文档、语法、配色、插件),src/testdir/ 提供完整回归测试框架。
图 6:Vim 源码包图
3.3 类图 — 核心数据结构
Vim 使用 C 语言的结构体(类型后置 _T)实现面向对象思想,核心包括缓冲区 buf_T、窗口 win_T、标签页 tabpage_T 和文件信息 file_buffer_T 等,它们之间存在严格的从属与引用关系。
图 7:Vim 核心数据结构类图
3.4 部署图 — 构建与运行
Vim 从 C 源码编译为可执行文件,在不同平台上以不同形态运行:终端 vim、GUI gvim(GTK/Motif/Athena)、macOS MacVim、Windows gvim,共享同一套运行时文件。
图 8:Vim 构建与部署图
4. 设计原则
| 原则 | 说明 |
| Vi 兼容 | 可作为 Vi 的直接替代品使用,不复制 Vi 的明显 bug |
| 持续改进 | 以 Vi 精神做扩展——优先键盘操作、命令一致性,鼠标为辅 |
| 跨平台 | 支持所有主流 OS,同一套功能覆盖终端和 GUI |
| 完善文档 | 未文档化的功能等于无用功能;帮助系统 :help 是核心体验 |
| 高性能小体积 | 启动快、命令响应快、代码体积精简,支持慢速网络连接场景 |
| 可维护 | C95 标准 + 部分 C99 特性,遵循严格编码风格,函数名 ≤31 字符 |
| 高度灵活 | 通过选项(~400+)、映射、自动命令、脚本语言让用户按喜好定制 |
| 非大而全 | 不做 shell 或 OS;不追求花哨 GUI,但欢迎实用的 GUI 功能 |
代码风格要点
| 项目 | 规范 |
| 缩进 | 4 空格(新文件禁用 Tab) |
| 花括号 | 括号独占一行 |
| 注释 | 文件头用 /* */,函数内用 // |
| 函数声明 | 返回类型独占一行,函数体左花括号独占一行 |
| 原型 | 不使用传统 .h 文件,用 src/proto/*.pro 存放函数原型 |
| 类型命名 | 自定义类型后置 _T,如 buf_T、linenr_T |
| 内存管理 | 不使用裸 malloc/free,用 alloc()/vim_free() |
5. 插件生态
Vim 的插件体系是核心扩展机制,分为两类:
| 类型 | 说明 | 示例 |
| 内置标准插件 | 随发行版附带,位于 runtime/pack/dist/opt/ | netrw(文件浏览器)、matchit(配对跳转)、editorconfig |
| 第三方插件 | 社区维护,通过插件管理器安装 | NERDTree、fzf.vim、coc.nvim、vim-surround |
扩展接口
| 接口 | 用途 |
| Vim9 Script | 原生脚本语言,v9 引入,类支持(:class) |
| Legacy Vim Script | 兼容旧版,函数式风格 |
| Python 3 | Python 接口(:python3) |
| Lua | Lua 接口 |
| Perl / Ruby / Tcl | 可选编译支持 |
| Channel / Job | 异步进程通信(用于 LSP、外部工具集成) |
自动命令(autocmd)
Vim 通过事件驱动机制实现自动化——在特定事件(文件打开、保存、缓冲区切换等)触发时执行用户定义的命令。这是插件系统的基石:
BufRead / BufWrite — 文件读写事件
FileType — 文件类型检测事件
TextChanged — 文本变更事件
VimEnter / VimLeave — 启动/退出事件
CursorMoved — 光标移动事件
6. 心智模型
阅读建议:如果你刚接触 Vim,先看第 6 节理解心智模型;如果你已有基础想系统提升,从第 7-9 节开始;如果你只需要查某个命令,直接翻《附录:速查表》。
6.1 核心思想:命令语法
Vim 不是"按什么键做什么事"的编辑器,而是一种语言。每个操作遵循统一语法:
【数字】+ 【操作符】+ 【动作/文本对象】
3 d iw → 删除 3 个词
5 y j → 复制当前行及下面 5 行
c i" → 修改双引号内的内容
. → 重复上一次修改
理解这个语法后,你不是在背快捷键,而是在"造句"。这也是 Vim 为何高效——可组合、可重复。
6.2 模式
| 模式 | 进入方式 | 退出方式 | 用途 |
| Normal | 默认 / Esc | — | 导航、执行命令 |
| Insert | i a o s c | Esc / Ctrl-[ | 输入文本 |
| Visual | v V Ctrl-v | Esc / 执行操作 | 选择文本区域 |
| Command-line | : / ? | Enter / Esc | Ex 命令、搜索 |
关键认知:Normal 模式才是"主模式"。Insert 模式只是临时状态,做完输入立即退回 Normal。新手常犯的错误是长时间停在 Insert 模式。完整的模式切换状态机见第 2.3 节。
6.3 "不要重复自己"
Vim 的核心哲学是 DRY(Don't Repeat Yourself)。体现在:
- . — 重复上一次修改(最强大的单一按键)
- 宏(q + 寄存器名)— 录制任意复杂操作序列,@ 回放
- ; / , — 重复上次 f/t 搜索
- n / N — 重复上一次 / 或 ? 搜索
7. 移动
最高效的移动不是 hjkl,而是"语义单位"跳转——词、句、段、函数、匹配括号。
7.1 基础移动
| 按键 | 效果 |
| h j k l | 左 下 上 右 |
| w / W | 下一个词首(W 只按空格分割) |
| b / B | 上一个词首 |
| e / E | 当前/下一个词尾 |
| 0 / ^ | 行首 / 行首第一个非空字符 |
| $ | 行尾 |
| gg / G | 文件首 / 文件尾 |
| 42G / :42 | 跳到第 42 行 |
7.2 行内精确跳转
| 按键 | 效果 |
| f{char} / F{char} | 向右/左跳到下一个 {char} 字符上 |
| t{char} / T{char} | 向右/左跳到下一个 {char} 字符前 |
| ; / , | 重复上一次 f/t(正向/反向) |
| % | 跳到匹配的括号 |
7.3 屏幕级移动
| 按键 | 效果 |
| Ctrl-d / Ctrl-u | 向下/上翻半页 |
| Ctrl-f / Ctrl-b | 向下/上翻一整页 |
| H / M / L | 跳到屏幕 顶部 / 中部 / 底部 |
| zz / zt / zb | 当前行置中 / 置顶 / 置底 |
7.4 语义级移动
| 按键 | 效果 |
| ( / ) | 上一句 / 下一句开头 |
| { / } | 上一段 / 下一段(空行分隔) |
| [[ / ]] | 上一个 / 下一个函数/类开头(代码) |
| [{ / ]} | 上一个 / 下一个不匹配的花括号 |
| Ctrl-o / Ctrl-i | 跳转历史中 后退 / 前进(最重要的导航键) |
7.5 文本对象
文本对象是 Vim 最强大的编辑概念之一。它让你以"语义单元"(一个词、一句话、一对引号/括号内的内容)为操作单位:
| 语法 | 效果 | 记忆 |
iw | 当前词(inner word) | i = inner |
aw | 当前词含尾随空格(a word) | a = around |
i" i' i` | 引号内的内容 | |
a" a' a` | 引号内的内容 + 引号本身 | |
i( / i) / ib | 圆括号内 | b = block |
i{ / i} / iB | 花括号内 | B = big block |
a[ a] | 方括号内 + 括号 | |
is | 当前句子 | |
ip | 当前段落 | |
i< it | HTML/XML 标签内 | t = tag |
实战用法:ci" 修改引号内文字;da{ 删除花括号块含括号;yip 复制整个段落;ciw 修改当前词(最常用)。组合 3diw 删除 3 个词。
8. 编辑
8.1 插入模式入口
| 按键 | 效果 |
| i | 光标前插入 |
| a | 光标后插入 |
| I | 行首插入(第一个非空字符前) |
| A | 行尾插入 |
| o / O | 下方/上方新行插入 |
| s / S | 删除光标字符/整行并插入 |
| c{motion} | 删除动作范围并插入 |
8.2 删除(= 剪切)
| 按键 | 效果 |
| x / X | 删除当前/前一个字符 |
| dd | 删除整行 |
| D | 删除到行尾 |
| d{motion} | 删除动作范围(dw d} d/foo) |
| d{text-object} | 删除文本对象(diw da{) |
8.3 复制与粘贴
| 按键 | 效果 |
| yy / Y | 复制整行 |
| y{motion} | 复制动作范围 |
| y{text-object} | 复制文本对象 |
| p / P | 粘贴到光标后 / 前 |
| "+y / "+p | 与系统剪贴板交互(需要 +clipboard) |
8.4 缩进与大小写
| 按键 | 效果 |
| >> / << | 当前行增加/减少缩进 |
| >{motion} / <{motion} | 动作范围增减缩进(>ip 整段) |
| == | 自动缩进当前行 |
| ={motion} | 自动缩进范围(=G 到文件尾) |
| ~ | 切换大小写 |
| gu{motion} / gU{motion} | 转 小写 / 大写(guiw 词转小写) |
8.5 撤销与重做
| 按键 | 效果 |
| u | 撤销 |
| Ctrl-r | 重做 |
| U | 撤销当前行所有修改 |
:earlier 5m | 回退到 5 分钟前的状态 |
:later 30s | 前进 30 秒 |
Vim 的撤销是树形的(不是线性)。使用 :undolist 查看,g- / g+ 在树中导航。
9. 搜索与替换
9.1 搜索
| 命令 | 效果 |
/pattern | 正向搜索 |
?pattern | 反向搜索 |
| n / N | 下一/上一匹配 |
* / # | 搜索光标下的单词(正向/反向) |
g* | 搜索光标下的词(部分匹配) |
:noh | 清除搜索高亮 |
:set hls is | 启用搜索高亮 + 增量搜索 |
9.2 替换
:[range]s/pattern/replacement/[flags]
| 范围 | 说明 |
:s/foo/bar/ | 当前行第一个匹配 |
:s/foo/bar/g | 当前行所有匹配 |
:%s/foo/bar/g | 全文替换 |
:%s/foo/bar/gc | 全文替换,每次确认 |
:10,20s/foo/bar/g | 10 到 20 行替换 |
:'<,'>s/foo/bar/g | 选中区域替换(Visual 模式下按 : 自动填入) |
9.3 正则技巧
| 模式 | 说明 |
\v | very magic 模式,少写反斜杠 |
\V | 纯文本匹配 |
\zs / \ze | 标记匹配的起/止位置 |
\%V | 仅在选中区域内匹配 |
实战示例::%s/\v(foo|bar)/[\1]/g — 将所有 foo 或 bar 用方括号包裹(\v 让括号不需要转义)。
10. 文件与缓冲区
10.1 打开文件
| 命令 | 效果 |
:e file.txt | 编辑文件(Tab 补全路径) |
:e . | 打开 netrw 文件浏览器 |
:e **/foo* | 模糊找文件 |
:find foo.c | 在 path 中找文件 |
gf | 打开光标下的文件路径 |
Ctrl-g | 显示当前文件路径 |
10.2 缓冲区管理
| 命令/按键 | 效果 |
:ls / :buffers | 列出所有缓冲区 |
:b 3 / :b name | 切换到 3 号 / 按名缓冲区 |
:bn / :bp | 下一个/上一个缓冲区 |
:bd | 删除(关闭)当前缓冲区 |
Ctrl-^ | 切换到上一个缓冲区(常用!) |
10.3 保存与退出
| 命令 | 效果 |
:w | 保存 |
:wa | 保存所有 |
:q / :q! | 退出 / 强制退出 |
:wq / :x | 保存并退出 |
:qa! | 全部强制退出(丢弃所有修改) |
ZZ | 保存并退出(Normal 模式) |
11. 窗口与标签
11.1 窗口分割
| 命令/按键 | 效果 |
:sp / Ctrl-w s | 水平分割 |
:vs / Ctrl-w v | 垂直分割 |
Ctrl-w q / :q | 关闭当前窗口 |
| Ctrl-w o | 仅保留当前窗口(关闭其他) |
| Ctrl-w w | 切换到下一个窗口 |
| Ctrl-w h/j/k/l | 切换到 左/下/上/右 窗口 |
| Ctrl-w = | 窗口等宽/等高 |
| Ctrl-w _ / Ctrl-w | | 最大化 高度 / 宽度 |
:resize +5 / :vertical resize +10 | 调整大小 |
11.2 标签页
| 命令 | 效果 |
:tabe file | 新标签页打开文件 |
| gt / gT | 下一个/上一个标签页 |
:tabc | 关闭当前标签页 |
场景区分:窗口(split)用于同时查看同一文件的不同部分或多文件对比;标签页(tab)用于不同工作上下文(如一个 tab 编辑代码,另一个 tab 看日志/文档)。
12. 代码导航
12.1 内置标签跳转
无需插件,利用 ctags 实现代码定义跳转:
# 项目根目录生成 tags 文件
ctags -R .
# 或者在 vim 内生成
:!ctags -R .
# 跳转到光标下符号的定义
Ctrl-]
# 跳回之前位置
Ctrl-t
# 跳到指定标签
:tag function_name
# 多匹配时选择
:ts function_name
12.2 Quickfix 列表
Vim 的通用结果列表,是编译、搜索、代码跳转的统一接口:
# 填充 quickfix 列表
:vimgrep /pattern/ **/*.c " 搜索所有 .c 文件
:make " 编译结果
# 在 quickfix 列表间导航
:copen " 打开 quickfix 窗口
:cnext / :cprev " 下一/上一项
:cfirst / :clast " 第一/最后一项
12.3 位置标记
| 按键 | 效果 |
| m{a-z} | 设置当前文件的标记 |
| m{A-Z} | 设置跨文件的标记 |
| '{mark} | 跳到标记行首 |
| `{mark} | 跳到标记的精确位置 |
:marks | 列出所有标记 |
| `` / '' | 跳回上次位置 / 行首 |
12.4 netrw 内置文件浏览器
:Lex " 左侧打开文件树(固定)
:Ex " 浏览当前目录
:Sex " 水平分割浏览
:Vex " 垂直分割浏览
如需更完整的文件树体验(类似 IDE 侧边栏),推荐安装 NERDTree 或 nvim-tree 插件。
13. 配置实战
13.1 最小可用的 ~/.vimrc
" === 基础 ===
set nocompatible " 不兼容 Vi
syntax on " 语法高亮
filetype plugin indent on " 文件类型检测
set number " 行号
set mouse=a " 鼠标支持
set hidden " 允许切换未保存的缓冲区
set encoding=utf-8
" === 搜索 ===
set hlsearch " 搜索结果高亮
set incsearch " 增量搜索(输入时即时匹配)
set ignorecase " 忽略大小写
set smartcase " 有大写字母时区分大小写配
" === 缩进 ===
set autoindent
set expandtab " Tab 转空格
set shiftwidth=4 " 自动缩进宽度
set tabstop=4 " Tab 显示宽度
set softtabstop=4
" === netrw 文件树 ===
let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 4
let g:netrw_winsize = 25
nnoremap <Space>e :Lexplore<CR>
" === ctags 代码跳转 ===
let $PATH = '/opt/homebrew/bin:' . $PATH
set tags=./tags;,tags;
nnoremap <Space>t :!ctags -R .<CR>
" === 快捷键 ===
nnoremap <Space>w :w<CR>
nnoremap <Space>q :q<CR>
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" === 视觉 ===
set cursorline " 高亮当前行
set showcmd " 显示正在输入的命令
set showmode " 显示当前模式
13.2 有用的选项
| 选项 | 效果 |
set list | 显示不可见字符(Tab、行尾空格) |
set listchars=tab:>-,trail:· | 定制不可见字符的显示样式 |
set wrap / set nowrap | 自动换行 / 不换行 |
set relativenumber | 相对行号(便于 12j 这种跳转) |
set scrolloff=3 | 光标距上下边保留 3 行 |
set wildmenu | 命令行补全菜单 |
set splitright / set splitbelow | 垂直/水平分割时新窗口在右/下 |
set colorcolumn=80 | 80 列显示竖线 |
13.3 常用 autocommand
" 自动去行尾空格
autocmd BufWritePre * :%s/\s\+$//e
" 回到上次编辑位置
autocmd BufReadPost *
\ if line("'\"") > 1 && line("'\"") <= line("$") |
\ exe "normal! g'`\"" |
\ endif
14. 插件体系
14.1 Vim 内置包管理(推荐,零依赖)
Vim 8+ 自带 native package 支持,无需任何第三方插件管理器:
# 目录结构
~/.vim/pack/{name}/start/ # 自动加载的插件
~/.vim/pack/{name}/opt/ # 手动加载的插件(:packadd plugin-name)
# 安装一个插件(以 vim-commentary 为例)
mkdir -p ~/.vim/pack/bundle/start/
cd ~/.vim/pack/bundle/start/
git clone https://github.com/tpope/vim-commentary.git
# opt 目录下的插件需手动加载
git clone https://github.com/preservim/nerdtree.git ~/.vim/pack/bundle/opt/nerdtree
# 在 vimrc 中:packadd nerdtree
14.2 进阶:推荐插件
| 场景 | 插件 | 说明 |
| 文件树 | NERDTree | 完整文件树侧边栏 |
| 模糊查找 | fzf.vim | 文件/缓冲区/标签模糊搜索 |
| 代码补全 | coc.nvim / YouCompleteMe | LSP 智能补全 |
| 注释 | vim-commentary | gc{motion} 注释/取消注释 |
| 包围符 | vim-surround | cs"' 替换引号类型 |
| 状态栏 | vim-airline / lightline | 丰富状态栏 |
| Git | vim-fugitive | Git 集成 |
| 对齐 | vim-easy-align | 快速对齐代码 |
14.3 vim-commentary 速查
gcc " 注释/取消注释当前行
gc{motion} " 注释动作范围(gc5j 注释下 5 行)
gcip " 注释当前段落
15. 实战场景
15.1 重命名变量
* " 搜索光标下的词
ciwnew_name " 修改当前词为新名称
Esc " 退回 Normal
n " 下一个
. " 重复修改
n.n.n. " 继续...
15.2 在多个文件间搜索替换
" 1. 在所有 .py 文件中搜索 old_name
:vimgrep /old_name/ **/*.py
" 2. 打开 quickfix 窗口查看所有匹配
:copen
" 3. 逐项修改或批量替换
:cfdo %s/old_name/new_name/g | update
15.3 代码格式化
gg=G " 全文自动缩进
ggVG= " 同样效果(选中全文 → 缩进)
=ip " 格式化当前段落
" 配合外部格式化工具
:%!clang-format " 全文用 clang-format 格式化
15.4 diff 文件比较
" 终端启动
vimdiff file1 file2
" 在 vim 内比较两个窗口
:windo diffthis
" 快捷键
]c / [c " 下一个/上一个差异
dp " 把当前 diff 块推送到另一边
do " 从另一边拉取当前 diff 块
:diffupdate " 手动刷新 diff
15.5 列块编辑
Ctrl-v " 进入块选择模式
jjj... " 向下选择多行
I " 列首插入
输入内容
Esc " 所有行生效
" 或:
Ctrl-v " 块选择
$ " 扩展到行尾
A " 列尾追加
输入内容
Esc
15.6 字段拼接/拆分
" 将多行合并为一行
VjjjJ " 选中 4 行 → 合并
" 在逗号处拆分为多行
:%s/,/,\r/g
" 将逗号分隔的值对齐为列
:%!column -t -s','
16. 宏与重复
16.1 录制与回放
qa " 开始录制宏到寄存器 a
... " 执行任意操作序列
q " 停止录制
@a " 执行宏 a
@@ " 重复上一次宏
5@a " 执行宏 a 5 次
" 对多行执行宏
:5,20normal @a " 对 5-20 行执行宏 a
16.2 宏实战:给每行加引号和逗号
# 原始:
apple
banana
cherry
# 操作:qa I" Esc A", Esc j q
# 然后:2@a(对剩下 2 行执行)
# 结果:
"apple",
"banana",
"cherry",
16.3 编辑已有宏
" 查看宏 a 的内容
:reg a
" 将宏粘贴出来编辑
"ap " 粘贴寄存器 a 的内容
...修改... " 编辑文本
"ay$ " 把修改后的内容存回寄存器 a
附录:速查表
移动速查
| 分类 | 按键 | 效果 |
| 字符 | h j k l | ← ↓ ↑ → |
| 词 | w b e | 词首 词首 词尾 |
| 行 | 0 ^ $ | 行首 非空首 行尾 |
| 段/句 | { } ( ) | 段跳 句跳 |
| 文件 | gg G | 首 尾 |
| 精确 | f{char} t{char} | 跳到字符上/前 |
| 匹配 | % | 匹配括号 |
| 屏幕 | H M L | 屏幕顶 中 底 |
| 历史 | Ctrl-o Ctrl-i | 跳转后退 前进 |
| 行号 | 42G :42 | 跳到 42 行 |
| 标记 | m{a-z} '{mark} | 设标记 跳标记 |
编辑速查
| 分类 | 按键 | 效果 |
| 插入 | i a I A o O s S c{motion} | 各种插入入口 |
| 删除 | x dd D d{motion} d{tobj} | 各种删除 |
| 复制 | yy y{motion} y{tobj} | 各种复制 |
| 粘贴 | p P | 光标后/前粘贴 |
| 撤销 | u Ctrl-r | 撤销 重做 |
| 重复 | . | 重复上一次修改 |
| 缩进 | >> << == | 增减缩进 自动缩进 |
| 大小写 | ~ gu gU | 切换 转小写 转大写 |
| 合并 | J | 合并当前行和下一行 |
文本对象速查
| 对象 | inner | around |
| 词 | iw | aw |
| 引号 | i" i' i` | a" a' a` |
| 圆括号 | i( ib | a( ab |
| 花括号 | i{ iB | a{ aB |
| 方括号 | i[ | a[ |
| 角括号 | i< it | a< at |
| 句子 | is | as |
| 段落 | ip | ap |
窗口速查
| 按键 | 效果 |
| Ctrl-w s / v | 水平/垂直分割 |
| Ctrl-w h j k l | 切换到 左/下/上/右 窗口 |
| Ctrl-w w | 循环切换窗口 |
| Ctrl-w q / o | 关闭当前窗口 / 仅保留当前 |
| Ctrl-w = / _ / | | 等宽高 / 最大高 / 最大宽 |
| Ctrl-w r / R | 旋转窗口 / 反向旋转 |
| Ctrl-w T | 当前窗口移到新标签页 |
搜索替换速查
| 命令 | 效果 |
/pattern | 正向搜索 |
/pattern/e | 搜索并停到匹配末尾 |
| * # | 搜索光标词(正向/反向) |
:%s/old/new/g | 全文替换 |
:%s/old/new/gc | 逐次确认替换 |
:'<,'>s/old/new/g | 选中区域替换 |
:vimgrep /pat/ **/*.ext | 跨文件搜索 |