vim的价值意义就不再赘述了,个人认为就像打字一样,两个指头戳能打得飞快的高手也有,没必要要求所有人都练习标准打字方法,vim也是一样,一切都是生产工具,对你来说什么更高效就用什么。
1. vim基本概念介绍
vim是vi的增强工具,其命名来源也是vi(vi (i)mproved,也就是vim),关于vi的来源本文就不介绍了,请自行搜索了解。一般我们可将vim分为三种模式:命令模式、插入模式和底线命令模式。
1.1 命令模式
刚刚打开vim默认进入的就是命令模式,插入模式和底线命令模式都是通过命令模式下按下某些按键进入的,例如命令模式下按下i
即进入插入模式,光标位于刚刚命令模式所在的文字前,a
同样也是进入插入模式,但是光标位于刚刚命令模式所在文字的后面。下面的表格对命令模式下所有的按键进行了汇总说明。
注:命令模式下的光标是粗光标,插入模式下的光标是细光标,差异是,粗光标选中了一个文字,细光标则在是在文字之间的。
图1 命令模式与插入模式光标对比
下表是命令模式下每个按键的功能说明。建议可以先跳过汇总表,先参考具体的关键用法,基本用法逻辑如下:
(N)+(R)+C+(O)
其中:
- 带括号表示该参数可选
- N表示数量,R表示操作寄存器,C表示命令,O表示选项
- 如:
5"+yy
的N为5,操作寄存器为"+,命令为y,选项为y,整个命令表示拷贝当前行开始往下5行到剪贴板中6G
N为6,没有R,没有O,表示跳转到第6行
表1 命令模式按键功能说明
名称 | 说明 | 分类 |
---|---|---|
h | 左移 | (查找)移动命令 |
i | 右移 | |
j | 下移 | |
k | 上移 | |
w | 把光标移动到下一个单词开始处 | |
W | 把光标移动到空格、换行或者制表符后的下一个单词开始处 | |
b | 把光标移动到上一个单词开始处 | |
B | 把光标移动到空格、换行或者制表符前的上一个单词开始处 | |
e | 把光标移动到下一个单词的尾部 | |
E | 把光标移动到空格、换行或者制表符后的下一个单词的尾部 | |
H | 移动光标到当前屏幕可见的第一行 | |
L | 移动光标到当前屏幕可见的最后一行 | |
/ | 向后搜索内容 | |
? | 向前搜索内容 | |
n | 移动到查找内容的下一个位置 | |
N | 移动到查找内容的上一个位置 | |
f | 查找命令,后接查找的字符,比如fx,查找当前光标往后一个x字符并把光标选中到该字符上 | |
F | 查找命令,后接查找的字符,比如Fx,查找当前光标往前一个x字符并把光标选中到该字符上 | |
t | 功能类似f,只是光标会移到目标字符的前一个字符上 | |
T | 功能类似F, 只是光标会移动到目标字符的前一个字符上 | |
$ | 移动光标到当前行尾部 | |
0 | 移动光标到当前行尾部 | |
^ | 移动光标到当前行首部非空字符 | |
i | 进入插入模式,光标位于命令模式光标选中文字前 | 插入命令 |
I | 进入插入模式,光标位于当前行第一个非空字符前 | |
a | 进入插入模式,光标位于命令模式选中文字后 | |
I | 进入插入模式,光标位于当前行最后一个非空字符后 | |
o | 进入插入模式,光标位于原位置的下一行 | |
O | 进入插入模式,光标位于原位置的下一行 | |
s | 删除原光标选中的文字并进入插入模式 | |
S | 删除原光标行内所有文字,并定位在该行的第一个非空字符进入插入模式 | |
y | 复制拷贝,y后面加拷贝选项,详细说明见yank命令 | 复制与粘贴 |
Y | 复制当前行,后面不需要加拷贝选项 | |
p | 在当前光标行后粘贴拷贝的内容 | |
P | 在当前光标行前粘贴拷贝的内容 | |
r | 替换当前光标选中的字符,输了r之后直接输入需要替换的字符即可,替换一个字符后自动退出替换状态回到正常命令模式 | 替换操作 |
R | 连续替换当前光标选中的字符,按esc退出替换模式 | |
u | 撤销上一个操作 | 撤销操作 |
U | 撤销行内的操作 | |
J | 合并该行与下一行,如果前面先输入数字则表示合并与后面的n行,如5J表示合并后面5行 | 行合并 |
K | 帮助 | 帮助 |
x | 删除操作,删除光标选中的字符,删除后光标选中被删除字符的下一个字符 | 删除操作 |
X | 删除操作,删除光标选中的字符,删除后光标选中被删除字符的上一个字符 | |
v | 进入可视模式 | 进入可视模式 |
V | 进入多行可视模式 | |
Q | 切换至ex模式 | |
esc | 回到命令模式! | 模式切换 |
: | 进入底线命令模式 | |
> | 缩进 | 缩进操作 |
< | 反缩进 | |
m | m标记位置,后接标记名称,如ma则把标记存储到a,再通过'a跳转 | 标记与跳转 |
' | 跳转到指定标记位置,标记是由m进行的 | |
q | 录制宏,具体参考宏的录制与使用 | 宏录制 |
z | 调整视图,后接调整选项,如zz将光标所在那一行移到屏幕中央,z-将光标所在那一行移动到屏幕底部,z回车将光标所在行移动到屏幕顶部 | 视图调整 |
下图是网上大神汇总的命令模式下的键位说明图。
1.1.1 复制与粘贴
y命令表示复制,基本操作如下:
yy
表示复制本行到默认寄存器,p
表示粘贴默认寄存器内容nyy
表示复制从本行开始的n行到默认寄存器,比如5yy
就是复制本行开始的5行到默认寄存器y
也可以配合前置选择功能,比如通过v进入选择模式先选取需要拷贝的内容,然后通过y
把选中的内容拷贝到默认寄存器- 此外还可以通过前置配置拷贝寄存器来把拷贝内容放到指定寄存器,如
"ayy
表示拷贝当前行到寄存器a中;- 需要粘贴寄存器a中的内容需要通过如下指令
"ap
进行粘贴 - a-z标记命名寄存器,0-9表示专用寄存器,通过d或者c删除的内容会依次序存在这10个寄存器里面;
"+yy
表示拷贝到剪贴板,"+p
表示粘贴剪贴板内容到文中;- 如果需要查看寄存器内容,通过
:
进入底线命令模式,输入registers
即可
1.1.2 宏的录制与使用
录制宏是为了自动做重复操作,比如如果想在连续的10行每行头部加入注释字符//,一种方案是通过底线命令模式下的s搜索替换完成,另一种方案就是录制与执行宏。以在光标所在行往下10行添加//的目的为例,宏的录制与使用如下:
- 按q加一个字母开始宏录制,如qa,就是开始录制宏,宏标记为a
- 接下来执行单次操作:
- 按0定位光标到行首
- 按i进入插入模式
- 输入//
- 按esc回到命令模式
- 按j跳转到下一行
- 按q完成录制
- 使用宏:命令模式下按下
9@a
表示执行宏a九次
1.2 插入模式
按i进入插入模式,就是正常输入内容,此处不再赘述,插入模式下按esc回到命令模式。
- 多行同时插入小技巧:比如在需要对多行进行注释的时候
- 按ctrl+v进入列选择模式
- 选择多行
- 按I进入插入模式
- 输入插入内容
- esc回到命令模式,可以发现多行注释已完成
1.3 底线命令模式
底线命令模式的进入方法是在命令模式下按下:
,在文档底部就会出现一个可以输入的光标,如下图所示,在这个里面输入对应的命令,完成命令后会自动退出底线命令模式,回到命令模式。
1.3.1 常用底线命令
如上图wq表示保存并退出,常用底线命令如下所示
set nu
:显示行号wq
:保存并退出registers
:显示寄存器内容s
:搜索替换,基本格式如下:{作用范围}s/{目标字符}/{替换的字符}/{替换标志}
,如%s/red/blue/g
表示把全文的red替换成blue;,$s/red/blue/g
表示把当前行至结尾的red搜索替换成blue,5,$s/red/blue/g
表示把第5行开始的red替换成blue。