在vim中突出显示子匹配

时间:2011-12-20 01:42:40

标签: vim macvim

我正在试图弄清楚如何在vim中突出显示匹配的特定部分。

给出以下示例规则(取自coffeescript语法文件source):

syn match coffeeExtendedOp /\%(\S\s*\)\@<=[+\-*/%&|\^=!<>?.]\+\|[-=]>\|--\|++\|:/ display

此正则表达式匹配各种coffeescript运算符。运算符突出显示(在我的vimrc中),如下所示:

hi Operator guifg=#ff0000

例如,由于coffeeExtendedOp链接到与上述源文件中的Operator链接的coffeeOperator。这一切都有效,但我想知道如何在我的++中专门突出显示上面syn match中匹配的vimrc运算符,使用不同的颜色(比如蓝色)(即不改变)上面的原始源文件)。我只是想知道这是否可能。

编辑:我认为规则是under a cluster,所以也许这就是为什么它不会影响任何事情。有没有办法在群集中访问规则?

编辑:问题得到澄清。

解决方案:

syn match plusplus /++/ contained containedin=coffeeExtendedOp display
hi plusplus guifg=#0000ff

现在的问题是,只有当我在vim中将它们作为命令运行时才会起作用,但是当我将它放在我的vimrc文件中时却不行。有任何想法吗?可能是这些东西藏在集群后面吗?但是为什么通过命令在vim中可见?我试过including the syntax file,但似乎没有任何效果。

2 个答案:

答案 0 :(得分:2)

查看与之链接的coffee.vim似乎该点属于coffeeDotAccess语法项。所以你可以通过这样做突出显示它:

:hi coffeeDotAccess ctermfg=blue

答案 1 :(得分:2)

我会猜测你需要什么。 (我不会说Coffeescript,你的样本正则表达式对我来说太复杂了,不能让我现在开始阅读。)

透明语法项

您可以查看透明语法规则:(http://vimdoc.sourceforge.net/htmldoc/usr_44.html)

In a C language file you would like to highlight the () text after a "while"
differently from the () text after a "for".  In both of these there can be
nested () items, which should be highlighted in the same way.  You must make
sure the () highlighting stops at the matching ).  This is one way to do this:

    :syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/
        \ contains=cCondNest
    :syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/
        \ contains=cCondNest
    :syntax region cCondNest start=/(/ end=/)/ contained transparent

正则表达式中的部分匹配

如果您真的只是意味着突出显示子匹配,请查看

\zs      start match
\ze      end match

简而言之,

:匹配错误/ foo \ zsbar \ zered /

只会突出'foobarred'中的'bar'