记得刚开始用vi的时候,只会用:wq
或者:q
来退出,后来又学会了ZZ
,今天上班路上没事做,又把 Learning the Vi & Vim 的 Introducing the ex Editor 过了一遍,又发现了一个退出命令-:x
,其实很早以前这些内容都看过,但是由于使用惯性,渐渐地会把一些平时不太用到的命令给遗忘了,其实一个防止遗忘的好办法就是认真总结一下,方便以后查阅。
其实当我们在命令模式下按下冒号后,就已经进入ex编辑模式了,也就是说退出时使用的命令wq
q
x
其实都是ex的命令。vi的行编辑都也都是通过ex完成的。
那么问题来了,如何在vi中优雅地使用ex呢?
ex是一个行编辑器(Line Editor),所以必须要把需要操作的行号范围传给它。
全称 | 缩写 |
---|---|
delete | d |
move | m |
copy | co |
copy | t |
用一段python脚本生成一个多行的文件,并且把行号都标记出来。
for i in range(1, 1000):
print ‘this is line #‘, i
把脚本文件保存成producer.py
文件,然后执行脚本
python producer.py >> practice
生成了一个新文件practice
。
可以通过 :set nu
或 :set nonu
来控制左侧行号的显示。
先执行一个简单的删除多行的操作:
:3,18d
删除第3行到第18行。
其他命令功能类似,移动多行
:10,20m2
把第10行到第20行的内容移动到第2行下面。
还有拷贝多行
:23,29co100
或者
:23,29t100
多行操作就这么简单 - 行号+命令
ex当然也没忘记为我们提供一些特定的符号来表示特定的行。
符号 | 代表行 |
---|---|
. | 当前行 |
$ | 最后一行 |
% | 所有行 |
用法举例
:.,$d
删除当前行以及当前行下面的所有行:20,.m$
把20行到当前行的内容移动到最后一行的下面,也就是文件末尾:%d
删除所有行:%$
把所有行复制到文件末尾行号也支持加减运算
:.,.+20d
删除当前行以及后面的20行,一共21行:226,$m-2
:.,+20#
#用来添加行号:-,+t0
当前行的上一行到当前行的下一行(共三行):/pattern/d
:/pattern/+d
:/pattern1/,/pattern2/d
:.,/pattern/m23
:g/pattern
:g/pattern/p
:g!/pattern/nu
:60,124g/pattern/p
1,3d | s/thier/their/
1,5 m 10 | g/pattern/nu
原文:http://blog.csdn.net/feelang/article/details/43854299