vim语法突出显示可以是一行或一个块的注释

vim语法突出显示可以是一行或一个块的注释,vim,syntax,highlight,Vim,Syntax,Highlight,这是我的第一篇帖子,所以请温柔一点 所以,我有一个内部程序的输入文件(.in)。语法如下(例如): 我的情况是,我希望所有的$set和$run都是红色的,相应的$end也都是红色的。介于两者之间的所有颜色都必须为标称颜色(灰色) 我只是简单地使用 syntax match inCMD "\$SET" 这样做很好 我遇到的问题是我希望“$CMT”为黄色,因此我使用 syntax match inCMT "/^\$CMT.*$" 特殊性在于$CMT不必有相应的$END。因此,如果没有$END(或

这是我的第一篇帖子,所以请温柔一点

所以,我有一个内部程序的输入文件(.in)。语法如下(例如):

我的情况是,我希望所有的
$set
$run
都是红色的,相应的
$end
也都是红色的。介于两者之间的所有颜色都必须为标称颜色(灰色)

我只是简单地使用

syntax match inCMD "\$SET"
这样做很好

我遇到的问题是我希望
“$CMT”
为黄色,因此我使用

syntax match inCMT "/^\$CMT.*$"
特殊性在于
$CMT
不必有相应的
$END
。因此,如果没有
$END
(或者它与
$CMT
位于同一行的末尾,我希望该行是黄色的,后面的行在语法区域之外。但是,如果我想做一个块注释,并且该
$CMT
有一个对应的
$END
,那么里面的所有内容都必须是黄色的

我想出了

但我在第二张照片的第14-17行遇到了一个问题:

如果
$set
位于
$cmt
的正下方,则$set内的文本将为黄色,而不仅仅是白色。 另一个问题是与
$set
对应的
$end
是白色而不是红色

我怎样才能解决这个问题

非常感谢

编辑:语法文件:

syntax case ignore 
syntax match inCMT /^\$CMT.*$/
syntax match inCMD "\$SET"
syntax match inCMD "\$RUN"

sy region inCMT matchgroup=inCMT start= /^\$CMT.*$/ end=/\(^\$end\)\|\(^\s*$\)/ contains=inCMD
:sy region inCMD matchgroup=inCMD start= /\v($(SET))/ end=/\(^\$end\)\|\(^\s*$\)/ contained

:hi inCMT ctermfg=yellow 
:hi inCMD ctermfg=red 

输入文件:

 $cmt eoipwejf
iowejwed
$end

$set
weoifjwef

$end
$set 
$end

$cmt
$set ewdiw
efef
$end
$set 
effef 
$end

$cmt 
efoiwef
$end

$cmt 
wd
$END

wd

$set
deiuwf = ewoiw
ewofoi we
$end

$cmt fefef
$cmt
efwef
$end

$set 
$set
$set

$cmt ewfoief
wdwwd
$end

$set efopwef


fwfewf
eiojf
$end 

$set 
ere

wd

$cmt
$end

effe

$cmt
wdeoiqwd
$end
edfeef

$run 
goto  
$cmt
wdqwd
$end

第二次编辑:我想要的最终结果(括号中的颜色) (y) 黄色的 (r) 红色的 (n) 名义上

我想所有的情况都是这样。

这对我来说很有效:

syntax clear
syntax case ignore
syntax match inCMD "\$set"
syntax match inCMD "\$cmd"
syntax match inCMD "\$end"
syntax region inCMT start=/^\$cmt/ end=/\$end\|\$\@=/

hi inCMT ctermfg=yellow
hi inCMD ctermfg=red
它似乎与您的更新相匹配,指示每行或每个单词应采用的颜色。通常只有关键字(
$cmd
$run
$end
)是红色的,但对于注释,整个块是黄色的,包括最后的
$end

匹配带有或不带有
$end
的注释的诀窍是在单个
$
上进行零宽度匹配(这是正则表达式的
\$\@=
部分)。由于正则表达式首先返回最长的匹配,因此只要找到
$end
,就会匹配(并以黄色突出显示),但如果一个
$
以其他方式匹配,它将结束该区域,但它不会成为该区域的一部分,因此它不会以黄色突出显示(如果它是其他匹配命令之一,它仍然可以以红色突出显示,这在本例中很重要)

我注意到你有一个
$end
,所以我没有将命令锚定在任何地方。我的第一反应是使用
^
将它们放在行的开头,并且使用
$
只允许
$end
单独在一行上。但是我删除了所有这些命令,结果它仍然像预期的那样工作。费用如果你认为有意义的话,我可以把它们加回去。

这对我很有用:

syntax clear
syntax case ignore
syntax match inCMD "\$set"
syntax match inCMD "\$cmd"
syntax match inCMD "\$end"
syntax region inCMT start=/^\$cmt/ end=/\$end\|\$\@=/

hi inCMT ctermfg=yellow
hi inCMD ctermfg=red
它似乎与您的更新相匹配,指示每行或每个单词应采用的颜色。通常只有关键字(
$cmd
$run
$end
)是红色的,但对于注释,整个块是黄色的,包括最后的
$end

匹配带有或不带有
$end
的注释的诀窍是在单个
$
上进行零宽度匹配(这是正则表达式的
\$\@=
部分)。由于正则表达式首先返回最长的匹配,因此只要找到
$end
,就会匹配(并以黄色突出显示),但如果一个
$
以其他方式匹配,它将结束该区域,但它不会成为该区域的一部分,因此它不会以黄色突出显示(如果它是其他匹配命令之一,它仍然可以以红色突出显示,这在本例中很重要)


我注意到你有一个
$end
,所以我没有将命令锚定在任何地方。我的第一反应是使用
^
将它们放在行的开头,并且使用
$
只允许
$end
单独在一行上。但是我删除了所有这些命令,结果它仍然像预期的那样工作。费用如果你认为有意义的话,我可以随意添加回去。

也许这个问题是针对你的截图,看起来所有的评论都需要有一个
$end
,是这样吗?否则,我看不出你如何真正区分单行评论和块评论。你能澄清一下吗?请以文本形式发布你的语法命令.将示例文本作为文本发布(即使没有颜色),更容易复制和粘贴以重现您的问题。@filbranden不是所有的注释都需要$end。这就是为什么很难得到我想要的。如果是一行注释,您不需要$end,但是如果是块注释,您需要它。两个问题都需要。对于第一个问题,
$
后面的单词需要正确的颜色(如果是
$end
则为黄色,如果是
$set
则为红色)。对于第二部分,一些文本将被视为注释(但我很少使用此语法)也许这个问题是针对你的截图,看起来所有的评论都需要有一个
$end
,是这样吗?否则,我看不出你怎么能真正区分单行评论和块评论。你能澄清一下吗?请以文本形式发布语法命令。同时以文本形式发布示例文本(即使没有颜色),更容易复制和粘贴以重现您的问题。@filbranden不是所有的注释都需要$end。这就是为什么很难得到我想要的。如果是一行注释,您不需要$end,但是如果是块注释,您需要它。两个问题都需要。对于第一个问题,
$
后面的单词需要正确的颜色(如果是
$end
则为黄色,如果是
$set
则为红色)。对于第二部分,某些文本将被视为注释(但我很少使用此语法),我将很快查看它!非常感谢!!我将在以后查看它
syntax clear
syntax case ignore
syntax match inCMD "\$set"
syntax match inCMD "\$cmd"
syntax match inCMD "\$end"
syntax region inCMT start=/^\$cmt/ end=/\$end\|\$\@=/

hi inCMT ctermfg=yellow
hi inCMD ctermfg=red