如何在一个语法文件中组合两个语法高亮显示以获得崇高的文本?

How to combine two syntax highlightings in one syntax file for sublime text?

提问人:Lex Podgorny 提问时间:10/26/2023 最后编辑:Lex Podgorny 更新时间:11/19/2023 访问量:21

问:

我希望能够对像 Vue.js 这样的文件进行语法突出显示,其中 javascript 和 css 出现在同一个文件中,如下所示:

// Some JavaScript code
function hello() {
    console.log("Hello");
}

====
.selector {
    color: red;
}
----

let foo = 'bar'

====
.foo {
    bar : 'baz';
}
----

我假设,有一种方法可以在 Sublime YAML 文件中的两个语法突出显示之间有条件地切换。我尝试了各种方法......

%YAML 1.2
---
name: Test
file_extensions: [test]
scope: source.test
extends: Packages/User/JavaScript.sublime-syntax
version: 2

contexts:
  main:
    - include: 'scope:source.js'
    - match: '===='
      push: 'css-block'

  css-block:
    - match: '----'
    - include: 'scope:source.css'
      pop: true
      # embed: scope:source.css
      # escape: '----'

经过数小时的阅读文档和与 gpt 聊天,我不是更聪明的:(有人知道秘方吗?

SublimeText3 语法高亮 SublimeText 文本编辑器

评论


答:

1赞 Keith Hall 10/28/2023 #1

您当前的方法存在一些问题。

  • 在上下文中,您将覆盖所有内容,这意味着不会评估文件上下文中的默认规则。这可以通过以下方法进行修复,以确保您的规则排在第一位。这将防止需要 .mainJavaScript.sublime-syntaxmainmeta_prepend: true- include: 'scope:source.js'
  • JavaScript 语法定义的上下文只是检查 shebang,然后切换到上下文。反过来,这基本上只包括上下文。这是您要放置匹配模式的位置。mainscriptstatements====
  • 与其推送包含 CSS 语法的上下文,不如使用 /,否则,如果 CSS 语法在内部推送到另一个上下文,它将不再从上下文中评估匹配模式。css-blockembedescapecss-block
  • 对意志没有影响。 仅适用于指令。pop: trueincludepopmatch
%YAML 1.2
---
name: Test JS
file_extensions: [test]
scope: source.test
extends: Packages/JavaScript/JavaScript.sublime-syntax
version: 2

contexts:
  statements:
    - meta_prepend: true
    - match: '===='
      embed: scope:source.css
      escape: '----'