Vim 备忘清单
Vim 8.2 快速参考备忘单的有用集合,可帮助您更快地学习 vim 编辑器。
入门
运动图
▼/▶ 光标 ▽/▷ 目标
左右动作
╭┈┈┈┈┈┈┈┈┈┈┈┈┈ |
├┈┈┈┈┈┈┈┈┈┈┈┈┈ 0 $ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
┆ ╭┈┈┈┈┈┈┈┈┈┈ ^ fe ┈┈┈┈┈┈┈┈╮ ┆
┆ ┆ ╭┈┈┈┈┈┈┈ Fo te ┈┈┈┈┈┈┈╮┆ ┆
┆ ┆ ┆╭┈┈┈┈┈┈ To 30| ┈┈┈╮ ┆┆ ┆
┆ ┆ ┆┆ ╭┈┈┈┈ ge w ┈┈┈╮ ┆ ┆┆ ┆
┆ ┆ ┆┆ ┆ ╭┈┈ b e ┈╮ ┆ ┆ ┆┆ ┆
┆ ┆ ┆┆ ┆ ┆ ╭h l╮ ┆ ┆ ┆ ┆┆ ┆
▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
echo "A cheatsheet from quickReference"
上下动作
- SCREEN 1 START
╭┈┬┈┈┈┈┈┈┈┈┈▷ #!/usr/bin/python
┆ ┆ ╭┈┈┈▷
┆ ┆ ┆ print("Hello")
┆ ┆ { } ▶ print("Vim")
┆ ┆ ┆ print("!")
┆ ┆ └┈▷
┆ ┆ ╭┈┈┈┬┈┈┈▷ print("Welcome")
G gg H M L k j ▶ print("to")
┆ ┆ └┈▷ print("Quick Reference")
┆ ┆ print("/vim")
┆ ┆
┆ ╰┈┈┈┈┈▷
┆ - SCREEN 1 END
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈▷ print("SCREEN 2")
动作
快捷方式 |
说明 |
h \ |
j \ |
k \ |
l |
方向键 |
<C-u> / <C-d> |
上/下半页 |
<C-b> / <C-f> |
向上/向下翻页 |
字(词)
快捷方式 |
说明 |
b / w |
上一个/下一个单词 |
ge / e |
上一个/下一个词尾 |
行
快捷方式 |
说明 |
0 (zero) / $ |
行的开始/结束 |
^ |
行开头 (非空白) |
字符串
快捷方式 |
说明 |
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 (letter) |
在下方/上方插入新行 |
s / S |
删除字符/行并插入 |
C / cc |
更改到/当前行的结尾 |
gi |
在最后一个插入点插入 |
Esc \ |
<C-[> |
退出插入模式 |
保存和退出
快捷方式 |
说明 |
:w |
保存 |
:q |
关闭文件 |
:wq \ |
:x \ |
ZZ |
保存并退出 |
:wqa |
保存并退出所有文件 |
:q! \ |
ZQ |
强制退出 |
:qa |
关闭所有文件 |
:qa! |
强制退出所有文件 |
:w new.txt |
写入new.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 |
Yank 选择 (复制) |
重复
快捷方式 |
说明 |
. |
重复上一个命令 |
; |
重复最新的 f 、t 、F 或 T |
, |
重复最新的f 、t 、F 或T 颠倒 |
& |
重复最后一个:s |
@: |
重复命令行命令 |
可视化模式
快捷方式 |
说明 |
v |
进入可视化模式 |
V |
进入视线模式 |
<C-v> |
进入可视化阻挡模式 |
ggVG |
选择所有文本 |
> / < |
向右/向左移动文本 |
宏
:- |
- |
qi |
录制宏 i |
q |
停止录制宏 |
@i |
运行宏i |
7@i |
运行宏 i 7 次 |
@@ |
重复上一个宏 |
您可以为任何字母保存宏,而不仅仅是 i
Vim 运算符
用法
将 可用运算符 与 动作 结合使用以使用它们
可用运算符
快捷方式 |
说明 |
d |
删除 |
y |
Yank (复制) |
c |
更改 (删除然后插入) |
p |
粘贴 |
= |
格式代码 |
g~ |
切换案例 |
gU |
大写 |
gu |
小写 |
> |
右缩进 |
< |
左缩进 |
! |
通过外部程序过滤 |
例子
组合 |
说明 |
d d |
删除当前行 |
d j |
删除两行 |
d w |
删除到下一个单词 |
d b |
删除到单词的开头 |
d fa |
删除直到 a 字符 |
d /hello |
删除直到 hello |
c c |
更改当前行,与 S 同义 |
y y |
复制当前行 |
> j |
缩进 2 行 |
ggd G |
删除完整的文档 |
gg= G |
缩进一个完整的文档 |
ggy G |
复制整个文档 |
计数
[数字] <运算符> <动作>
<运算符> [数字] <动作>
组合 |
说明 |
2d d |
删除 2 行 |
6y y |
复制 6 行 |
d 3w |
删除 3 字 |
d 5j |
向下删除 5 行 |
> 4k |
向上缩进 4 行 |
Vim 文本对象
用法
快捷方式 |
说明 |
v |
i / a |
p |
Operator |
inner(内部) / around(周围) |
文本对象 |
文本块内部或周围使用 operator 进行操作
文本对象
快捷方式 |
说明 |
p |
段落 |
w |
单词 |
W |
WORD (被空格包围) |
s |
句子 |
[ ( { \< |
[]、() 或 {} 块 |
] ) } > |
[]、() 或 {} 块 |
‘ “ ` |
带引号的字符串 |
b |
一个块 [( |
B |
[{中的一个块 |
t |
一个 HTML 标签块 |
查看 :help text-objects
删除
快捷方式 |
说明 |
d iw |
删除内词 |
d is |
删除内句 |
d i“ |
引号中删除 |
d a“ |
删除引号 (包括引号) |
d ip |
删除段落 |
选择
快捷方式 |
说明 |
v i“ |
选择内引号“... {.underline}” |
v a“ |
选择引号"..." {.underline} |
v i[ |
选择内括号 [... {.underline}] |
v a[ |
选择括号[...] {.underline} |
v iw |
选择内词 |
v ip |
选择内部段落 |
v ipip |
选择更多段落 |
杂项
快捷方式 |
说明 |
c iw |
换内字 |
c i“ |
更改内部引号 |
c it |
更改内部标签 (HTML) |
c ip |
更改内部段落 |
y ip |
Yank 段落 |
y ap |
Yank 段落 (包括换行符) |
Vim 多个文件
Buffers (缓冲器)
:- |
- |
: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> h / l |
转到左/右窗口 |
<C-w> j / k |
转到上/下窗口 |
选项卡
快捷方式 |
说明 |
:tabe [file] |
E在新选项卡中编辑文件 |
:tabf [file] |
如果在新选项卡中存在则打开 |
:tabc |
C失去当前选项卡 |
:tabo |
关闭o其他选项卡 |
:tabs |
列出所有标签 |
:tabr |
转到第一个r标签 |
:tabl |
转到 last 选项卡 |
:tabm 0 |
我转到位置 0 |
:tabn |
转到 next 选项卡 |
:tabp |
转到p上一个标签 |
正常模式
快捷方式 |
说明 |
gt |
转到 next 选项卡 |
gT |
转到p上一个标签 |
2gt |
转到标签编号 2 |
Vim 搜索和替换
搜索
:- |
- |
/foo |
向前搜索 |
/foo\c |
向前搜索 (不区分大小写) |
?foo |
向后搜索 |
/\v\d+ |
使用 regex 搜索 |
n |
下一个匹配的搜索模式 |
N |
上一场比赛 |
* |
向前搜索当前单词 |
# |
向后搜索当前单词 |
更换行
:[range]s/{pattern}/{str}/[flags]
:- |
- |
:s/old/new |
先更换 |
:s/old/new/g |
全部替换 |
:s/\vold/new/g |
全部替换为 regex |
:s/old/new/gc |
全部替换(确认) |
:s/old/new/i |
先忽略大小写替换 |
:2,6s/old/new/g |
在 2 -6 行之间替换 |
替换文件
:%s/{pattern}/{str}/[flags]
:- |
- |
:%s/old/new |
先更换 |
:%s/old/new/g |
全部替换 |
:%s/old/new/gc |
全部替换 (确认) |
:%s/old/new/gi |
全部替换 (忽略大小写) |
:%s/\vold/new/g |
全部替换为 regex |
范围
:- |
- |
% |
整个文件 |
’<,’> |
当前选择 |
5 |
第 5 行 |
5,10 |
第 5 行到第 10 行 |
$ |
最后一行 |
2,$ |
第 2 行到最后 |
. |
当前行 |
,3 |
接下来的 3 行 |
-3, |
转发 3 行 |
全局命令
:[range]g/{pattern}/[command]
:- |
- |
:g/foo/d |
删除包含 foo 的行 |
:g!/foo/d |
删除不包含 foo 的行 |
:g/^\s*$/d |
删除所有空行 |
:g/foo/t$ |
将包含 foo 的行复制到 EOF |
:g/foo/m$ |
将包含 foo 的行移动到 EOF |
:g/^/m0 |
反转文件 |
:g/^/t. |
复制每一行 |
Inverse(逆) :g
:[range]v/{pattern}/[command]
:- |
- |
:v/foo/d |
删除不包含foo 的行 (还有:g!/foo/d ) |
Flags(标志)
:- |
- |
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)+$ # 查看重复行(非常神奇)
:v/./,/./-j # 将空行压缩成空行
:g/<p1>/,/<p2>/d # 从 <p1> 到 <p2> 包含删除
Vimdiff
用法
```shell script
$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]
### 编辑
<!--rehype:wrap-class=row-span-2-->
:[range]diffget [bufspec]
:[range]diffput [bufspec]
---
快捷方式 | 说明
:- | -
`do` _/_ `:diffget` | 获取(get)差异
`dp` _/_ `:diffput` | 放差价
`:dif` | 重新扫描差异
`:diffo` | 关闭差异模式
`:1,$+1diffget` | 获取所有差异
`ZQ` | 不做改动就退出
<!--rehype:className=shortcuts-->
请参阅:[范围](#范围)
### 折叠
<!--rehype:wrap-class=row-span-2-->
快捷方式 | 说明
:- | -
`zo` _/_ `zO` | 打开
`zc` _/_ `zC` | 关
`za` _/_ `zA` | 切换
`zv` | 这条线的打开折叠
`zM` | 关闭所有
`zR` | 打开所有
`zm` | 折叠更多 _(折叠级别 += 1)_
`zr` | 少折叠 _(折叠级别 -= 1)_
`zx` | 更新折叠
<!--rehype:className=shortcuts-->
### 跳跃
快捷方式 | 说明
:- | -
`]c` | 下一个区别
`[c` | 以前的区别
<!--rehype:className=shortcuts-->
各种各样的
-------------
### Case
<!--rehype:wrap-class=row-span-2-->
快捷方式 | 说明
:- | -
`vU` | _大写_ 字母
`vu` | _小写_ 字符
`~` | _切换案例_ 字符
`viw` `U` | _大写_ 字
`viw` `u` | _小写_ 字
`viw` `~` | _切换案例_ 字
`VU` _/_ `gUU` | _大写_ 行
`Vu` _/_ `guu` | _小写_ 行
`V~` _/_ `g~~` | _切换案例_ 线
`gggUG` | _大写_ 所有文本
`ggguG` | _小写_ 所有文本
`ggg~G` | _切换大小写_ 所有文本
<!--rehype:className=shortcuts-->
### 跳跃
快捷方式 | 说明
:- | -
| `<C-o>` | 返回上一个
| `<C-i>` | 向前
| `gf` | 转到光标中的文件
| `ga` | 显示十六进制、ASCII值
<!--rehype:className=shortcuts-->
### 其他命令行
<!--rehype:wrap-class=row-span-2-->
:- | -
:- | -
`:h` | 帮助打开帮助视图
`:edit!` | 重新加载当前文件
`:2,8m0` | 将行 `2`-`8` 移动到 `0`
`:noh` | 清除搜索亮点
`:sort` | 排序行
`:ter` | 打开终端窗口
`:set paste` | 启用插入粘贴子模式
`:set nopaste` | 禁用插入粘贴子模式
`:cq` | 退出并出现错误<br/> _(正在中止 Git)_
### 导航
快捷方式 | 说明
:- | -
`%` | 最近/匹配的`{[()]}`
`[(` _\|_ `[{` | 上一个 `(` 或 `{`
`])` _\|_ `]{` | 下一个`)`或`}`
`[m` | 上一个方法开始
`[M` | 上一个方法结束
<!--rehype:className=shortcuts-->
### 计数器
快捷方式 | 说明
:- | -
`<C-a>` | 增加数量
`<C-x>` | 减少数量
<!--rehype:className=shortcuts-->
### 选项卡
<!--rehype:wrap-class=row-span-2 col-span-2-->
快捷方式 | 说明
:- | -
`:tag Classname` | 跳转到 Classname 的第一个定义
`<C-]>` | 跳转到定义
`g]` | 查看所有定义
`<C-t>` | 回到最后一个标签
`<C-o> <C-i>` | 后退前进
`:tselect Classname` | 查找类名的定义
`:tjump Classname` | 查找类名的定义 _(自动选择第一个)_
<!--rehype:className=shortcuts-->
### 格式化
:- | -
:- | -
| `:ce 8` | `8` 列之间的中心线 |
| `:ri 4` | 在 `4` 列右对齐行 |
| `:le` | 左对齐线 |
查看 `:help formatting`
### 标记
<!--rehype:wrap-class=row-span-4 col-span-2-->
快捷方式 | 说明
:- | -
<code>\`^</code> | 插入模式下光标的最后位置
<code>\`.</code> | 当前缓冲区的最后更改
<code>\`"</code> | 最后退出的当前缓冲区
<code>\`0</code> | 在上次编辑的文件中
<code>''</code> | 返回当前缓冲区中跳出的行
<code>\`\`</code> | 返回当前缓冲区中跳转的位置
<code>\`[</code> | 到先前更改或拉出的文本的开头
<code>\`]</code> | 到之前更改或拉出的文本的结尾
<code>\`<</code>| 到最后一个可视化选择的开始
<code>\`></code>| 到最后一个可视化选择的结尾
`ma` | 将此光标位置标记为`a`
<code>\`a</code> | 跳转到光标位置`a`
`'a` | 跳转到位置为 `a` 的行首
<code>d'a</code> | 从当前行删除到标记 `a` 的行
<code>d\`a</code> | 从当前位置删除到标记 `a` 的位置
<code>c'a</code> | 将文本从当前行更改为 `a` 行
<code>y\`a</code> | 将文本从当前位置拉到 `a` 的位置
`:marks` | 列出所有当前标记
`:delm a` | 删除标记`a`
`:delm a-d` | 删除标记`a`、`b`、`c`、`d`
`:delm abc` | 删除标记`a`、`b`、`c`
<!--rehype:className=shortcuts-->
### 计算器
快捷方式 | 说明
:- | -
| `<C-r>` `=` 7*7 | 显示结果|
| `<C-r>` `=` 10/2 | 显示结果|
<!--rehype:className=shortcuts-->
在 INSERT 模式下执行此操作
### Shell
:- | -
:- | -
`:!<shell>` | 解释 Shell 命令
`:r!<shell>` | 读入shell的输出
`:r!date` | 插入日期
`:!!date` | 用日期替换当前行
### 命令行
快捷方式 | 说明
:- | -
`<C-r><C-w>` | 将当前单词插入命令行
`<C-r>"` | 从 `注册` 粘贴
`<C-x><C-f>` | 在插入模式下自动完成路径
<!--rehype:className=shortcuts-->
### 技巧
删除重复行
```shell
:sort | %!uniq -u
对文件中的行进行编号
:%!cat -n
将整个文档复制到剪贴板
:%w !pbcopy # Mac OS X
:%w !xclip -i -sel c # GNU/Linux
:%w !xsel -i -b # GNU/Linux
理解 Vim
动词理解
d # 表示删除delete
r # 表示替换replace
c # 表示修改change
y # 表示复制yank
v # 表示选取visual select
动词代表了我们打算对文本进行什么样的操作
名词理解
w # 表示一个单词word
s # 表示一个句子sentence
p # 表示一个段落paragraph
t # 表示一个 HTML 标签tag
名词代表了我们即将处理的文本。引号或者各种括号所包含的文本称作一个文本块。
介词理解
i # 表示在...之内 inside
a # 表示环绕... around
t # 表示到...位置前 to
f # 表示到...位置上 forward
介词界定了待编辑文本的范围或者位置。
数词理解
数词指定了待编辑文本对象的数量,从这个角度而言,数词也可以看作是一种介词。引入数词之后,文本编辑命令的语法就升级成了下面这样:
动词 介词/数词 名词
下面是几个例子:
c3w # 修改三个单词:change three words
d2w # 删除两个单词:delete two words
另外,数词也可以修饰动词,表示将操作执行 n
次。于是,我们又有了下面的语法:
数词 动词 名词
示例
2dw # 两次删除单词(等价于删除两个单词): twice delete word
3x # 三次删除字符(等价于删除三个字符): three times delete character
组词为句理解
有了这些基本的语言元素,我们就可以着手构造一些简单的命令了。文本编辑命令的基本语法如下:
动词 介词 名词
下面是一些例子
dip # 删除一个段落: delete inside paragraph
vis # 选取一个句子: visual select inside sentence
ciw # 修改一个单词: change inside word
caw # 修改一个单词: change around word
dtx # 删除文本直到字符“x”(不包括字符“x”): delete to x
dfx # 删除文本直到字符“x”(包括字符“x”): delete forward x
另见