编辑文本
使用缩写
要为经常使用的单词或表达式创建缩写,可以使用ab(abbreviate,缩写)命令。该命令的语法是:
:ab [short long]
其中short是缩写,long是缩写的原文。
例如,配置服务器文件时,需要不停地键入“192.168.0.1”,这让人觉得很烦。因此,希望建立一个缩写,比如“ip”。键入:ab,后面跟着短格式的缩写,再后跟长格式的原文:
:ab ip 192.168.0.1
从现在开始,在位于输入模式时,每当以一个单独的单词键入eg,vi将自动地使用“192.168.0.1”替换它。注意只有“ip”是一个单独的单词时才会进行替换,vi非常聪明,不会替换其他单词中的“ip”,如“listen_client_ip”。
如果要删除一个缩写,可以使用:una(un-abbreviate,反缩写)命令。该命令的语法是:
:una short
其中,short是缩写。在使用这个命令时,只需要键入:una,后面跟着希望移除的短格式的缩写。如:
:una ip
在任何时候,通过输入:ab命令本身可以查看所有的缩写列表:
:ab
~
! wjb wenjiabao
! hjt hujintao
! ip 192.168.65.124
请按 ENTER 或其它命令继续
宏
类似缩写模式,可以用:map命令创建命令模式中使用的单字符的缩写。实际上,这将允许创建自己定制的单字符命令,这些命令称为宏(macro)。该命令的语法为:
:map [x commands]
其中x是一个字符,commands是vi或ex命令序列。
根据宏的定义,宏的名称必须是单个字符。如果使用一个早已拥有其他含义的字符,那么这个字符将会失去原本含义。例如,
:map G gg
在前面小节讨论过G和gg命令。G命令将光标移动到编辑缓冲区的最后一行行首,gg将光标移到到编辑缓冲区的首行行首。该命令创建一个名称为“G”的宏,该宏将光标移动到编辑缓冲区的首行行首。一旦定义了这个宏,常规的gg命令将不起作用。
对于这一点,需要根据自己的习惯和日常策略来调整。不过,替换常规命令的命令通常并不是一个好主意。这将产生一个问题:
vi或vim还没有用作命令名称的是哪些字符呢?实际上,没有使用的字符极少。
vi没有使用的过的字符只有14个。
vim没有使用过的字符只有^K和\(反斜线)。不过,情形没有想象的糟糕,因为有若干条vim命令或许根本不需要,可以安全地替换它们。
Vi:可以用作宏名称的字符 | |
字母 | g K q v V Z |
标点 | @ # * \ |
Ctrl字符 | ^A ^K ^O ^w ^X |
Vim:可以用作宏名称的字符 | |
字母 | K q v V |
标点 | @ \ |
Ctrl字符 | ^@ ^A ^K ^O ^T ^X |
从真实意义上讲,宏就是微型程序。对于所有的编程工具来说,有许多细节永远都不需要,因此不在这里讨论全部细节。作为替代,介绍几个给力的宏。
对于不支持gg的vi,可以使用:
:map g 1G
定义一个代替1G命令的宏g。
对于用/*和*/括起来表示注释的编程语言,下面的宏通过在行首插入/*和行尾插入*/来创建注释:
:map * I/* ^v<Esc>A */^V<Esc>
:map之后的*(星号)字符,是宏的名称。
命令部分:首先,I在行首进入输入模式。然后输入/*,后面跟一个空格。此时,需要按<Esc>键退出输入模式。为了在宏中插入一个<Esc>码,键入^V<Esc>(^V[Ctrl-v]告诉vi接下来的键要从字面上解释)。接下来使用A(append,追加)命令在行的末尾进入输入模式。然后键入一个空格,后面跟着*/。为了退出输入模式,再次使用了<Esc>键。
一些版本的vi允许将宏赋给<F1>到<F10>的功能键。这时,可以通过在一个#字符之后跟一个数字(1=F1、2=F2……0=F10)来指定自己喜欢的功能键。如:
:map #1 :set all
在任何时候,都可以通过:map命令本身显示所有宏的列表:
:map
移除宏时,使用:unmap命令。语法为:
:unmap x
x为宏的名称。