分享
 
 
 

vi编辑器的学习使用(十三)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Vim最大的一个优点就是他的灵活性.使得他具有如此灵活性的一个重要原因就是自动命令.所谓的自动命令就是一条命令,所不同的只是他可以在某些事件发生时自动执行.

例如通过Vim的这样自动命令,我们可以使用Vim来编辑压缩文件,这是因为我们可以定义一个自动命令在我们读取文件时解压缩,在我们写入文件时进行压缩.

我们在处理文件时有时希望文件在保存时在文件的结尾处插入当前的日期,而这在Vim当中我们可以使用自动命令来完成.我们可以定义这样的一个函数:

:function DateInsert()

: $read !date "在文件的结尾处插入日期

:endfunction

当我们要保存文件时可以调用这个函数:

:call DateInsert()

然后我们就可以保存退出了.

我们还可以将这个功能绑定在一个按键上:

:map <F12>:call DateInsert()<CR>\|:write<CR>

这种方法使用问题的解决更简单,因为我们只需在要保存文件时按一下F12键就可以了.

但是也许有时我们会忘记这样的步骤,而使用正常的保存命令,那么这时这个函数也就失去了意义.我们希望这个插入日期的命令可以自动被执行,这也正是自动命令的意义所在.

下面的命令就可以来满足我们的要求了:

:autocmd FileWritePre * :callDateInsert()<CR>

这个命令会使得所有的文件在保存之前调用这个插入日期的函数.我们并不需要每一次都要输入:write来保存文件,也就是说当我们定义了这个命令以后,当我们输入一次:write命令,vim就会自动检查所有未保存的文件并执行我们定义的这个命令,然后执行保存命令.

:autocmd命令的一般格式如下:

:autocmd group events file_patter nested command

在这个格式中组名(group)是一个可选项,他被用于管理和调用命令.参数事件(events)是一个事件列表,指明引发命令的事件,而嵌套标记(nested)可以允许嵌套自动命令,最后是所要执行的命令.

命令:augroup可以使得我们定义一组自动命令.这个组名最好应是一个和我们要定义的一组自动命令相关联的名字,如下面的例子:

:augroup cprograms

: autocmd FileReadPost *.c :set cindent

: autocmd FileReadPost *.cpp :set cindent

:augroup END

在这里因为这些自动命令是在:augroup的作用域之内的,所以他们被放在cprogram这个组内.这组自动命令是在读取C和Cpp之后执行的.如果我们想在这个组中添加关于头文件的自动命令,我们可以使用:augroup命令,或者是在我们的定义中包含这个组名.

如果我们正在编辑的文件名为sam.cx,而我们想将他当作C程序文件来对处理.这时我们可以通过命令来告诉Vim编辑器在文件读入以后将他与*.c文件相匹配.我们所用的命令如下:

:doautocmd group event file_name

在这个命令执行的时候,Vim是将假定当前文件的名字为file_name,而实际上这并不是他真正的文件名.如果在这个命令中我们并没有指明组(group),那么所有的组都会被用到.而且我们必须指明事件,并且Vim会认为这个事件已经发生.与命令:doautocmd相类似的是命令:doautoall,所不同的只是后者是针对每一个缓冲区(buffer).这个命令的格式为:

:doautoall group event file_name

我们可以使用下列的命令来引发命令:

BufNewFile 当编辑一个新文件时引发命令

BufReadPre BufReadPost 在读入之前或是读入之后引发命令

BufRead BufReadPost的另一种说法

BufFilePre BufFilePost 在通过:file命令更改缓冲区名字之前或是之后引发

FileReadPre FileReadPost

在用:read命令读入文件之前或之后.在文件读入之后,在文件的开头和结尾处有由[和]来标记

FilterReadPre FilterReadPost 在用过滤命令(filter)读入文件之前或之后

FileType 当FileType设置时有效

Syntax 当Syntax设置时有效

StdinReadPre StdReadPost 由标准输入设备读入或是输出

BufWritePre BufWritePost 在将整个缓冲区写入文件之前或是之后

BufWrite BufWritePre的另一种说法

FileWritePre FileWritePost 将部分缓冲区内容写入文件之前或是之后

FileAppendPre FileAppendPost 将一个文件由过滤命令输入之前或之后

FileChangedShell

这个事件是在Vim运行Shell命令而文件的修改时间已经改变时引发

FocusGained FocusLost

这个事件是在Vim编辑器得到或是失运输入光标时引发.这意味着vim运行图形界面,并且是Vim成为当前窗口或是其他的成为当前窗口

CursorHold

用户停止输入的时间长于由updatetime所指定的时间时引发

BufEnter BufLeave 当进入或离开缓冲区时引发

BufUnload 在缓冲区未载入之前引发

BufCreate BufDelete 在缓冲区产生以后或是在缓冲区删除以前引发

GuiEnter 启动GUI时引发

VimEnter Vim启动而初始化文件还没有读入进引发

VimLeave 退出Vim编辑器而.viminfo还没有改写时引发

FileEncoding fileencoding已经被设置时有效

TermChanged term选项被更改时引发

User

并不是一个真正的事件,而是命令:doautocmd一起使用的一个事件

当存文件时,只有下列事件成对出现时才引发:

BufWritePre BufWritePost

FilterWritePre FilterWritePost

FileAppendPre FileAppendPost

FileWritePre FileWritePost

当读文件进,只要下列事件中的一个被设置则会引发:

BufNewFile

BufReadPre BufReadPost

FilterReadPre FilterReadPost

FileReadPre FileReadPost

文件名类型与UNIX标准系统相匹配.下面列出是一些特殊字符匹配的情况:

* 匹配任意长度的任意字符

? 匹配单个字符

' 分隔交替的类型

\? 字符?

\, 字符,

\character

将这个字符看作是一个要查找的类型字符,例如:a\+可以匹配,aa,aaa等等

一般情况下一个命令的执行结果并不会引发另一个事件.例如Syntax的执行结果并不会引发FileReadPre事件.但是如果我们在自动命令中加入nested关键字就可以来引发了,例如下面的命令:

:autocmd FileChangedShell *.c nested e!

我们可以使用命令:autocmd列出所有的自动命令.

如果我们想要得到所有这些命令中的一个子集命令,我们可以使用如下的命令:

:autocmd group event pattern

在这个命令中如果我们指定了group,那么就会所有与group相匹配的命令.event可以是以前定义的或是所有的事件,pattern指了与类型相匹配的文件选项.只有那些与命令相匹配的命令才会被列出来.

我们可以建立我们自已的自动命令,当然了我们也可以移除那些我们不再需要的自动命令.例如命令:autocmd!就可以移除所有的自动命令.

我们也可以用下面的命令来移除指定的组命令:

:autocmd! group

在这个命令中我们当然也可以为这个组指定事件或是类型

:autocmd! group event pattern

event可以用*代替所有的事件

我们可以用命令:autocmd!来移除那些已经存在的自动命令,我们还可以同时在一个命令中再新建一个我们自己的自动命令.这个语法的格式如下:

:autocmd! group event pattern nested command

这个命令等价于下面的两个命令:

:autocmd! group event pattern

:autocmd group event pattern nested command

有时我们并不想引发某个命令,在这样的情况下我们可以设置eventignore选项来指定那些要忽略的事件.例如下面的命令将进入窗口和离开窗口的事件忽略掉:

:set eventignore=WinEnter,WinLeave

如果要忽略所有的事件,可以用下面的命令:

:set eventignore=all

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有