在VIM中,高亮的特性被称为匹配(matching)。
使用匹配,VIM几乎可以标记任何字符,数字,句子和行及其组合,你甚至可以选择让VIM来如何标记,比如用红色标记错误,绿色标记重要的单词等等。
匹配可以使用下面的命令来实现:
此命令包含两个参数,第一个参数是在使用高亮的时候所要标记的颜色组(color group)的名字。第二个参数是你想要匹配的模式。整个模式是一个正则表达式,根据你想匹配的内容,可能会很简单,也可能会很复杂。一个简单的例子是:
此命令查找所有行的开头(^标志)是否包含有Error,如果找到了匹配,则标记成ErrorMsg颜色组的颜色(一般是红底白字)。
注: 和可以影响整个颜色设置的颜色配置文件不同,一个颜色组只是一个包含如前景色和背景色的小的组合,用于如匹配等地方。当VIM启动的时候,很多颜色组会根据选择的颜色配置文件设置成默认的颜色。
使用下面的命令来获得颜色组的完整列表:
如果你不喜欢已有的任何一个颜色组,则你可以使用下面的命令来定义自己的颜色组:
这个命令建立了一个叫MyGroup的颜色组,无论是在终端还是在GUI中都是红底黄字的。你可以根据自己的喜好来设置下面的选项:
guibg : GVim下的背景颜色
ctermfg : console下的文字颜色
guifg : Gvim下的文字颜色
gui : Gvim的字体描述
term : console 下的字体描述(如bold)
如果修改了已有的颜色组,则将会改变会话以后的颜色组显示。
但使用一个match命令后,将会一直匹配到执行一个新的匹配或者执行下面的命令:
match命令一次只能匹配一个模式,vim提供了可以匹配多大三个模式的命令
我们用一些例子来显示匹配的威力:
例子1:
在邮件中,一般来说最好一行不要超过74个字符(这种规则也可见于一些比较古老的编程语言如Fortran-77)。在Vim中,当一行超过给定的字符的时候希望能够警告,这可以通过下面的命令来实现:
这里,超过第73个字符的其他字符都会标记成错误。这个匹配的正则表达式可以分解成:
/%> : Match after column with the number right after this
73 : The column number
V : Combined with the previous command, this means that the next part is very magic. See :help magic for more info.
./+ : Match one or more of any character.
例子2:
在编程 的时候,tab仅仅用来缩进代码是一个好的习惯。尽管如此,有时候很难遵守,好了,现在我们可以使用一个简单的匹配来避免这种情况。下面的命令将标记任何不是在行开头的tab为错误:
:match errorMsg /[^/t]/zs/t/+/
现在你可以使用这个匹配来检查含在代码中的tab了,这个正则包含下面几部分:
[^ : Begin a group of characters that should not be matched
/t : The tab-character
] : End of character group.
/zs : A zero-width match that places the 'matching' at the beginning of the line
ignoring any whitespaces
/t/+ : One or more tabs in a row.
如果你仅仅想使用空格字符用来缩进,则可以用下面的命令:
这条命令是说匹配所有的tab字符。
例子3:
如果你输入大量的IP地址,有些时候你可能会输入一些错误的值,比如123.123.123.256,为了防止这种错误,你可以将下面的匹配加入到你的vimrc文件中:
match errorMsg //(2[5][6-9]/|2[6-9][0-9]/|[3-9][0-9][0-9]/)[.]
/[0-9]/{1,3/}[.][0-9]/{1,3/}[.][0-9]/{1,3/}/|
/[0-9]/{1,3/}[.]/(2[5][6-9]/|2[6-9][0-9]/|/
// /[3-9][0-9][0-9]/)[.][0-9]/{1,3/}[.][0-9]
//{1,3/}/|/[0-9]/{1,3/}[.][0-9]/{1,3/}[.]/(2[5]
// /[6-9]/|/2[6-9][0-9]|[3-9][0-9][0-9]/)[.]
[0-9]/{1,3/}
尽管它看起来为了解决这个小问题而显得有些复杂,但是应该记住的是即使可能只是会有用一次,但是也是值得添加到vimrc文件中去的。
如果你想匹配一个合法的IP地址,则匹配看起来要简单得多了:
match todo //(/(25[0-5]/|2[0-4][0-9]/|[01]/?[0-9]
[0-9]/?/)/./)
// /{3/}/(25[0-5]/|2[0-4][0-9]/|[01]/?
[0-9][0-9]/?/)/