r3f.cn
GitHub Repo stars

Vim

一份实用的 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, FT
, 反向重复最新的 f, t, FT
& 重复上一个 :s
@: 重复一个命令行命令

#可视模式

快捷键 描述
v 进入可视模式
V 进入可视行模式
<C-v> 进入可视块模式
ggVG 选中所有文本
> / < 文本右移/左移

#

- -
qi 录制宏 i
q 停止录制宏
@i 运行宏 i
7@i 运行宏 i 7 次
@@ 重复上一个宏

你可以为任何字母保存宏,不仅仅是 i

#Vim 操作符

#用法

快捷键 描述
d w
操作符 移动

组合操作符移动来使用它们

#可用操作符

快捷键 描述
d 删除
y 复制 (复制)
c 修改 (删除后插入)
p 粘贴
= 格式化代码
g~ 切换大小写
gU 转为大写
gu 转为小写
> 右缩进
< 左缩进
! 通过外部程序过滤

#示例

组合 描述
dd 删除当前行
dj 删除两行
dw 删除到下一个单词
db 删除到单词开头
dfa 删除直到字符 a
d/hello 删除直到 hello
cc 修改当前行,与 S 同义
yy 复制当前行
>j 缩进 2 行
ggdG 删除整个文档
gg=G 缩进整个文档
ggyG 复制整个文档

#计数

[计数] <操作符> <移动>
<操作符> [计数] <移动>

组合 描述
2dd 删除 2
6yy 复制 6
d3w 删除 3 个单词
d5j 向下删除 5
>4k 向上缩进 4

#Vim 文本对象

#用法

快捷键 描述 -
v i / a p
操作符 inner / around 文本对象

使用操作符对文本块内部或周围进行操作

#文本对象

快捷键 描述
p 段落
w 单词
W 大写单词
(被空白包围)
s 句子
[ ( { < 一个 [], (), 或 {} 块
] ) } > 一个 [], (), 或 {} 块
' " ` 一个引号括起来的字符串
b 一个块 [(
B 一个块 [{
t 一个 HTML 标签块

参见 :help text-objects

#删除

快捷键 描述
diw 删除内部单词
dis 删除内部句子
di" 删除引号内内容
da" 删除引号内内容 (包括引号)
dip 删除一个段落

#选择

快捷键 描述
vi" 选择引号内内容 "..."
va" 选择引号 "..."
vi[ 选择方括号内内容 [...]
va[ 选择方括号 [...]
viw 选择内部单词
vip 选择内部段落
vipip 选择更多段落

#其他

快捷键 描述
ciw 修改内部单词
ci" 修改引号内内容
cit 修改内部标签 (HTML)
cip 修改内部段落
yip 复制内部段落
yap 复制段落 (包括换行符)

#Vim 多文件操作

#缓冲区

- -
: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 转到上/下窗口

#标签页

快捷键 描述
:tabe [file] 在新标签页中辑文件
:tabf [file] 如果存在则在新标签页中打开
:tabc 闭当前标签页
:tabo 关闭他标签页
:tabs 列出所有标签页
:tabr 转到一个标签页
:tabl 转到后一个标签页
:tabm 0 动到位置 0
:tabn 转到一个标签页
:tabp 转到一个标签页

#普通模式

快捷键 描述
gt 转到一个标签页
gT 转到一个标签页
2gt 转到标签页编号 2

#Vim 搜索和替换

#搜索

- -
/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 510
$ 最后一行
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. 复制每一行

#反向 :g

:[范围]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

#用法

$ 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> 执行 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

#另请参阅