#tech / dev / editor
#type / howto
#status / evergreen
#resource / vim
[!info] related notes
Vim 命令速查
核心概念
普通模式 (Normal) ←── Esc ──── 插入模式 (Insert)
│ ↑
│── : ─→ 命令模式 (Command) i/a/o 等
│── v ─→ 可视模式 (Visual) │
│── Ctrl+v → 块选择 (Block) │
└────────────────────────────────┘
心智模型:动词 + 名词 = 动作。d(删除)+ w(单词)= dw(删除单词)。大写通常更强。
模式切换
| 命令 | 说明 |
|---|
i | 在光标前进入插入模式 |
I | 在行首进入插入模式 |
a | 在光标后进入插入模式 |
A | 在行尾进入插入模式 |
o | 在当前行下方新开一行并进入插入模式 |
O | 在当前行上方新开一行并进入插入模式 |
s | 删除光标处字符并进入插入模式 |
S | 删除整行并进入插入模式 |
Esc | 退回普通模式 |
Ctrl+[ | 退回普通模式(同 Esc) |
光标移动
基础移动
| 命令 | 说明 |
|---|
h / j / k / l | 左 / 下 / 上 / 右 |
w | 跳到下一个词首 |
W | 跳到下一个词首(忽略标点,以空格分隔) |
b | 跳回上一个词首 |
B | 跳回上一个词首(忽略标点) |
e | 跳到当前/下一个词尾 |
E | 跳到词尾(忽略标点) |
0 | 跳到行首(第 0 列) |
^ | 跳到行首第一个非空字符 |
$ | 跳到行尾 |
gg | 跳到文件第一行 |
G | 跳到文件最后一行 |
:{N} | 跳转到第 N 行 |
{N}G | 跳转到第 N 行 |
Ctrl+u | 向上翻半页 |
Ctrl+d | 向下翻半页 |
Ctrl+b | 向上翻整页 |
Ctrl+f | 向下翻整页 |
Ctrl+e | 屏幕向下滚动一行(光标不动) |
Ctrl+y | 屏幕向上滚动一行(光标不动) |
H | 跳到屏幕顶部 (High) |
M | 跳到屏幕中部 (Middle) |
L | 跳到屏幕底部 (Low) |
zz | 当前行居中显示 |
zt | 当前行置顶显示 |
zb | 当前行置底显示 |
行内查找
| 命令 | 说明 |
|---|
f{char} | 向后查找字符 {char} 并跳到其上 |
F{char} | 向前查找字符 {char} |
t{char} | 向后查找字符 {char} 并跳到其前 |
T{char} | 向前查找字符 {char} 并跳到其后 |
; | 重复上一次 f/F/t/T |
, | 反向重复上一次 f/F/t/T |
括号匹配与跳转
| 命令 | 说明 |
|---|
% | 跳到匹配的括号 () {} [] |
[{ | 跳到当前代码块的 { |
]} | 跳到当前代码块的 } |
[( | 跳到当前 ( |
]) | 跳到当前 ) |
编辑操作
删除
| 命令 | 说明 |
|---|
x | 删除光标处字符 |
X | 删除光标前字符 |
dd | 删除整行 |
D 或 d$ | 删除至行尾 |
d0 | 删除至行首 |
dw | 删除一个单词 |
daw | 删除一个单词(含周围空格) |
diw | 删除单词内容(不含周围空格) |
di( | 删除括号内的内容 |
da( | 删除括号及其内容 |
di" | 删除引号内的内容 |
da" | 删除引号及其内容 |
di{ | 删除花括号内的内容 |
da{ | 删除花括号及其内容 |
d{motion} | 通用删除:d + 移动命令 |
5dd | 删除 5 行 |
dG | 删除至文件末尾 |
ggdG | 删除全文 |
d} | 删除至下一段落 |
d% | 删除至匹配的括号 |
复制与粘贴
| 命令 | 说明 |
|---|
yy | 复制整行 |
Y | 复制整行(同 yy) |
yw | 复制一个单词 |
y$ | 复制至行尾 |
y0 | 复制至行首 |
yaw | 复制一个单词(含空格) |
yi( | 复制括号内内容 |
yi" | 复制引号内内容 |
y{motion} | 通用复制:y + 移动命令 |
5yy | 复制 5 行 |
yG | 复制至文件末尾 |
p | 在光标后粘贴 |
P | 在光标前粘贴 |
"ay | 复制到寄存器 a |
"ap | 从寄存器 a 粘贴 |
"+y | 复制到系统剪贴板 |
"+p | 从系统剪贴板粘贴 |
修改
| 命令 | 说明 |
|---|
cw | 修改单词(删除并进入插入模式) |
cc | 修改整行 |
C 或 c$ | 修改至行尾 |
c0 | 修改至行首 |
ci( | 修改括号内内容 |
ci" | 修改引号内内容 |
ci{ | 修改花括号内内容 |
c{motion} | 通用修改:c + 移动命令 |
r{char} | 替换光标处字符为 {char} |
R | 进入替换模式(连续覆盖字符) |
~ | 切换大小写 |
gU{motion} | 转为大写 |
gu{motion} | 转为小写 |
>> | 右缩进当前行 |
<< | 左缩进当前行 |
== | 自动缩进当前行 |
>ip | 缩进整个段落 |
<ip | 反缩进整个段落 |
>G | 缩进至文件末尾 |
gg=G | 全文自动缩进 |
撤销与重做
| 命令 | 说明 |
|---|
u | 撤销 |
Ctrl+r | 重做 |
U | 撤销对当前行的所有修改 |
. | 重复上一次修改操作(极强大) |
查找与替换
| 命令 | 说明 |
|---|
/{pattern} | 向下查找 |
?{pattern} | 向上查找 |
n | 跳到下一个匹配 |
N | 跳到上一个匹配 |
* | 查找光标下的单词(向下) |
# | 查找光标下的单词(向上) |
:s/old/new/ | 当前行替换(仅首个匹配) |
:s/old/new/g | 当前行全部替换 |
:%s/old/new/g | 全文替换 |
:%s/old/new/gc | 全文替换(每次确认) |
:%s/old/new/gi | 全文替换(忽略大小写) |
:set ignorecase | 设置查找不区分大小写 |
:set smartcase | 智能大小写(含大写字母时区分) |
:set hlsearch | 高亮查找结果 |
:nohlsearch 或 :noh | 临时取消高亮 |
:set incsearch | 实时增量查找 |
可视模式(选择)
| 命令 | 说明 |
|---|
v | 字符选择 |
V | 行选择 |
Ctrl+v | 块选择(矩形选择) |
aw | 选择一个单词(含空格) |
iw | 选择单词内容(不含空格) |
ap | 选择一个段落 |
ip | 选择段落内容 |
a" / i" | 选择双引号(含/不含引号) |
a' / i' | 选择单引号 |
a( / i( | 选择括号 |
a{ / i{ | 选择花括号 |
at / it | 选择 HTML 标签 |
o | 在可视模式中切换选择端点 |
gv | 重新选择上次的选区 |
Ctrl+v 后 I | 块选择后在每行前插入 |
Ctrl+v 后 A | 块选择后在每行后追加 |
分屏
| 命令 | 说明 |
|---|
:split 或 :sp | 水平分屏 |
:vsplit 或 :vsp | 垂直分屏 |
:sp {file} | 水平分屏打开文件 |
:vsp {file} | 垂直分屏打开文件 |
Ctrl+w h | 切换到左屏 |
Ctrl+w j | 切换到下屏 |
Ctrl+w k | 切换到上屏 |
Ctrl+w l | 切换到右屏 |
Ctrl+w w | 循环切换窗口 |
Ctrl+w = | 等分窗口大小 |
Ctrl+w _ | 最大化当前窗口高度 |
Ctrl+w | | 最大化当前窗口宽度 |
Ctrl+w c | 关闭当前窗口 |
Ctrl+w o | 关闭除当前外的所有窗口 |
Ctrl+w r | 向右旋转窗口 |
Ctrl+w R | 向左旋转窗口 |
Ctrl+w H | 当前窗口移到最左 |
Ctrl+w L | 当前窗口移到最右 |
Ctrl+w J | 当前窗口移到最下 |
Ctrl+w K | 当前窗口移到最上 |
宏与重复
| 命令 | 说明 |
|---|
q{a-z} | 开始录制宏到寄存器 a-z |
q | 停止录制 |
@{a-z} | 执行寄存器中的宏 |
@@ | 重复上次执行的宏 |
{N}@{a-z} | 执行宏 N 次 |
. | 重复上次修改操作 |
{N}. | 重复上次修改 N 次 |
文件操作
| 命令 | 说明 |
|---|
:e {file} | 打开文件 |
:e . | 打开文件浏览器 |
:w | 保存 |
:w {file} | 另存为 |
:wq 或 :x 或 ZZ | 保存并退出 |
:q | 退出(有修改时会提示) |
:q! 或 ZQ | 强制退出不保存 |
:wa | 保存所有打开的文件 |
:qa | 退出所有 |
:qa! | 强制退出所有 |
:saveas {file} | 另存为 |
:read {file} | 在光标下方插入文件内容 |
:read !{cmd} | 在光标下方插入命令输出 |
:!{cmd} | 执行外部命令 |
:r !{cmd} | 插入命令输出到当前位置 |
缓冲区
| 命令 | 说明 |
|---|
:ls 或 :buffers | 列出所有缓冲区 |
:b {N} | 切换到第 N 个缓冲区 |
:b {name} | 切换到名称匹配的缓冲区 |
:bn | 切换到下一个缓冲区 |
:bp | 切换到上一个缓冲区 |
:bd | 关闭当前缓冲区 |
:bufdo {cmd} | 对所有缓冲区执行命令 |
配置速查 (~/.vimrc)
| 配置项 | 说明 | 推荐值 |
|---|
set number | 显示行号 | set number |
set relativenumber | 相对行号 | set relativenumber |
set tabstop=4 | Tab 宽度 | 4 |
set shiftwidth=4 | 缩进宽度 | 4 |
set expandtab | 空格替代 Tab | set expandtab |
set autoindent | 自动缩进 | set autoindent |
set smartindent | 智能缩进 | set smartindent |
set ignorecase | 查找不区分大小写 | set ignorecase |
set smartcase | 智能大小写 | set smartcase |
set hlsearch | 高亮搜索结果 | set hlsearch |
set incsearch | 增量搜索 | set incsearch |
set mouse=a | 启用鼠标 | set mouse=a |
set hidden | 允许隐藏未保存的缓冲区 | set hidden |
set clipboard=unnamedplus | 使用系统剪贴板 | set clipboard=unnamedplus |
set encoding=utf-8 | 编码 | set encoding=utf-8 |
set history=1000 | 命令历史行数 | set history=1000 |
set wildmenu | 命令行补全菜单 | set wildmenu |
set scrolloff=8 | 光标距顶/底保留行数 | 8 |
set signcolumn=yes | 始终显示标记列 | set signcolumn=yes |
set updatetime=250 | 写入 swap 的延迟(ms) | 250 |
set colorcolumn=80 | 显示 80 列参考线 | set colorcolumn=80 |
syntax on | 语法高亮 | syntax on |
filetype plugin indent on | 文件类型检测 | filetype plugin indent on |