vim 中高亮显示:用注释分隔符后跟特殊字符串来区分行
在某些情况下,例如对于 HPC 集群的脚本,当使用 SGE、TORQUE 或 Slurm 时,我们可以使用 shell 脚本(如 bash),其注释行由 # 表示,但网格命令则用#$
、#PBS
或 表示#SBATCH
。
有什么简单的方法可以保持 bash 中使用的相同突出显示但不#SomeString
被视为评论?
答案1
首先检查 shell 语法脚本中注释的定义:
:syn list shComment
--- Syntax items ---
shComment xxx match /^\s*\zs#.*$/ contains=@shCommentGroup
match /\s\zs#.*$/ contains=@shCommentGroup
match /#.*$/ contained contains=@shCommentGroup
links to Comment
扩展语法簇
在那里,您可以看到需要覆盖哪些注释模式。可是等等!该语法脚本通过以下方式提供了扩展机制:help :syn-cluster
;这contains=@shCommentGroup
syn match shHPC "PBS" contained
这将突出显示PBS
任何地方在评论里面。如果可以遵循其他内容,请附加.*$
到模式中。如果PBS
关键字必须直接跟在 后面#
,则添加一个积极的后向断言:
syn match shHPC "#\@<=PBS" contained
:syn match
您可以通过附加命令或使用正则表达式分支来使用所有其他关键字: "#\@<=\(PBS\|SBATCH\|...\)"
。
最后,新的语法组必须包含在语法簇中以供注释,并突出显示以便您可以看到它:
syn cluster shCommentGroup add=shHPC
hi link shHPC PreProc
定义覆盖语法匹配
或者,您可能想跳过簇并覆盖注释语法。例如,以前特殊关键字只能出现在行首,但现在出现在 Bash 命令之后。或者,如果您无法忍受 cluster 方法将保留#
原始突出显示的事实。
syn match shHPC "^\s*\zs#PBS"
hi link shHPC PreProc
激活
由于这些命令扩展了内置语法,因此需要在它们之后执行。那个地方是~/.vim/after/syntax/sh.vim
.如果您只想为某些项目有条件地激活它们,您可以编写文件类型检测设置一个标记变量,例如b:is_HPC
,然后让上面的代码检查该标志。