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