Vim 备忘清单

Vim 8.2 快速参考备忘单的有用集合,可帮助您更快地学习 vim 编辑器。

入门

运动图

  1. ▼/▶ 光标 ▽/▷ 目标

左右动作

  1. ╭┈┈┈┈┈┈┈┈┈┈┈┈┈ |
  2. ├┈┈┈┈┈┈┈┈┈┈┈┈┈ 0 $ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
  3. ╭┈┈┈┈┈┈┈┈┈┈ ^ fe ┈┈┈┈┈┈┈┈╮
  4. ╭┈┈┈┈┈┈┈ Fo te ┈┈┈┈┈┈┈╮┆
  5. ┆╭┈┈┈┈┈┈ To 30| ┈┈┈╮ ┆┆
  6. ┆┆ ╭┈┈┈┈ ge w ┈┈┈╮ ┆┆
  7. ┆┆ ╭┈┈ b e ┈╮ ┆┆
  8. ┆┆ h l ┆┆
  9. ▽▽ ▽▼ ▼▽ ▽▽
  10. echo "A cheatsheet from quickReference"

上下动作

  1. - SCREEN 1 START
  2. ╭┈┬┈┈┈┈┈┈┈┈┈▷ #!/usr/bin/python
  3. ╭┈┈┈▷
  4. print("Hello")
  5. { } print("Vim")
  6. print("!")
  7. └┈▷
  8. ╭┈┈┈┬┈┈┈▷ print("Welcome")
  9. G gg H M L k j print("to")
  10. └┈▷ print("Quick Reference")
  11. print("/vim")
  12. ╰┈┈┈┈┈▷
  13. - SCREEN 1 END
  14. ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈▷ 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 选择 (复制)

重复

快捷方式 说明
. 重复上一个命令
; 重复最新的 ftFT
, 重复最新的ftFT颠倒
& 重复最后一个:s
@: 重复命令行命令

可视化模式

快捷方式 说明
v 进入可视化模式
V 进入视线模式
<C-v> 进入可视化阻挡模式
ggVG 选择所有文本
> / < 向右/向左移动文本

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

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

Vim 运算符

用法

快捷方式 说明
d w
运算符 动作

可用运算符动作 结合使用以使用它们

可用运算符

快捷方式 说明
d 删除
y Yank (复制)
c 更改 (删除然后插入)
p 粘贴
= 格式代码
g~ 切换案例
gU 大写
gu 小写
> 右缩进
< 左缩进
! 通过外部程序过滤

例子

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

计数

  1. [数字] <运算符> <动作>
  2. <运算符> [数字] <动作>

组合 说明
2dd 删除 2
6yy 复制 6
d3w 删除 3
d5j 向下删除 5
>4k 向上缩进 4

Vim 文本对象

用法

快捷方式 说明
v         i / a p
Operator inner(内部) / around(周围) 文本对象

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

文本对象

快捷方式 说明
p 段落
w 单词
W WORD
(被空格包围)
s 句子
[ ( { \< []、() 或 {} 块
] ) } > []、() 或 {} 块
` 带引号的字符串
b 一个块 [(
B [{中的一个块
t 一个 HTML 标签块

查看 :help text-objects

删除

快捷方式 说明
diw 删除内词
dis 删除内句
di 引号中删除
da 删除引号 (包括引号)
dip 删除段落

选择

快捷方式 说明
vi 选择内引号“...{.underline}”
va 选择引号"..."{.underline}
vi[ 选择内括号 [...{.underline}]
va[ 选择括号[...]{.underline}
viw 选择内词
vip 选择内部段落
vipip 选择更多段落

杂项

快捷方式 说明
ciw 换内字
ci 更改内部引号
cit 更改内部标签 (HTML)
cip 更改内部段落
yip Yank 段落
yap 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 上一场比赛
* 向前搜索当前单词
# 向后搜索当前单词

更换行

  1. :[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 行之间替换

替换文件

  1. :%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

全局命令

  1. :[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

  1. :[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 的结尾

例子

  1. :s/a\|b/xxx\0xxx/g # 将 "a b" 修改为 "xxxaxxx xxxbxxx"
  2. :s/test/\U& file/ # 将 "test" 修改为 "TEST FILE"
  3. :s/\(test\)/\U\1\e file/ # 将 "test" 修改为 "TEST file"
  4. :s/\v([abc])([efg])/\2\1/g # 将 "af fa bg" 修改为 "fa fa gb"
  5. :s/\v\w+/\u\0/g # 将 "bla bla" 修改为 "Bla Bla"
  6. :s/\v([ab])|([cd])/\1x/g # 将 "a b c d" 修改为 "ax bx x x"
  7. :%s/.*/\L&/ # 将 "HTML" 修改为 "html"
  8. :s/\v<(.)(\w*)/\u\1\L\2/g # 将单词的每个首字母大写
  9. :%s/^\(.*\)\n\1/\1/ # 删除重复行
  10. :%s/<\/\=\(\w\+\)\>/\U&/g # 将 HTML 标记转换为大写
  11. :g/^pattern/s/$/mytext # 查找文本并将其附加到末尾
  12. :g/pattern/norm! @i # 在匹配行上运行宏
  13. /^\(.*\)\(\r\?\n\1\)\+$ # 查看重复行
  14. /\v^(.*)(\r?\n\1)+$ # 查看重复行(非常神奇)
  15. :v/./,/./-j # 将空行压缩成空行
  16. :g/<p1>/,/<p2>/d # 从 <p1> 到 <p2> 包含删除

Vimdiff

用法

```shell script $ vimdiff file1 file2 [file3] $ vim -d file1 file2 [file3]

  1. ### 编辑
  2. <!--rehype:wrap-class=row-span-2-->

:[range]diffget [bufspec] :[range]diffput [bufspec]

  1. ---
  2. 快捷方式 | 说明
  3. :- | -
  4. `do` _/_ `:diffget` | 获取(get)差异
  5. `dp` _/_ `:diffput` | 放差价
  6. `:dif` | 重新扫描差异
  7. `:diffo` | 关闭差异模式
  8. `:1,$+1diffget` | 获取所有差异
  9. `ZQ` | 不做改动就退出
  10. <!--rehype:className=shortcuts-->
  11. 请参阅:[范围](#范围)
  12. ### 折叠
  13. <!--rehype:wrap-class=row-span-2-->
  14. 快捷方式 | 说明
  15. :- | -
  16. `zo` _/_ `zO` | 打开
  17. `zc` _/_ `zC` |
  18. `za` _/_ `zA` | 切换
  19. `zv` | 这条线的打开折叠
  20. `zM` | 关闭所有
  21. `zR` | 打开所有
  22. `zm` | 折叠更多 _(折叠级别 += 1)_
  23. `zr` | 少折叠 _(折叠级别 -= 1)_
  24. `zx` | 更新折叠
  25. <!--rehype:className=shortcuts-->
  26. ### 跳跃
  27. 快捷方式 | 说明
  28. :- | -
  29. `]c` | 下一个区别
  30. `[c` | 以前的区别
  31. <!--rehype:className=shortcuts-->
  32. 各种各样的
  33. -------------
  34. ### Case
  35. <!--rehype:wrap-class=row-span-2-->
  36. 快捷方式 | 说明
  37. :- | -
  38. `vU` | _大写_ 字母
  39. `vu` | _小写_ 字符
  40. `~` | _切换案例_ 字符
  41. `viw` `U` | _大写_
  42. `viw` `u` | _小写_
  43. `viw` `~` | _切换案例_
  44. `VU` _/_ `gUU` | _大写_
  45. `Vu` _/_ `guu` | _小写_
  46. `V~` _/_ `g~~` | _切换案例_ 线
  47. `gggUG` | _大写_ 所有文本
  48. `ggguG` | _小写_ 所有文本
  49. `ggg~G` | _切换大小写_ 所有文本
  50. <!--rehype:className=shortcuts-->
  51. ### 跳跃
  52. 快捷方式 | 说明
  53. :- | -
  54. | `<C-o>` | 返回上一个
  55. | `<C-i>` | 向前
  56. | `gf` | 转到光标中的文件
  57. | `ga` | 显示十六进制、ASCII
  58. <!--rehype:className=shortcuts-->
  59. ### 其他命令行
  60. <!--rehype:wrap-class=row-span-2-->
  61. :- | -
  62. :- | -
  63. `:h` | 帮助打开帮助视图
  64. `:edit!` | 重新加载当前文件
  65. `:2,8m0` | 将行 `2`-`8` 移动到 `0`
  66. `:noh` | 清除搜索亮点
  67. `:sort` | 排序行
  68. `:ter` | 打开终端窗口
  69. `:set paste` | 启用插入粘贴子模式
  70. `:set nopaste` | 禁用插入粘贴子模式
  71. `:cq` | 退出并出现错误<br/> _(正在中止 Git)_
  72. ### 导航
  73. 快捷方式 | 说明
  74. :- | -
  75. `%` | 最近/匹配的`{[()]}`
  76. `[(` _\|_ `[{` | 上一个 `(` `{`
  77. `])` _\|_ `]{` | 下一个`)``}`
  78. `[m` | 上一个方法开始
  79. `[M` | 上一个方法结束
  80. <!--rehype:className=shortcuts-->
  81. ### 计数器
  82. 快捷方式 | 说明
  83. :- | -
  84. `<C-a>` | 增加数量
  85. `<C-x>` | 减少数量
  86. <!--rehype:className=shortcuts-->
  87. ### 选项卡
  88. <!--rehype:wrap-class=row-span-2 col-span-2-->
  89. 快捷方式 | 说明
  90. :- | -
  91. `:tag Classname` | 跳转到 Classname 的第一个定义
  92. `<C-]>` | 跳转到定义
  93. `g]` | 查看所有定义
  94. `<C-t>` | 回到最后一个标签
  95. `<C-o> <C-i>` | 后退前进
  96. `:tselect Classname` | 查找类名的定义
  97. `:tjump Classname` | 查找类名的定义 _(自动选择第一个)_
  98. <!--rehype:className=shortcuts-->
  99. ### 格式化
  100. :- | -
  101. :- | -
  102. | `:ce 8` | `8` 列之间的中心线 |
  103. | `:ri 4` | `4` 列右对齐行 |
  104. | `:le` | 左对齐线 |
  105. 查看 `:help formatting`
  106. ### 标记
  107. <!--rehype:wrap-class=row-span-4 col-span-2-->
  108. 快捷方式 | 说明
  109. :- | -
  110. <code>\`^</code> | 插入模式下光标的最后位置
  111. <code>\`.</code> | 当前缓冲区的最后更改
  112. <code>\`"</code> | 最后退出的当前缓冲区
  113. <code>\`0</code> | 在上次编辑的文件中
  114. <code>''</code> | 返回当前缓冲区中跳出的行
  115. <code>\`\`</code> | 返回当前缓冲区中跳转的位置
  116. <code>\`[</code> | 到先前更改或拉出的文本的开头
  117. <code>\`]</code> | 到之前更改或拉出的文本的结尾
  118. <code>\`&lt;</code>| 到最后一个可视化选择的开始
  119. <code>\`&gt;</code>| 到最后一个可视化选择的结尾
  120. `ma` | 将此光标位置标记为`a`
  121. <code>\`a</code> | 跳转到光标位置`a`
  122. `'a` | 跳转到位置为 `a` 的行首
  123. <code>d'a</code> | 从当前行删除到标记 `a` 的行
  124. <code>d\`a</code> | 从当前位置删除到标记 `a` 的位置
  125. <code>c'a</code> | 将文本从当前行更改为 `a` 行
  126. <code>y\`a</code> | 将文本从当前位置拉到 `a` 的位置
  127. `:marks` | 列出所有当前标记
  128. `:delm a` | 删除标记`a`
  129. `:delm a-d` | 删除标记`a`、`b`、`c`、`d`
  130. `:delm abc` | 删除标记`a`、`b`、`c`
  131. <!--rehype:className=shortcuts-->
  132. ### 计算器
  133. 快捷方式 | 说明
  134. :- | -
  135. | `<C-r>` `=` 7*7 | 显示结果|
  136. | `<C-r>` `=` 10/2 | 显示结果|
  137. <!--rehype:className=shortcuts-->
  138. 在 INSERT 模式下执行此操作
  139. ### Shell
  140. :- | -
  141. :- | -
  142. `:!<shell>` | 解释 Shell 命令
  143. `:r!<shell>` | 读入shell的输出
  144. `:r!date` | 插入日期
  145. `:!!date` | 用日期替换当前行
  146. ### 命令行
  147. 快捷方式 | 说明
  148. :- | -
  149. `<C-r><C-w>` | 将当前单词插入命令行
  150. `<C-r>"` | 从 `注册` 粘贴
  151. `<C-x><C-f>` | 在插入模式下自动完成路径
  152. <!--rehype:className=shortcuts-->
  153. ### 技巧
  154. 删除重复行
  155. ```shell
  156. :sort | %!uniq -u

对文件中的行进行编号

  1. :%!cat -n

将整个文档复制到剪贴板

  1. :%w !pbcopy # Mac OS X
  2. :%w !xclip -i -sel c # GNU/Linux
  3. :%w !xsel -i -b # GNU/Linux

理解 Vim

动词理解

  1. d # 表示删除delete
  2. r # 表示替换replace
  3. c # 表示修改change
  4. y # 表示复制yank
  5. v # 表示选取visual select

动词代表了我们打算对文本进行什么样的操作

名词理解

  1. w # 表示一个单词word
  2. s # 表示一个句子sentence
  3. p # 表示一个段落paragraph
  4. t # 表示一个 HTML 标签tag

名词代表了我们即将处理的文本。引号或者各种括号所包含的文本称作一个文本块。

介词理解

  1. i # 表示在...之内 inside
  2. a # 表示环绕... around
  3. t # 表示到...位置前 to
  4. f # 表示到...位置上 forward

介词界定了待编辑文本的范围或者位置。

数词理解

数词指定了待编辑文本对象的数量,从这个角度而言,数词也可以看作是一种介词。引入数词之后,文本编辑命令的语法就升级成了下面这样:

  1. 动词 介词/数词 名词

下面是几个例子:

  1. c3w # 修改三个单词:change three words
  2. d2w # 删除两个单词:delete two words

另外,数词也可以修饰动词,表示将操作执行 n 次。于是,我们又有了下面的语法:

  1. 数词 动词 名词

示例

  1. 2dw # 两次删除单词(等价于删除两个单词): twice delete word
  2. 3x # 三次删除字符(等价于删除三个字符): three times delete character

组词为句理解

有了这些基本的语言元素,我们就可以着手构造一些简单的命令了。文本编辑命令的基本语法如下:

  1. 动词 介词 名词

下面是一些例子

  1. dip # 删除一个段落: delete inside paragraph
  2. vis # 选取一个句子: visual select inside sentence
  3. ciw # 修改一个单词: change inside word
  4. caw # 修改一个单词: change around word
  5. dtx # 删除文本直到字符“x”(不包括字符“x”): delete to x
  6. dfx # 删除文本直到字符“x”(包括字符“x”): delete forward x

另见