一份实用的 Vim 8.2 快速参考备忘单集合,助您更快学习 Vim 编辑器。
▼/▶ 光标 ▽/▷ 目标
┌───────────── |
├───────────── 0 $ ──────────────┐
│ ┌────────── ^ fe ────────┐ │
│ │ ┌─────── Fo te ───────┐│ │
│ │ │┌────── To 30| ───┐ ││ │
│ │ ││ ┌──── ge w ───┐ │ ││ │
│ │ ││ │ ┌── b e ─┐ │ │ ││ │
│ │ ││ │ │ ┌h l┐ │ │ │ ││ │
▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
echo "一份来自 quickref.me 的备忘单"
- 屏幕 1 开始
┌─┬─────────▷ #!/usr/bin/python
│ │ ┌───▷
│ │ │ print("你好")
│ │ { } ▶ print("Vim")
│ │ │ print("!")
│ │ └─▷
│ │ ┌───┬───▷ print("欢迎")
G gg H M L k j ▶ print("来到")
│ │ └─▷ print("r3f.cn")
│ │ print("/vim")
│ │
│ └─────▷
│ - 屏幕 1 结束
└──────────────▷ print("屏幕 2")
快捷键 | 描述 |
---|---|
h | j | k | l |
方向键 |
<C-u> / <C-d> |
上/下翻半页 |
<C-b> / <C-f> |
上/下翻页 |
快捷键 | 描述 |
---|---|
b / w |
上一个/下一个单词 |
ge / e |
上一个/下一个单词词尾 |
快捷键 | 描述 |
---|---|
0 (零) / $ |
行首/行尾 |
^ |
行首 (非空白字符) |
快捷键 | 描述 |
---|---|
Fe / fe |
移动到上一个/下一个 e |
To / to |
移动到上一个/下一个 o 之前/之后 |
| / n| |
跳转到第一列/第 n 列 |
快捷键 | 描述 |
---|---|
gg / G |
第一行/最后一行 |
:n | nG |
跳转到第 n 行 |
} / { |
下一个/上一个空行 |
快捷键 | 描述 |
---|---|
H / M / L |
屏幕顶部/中部/底部 |
zt / zz / zb |
当前行置于屏幕顶部/中部/底部 |
快捷键 | 描述 |
---|---|
i / a |
在光标前/后插入 |
I / A |
在行首/行尾插入 |
o / O (字母) |
在下方/上方插入新行 |
s / S |
删除字符/行并插入 |
C / cc |
修改至行尾/当前行 |
gi |
在上次插入点插入 |
Esc | <C-[> |
退出插入模式 |
快捷键 | 描述 |
---|---|
:w |
保存 |
:q |
关闭文件 |
:wq | :x | ZZ |
保存并退出 |
:wqa |
保存并退出所有文件 |
:q! | ZQ |
强制退出 |
:qa |
关闭所有文件 |
:qa! |
强制退出所有文件 |
:w now.txt |
写入 now.txt |
:sav new.txt |
保存并编辑 new.txt |
:w !sudo tee % |
写入只读文件 |
快捷键 | 描述 |
---|---|
r |
替换一个字符 |
R |
进入替换模式 |
u / 3u |
撤销 1 / 3 次更改 |
U |
撤销对一行的更改 |
J |
与下一行合并 |
<C-r> / 5 <C-r> |
重做 1 / 5 次更改 |
###剪切和粘贴
快捷键 | 描述 |
---|---|
x |
删除字符 (剪切) |
p / P |
在之后/之前粘贴 |
xp |
交换两个字符 |
D |
删除至行尾 (剪切) |
dw |
删除单词 (剪切) |
dd |
删除行 (剪切) |
ddp |
交换两行 |
yy |
复制行 (复制) |
"*p | "+p |
从系统剪贴板粘贴 |
"*y | "+y |
复制到系统剪贴板 |
快捷键 | 描述 |
---|---|
d | x |
删除选中内容 (剪切) |
s |
替换选中内容 |
y |
复制选中内容 (复制) |
快捷键 | 描述 |
---|---|
. |
重复上一个命令 |
; |
重复最新的 f , t , F 或 T |
, |
反向重复最新的 f , t , F 或 T |
& |
重复上一个 :s |
@: |
重复一个命令行命令 |
快捷键 | 描述 |
---|---|
v |
进入可视模式 |
V |
进入可视行模式 |
<C-v> |
进入可视块模式 |
ggVG |
选中所有文本 |
> / < |
文本右移/左移 |
- | - |
---|---|
qi |
录制宏 i |
q |
停止录制宏 |
@i |
运行宏 i |
7@i |
运行宏 i 7 次 |
@@ |
重复上一个宏 |
你可以为任何字母保存宏,不仅仅是 i
快捷键 | 描述 |
---|---|
d |
删除 |
y |
复制 (复制) |
c |
修改 (删除后插入) |
p |
粘贴 |
= |
格式化代码 |
g~ |
切换大小写 |
gU |
转为大写 |
gu |
转为小写 |
> |
右缩进 |
< |
左缩进 |
! |
通过外部程序过滤 |
组合 | 描述 |
---|---|
d |
删除当前行 |
d |
删除两行 |
d |
删除到下一个单词 |
d |
删除到单词开头 |
d |
删除直到字符 a |
d |
删除直到 hello |
c |
修改当前行,与 S 同义 |
y |
复制当前行 |
> |
缩进 2 行 |
ggd |
删除整个文档 |
gg= |
缩进整个文档 |
ggy |
复制整个文档 |
[计数] <操作符> <移动>
<操作符> [计数] <移动>
组合 | 描述 |
---|---|
2d |
删除 2 行 |
6y |
复制 6 行 |
d 3 |
删除 3 个单词 |
d 5 |
向下删除 5 行 |
> 4 |
向上缩进 4 行 |
快捷键 | 描述 |
---|---|
段落 | |
单词 | |
大写单词 (被空白包围) |
|
句子 | |
一个 [], (), 或 {} 块 | |
一个 [], (), 或 {} 块 | |
一个引号括起来的字符串 | |
一个块 [( | |
一个块 [{ | |
一个 HTML 标签块 |
参见 :help text-objects
快捷键 | 描述 |
---|---|
d |
删除内部单词 |
d |
删除内部句子 |
d |
删除引号内内容 |
d |
删除引号内内容 (包括引号) |
d |
删除一个段落 |
快捷键 | 描述 |
---|---|
v |
选择引号内内容 "... " |
v |
选择引号 "..." |
v |
选择方括号内内容 [... ] |
v |
选择方括号 [...] |
v |
选择内部单词 |
v |
选择内部段落 |
v |
选择更多段落 |
快捷键 | 描述 |
---|---|
c |
修改内部单词 |
c |
修改引号内内容 |
c |
修改内部标签 (HTML) |
c |
修改内部段落 |
y |
复制内部段落 |
y |
复制段落 (包括换行符) |
- | - |
---|---|
:e file |
在新缓冲区中编辑文件 |
:bn |
转到下一个缓冲区 |
:bp |
转到上一个缓冲区 |
:bd |
从缓冲区列表中移除文件 |
:b 5 |
打开缓冲区 #5 |
:b file |
按文件名转到缓冲区 |
:ls |
列出所有打开的缓冲区 |
:sp file |
打开并分割窗口 |
:vs file |
打开并垂直分割窗口 |
:hid |
隐藏此缓冲区 |
:wn |
写入文件并移至下一个 |
:tab ba |
将所有缓冲区作为标签页编辑 |
- | - |
---|---|
<C-w> s |
分割窗口 |
<C-w> v |
垂直分割窗口 |
<C-w> w |
切换窗口 |
<C-w> q |
关闭一个窗口 |
<C-w> T |
拆分到新标签页 |
<C-w> x |
与下一个交换 |
<C-w> - / + |
减小/增加高度 |
<C-w> < / > |
减小/增加宽度 |
<C-w> | |
最大化宽度 |
<C-w> _ |
最大化高度 |
<C-w> = |
等高和等宽 |
<C-w> h / l |
转到左/右窗口 |
<C-w> j / k |
转到上/下窗口 |
- | - |
---|---|
/foo |
向前搜索 |
/foo\c |
向前搜索 (不区分大小写) |
?foo |
向后搜索 |
/\v\d+ |
使用正则表达式搜索 |
n |
下一个匹配的搜索模式 |
N |
上一个匹配 |
* |
向前搜索当前单词 |
# |
向后搜索当前单词 |
:[范围]s/{模式}/{字符串}/[标志]
:s/old/new |
替换第一个 |
:s/old/new/g |
全部替换 |
:s/\vold/new/g |
使用正则表达式全部替换 |
:s/old/new/gc |
全部替换 (确认) |
:s/old/new/i |
忽略大小写替换第一个 |
:2,6s/old/new/g |
替换第 2 -6 行之间的内容 |
:%s/{模式}/{字符串}/[标志]
:%s/old/new |
替换第一个 |
:%s/old/new/g |
全部替换 |
:%s/old/new/gc |
全部替换 (确认) |
:%s/old/new/gi |
全部替换 (忽略大小写) |
:%s/\vold/new/g |
使用正则表达式全部替换 |
- | - |
---|---|
% |
整个文件 |
’<,’> |
当前选择 |
5 |
第 5 行 |
5,10 |
第 5 到 10 行 |
$ |
最后一行 |
2,$ |
第 2 行到最后一行 |
. |
当前行 |
,3 |
接下来 3 行 |
-3, |
向前 3 行 |
:[范围]g/{模式}/[命令]
:g/foo/d |
删除包含 foo 的行 |
:g!/foo/d |
删除不包含 foo 的行 |
:g/^\s*$/d |
删除所有空行 |
:g/foo/t$ |
将包含 foo 的行复制到文件末尾 |
:g/foo/m$ |
将包含 foo 的行移动到文件末尾 |
:g/^/m0 |
反转文件 |
:g/^/t. |
复制每一行 |
:[范围]v/{模式}/[命令]
:v/foo/d |
删除不包含 foo 的行(也写作 :g!/foo/d ) |
- | - |
---|---|
g |
替换所有出现的地方 |
i |
忽略大小写 |
I |
不忽略大小写 |
c |
每次替换前确认 |
- | - |
---|---|
& | \0 |
用整个匹配项替换 |
\1 ...\9 |
用第 0-9 组替换 |
\u |
下一个字母大写 |
\U |
后续字符大写 |
\l |
下一个字母小写 |
\L |
后续字符小写 |
\e |
\u , \U , \l 和 \L 的结束 |
\E |
\u , \U , \l 和 \L 的结束 |
:s/a\|b/xxx\0xxx/g # 修改 "a b" 为 "xxxaxxx xxxbxxx"
:s/test/\U& file/ # 修改 "test" 为 "TEST FILE"
:s/\(test\)/\U\1\e file/ # 修改 "test" 为 "TEST file"
:s/\v([abc])([efg])/\2\1/g # 修改 "af fa bg" 为 "fa fa gb"
:s/\v\w+/\u\0/g # 修改 "bla bla" 为 "Bla Bla"
:s/\v([ab])|([cd])/\1x/g # 修改 "a b c d" 为 "ax bx x x"
:%s/.*/\L&/ # 修改 "HTML" 为 "html"
:s/\v<(.)(\w*)/\u\1\L\2/g # 使每个单词的首字母大写
:%s/^\(.*\)\n\1/\1/ # 删除重复行
:%s/<\/\=\(\w\+\)\>/\U&/g # 将 HTML 标签转换为大写
:g/^pattern/s/$/mytext # 查找并追加文本到行尾
:g/pattern/norm! @i # 在匹配行上运行宏
/^\(.*\)\(\r\?\n\1\)\+$ # 查看重复行
/\v^(.*)(\r?\n\1)+$ # 查看重复行 (very magic)
:v/./,/./-j # 将多个空行压缩为一个空行
:g/<p1>/,/<p2>/d # 删除从 <p1> 到 <p2> (包含) 的内容
$ vimdiff 文件1 文件2 [文件3]
$ vim -d 文件1 文件2 [文件3]
:[范围]diffget [缓冲区指定]
:[范围]diffput [缓冲区指定]
快捷键 | 描述 |
---|---|
do / :diffget |
获取 (get) 差异 |
dp / :diffput |
应用 (put) 差异 |
:dif |
重新扫描差异 |
:diffo |
关闭差异模式 |
:1,$+1diffget |
获取所有差异 |
ZQ |
不保存更改退出 |
参见: 范围
快捷键 | 描述 |
---|---|
zo / zO |
打开 |
zc / zC |
关闭 |
za / zA |
切换 |
zv |
打开当前行的折叠 |
zM |
关闭所有 |
zR |
打开所有 |
zm |
折叠更多 (折叠级别 += 1) |
zr |
折叠更少 (折叠级别 -= 1) |
zx |
更新折叠 |
快捷键 | 描述 |
---|---|
]c |
下一个差异 |
[c |
上一个差异 |
快捷键 | 描述 |
---|---|
vU |
大写 字符 |
vu |
小写 字符 |
~ |
切换大小写 字符 |
viw U |
大写 单词 |
viw u |
小写 单词 |
viw ~ |
切换大小写 单词 |
VU / gUU |
大写 行 |
Vu / guu |
小写 行 |
V~ / g~~ |
切换大小写 行 |
gggUG |
大写 所有文本 |
ggguG |
小写 所有文本 |
ggg~G |
切换大小写 所有文本 |
快捷键 | 描述 |
---|---|
<C-o> |
返回上一个位置 |
<C-i> |
前进到下一个位置 |
gf |
跳转到光标下的文件 |
ga |
显示十六进制、ASCII 值 |
- | - |
---|---|
:h |
帮助 打开帮助视图 |
:edit! |
重新加载当前文件 |
:2,8m0 |
将第 2 -8 行移动到第 0 行 |
:noh |
清除搜索高亮 |
:sort |
排序行 |
:ter |
打开一个终端窗口 |
:set paste |
启用插入粘贴子模式 |
:set nopaste |
禁用插入粘贴子模式 |
:cq |
带错误退出 (中止 Git) |
快捷键 | 描述 |
---|---|
% |
最近的/匹配的 {[()]} |
[( | [{ |
上一个 ( 或 { |
]) | ]{ |
下一个 ) 或 } |
[m |
上一个方法开始 |
[M |
上一个方法结束 |
快捷键 | 描述 |
---|---|
<C-a> |
增加数字 |
<C-x> |
减少数字 |
快捷键 | 描述 |
---|---|
:tag Classname |
跳转到 Classname 的第一个定义 |
<C-]> |
跳转到定义 |
g] |
查看所有定义 |
<C-t> |
返回上一个标签 |
<C-o> <C-i> |
后退/前进 |
:tselect Classname |
查找 Classname 的定义 |
:tjump Classname |
查找 Classname 的定义 (自动选择第一个) |
- | - |
---|---|
:ce 8 |
在 8 列之间居中对齐行 |
:ri 4 |
在第 4 列右对齐行 |
:le |
左对齐行 |
参见 :help formatting
快捷键 | 描述 |
---|---|
`^ |
插入模式下光标的最后位置 |
`. |
当前缓冲区中的最后更改 |
`" |
最后退出的当前缓冲区 |
`0 |
在最后编辑的文件中 |
'' |
返回到当前缓冲区中跳转前的那一行 |
`` |
返回到当前缓冲区中跳转前的那个位置 |
`[ |
到先前更改或复制的文本的开头 |
`] |
到先前更改或复制的文本的末尾 |
`< |
到上一个可视选择的开头 |
`> |
到上一个可视选择的末尾 |
ma |
将此光标位置标记为 a |
`a |
跳转到光标位置 a |
'a |
跳转到带有位置 a 的行的开头 |
d'a |
从当前行删除到标记 a 所在的行 |
d`a |
从当前位置删除到标记 a 的位置 |
c'a |
从当前行更改文本到 a 所在的行 |
y`a |
从当前位置复制文本到 a 的位置 |
:marks |
列出所有当前标记 |
:delm a |
删除标记 a |
:delm a-d |
删除标记 a , b , c , d |
:delm abc |
删除标记 a , b , c |
快捷键 | 描述 |
---|---|
<C-r> = 7*7 |
显示结果 |
<C-r> = 10/2 |
显示结果 |
在插入模式下执行此操作
- | - |
---|---|
:!<shell> |
执行 Shell 命令 |
:r!<shell> |
读入 Shell 命令的输出 |
:r!date |
插入日期 |
:!!date |
用日期替换当前行 |
快捷键 | 描述 |
---|---|
<C-r><C-w> |
将当前单词插入到命令行 |
<C-r>" |
从 " 寄存器粘贴 |
<C-x><C-f> |
在插入模式下自动补全路径 |
删除重复行
:sort | %!uniq -u
给文件中的行编号
:%!cat -n
复制整个文档到剪贴板
:%w !pbcopy # Mac OS X
:%w !xclip -i -sel c # GNU/Linux
:%w !xsel -i -b # GNU/Linux