在vim中突出显示子匹配结果

3
我正在尝试弄清楚如何在vim中突出显示匹配的特定部分。
给定以下示例规则(取自coffeescript语法文件source):
syn match coffeeExtendedOp /\%(\S\s*\)\@<=[+\-*/%&|\^=!<>?.]\+\|[-=]>\|--\|++\|:/ display

这个正则表达式匹配各种coffeescript操作符。这些操作符会被突出显示(在我的vimrc中)像这样:
hi Operator guifg=#ff0000

例如,由于coffeeExtendedOp与链接到Operator的coffeeOperator相关联,在上面的源文件中所有这些都有效,但我想知道如何在我的vimrc中特别突出显示上面syn match中匹配的++运算符,使用不同的颜色,比如蓝色(也就是说,不修改上面的原始源文件)。我只是想知道这是否可能。
编辑:我认为规则被放置在簇下面,所以可能这就是为什么它不影响任何东西的原因。有没有办法访问簇内的规则?
编辑:问题已澄清。
解决方案:
syn match plusplus /++/ contained containedin=coffeeExtendedOp display
hi plusplus guifg=#0000ff

现在的问题是,当我将它们放入我的vimrc文件中时,它只能在vim中作为命令运行,而不能正常工作。有什么想法吗?可能是这些东西被隐藏在集群后面了吗?但是为什么通过命令在vim中可见呢?我尝试过包括语法文件, 但似乎没有任何效果。
2个回答

2

从你提供的coffee.vim文件来看,似乎点号属于coffeeDotAccess语法项。因此,您可以通过执行以下操作来突出显示它:

:hi coffeeDotAccess ctermfg=blue

你是正确的!这是我犯的一个愚蠢错误 xD,非常感谢。事实上,点高亮只是我要实现的一个例子,显然是个坏例子。那么试试突出显示 ++ 操作符怎么样?因为一切都在一个集群下,所以不可能吗? - Jorge Israel Peña
其实这确实是我的问题的根源哈哈。因为我一直在使用点运算符进行测试,所以它没有起作用,但是建议我这样做的方式确实是正确的 :) 谢谢! - Jorge Israel Peña
实际上,由于某种原因,当我将其放入我的vimrc中时,它只在我将其作为命令在vim中执行时才起作用。你有任何想法吗? - Jorge Israel Peña
这是因为你的vimrc条目被coffee.vim覆盖了。:scriptnames应该向你展示脚本加载的顺序。你可能想把你的条目放到~/.vim/after/syntax/coffee.vim中。 - holygeek
有趣,谢谢!实际上,这是我犯的另一个愚蠢错误。我实际上把那些东西放在我的颜色文件~/.vim/colors/Blaenk.vim中。但你仍然是正确的 :) :scriptnames显示我的颜色文件在coffee之前被加载。将其放在after目录中非常好用 :) - Jorge Israel Peña

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

简而言之,

:match 错误 /foo\zsbar\zered/

将只会在“foobarred”中高亮显示“bar”


嗯,谢谢,但我不确定如何将其应用于我的情况。基本上,我展示的正则表达式是匹配coffeescript运算符的一个例子,例如包括++。假设我想要将++与其他部分区别开来,以不同的颜色突出显示,我想知道如何将现有的syn match的一部分突出显示为不同的颜色。 - Jorge Israel Peña
太棒了,这正是我在寻找的!\zs\ze。谢谢! - rendon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接