学习vi和vim编辑器(11):高级编辑方法(2)

本章学习在vi编辑器中如何保存命令。

保存命令:

vi和ex中提供了许多方法来保存一长串命令序列,这样当调用已保存的序列时,只需要输入几个字符即可。

单词缩写:

可以定义缩写,让vi在处于插入模式时替你自动将输入展开成原文。定义缩写的命令为:"  ab abbr phrase ",其中abbr就是给phrase指定的缩写。注意,在插入模式中,只有将缩写当成单个单词输入时,缩写才会被展开,单词内的abbr不会被展开。如下图所示,将"vi"定义为"visual editor"的缩写。

技术分享

通过" :unab abbr" 来取消一个缩写的定义,这样之后再输入该缩写时,缩写将不会被展开。通过" :ab "命令列出当前所有定义的缩写。

还有一点值得说明,在实际测试时发现,如果缩写出现在所代表的词组中,该缩写只会展开一次,并不会无限递归展开(但有的版本的vi编辑器可能会无限展开或者缩写定义失败)。

使用map命令:
map命令将命令序列“对应”到一个没有用到的键。所以map命令的作用类似于ab命令,但是map命令是对vi的命令模式定义宏,而ab命令是对插入模式定义宏。

:map x sequence:定义字符x映射到sequence命令序列;

:unmap x sequence: 取消字符x所映射的命令;

:map:列出所有被映射的字符;

需要注意的是,最好只对命令模式中没有用到的键做映射。如果对vi中已经使用的按键做映射,则该键原有的功能就会消失。而在命令模式中没有用到的按键有(不同版本的vi会有所不同):字母键:g,K,q;控制键:CTRL+A,CTRL + K,CTRL + O,CTRL + W,CTRL + X;符号:_,*,\与=。

如下图所示,把交换两个单词顺序的命令序列映射为" q "(" dw "用于删除一个单词," e "移到下一个单词的结尾," l "往右移动一格," p "放置刚刚删除的单词),这样便可以在编辑会话的任何时候,用q键来交换两个单词的顺序:

技术分享

保护按键免被ex解释:

在定义映射命令时,某些按键并不能直接输入并把它们作为命令序列的一部分,例如ENTER,ESC,BACKSPACE,DELETE键等。如果需要把这些键作为命令序列的一部分,需要在前面加上CTRL+V,从而转换按键的正常意义。而且输入Ctrl+V后,屏幕上显示的是" ^ "字符,接着输入enter键后,屏幕上显示的是" ^M "。类似地,退格键转义后显示为" ^H ",ESC键转义后显示为" ^[ "。

这种用法可以用在任何ex命令中,而不仅仅是map命令。这就意味着我们可以在缩写命令或替换命令中输入换行符,退格符等。例如,对num定义如下所示的缩写:

技术分享

在插入模式中输入num后,num便会自动展开为:

技术分享

还有几个需要注意的事项:

(1)竖线(|)在ex中具有特殊含义(作为多个ex命令的分隔符号),所以不能在插入模式的映射键中使用竖线。

(2)如果需要将控制字符作为映射字符,例如将" CTRL+A "映射为sequence命令序列,可以使用如下命令 " :map CTRL+A sequence ",但是有三个控制字符必须用" CTRL+V "进行转义,分别为" CTRL+T ", " CTRL+W ", " CTRL+X "。 因此如果要对" CTRL+T "进行映射,则需要按以下方式输入":map CTRL+V CTRL+T sequence "。但是实际测试时,并不是这样,例如可以直接对" CTRL+X "进行映射,前面并不需要进行转义。反倒是" CTRL+A "要进行转义,难道书上又讲错了,这里先记下来吧。

(3)映射序列中可以包含其他映射命令,也就是说允许嵌套映射序列。该功能是由vi编辑器的remap选项控制的,而且该选项默认是开启的。

映射键的范例:

(1)大多数时候我们按" e "键将光标移动到单词结尾是为了在单词后面添加内容,因此可以做如下映射:

技术分享

这样在命令模式中输入" e "键就可以直接移动到单词结尾并进入插入模式。

(2)保存一个文件并编辑下一个文件:

技术分享

再次提醒,屏幕上显示的" ^M "对应的按键为:先输入" CTRL+V ",再输入" ENTER "。

(3)将C/C++里的某行代码进行注释:

技术分享

这样在命令模式中直接输入g,就能对该行代码进行注释。其实方法还有很多,再给出一种用搜索命令实现的方法:

技术分享

插入模式中的映射键:

一般来说,映射应该只在命令模式中有用,因为在插入模式中输入某个按键就应该代表输入相应的文本,而不是代表执行相应的命令序列。但是,通过在map命令后面加上感叹号(!),即可强制覆盖按键的原有含义,以产生插入模式中的映射行为。
例如前面对" e "键进行如下的映射:"map e ea",这样在命令模式中输入" e ",就能够直接将光标移动到单词尾部并进入插入模式。但是如果在插入模式中使用" e "键,就代表输入字母" e "。如果想在插入模式中达到同样的效果,需要按以下方式定义:

技术分享

这样在插入模式中输入" e "键也能够将光标移动到当前单词尾部并仍然保持为插入模式。但这样就存在一个问题:再也无法输入文本" e "了。如果想让字符" e "恢复正常的文本输入方式,可以使用如下命令:" :unmap! e "(但是实际测试时该命令无法使" e "键恢复为输入文本,难道书上又出错了?)。

《VI和VIM编辑器》中还介绍了映射功能键的相关知识,可以参考《VI和VIM编辑器》p125。

本章vi命令总结:

" :ab "," :unab "," :map "," :unmap ",转义按键" CTRL+V "," :map! "," :unmap! "。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。