regex之在 Vim 中突出显示 Javascript 内联 block 注释
背景
我使用 JScript(Microsoft 的 ECMAScript 实现)来满足许多 Windows 系统管理需求。这意味着我使用了很多 ActiveX(自动化 COM)对象。这些对象的方法通常需要数字或 bool 参数。例如:
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”的 bool 值并没有真正描述方法的行为将如何改变。这对我来说不是问题,但我那些不愿使用自动化的同事很容易被吓到。不知道争论会吓到他们。不幸的是,一长串常量(当然不是真正的常量,因为当前的 JScript 版本不支持它们)也会吓到它们。因此,我开始使用内联 block 注释来记录其中一些基本函数调用。上面例子中的第二行应该这样写:
var a = fso.CreateTextFile("c:\\testfile.txt", /*overwrite*/ true, /*unicode*/ false);
不过,这最终以一个小语法突出显示了我的困境。我喜欢我的评论充满活力地突出显示; block 注释和行注释。然而,这些微小的行内 block 注释对我个人而言意义不大。我想以更柔和的方式突出显示那些特定的评论(例如,白色上的浅灰色)。这让我进退两难。
困境
当开始和结束标记都在同一行时,我想覆盖 block 注释的默认语法突出显示。理想情况下,这仅在我的 vimrc 文件中完成,而不是在 javascript.vim 语法的替代个人副本中完成。我最初的尝试是可悲的:
hi inlineComment guifg=#bbbbbb
match inlineComment "\/\*.*\*\/"
您可以立即看到此正则表达式模式的第一个问题是它是一个贪心搜索。它将匹配行中第一个“/*”到最后一个“*/”,这意味着两个内联 block 注释之间的所有内容也将采用这种高亮样式。我可以解决这个问题,但我真的不确定如何处理我的第二个问题。
注释不能在 ECMAScript 中的字符串字面量中定义。所以这个语法高亮也会覆盖字符串高亮。我在系统管理脚本中从来没有遇到过这个问题,但是当我检查许多用于浏览器的 javascript 库的源代码时(例如 less.js),它确实经常困扰我。
神奇的 StackOverflow 社区会推荐什么正则表达式模式、语法定义或其他解决方案来恢复我的 vimrc zen?
请您参考如下方法:
我不确定,但根据您的描述,您似乎不需要新的语法定义。 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 来了解要做什么。如果这样做,您可以看到 block 注释定义如下:-
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 中定义这种新的注释区域,并按照你喜欢的方式设置突出显示:看起来你已经知道如何做到这一点,所以我不会详细介绍。我还没有尝试过这个特定的例子,所以你可能还需要一些小 Action 才能让它发挥作用。试一试,让我知道进展如何。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。