1 普通模式
命令操作符合 | 命令作用 | 等同命令 |
---|---|---|
. | 重复上次修改 | |
x | 删除光标下的字符 | |
dd | 删除整行 | |
>G | 从当前行到文档末尾处的缩进层级 | |
a | 在当前光标之后添加内容 | |
i | 在当前光标之前添加内容 | |
A | 在当前行的结尾添加内容 | $a |
I | 在当前行的开头添加内容 | ^i |
C | 从当前光标到行尾内容全部删除 | c$ |
cw | 从光标到当前一个单词内容进行删除 | |
cW | 从光标到当前一个字符串删除一个单词 | |
s | 删除光标所在字符,并且进入插入模式 | cl |
S | 删除整行内容 | dd |
I | 从行首进入插入模式 | ^i |
o | 从下行进入插入模式 | |
O | 从上行进入插入模式 | ko |
f{char} | 查找当前行char(任一字符)所在位置 | |
; | 正向查找上次f命令所查找的字符 | |
, | 方向查找上次f命令所查找的字符 | |
n | 正向跳转到匹配指定模式的地方 | |
n | 反向跳转到匹配指定模式的地方 | |
u | 插销上一次的修改 | |
db | 从光标起始位置到单词开头的内容,光标所在的字符会保留 | |
b | 将光标移到单词的开头 | |
dw | 删除光标所在位置到该单词的结尾 | |
daw | 删除光标所在的整个单词 | |
d$ | 删除光标到行尾所有内容 | |
d{n}w | 删除光标所后的n个词 | |
g~ | 从光标行到下一行内容反转大小写 | |
gu | 从光标行到下一行内容转小写 | |
gU | 从光标行到下一行内容转大写 | |
gU{motion} | gU为操作符,{motion}为动作符 | |
> | 从光标行到下行内容增加缩进 | |
>{n} | 从光标行到下n行内容增加缩进 | |
yt{char} | 从光标内容到字符char内容copy到寄存器 | |
v | 激活面向字符的可视模式 | |
V | 激活面向行的可视模式 | |
ctr+v | 激活面向列块的可视模式 | |
* | 高亮光标所在的所有单词,且光标跳转到下一处匹配 | |
q/ | 打开查找命令历史的命令行窗口 | |
q: | 打开Ex命令历史的命令窗口 |
2 插入模式
命令操作符 | 命令作用 | 等同命令 |
---|---|---|
ctr+h | 删除光标前一个字符 | 等同退格键 |
ctr+w | 删除光标前一个单词 | |
ctr+u | 删除光标到行首内容 | |
Esc | 切换到普通模式 | |
ctr+[ | 切换到普通模式 | |
ctr+o | 切换到插入-普通模式(是普通模式的一个特例,执行一次普通模式命令,执行完后,回到插入模式 | |
ctr+r{register} | 把寄存器{register},eg: register=0的内容黏贴到光标所在位置 |
3 可视模式
vim的可视模式运行选中一块文本区域并在其上进行操作,某些可视模式命令执行的基本功能与普通模式相同,但操作上有些细微的变化。在普通模式中,先触发修改命令,然后使用动作命令指定其作用范围,然而,在可视模式中,要先选中选区,然后再触发修改命令。
命令操作符 | 命令作用 | 等同命令 |
---|---|---|
Esc | 回到普通模式 | |
ctr+[ | 回到普通模式 | |
v | 从面向字符的可视模式切换到普通模式 | |
V | 从面向行的可视模式切换到普通模式 | |
ctr+v | 从面向列块的可视模式切换到普通模式 | |
b | 选中区域向后移动一个词 | |
e | 选中区域向前移动一个词 | |
o | 重现调整可视模式选择的边界 | |
it | 高亮选中标签内部的内容 | |
U | 对选中的区域转大写 | |
u | 对选中的区域转小写 | |
{n}j | 向下移动n行 | |
x | 对选中的内容进行删除 | |
gv | 重选上次的高亮选区 | |
r{char} | 对选中的区域用{char}取代 |
假设我们需要对如下内容中的"images"更改为"compnents":
我们可以在可视化模式下进行操作,只需要如下几步,就能够快速达到效果:
- 进入可视化列块模式:ctr+v
- 移动选定方块区域:jje
- 对选定的区域进行删除:c
- 输入替换的内容:components
- 进入普通模式:Esc (此时后两行的内容也会全部更换过来)
操作完后结果如下:
4 命令行模式
Vim的先祖是vi,vi奉一个名为ex的行编辑器为先祖,这就是为什么有Ex命令。在按下 : 键时,Vim会进入到命令行模式,这个模式和shell下的命令行有些类似,可以输入一条命令,然后按Enter键执行它。在任意时刻,都可以按键从命令行模式切回普通模式。Ex命令影响范围广且距离远。
命令操作符 | 命令作用 | 等同命令 |
---|---|---|
:{n} | 把光标移到第n行,比如 :10 | |
:2print | 将第二行的内容打印出来 | :2p |
:1,2substitue/#/t/ | 将第一到第二行内容的第一个#替换成t | :1,2s/#/t/ |
:%s/#/t/g | 将文本所有行的每个#替换成t | |
:2,5p | 将第2行到第5行内容全部打印出来 | |
:2,5delete | 将第2行到第5行内容全部删除 | |
:{start},{end}{action} | 从地址start到地址end做操作action | |
:.,$p | 从当前位置到文件末尾全部内容打印 | |
:%p | %代表当前文件中的所有行,打印当前文件的所有内容 | :1,$p |
:‘<,’>p | ‘<代表高亮选取的起始行,’>高亮选取的结束行,对高亮选取的内容进行打印输出 | |
:‘<,’>t0 | '对高亮选取的内容复制到文件开头 | |
:{range}t{address} | t是copy的简写,将range范围内容copy到地址address部分 | |
:{range}m{address} | m是move的简写,将range范围内容move到地址address部分 | |
:6t. | 将第6行复制到当前行下方 | |
:t6 | 将当前行复制到第6行下方 | |
:t. | 将当前行内容copy到当前行下方 | |
:‘<,’>m$ | 将高亮选区的内容移动到文件末尾 | |
:‘<,’>normal . | 将高亮选区的内容执行普通模式下的.命令 | |
:‘<,’>normal i// | 将高亮选区的内容执行普通模式下i//命令(对高亮每行行首进行加注释// | |
:%normal A; | 对整个文件范围,执行普通模式的A;命令(对每行末尾添加;) | |
:%normal i// | 对整个文件范围,执行普通模式的i//命令(对每行行首添加注释//) | |
:4,10normal i// | 对第4行内容到第10行内容,执行普通模式的i//命令(对每行行首添加注释//) | |
@: | 重复上次Ex命令 | |
:col<ctr+d> | ctr+d命令会让vim现实可用的补全列表,类似shell按tab键进行补全,最后这里的结果为: colder colorsheme | |
:colorscheme <ctr+d> | 对colorscheme的配色方案补全,出来的结果有:blue blackboard desert shine 等 | |
:%s//<ctr+r><ctr+w>/g | 对文本中所有的用*命令高亮产生的单词用执行cw后修改的词取代 | |
:!ls | 在vim的命令行模式中,给命令加一个感叹号前缀,比如!ls就可以调用外部shell的ls命令,查看当前目录的内容 | |
:!cat % | 在vim的命令行模式中,%表示当前文件名,所以这个命令表示输出当前文件的所有内容 | |
:shell | 该命令来启动一个交互的shell会话,在这个会话中,我们可以执行多个shell命令,想退出并返回vim,则用exit命令就可以 | 如果我们在bash中运行的vim,则我们可以用命令ctr+z挂起vim所属的进程,控制权交给bash, 可以用jobs查看挂起的作业,在bash执行完后,我们可以用fg命令唤醒被挂起的作业,恢复vim,ctr+z与fg比:shell exit更加方便快捷 |
:source batch.vim | 批量执行batch.vim中的所有Ex命令,若想撤回,则按u键即可让文档完好如初 | |
:pwd | 打印工作目录 | |
:edit {file_path} | 打开指定path的file文件 | |
:edit . | 打开文件管理器,并显示当前工作目录 | :e. |
:Explore | 打开文件管理器,并显示活动缓冲区所在的目录 | :E |
4 文件操作
Vim允许在多个文件上工作,允许同时在多个缓冲区上工作。例如我们在shell里用下面的命令打开几个文件:
vim *.txt
此时目录正好有a.txt和b.txt,当vim启动时,它会显示一个窗口。
命令操作符 | 命令作用 | 补充说明 |
---|---|---|
:bnext | 正向移动一个文件 | 等同ctr+^ |
:bprev | 反向移动一个文件 | |
:bfirst | 跳到缓冲区列表的开头 | |
:blast | 跳到缓冲区列表的结尾 | |
:args | 显示启动时作为参数传给vim的文件列表 | |
:args app.js | 将参数列表增加app.js文件,vim跳转打开app.js文件 | |
:w | 把缓冲区保存到文件 | :write |
:edit! | 重新从磁盘读取此文件,这会用文件的内容覆盖缓冲区中的内容,当缓冲区内容与磁盘一致后,就可以执行:quit | |
<ctr+w>s | 水平切分当前窗口,新窗口仍然显示当前缓冲区 | |
<ctr_w>v | 准直切分当前窗口,新窗口仍然显示当前缓冲区 | |
:split {file} | 水平切分当前窗口,并在新窗口中载入{file} | |
:vsplit {file} | 准直切分当前窗口,并在新窗口中载入{file} | |
<ctr+w>w | 在窗口间循环切换 | |
<ctr+w>h | 切换到左边的窗口 | |
<ctr+w>j | 切换到下边的窗口 | |
<ctr+w>k | 切换到上边的窗口 | |
<ctr+w>l | 切换到右的窗口 | |
<ctr+w>c | 关闭活动窗口 | :close |
<ctr+w>o | 只保留活动窗口,关闭其他所有窗口 | :only |
<ctr+w>= | 使所有窗口等宽,等高 | |
<ctr+w>_ | 最大化活动窗口的高度 | |
<ctr+w>| | 最大化活动窗口的宽度 |
5 动作命令
命令操作符 | 命令作用 | 补充说明 |
---|---|---|
h | 左移一列 | |
l | 右移一列 | |
j | 下移一行 | |
k | 上移一行 | |
gj | 屏幕行向下移一行 | |
gk | 屏幕行向上移一行 | |
0 | 移动到实际行的行首 | |
^ | 移动到实际行的第一个非空白字符 | |
g^ | 移动到屏幕行的第一个非空白字符 | |
$ | 移动到实际行的行尾 | |
g$ | 移动到屏幕行的行尾 | |
g0 | 移动到屏幕行的行首 | |
w | 正向移动到下一单词的开头 | |
b | 反向移动到当前单词/上一单词的开头 | |
e | 正向移动到当前单词/下一单词的结尾 | |
ge | 反向移动到上一单词的结尾 | |
W | 移动一个字串(按照空白字符分割,不要搞混w基于单词移动 | 例如:: e.g. we’re going too slow 有5个字串和10个单词 |