Visual Studio 语法高亮是如何工作的?
How Visual Studio syntax highlight works?
当我在 aspx 页面中创建标签 'style' 时,Visual Studio highlights 代码使用 css 样式语法来突出显示和格式化。当我创建标签 'script' 时,Visual Studio 做同样的事情,但使用 javascript 样式语法。
当我创建一个 .scss 文件时,Visual Studio 有 scss 语法。我创建了一个处理 SCSS 的新服务器控件,我希望在该服务器控件内编写的代码使用 scss 样式语法。我如何将某个标签传递给某个语法处理器?
Ps.: 我正在使用 Visual Studio 2017
VS 中的编辑器(以及许多与编辑器相关的功能)依赖于指示它们支持的语言的内容类型。大多数编辑器,如 C# 或 VB,只能处理一种内容类型。
HTML 和 Visual Studio 中的 ASPX 编辑器(它们是独立的编辑器)识别某些模式,表明正在使用不同的语言。然后,它会在内存 (TextBuffers) 中创建多个内部文档,并为每种已识别的语言创建单独的内容类型。然后可以使用每个语言的语言服务来本地处理语言,而不是 HTML 必须 "know" 其他所有 CSS/JavaScript/anything。例如:
<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。所以它看起来像一个文档,但它在内部作为几个不同的文档 (TextBuffers) 处理,每种语言一个。
现在开始回答您的问题:如何使 ASPX 编辑器支持 SCSS?好吧,这有两个部分:
首先,ASPX 编辑器需要知道如何识别文档的 SCSS 区域。这可能是 <style type="text/scss">
或其他指标。如果 ASPX 编辑器是可扩展的(HTML 编辑器对编写扩展更友好),甚至可以通过为 ASPX 编辑器编写扩展来完成此操作。
接下来,ASPX 编辑器将创建投影范围。它将把它交给 SCSS 语言服务。 SCSS 语言服务需要知道它在投影中,并生成所有额外的东西以使语法树工作。 (注意:VS 中的 SCSS 语言服务目前不支持此功能。)
从那时起,SCSS区域发生的一切都需要在TextView(光标在你看到的文档中的位置)之间映射到SCSS特定的TextBuffer (光标位于语言服务使用的内存文档中)。同样,今天 SCSS LS 没有考虑到这种情况。
获得此支持的最佳方式是通过 Visual Studio 开发者社区提供反馈。此功能已在积压工作中,但为其添加额外的投票将有助于团队确定工作的优先级。
当我在 aspx 页面中创建标签 'style' 时,Visual Studio highlights 代码使用 css 样式语法来突出显示和格式化。当我创建标签 'script' 时,Visual Studio 做同样的事情,但使用 javascript 样式语法。
当我创建一个 .scss 文件时,Visual Studio 有 scss 语法。我创建了一个处理 SCSS 的新服务器控件,我希望在该服务器控件内编写的代码使用 scss 样式语法。我如何将某个标签传递给某个语法处理器?
Ps.: 我正在使用 Visual Studio 2017
VS 中的编辑器(以及许多与编辑器相关的功能)依赖于指示它们支持的语言的内容类型。大多数编辑器,如 C# 或 VB,只能处理一种内容类型。
HTML 和 Visual Studio 中的 ASPX 编辑器(它们是独立的编辑器)识别某些模式,表明正在使用不同的语言。然后,它会在内存 (TextBuffers) 中创建多个内部文档,并为每种已识别的语言创建单独的内容类型。然后可以使用每个语言的语言服务来本地处理语言,而不是 HTML 必须 "know" 其他所有 CSS/JavaScript/anything。例如:
<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。所以它看起来像一个文档,但它在内部作为几个不同的文档 (TextBuffers) 处理,每种语言一个。
现在开始回答您的问题:如何使 ASPX 编辑器支持 SCSS?好吧,这有两个部分:
首先,ASPX 编辑器需要知道如何识别文档的 SCSS 区域。这可能是 <style type="text/scss">
或其他指标。如果 ASPX 编辑器是可扩展的(HTML 编辑器对编写扩展更友好),甚至可以通过为 ASPX 编辑器编写扩展来完成此操作。
接下来,ASPX 编辑器将创建投影范围。它将把它交给 SCSS 语言服务。 SCSS 语言服务需要知道它在投影中,并生成所有额外的东西以使语法树工作。 (注意:VS 中的 SCSS 语言服务目前不支持此功能。)
从那时起,SCSS区域发生的一切都需要在TextView(光标在你看到的文档中的位置)之间映射到SCSS特定的TextBuffer (光标位于语言服务使用的内存文档中)。同样,今天 SCSS LS 没有考虑到这种情况。
获得此支持的最佳方式是通过 Visual Studio 开发者社区提供反馈。此功能已在积压工作中,但为其添加额外的投票将有助于团队确定工作的优先级。