LeeYzero的博客

自强不息,厚德载物

0%

Vim简明教程

相对于IDE,vim的学习成本较高,但一旦熟悉vim后,开发效率是非常高的。vim的命令非常多,但在工作中常用的却比较少,本着实用主义,参考Learn Vim Progressively,整理最有用的命令,也便自己以后查阅。下面涉及到ctrl键的组合操作,如ctrlr组合,用<C-r>表示

模式

vim有三种模式:普通(normal)模式、插入(insert)模式和命令(command)模式。刚进入vim时默认进入普通模式,下面看下各模式的转换:

普通模式下键入i进行插入模式
普通模式下键入:进入命令模式
ESC退出插入模式和命令模式

vim的文档非常全,在命令模式下,我们可以键入hhelp打开帮忙文档,也可以直接键入help <command>,查看指定命令的帮助文档,如help i

在普通模式下通过hjkl(左下上右)移动光标,插入模式下可以键入任意字符,命令模式下可以输入命令,回车键执行命令。如何退出呢,进入命令模式,键入q就可以退出了,如果有更新会提示你保存,键入w进行保存。也可以同时键入wq保存退出。

移动

上面讲了hjkl可以在普通模式下对光标进行移动。如果只支持光标按字符移动,那就太没效率了,下面这些命令可以快速将光标移动到目标位置。

先来看看光标在当前行中的移动:

1
2
3
4
5
6
7
8
9
10
0:数字零,将光标移动到行首
^:将光标移动到当前行第一个不是blank的位置,所谓blank,是指空格、tab、换行、回车等不可见字符)
$:将光标移动到行尾
g_:将光标移动到当前行最后一个不是blank的位置
gg:将光标移动第一行
G:将光标移动第最后一行
NG:N是行号,即将光标移动了第N行,如3G,表示将光标移动到第三行
w/W:移动到下一个单词的开头
e/E:移动到下一个单词的结尾
b/B:移动到上一个单词的开头

其中单词间的移动大小写的区别是单词划分规则不同,小写w、e、b的单词是由字母、数据加下划线组成的单词,而大写W、E、B的单词是由字符组成,已空格区分。如下所示:

Figure-1

再来看下更强大的一些移动操作:

1
2
3
%:匹配括号移动,包括 `(, {, [ `
f/F:如`fa`,移动到下一个为a的字符处,也可以是fs,移动到下一个为s的字符,大写F表示反向移动,也可以使用3fa,表示移动到第三个为a的字符处
t/T:如`t;`,移动到分号`;`前的一个字符,大写T表示反向移动,也可以使用`3t;`,表示移动到第三个分号`;`前的一个字符

下图更直观展示各种移动操作:

Figure-2

常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
x:删除光标所处字符,也可以在前面指定数字N,表示删除从当前光标开始后的N个字符,如`4N`,删除光标后的4个字符(包含光标所处字符)
dd:删除当前光标所处行,也可以在前面指定数字N
yy或Y:复制当前行,也可以在前面指定数据N
p:粘贴剪切板
a:在光标之后插入
o:在当前行后插入一个新行
O:在当前行前插入一个新行
cw:替换从光标所处位置到单词结尾的字符
u:撤销
<C-r>:反撤销
<C-n>或<C-p>:自动提示
.:重复上一个命令
=:将光标所处行及之后的行自动缩进,通用使用`gg=`,对整个文件进行自动缩进。
<,>:左右缩进

另外说两个时常用的比较多的命令como,需要在命令模块下执行,
如将1到10的行拷贝插入到100行:

1
:1,10 co 100

又如将1到10行剪切插入到100行:

1
:1,10 mo 100

查找替换

1
2
3
/pattern:搜索 pattern 的字符串,如果搜索出多个匹配,可按n键到下一个,按N键到上一个
*和#:匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词
:%s/this/that/g:全局将`this`替换为`that`

可视化选择

在普通模式下键入vV后,vim左下角会出现-- 可视 --状态提示,此时移动光标可以进行行选择或对行中的局部字符选择,如:

1
2
3
4
v$U:表示将光标所处的行全部转化为大写,分解如下:
v -> 进入可视化选择
$ -> 将光标移动到行尾,即选择了当前行
U -> 将选择的内容转化为大写

也可以使用<C-v>进行块选择,此时vim左下角会出现-- 可视 块 --,来看两个常用操作,下面是对指定行进行注释:

1
2
3
4
5
6
<C-v>GI# ESC:将当前行到最后一行的进行注释,命令分解如下:
<C-v> -> 进行可视块
G ->将光标跳转到最后一行
I -> 进入可视化编辑
# -> 在行前添加`# `
ESC -> 退出可视化及可视化编辑

又如在每行后添加注释:

1
2
3
4
5
6
7
<C-v>G$A# your comment ESC:从当前行到最后一行的所有行末加上`# your comment`,命令分解如下:
<C-v> -> 进行可视块
G -> 将光标跳转到最后一行
$ -> 将光标跳转到行末
A -> 在行末进行可视化编辑
# your comment -> 添加注释内容
ESC -> 退出可视化及可视化编辑

分屏与多文件操作

常用分屏命令,以下命令需要在命令模式下执行:

1
2
3
4
5
6
7
sp:水平分屏
vs:垂直分屏
<C-w><dir>:dir是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏
<C-w>[N]+:增加当前分屏间的尺寸,N可选,表示增加的尺寸个数
<C-w>[N]-:减少当前分屏的尺寸,N可选,表示减少的尺寸个数
<C-w>=:均分分屏
<C-w>|:最大化当前分屏

我看代码时,经常会打开多个文件,vim支持打开多个文件以及在各个文件之间跳转。在命令模式下,使用e命令打开文件:

1
:e file.txt

使用ls命令查看当前打开的文件,如:

Figure-3

命令模式下,使用bn打开下一个文件,使用bp打开上一个文件,也可以使用buffer 文件序号打开指定序号的文件,如下图中打开序号为3的文件3.txt

1
:buffer 3

录制宏

对于vim的宏来讲,可以简单理解为是将一串命令存储到寄存器中。用下面例子说明宏的使用方法,在数据库我们经常需要进行分表处理中,通常会写下面这样的SQL命令:

1
CREATE TABLE LIKE your_table_0;

假设我们要分64张表,如果一个个的粘贴复制,再修改表象,就太麻烦了,我们可以使用宏来帮我们完成这个任务,将光标移到上面行中,执行如下命令:

1
qaYp$T_<C-a>q

上面命令是什么意思,其它比较简单,分解如下:

1
2
3
4
5
6
qa -> 开始录制宏,并存到寄存器a中
Yp -> 复制当面光杆所在行
$ -> 将光杆移动到行末尾
T_ -> 向后移动光杆直到出现_为止(即将光标移动到数字上)
<C-a> -> ctrl + a对光标所处的数字+1
q -> 停止录制宏

执行完上面命令后,实际上已经完成了创建your_table_1表的SQL语句,此时,只需要将光标放到这条sql命令所处行中,利用@a可以将寄存器a中的宏进行重放,同时可以在前面指定重放次数,如执行以下命令创建后续62张表:

1
62@a

这便完成了对your_table进行64分表的SQL语句,合理利用录制宏命令,可以极大提高效率。

总结

刚开始学习vim有点痛苦,因为这些命令更多的是要先记住,最好的办法是不断的实践,熟能生巧,最终你会喜欢上vim。

参考资料

[1] http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively