3

背景

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

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

(MSDN 上的 CreateTextFile 方法)

在第二行,您会看到第二个论点是我正在谈论的论点。“真”的布尔值并不能真正描述方法的行为将如何变化。这对我来说不是问题,但我自动化害羞的同事很容易被吓到。不知道一个论点会吓到他们。不幸的是,一长串常量(当然不是真正的常量,因为当前的 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?

4

2 回答 2

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覆盖onelinein 的部分容器区域,因此您仍然可以将所有 TODO 注释与该区域匹配。

你可以在你的 .vimrc 中定义这种新的注释区域,并设置你喜欢的突出显示:看起来你已经知道如何做到这一点,所以我不会对此进行详细介绍。我还没有尝试过这个特定的例子,所以你可能仍然需要一些摆弄才能让它工作。试一试,让我知道它是怎么回事。

于 2012-06-28T00:59:26.157 回答
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);
于 2012-06-28T05:54:21.063 回答