vim 语法高亮注释,可以是一行或一行

vim syntax highlighting comments that can be one line or block

这是我的第一个post,所以请温柔点!

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

$set (code) $end

$run
(code)
$end

$cmt this is a comment

$cmt this is

a block comment

$end

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

我只是用

syntax match inCMD "$SET"

为此,它工作正常。

我有一个问题是我希望 "$CMT" 是黄色的,所以我使用

syntax match inCMT "/^$CMT.*$"

特殊性是$CMT不一定要有对应的$END。因此,如果没有 $END(或者它位于与 $CMT 同一行的末尾,我希望该行为黄色,并且之后的行位于语法区域之外。但是,如果我想做一个块注释并且有一个对应的 $END 到这个 $CMT,里面的所有东西都必须是黄色的。

我想出了

syntax commands

但是我在第二张图片的第 14-17 行有问题: syntax example.

如果 $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) 标称

Block comment:  
$cmt foo (y)
bar (y)
$end (y)

$cmt (y)
   foo (y)
   bar (y)
$end (y)

$cmt (y)
foo (y)

bar(y)
$end (y)

Line comment: 
$cmt (y)
$set (r) foo = bar (n) $end (r)

$cmt foo bar (y)
$set (r) 
foo = bar (n) 
$end (r)


我想就是这些吧。

这对我有用:

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 的评论的技巧是对单个 $(即正则表达式的 $\@= 部分)进行零宽度匹配。由于正则表达式 return 是最长的匹配项,只要找到 $end 就会匹配(并突出显示为黄色),但如果 $ 以其他方式匹配,它会结束该区域但不会不会成为它的一部分,因此它不会以黄色突出显示(事实证明,如果它是其他匹配命令之一,它仍然可以以红色突出显示,这在这种情况下很重要。)

我注意到你在下一行有一个 $end,所以我没有在任何地方锚定命令。我的第一直觉是使用 ^ 将它们放在行首,并使用 $ 只允许 $end 单独出现在一行中。但我删除了所有这些,结果它仍然按预期工作。如果您认为它们有意义,请随意添加回来。