相对于IDE,vim的学习成本较高,但一旦熟悉vim后,开发效率是非常高的。vim的命令非常多,但在工作中常用的却比较少,本着实用主义,参考Learn Vim Progressively,整理最有用的命令,也便自己以后查阅。下面涉及到ctrl
键的组合操作,如ctrl
和r
组合,用<C-r>
表示
模式
vim有三种模式:普通(normal)模式、插入(insert)模式和命令(command)模式。刚进入vim时默认进入普通模式,下面看下各模式的转换:
普通模式下键入
i
进行插入模式
普通模式下键入:
进入命令模式
按ESC
退出插入模式和命令模式
vim的文档非常全,在命令模式下,我们可以键入h
或help
打开帮忙文档,也可以直接键入help <command>
,查看指定命令的帮助文档,如help i
。
在普通模式下通过hjkl
(左下上右)移动光标,插入模式下可以键入任意字符,命令模式下可以输入命令,回车键执行命令。如何退出呢,进入命令模式,键入q就可以退出了,如果有更新会提示你保存,键入w
进行保存。也可以同时键入wq
保存退出。
移动
上面讲了hjkl
可以在普通模式下对光标进行移动。如果只支持光标按字符移动,那就太没效率了,下面这些命令可以快速将光标移动到目标位置。
先来看看光标在当前行中的移动:
1 | 0:数字零,将光标移动到行首 |
其中单词间的移动大小写的区别是单词划分规则不同,小写w、e、b
的单词是由字母、数据加下划线组成的单词,而大写W、E、B
的单词是由字符组成,已空格区分。如下所示:
再来看下更强大的一些移动操作:
1 | %:匹配括号移动,包括 `(, {, [ ` |
下图更直观展示各种移动操作:
常用操作
1 | x:删除光标所处字符,也可以在前面指定数字N,表示删除从当前光标开始后的N个字符,如`4N`,删除光标后的4个字符(包含光标所处字符) |
另外说两个时常用的比较多的命令co
和mo
,需要在命令模块下执行,
如将1到10的行拷贝插入到100行:
1 | :1,10 co 100 |
又如将1到10行剪切插入到100行:
1 | :1,10 mo 100 |
查找替换
1 | /pattern:搜索 pattern 的字符串,如果搜索出多个匹配,可按n键到下一个,按N键到上一个 |
可视化选择
在普通模式下键入v
或V
后,vim左下角会出现-- 可视 --
状态提示,此时移动光标可以进行行选择或对行中的局部字符选择,如:
1 | v$U:表示将光标所处的行全部转化为大写,分解如下: |
也可以使用<C-v>
进行块选择,此时vim左下角会出现-- 可视 块 --
,来看两个常用操作,下面是对指定行进行注释:
1 | <C-v>GI# ESC:将当前行到最后一行的进行注释,命令分解如下: |
又如在每行后添加注释:
1 | <C-v>G$A# your comment ESC:从当前行到最后一行的所有行末加上`# your comment`,命令分解如下: |
分屏与多文件操作
常用分屏命令,以下命令需要在命令模式下执行:
1 | sp:水平分屏 |
我看代码时,经常会打开多个文件,vim支持打开多个文件以及在各个文件之间跳转。在命令模式下,使用e
命令打开文件:
1 | :e file.txt |
使用ls
命令查看当前打开的文件,如:
命令模式下,使用bn
打开下一个文件,使用bp
打开上一个文件,也可以使用buffer 文件序号
打开指定序号的文件,如下图中打开序号为3的文件3.txt
:
1 | :buffer 3 |
录制宏
对于vim的宏来讲,可以简单理解为是将一串命令存储到寄存器中。用下面例子说明宏的使用方法,在数据库我们经常需要进行分表处理中,通常会写下面这样的SQL命令:
1 | CREATE TABLE LIKE your_table_0; |
假设我们要分64张表,如果一个个的粘贴复制,再修改表象,就太麻烦了,我们可以使用宏来帮我们完成这个任务,将光标移到上面行中,执行如下命令:
1 | T_<C-a>q |
上面命令是什么意思,其它比较简单,分解如下:
1 | qa -> 开始录制宏,并存到寄存器a中 |
执行完上面命令后,实际上已经完成了创建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