第七章 高级编辑
定制vi
vi的设置选项影响它的操作方式,可以在vi中使用ex的:set命令修改这些选项. 而且,无论vi什么时候启动,它都要读取主目录下的.exrc文件以获得进一步的操作指令。通过在文件中放置:set命令,就可以在使用vi的任何时候改变它的操作方式。vi首先执行主目录下的.exrc文件,然后才执行当前目录下的.exrc文件,储存在shell变量EXINIT中的任何命令都将在vi启动时执行并覆盖主目录.exrc文件的设置。
:set命令
有两种类型的选项可以使用:set命令进行修改:不是开就是关的触发选项和带数字或字符串值的选项(如页边距的位置和文件名)。开启触发选项的命令为:
:set option
关闭触发选项的命令为:
:set nooption
:set ic 指定模式搜索忽略大小写
:set noic 搜索时不忽略大小写
:set window=n 设置"窗口大小"就是active的buffer,在使用^F和^B的时候起效,向前(后)移动max(n-2, 1)行
:set all查看所有的选项设置情况,可以使用:h[elp] 'option'来寻求帮助
:set option? 查看命令当前值
:set 显示在.exrc文件或当前会话期间明确修改和设置过的选项
.exrc文件
控制vi环境的.exrc位于主目录下,把将在使用vi或ex时产生影响的set ab和map命令输入到该文件中,命令前面不需要有冒号
替换环境
除了读取主目录下的.exrc文件外,还可以让vi读取当前目录下名为.exrc的文件
可以读取另外名字的文件设置vi环境,例如
:so[urce] .progoptions
一些有用的选项
:set textwidth=10 让每行的宽度不超过10,但是只能在空白处断行
:set wrapmargin=10 让每行到右边界上的宽度不少于10,但是只能在空白处断行
:set magic 让正则表达式中.和*有特殊意义/\v更厉害名曰:very magic就和egrep使用一样了
:set wrapscan 让模式搜索的时候不要一圈一圈的找,找不到了就不要绕圈子
:set autoindent 让下一行和这一行的缩进相同
:set tabstop=4 设置Tab键在vim中移动量为4,默认为8
:set shiftwidth=4 设置自动缩进量为4,可以和tab不一样,最好一样
:set showmatch 找到匹配的括号,给出闪烁提示
:set list 列出tab键^I和回车键$
:set autowrite 在调用:n命令移动到下个文件进行编辑时和使用:!运行shell命令之前将自动写出已修改的缓冲区内容
执行UNIX命令
在vi中进行编辑时,可以显示或读取任何UNIX命令的执行结果.感叹号!可以指定vi创建一个shell并把它后面的内容看成UNIX命令:
:!command
通过:sh命令可以创建一个shell,跟:!sh命令创建的shell不一样,后者功能很弱,不知道为什么会这样
:r !date可以将date得到的结果插入到当前行以下
:r !sort phone会读取"phone"排序后的内容
使用命令过滤文本
把(缓冲区中)文本块作为标准输入发送给UNIX命令,该命令的输出将取代缓冲区中(对应)的文本.可以使用ex或vi的命令对文本进行过滤,区别在于:ex使用行地址指示文本块,vi使用文本目标(移动命令)指示文本块.
使用ex过滤文本
:28,34!sort 使用sort对第28行到第34行进行过滤,并用sort的输出取代这些行
使用vi过滤文本
在vi中,依次输入感叹号 任何指示文本块的vi移动键和所要执行的UNIX命令,即可使用该UNIX命令对文本进行过滤,例如:
!)command 表示过滤该句
由于都是行过滤,因此需要选择的范围 >1才会有效果,实际上都是将你选择的范围转换为行后通过n!!command命令转发的
重复前面命令的语法是:!object!