vim 中高亮显示:用注释分隔符后跟特殊字符串来区分行

vim 中高亮显示:用注释分隔符后跟特殊字符串来区分行

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,然后让上面的代码检查该标志。

相关内容