Hacking Vim 中文翻译 by Alec [email protected]
[Vim]6+ [GVim]6+ 个性化高亮显示
在Vim中, 高亮显示的高亮叫作匹配.
通过匹配, 你可以让Vim标识很多的字母组合, 单词, 数字, 句子和行. 你甚至可以Vim应该如地去标注(错误去红色, 重要的字用绿色等等).
用下面的命令可以做匹配操作:
:match Group /pattern/
这条命令有两个参数. 第一个是你要在高亮显示方案中的颜色组合.
和配色方案相比, 配色方案是全局的颜色设置, 而颜色组合只是前景色或背景色的小的组合用来为匹配操作使用的. 当Vim启动时, 它会根据你的本色方案, 将一大堆的颜色组合设置成默认的颜色.
想看完整的颜色组合, 使用这个命令:
:so $VIMRUNTIME/syntax/hitest.vim
第二个参数是你想要匹配的模式字符串(pattern). 这个模式是一个正则表达式, 并且根据你想要匹配的内容, 从非常简单要相当得复杂. 一个比较简单的匹配命令就像下面这样:
:match ErrorMsg /^Error/
这个命令就会去查找以Error开始的所有行(通过一个^来表示行开始). 如果找到了一个匹配, 就会被标识成ErrorMsg颜色组的颜色(红底白字).
如果你不喜欢任何一个已有的颜色组合, 你也可以定义你自己的. 使用这个命令:
:highlight MyGroup ctermbg=red guibg=red gctermfg=yellow guifg=yellow term=bold
这个命令创建了一个叫做MyGroup的颜色组合, 红色的背景, 黄色的文本, 终端模式和图形模式的都可以. 你可以根据你的喜好改变下面的选项:
• ctermbg : Background color in console
• guibg : Background color in Gvim
• ctermfg : Text color in console
• guifg : Text color in Gvim
• gui : Font formatting in Gvim
• term : Font formatting in console (for example, bold)
如果你使用已经存在的颜色组合的名字, 你就会在后来的使用中改变那个颜色组.
当你使用匹配功能时, 给定的模式字符串一直都会被标识, 直到有一个新的匹配操作或者执行下面这个命令:
:match NONE
这个匹配命令只能是一次匹配一个模式; 所以Vim已经为你提供了两个命令来同时匹配多达三个匹配. 这个命令非常简单地记住, 因为它们的名字和命令的内容很相似:
:2match
:3match
你可以考虑一下这个匹配命令是不是合适你, 因为它可能没什么用. 这里有几个例子, 来显示了匹配的功能.
例1:
在邮件中, 有一个通常的规则, 你不能一行中写超过74个字符(这是一个老的编程语言的规则, 如Fortran-77). 在这种情况下, 如果当你一行中写到最多个字符时, Vim能帮助提醒你, 是非常好的.
这个功能可以通过下面的命令来实现:
:match ErrorMsg /\%>73.\+/
这条命令中, 第73个字符后的字符都会被标识成一个错误的颜色. 这个匹配中的正则表达式, 我们把分解开:
\%> :在它后面有个数字, 匹配这个数字的所在列后面的字符
73 :列的序号
v :和刚刚的的命令组合, 这个意味着下部分非常神奇(magic). 参照 :help magic 可得到更多的信息
.\+ :匹配一个或多个字符
例2
当你在编码时, 有一个非常普通的规则, 就是制表符(tab)只被用作缩进代码, 不能用在别的地方. 然而, 因为某些原因, 可以很难去遵守这个规则. 现在, 通过一个非常简单的匹配命令, 就可以避免这个发生.
:match errorMsg /[^\t]\zs\t\+/
现在你就可以检查是否已经将这个规则给忘掉了, 在代码中使用了制表(符. 上面的模式字符串分解, 就是:
[^ :后面的字符将不被包含
\t :制表符(tab)
] :一组字符的结束
\zs :将要匹配的字符(即[^\t]不含制表符的字符串)放在一行中第一个非空格的位置, 即一 行中, 从第一个不是空白的字符开始就不能有制表符了
\t\+ :一行中一个或多个制表符
这个命令是说: 不要去匹配所有的制表符, 只是去匹配不在行首出现的制表符(行首为忽略行前空白第一个字符)
如果你只想用空格符来缩进代码, 而不是制表符, 那你可以把命令改成:
:match errorMsg /[\t]/
这个命令是说: 匹配所有的制表符
例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\}
\\|[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]\)/
尽管这好像是为了解决一个小的错误而大费周折, 你应该知道就算它就帮了你一次, 那它也已经完善了它的价值.
如果你想只想配置一个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]\?\)/