原文地址:Vim实战指南(四):ex命令
Introduction
ex是Unix下的一个文本编辑器。至于为什么突然讲到这个,那是因为vi就是ex的"visual mode"。
你已经见过vi中的":w", ":q!",没错,这些就是来自于ex命令。
ex命令远不止这些,实际上所有":"开头的命令,也就是你在vi最下面看到的命令行,都属于ex命令。
接下来我要详细的介绍一下,ex命令的用法。
ex简介
首先我们打开ex:
$ ex file
"file" 3L, 16C
Entering Ex mode. Type "visual" to go to Normal mode.
输入1,3,屏幕上将显示1-3行的内容。
试着输入"visual"或者"vi",是不是回到了熟悉的vi界面?
想要使用ex,输入":",是不是在最下面看到了ex命令行?
ex究竟是什么东西?事实上这和历史有关,在早期,显示器并不像现在这么好用,那会的“显示器”只有按行显示的功能。当你希望显示某行,输入命令,“显示器”上才会显示那行。试着想想一个不支持上下左右滚动的界面。
而控制这个“显示器”显示文本的命令行工具,就是ex。
ex vs vi
为什么我们有了vi还要使用ex?因为对于大段文本的操作,ex命令比vi命令行模式(command mode)更方便。
ex的命令都是基于行的(早期的“显示器”,或者你的小型计算器,除了行列什么都没有了),如:
:3:显示第三行
:3,5:显示第3到5行
:3s/hello/hi:将第三行的hello替换成hi,这里s是substitute的缩写
而在vi命令行模式下,你只需要简单的:
3G
但是对于删除3-6行,ex命令只需要:
:3,6d:这里d是delete的缩写
而在vi命令行模式下,你需要:
3G
3dd:这里你还需要计算6-3=3
另外一个例子,将3-6行放到14行的后面,ex命令只需要:
:3,6m14
而在vi命令行模式下,你需要:
3G
3dd
14G
pp
ex的优势就体现在这里。
ex行
上面我们见过,ex命令都是基于行的,而获得行号有下面几种方法:
3:直接输入行号
3-6:行范围
.:当前行
/pattern/:满足pattern的第一行
$:最后一行
%:每一行
你可以组合这些,如:
:3,$d:删除3行到最后一行
:%d:删掉每一行
你也可以:
:.,.+3d:删除当前行及后面3行
:/pattern/d:删除包含pattern的第一行
:/pattern1/,/pattern2/d:删除从pattern1到pattern2的行
搜索
在vi中,使用/进行搜索,是不是觉得每次使用n/N来查找下一个太慢了?试试ex吧:
:g/pattern/nu
是不是所有包含pattern的行以及行号都打印出来了?这里g的意思是global,全文的意思,nu是number,行号的意思。
你也可以把g换成3,6之类的,只在3-6行中搜索。
批处理
在ex中,也可以用"|"来批处理多条命令,如:
3,6d | g/csprojectedu/nu:删除3-6行后,打印所有包含csprojectedu的行。
保存和退出文件
在Vim实战指南(一):基础编辑命令中,我们介绍过保存和退出文件的方法,实际上:
ZZ:是vi命令行模式下的命令
:q:ex命令,退出文件,如果有未保存的修改则无法退出
:q!:ex命令:强制退出
:x:ex命令,保存和退出文件
:w:ex命令,保存文件
:w!:ex命令,强制保存
:w another:将文件另存为文件another
:3,6w another:将3-6行另存为文件another(编辑神器)
:9,13w >>another:将9-13行追加到文件another后面(编辑神器2)
:r another2:将another2文件的内容追到到当前文件光标后(编辑神器3)
:3r /home/user/another3:将/home/user/another3文件的内容追到到当前文件第3行后(编辑神器4)
编辑神器1-4,是不是很方便?
多文件处理
vi支持多文件处理,同时处理多文件不仅节省你多次打开和退出vi的时间,也可以让你反复利用vi的缓存区,关于缓存区的说明见Vim实战指南(三):高级技巧。
首先在命令行打开多个文件:
$ vi filename1 filename2
首先打开filename1,你可以通过ex的命令来切换:
:n:切换到下一个文件
:N:切换到上一个文件
:args:显示所有文件
:rewind/:rew:跳到第一个文件
:last:跳到最后一个文件
记住,缓存区是公用的,你可以将filename1中选择的内容,通过缓存区拷贝到filename2中。
Summary
掌握ex命令后,是不是发现vi越来越好用了?别着急,更强大更好用的ex命令还在后面。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。