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("IT开发知识")
┆        ┆        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替换选择
yYank 选择 (复制)

重复

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

可视化模式

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

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

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

Vim 运算符

用法

快捷方式说明
dw
运算符动作

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

可用运算符

快捷方式说明
d删除
yYank (复制)
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
Operatorinner(内部) / around(周围)

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

文本对象

快捷方式说明
p段落
w单词
WWORD
(被空格包围)
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更改内部段落
yipYank 段落
yapYank 段落 (包括换行符)

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]如果在新选项卡中存在则打开
:tabcC失去当前选项卡
: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/g2-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

范围

:--
%整个文件
’<,’>当前选择
55
5,105 行到第 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

用法

$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]

编辑

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

快捷方式说明
do / :diffget获取(get)差异
dp / :diffput放差价
:dif重新扫描差异
:diffo关闭差异模式
:1,$+1diffget获取所有差异
ZQ不做改动就退出

请参阅:范围

折叠

快捷方式说明
zo / zO打开
zc / zC
za / zA切换
zv这条线的打开折叠
zM关闭所有
zR打开所有
zm折叠更多 (折叠级别 += 1)
zr少折叠 (折叠级别 -= 1)
zx更新折叠

跳跃

快捷方式说明
]c下一个区别
[c以前的区别

各种各样的

Case

快捷方式说明
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查找类名的定义
:tjump Classname查找类名的定义 (自动选择第一个)

格式化

:--
:ce 88 列之间的中心线
:ri 44 列右对齐行
: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删除标记abcd
:delm abc删除标记abc

计算器

快捷方式说明
<C-r> = 7*7显示结果
<C-r> = 10/2显示结果

在 INSERT 模式下执行此操作

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

理解 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

另见