Visual Studio语法突出显示如何工作?

时间:2018-07-06 14:51:02

标签: visual-studio visual-studio-2017 syntax-highlighting

当我在aspx页面中创建标记“样式”时,Visual Studio highligths代码使用CSS样式语法来突出显示和设置格式。当我创建标记“脚本”时,Visual Studio会执行相同的操作,但是使用的是JavaScript样式语法。

当我创建一个.scss文件时,Visual Studio具有scss语法。我创建了一个处理SCSS的新服务器控件,并且希望该服务器控件内编写的代码使用scss样式语法。如何将特定标签与特定语法处理器关联?

附注:我正在使用Visual Studio 2017

1 个答案:

答案 0 :(得分:0)

VS中的

编辑器(以及许多与编辑器相关的功能)依赖于内容类型,该内容类型指示了他们支持的语言。大多数编辑器(例如C#或VB)仅适用于单个“内容类型”。

Visual Studio中的HTML和ASPX编辑器(是单独的编辑器)可以标识某些模式,这些模式指示正在使用另一种语言。然后,它将在内存(TextBuffers)中创建多个内部文档,并为每种所识别的语言使用单独的“内容类型”。然后,针对每个语言的语言服务都可以用于本地处理语言,而无需HTML来“了解” CSS / JavaScript /其他所有内容。例如:

  • <script>块或事件处理程序为内容创建JavaScript缓冲区
  • <style>块或style=属性创建CSS缓冲区
  • 任何<%风格的ASP.NET块均会创建适当的语言缓冲区(C#/ VB)
  • Razor CSHTML文件中的@创建一个C#缓冲区

这些嵌套的TextBuffer实际上是使该语言看起来正确的整个文档。例如,如果我有:

<span style="color: blue;" />

CSS缓冲区是一个内部文档,看起来像这样:

/* BEGIN EXTERNAL SOURCE */
span {
color: blue;
}
/* END EXTERNAL SOURCE */

需要注意的是,这是一个完整且可解析的CSS文档,因此语言服务可以正常工作以查找错误,提供IntelliSense等。

(如果您认为CSS缓冲区看起来很乱,那么应该看看Razor或ASPX块会发生什么...)

然后,ASPX编辑器使用VS编辑器平台将这些缓冲区之间的投影协调成您所看到的单个视图-TextView。因此,它看起来像是一个文档,但是在内部却作为多个不同的文档(TextBuffer)来处理,每种语言一个。

现在,您要提出一个问题:如何使ASPX编辑器支持SCSS?好吧,这包括两个部分:

首先,ASPX编辑器将需要知道如何识别文档的SCSS区域。这可能是<style type="text/scss">或其他指示符。如果扩展是可扩展的,甚至可以通过向ASPX编辑器编写扩展来实现(HTML编辑器对编写扩展更友好)。

接下来,ASPX编辑器将创建投影范围。它将交给SCSS语言服务。 SCSS语言服务需要知道它在投影中,并生成所有额外的内容以使语法树起作用。 (注意:VS中的SCSS语言服务今天不支持此功能。)

从那时起,需要将SCSS区域中发生的所有事情映射到TextView(光标位于您看到的文档中)和特定于SCSS的TextBuffer(光标位于所使用的内存中文档中)之间通过语言服务)。同样,今天SCSS LS并未考虑这种情况。

获得支持的最好方法是通过Visual Studio开发人员社区提供反馈。此功能已经在积压中,但是为其添加更多选票将有助于团队确定工作的优先级。