在Vim中突出显示Javascript内联块注释

时间:2012-06-28 00:32:32

标签: regex vim

背景

我使用JScript(Microsoft的ECMAScript实现)来满足许多Windows系统管理需求。这意味着我使用了很多ActiveX(自动COM)对象。这些对象的方法通常需要Number或Boolean参数。例如:

var fso = new ActiveXObject("Scripting.FileSystemObject");
var a = fso.CreateTextFile("c:\\testfile.txt", true);
a.WriteLine("This is a test.");
a.Close();

(CreateTextFile Method on MSDN)

在第二行,您会看到第二个参数是我正在谈论的。布尔值“true”并未真正描述方法的行为将如何变化。这对我来说不是问题,但我的自动化害羞的同事很容易受到惊吓。不知道什么是一个论点会吓到他们。不幸的是,一长串常量(当然,不是真正的常量,因为当前的JScript版本不支持它们)也会让他们感到害怕。所以我采用内联块注释记录了一些这些基本函数调用。上例中的第二行将如下编写:

var a = fso.CreateTextFile("c:\\testfile.txt", /*overwrite*/ true, /*unicode*/ false);

最终会出现一个小语法,突显出我的困境。我喜欢我的评论充满活力;块和行注释。然而,这些微小的内联块注释对我来说意义不大。我想以更加柔和的方式突出这些特别的评论(例如,浅灰色的白色)。这让我陷入困境。

困境

当开始和结束标记位于同一行时,我想覆盖块注释的默认语法高亮显示。理想情况下,这仅在我的vimrc文件中完成,而不是在javascript.vim语法的替代个人副本中完成。我最初的尝试是可悲的:

hi inlineComment    guifg=#bbbbbb
match inlineComment "\/\*.*\*\/"

直接你可以看到这个正则表达式模式的第一个问题是它是一个贪婪的搜索。它将从第一个“/ *”到最后一行“* /”匹配,这意味着两个内联块注释之间的所有内容也将获得此突出显示样式。我可以解决这个问题,但我真的不确定如何处理我的第二个问题。

无法在ECMAScript中的字符串文字内定义注释。因此,此语法突出显示也将覆盖字符串突出显示。我在系统管理脚本中从未遇到过这方面的问题,但是当我正在检查用于浏览器的许多javascript库的来源时(例如less.js),它经常会让我感到厌烦。

令人惊奇的StackOverflow社区建议使用什么正则表达式模式,语法定义或其他解决方案来恢复我的vimrc zen?

2 个答案:

答案 0 :(得分:3)

我不确定,但根据您的描述,您似乎不需要新的语法定义。 Vim语法文件通常允许您使用自己选择的突出显示覆盖特定语法项。在这种情况下,您想要的项目称为javaScriptComment,因此这样的命令将设置其突出显示: -

hi javaScriptComment guifg=#bbbbbb

但你必须在.vimrc文件中(或从那里获取的某个地方)执行此操作,因此在语法文件之前对其进行评估。语法文件使用highlight default命令,因此语法文件的突出显示选择仅影响没有突出显示集的语法项。有关详细信息,请参阅:help :hi-default。顺便说一句,它只适用于Vim 5.8及更高版本。

以上命令将更改所有内联/* */条评论,并将//行注释保留为默认设置,因为行注释是不同的语法项(javaScriptLineComment)。您可以通过查看javascript.vim文件找到所有这些组的名称。 (最简单的方法是:e $VIMRUNTIME/syntax/javascript.vim。)

如果您只想更改一些内联评论,那么它会更复杂一点,但通过查看javascript.vim仍然很容易看到该做什么。如果这样做,您可以看到块注释的定义如下: -

syn region javaScriptComment start="/\*" end="\*/" contains=@Spell,javaScriptCommentTodo

看到你可以为开始和结束标记使用单独的正则表达式:你不必担心将两者之间的东西与非贪婪量词或类似的东西进行匹配。要使语法项工作方式相似但仅在一行上,请尝试添加oneline选项(:h :syn-oneline以获取更多详细信息): -

syn region myOnelineComment start="/\*" end="\*/" oneline

我已删除了两个contains群组,因为(1)如果您仅将其用作参数名称,您可能不希望在这些评论中启用拼写检查,(2)包含的段落不会oneline覆盖容器区域中的oneline,因此您仍然会将所有TODO注释与此区域匹配。

您可以在.vimrc中定义这种新的评论区域,并设置突出显示方式:看起来您已经知道如何做到这一点,所以我不想详细介绍。我还没有尝试过这个特殊的例子,所以你可能还需要一些摆弄才能让它发挥作用。试一试,让我知道它是怎么回事。

答案 1 :(得分:2)

为什么不在呼叫上方添加注释行?

我认为

// fso.CreateTextFile(filename:String, overwrite:Boolean, unicode:Boolean)
var a = fso.CreateTextFile("c:\\testfile.txt", true, false);

更具可读性和信息量
var a = fso.CreateTextFile("c:\\testfile.txt", /*overwrite*/ true, /*unicode*/ false);