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
单独出现在一行中。但我删除了所有这些,结果它仍然按预期工作。如果您认为它们有意义,请随意添加回来。
这是我的第一个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
单独出现在一行中。但我删除了所有这些,结果它仍然按预期工作。如果您认为它们有意义,请随意添加回来。