学习vi编辑器7(中)
保存命令
vi和ex都有许多不同的用来保存长命令序列的方法,当调用这些已保存的序列中某一个时,只需输入几个字符(或者甚至一个字符)就会执行整个命令序列
单词缩写
定义一些缩写,无论什么时候在插入模式下输入缩写,vi将自动把它扩展为完整的文本,使用ex命令定义缩写:
:ab abbr phrase
只有在插入模式下把组成缩写的字符序列作为完整的单词输入(regexp中的\<和\>中),才会被扩展;单词内部的abbr将不会被扩展.
输入:unab abbr 就可以从此停止扩展
:ab 列出当前定义的缩写
在vim中如果递归的缩写,如
:ab GNU GNU's Not Unix
将只会扩展一次
使用映射命令
除了是为vi命令模式而不是插入模式定义一个宏外,map命令的行为与ab极为相似
:map x sequence 把字符x定义为一系列编辑命令
:unmap x 取消为x定义的序列
:map 列出当前映射的所有字符
防止ex解释键
注意在定义映射时,不能只输入RETURN,ESC,BACKSPACE,DELETE之类的键作为映射命令的一部分,因为这些键已在ex内有含义了,如果要使用这些键作为被映射命令的一部分,需要使用CTRL-V来避开它的正常含义,例如
:map CTRL-A d10CTRL-VRETURN
这种用法适用于任何ex命令,不只是映射命令,在缩写或者替换命令也适用,例如
:ab 123 one^Mtwo^Mthree ^M就是CTRL-VRETURN因为回车就是ASCII码中的第M个
:g/^Section/s//As you recall, in^M& 在所有以单词Section开头的行前面插入一个短语作为独立行
注意竖直条( | )无法被防止,因为它有作为多个ex命令分隔符的特殊含义
一些映射例子
:map ^A 0i/*^[$a*/^[ 为c++加上注释
:map e ea 移动到单词的尾部添加文本
:map K dwwp 调换两个单词位置
:map q :w^M:n^M 保存当前文件
:map = xf)xn 重复搜索并删除单词或短语周围的圆括号
用于插入模式的映射键(仅仅在插入模式下和命令模式下可用,在一般模式下不能使用)
通常,映射键只适用于命令模式,因为在插入模式下各键都代表其本身,不应该将其映射为命令.但是,通过在map命令前加上感叹号(!),就可以强迫它忽略正常含义,从而在插入模式下产生映射,例如:
:map! + ^[kA:^[jA 在插入模式下将+映射成为在上一行末尾插入:再返回该行末尾继续输入
也可以取消这个映射:
:unmap! x 但是实际上不奏效,我也不知道怎么办,有方法啦:通过CTRL+V转义它
映射功能键(什么是功能键)
映射其他特殊键
许多键盘上带有与vi中的命令功能相同的特殊键,如HOME,END,PAGE UP,PAGE DOWN,由于这些按键也是有本来的意思的,于是跟ESC等按键一样,需要转义.例如:
:map CTRL-V HOME 1G 就可以将HOME键转义成为到第一排
映射多个输入键
:map =b a</emphasis>^[ 将=b映射了,输入的时候只要连续的输入=b就可以达到替换的效果
@函数
使用@命令执行某个命名缓冲区的内容,例如
将cwgadfly^[删除放到g缓冲区(执行"gdd将该行删除到g缓冲区).现在无论什么时候只要把光标放在一个单词的开头并输入@g,文本中的单词就将被替换成为gadfly
从ex中执行缓冲区
除了在一般模式中执行缓冲区以外,还可以在ex中,即命令模式中执行缓冲区,方法是相同的,例如在插入模式中输入:
/cmp并删除到a缓冲区后,在一般模式中输入:@a过后就可以达到/cmp一样的结果