Как ссылаться на вставленную грамматику в пользовательском языке VSCode - PullRequest
2 голосов
/ 25 февраля 2020

Prefacing ниже. Демонстрационный проект, иллюстрирующий эту проблему, можно найти по адресу: https://github.com/kirksl/so60384141

Я могу ссылаться на внедренную грамматику на собственном языке VSCode

, указав это (package. json)

        "grammars": 
        [
            {
                "scopeName": "source.js.mylang",
                "path": "./syntaxes/mylang-js.tmLanguage.json",
                "injectTo": ["source.js"]
            }
        ]

и это (./syntaxes/mylang-js.tmLanguage.json)

{
  "scopeName": "source.js.mylang",
  "injectionSelector": "L:source",
  "patterns": [
    {
      "include": "#todo-keyword"
    }
  ],
  "repository": {
    "todo-keyword": {
      "match": "TODO",
      "name": "keyword.todo"
    }
  }
}

я вижу это (. js файл , родной JS)

enter image description here

Пока все хорошо.

Однако я не могу сослаться на ту же введенную грамматику в рамках моего пользовательского языка подробно описано ниже. Огороженные блоки кода с тройными кавычками должны использовать его.

Обновление, теперь, это (пакет. json)

        "languages": [
            {
                "id": "mylang",
                "aliases": ["Mylang", "mylang"],
                "extensions": [".mylang"],
                "configuration": "./language-configuration.json"
            }
        ],
        "grammars": 
        [
            {
                "language": "mylang",
                "scopeName": "source.mylang",
                "path": "./syntaxes/mylang.tmLanguage.json",
                "embeddedLanguages": {
                    "meta.embedded.block.javascript": "javascript"
                }
            },
            {
                "scopeName": "source.js.mylang",
                "path": "./syntaxes/mylang-js.tmLanguage.json",
                "injectTo": ["source.js"]
            }
        ]

и дополнительное указание этого (./syntaxes/mylang-js.tmLanguage.json)

    "fenced-expression": {
      "begin": "(^|\\G)\\s*[\"]{3}\\s*$",
      "end": "(^|\\G)\\s*[\"]{3}\\s*$",
      "contentName": "meta.embedded.block",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "endCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "patterns": [
        {
          "begin": "^(\\s*)(?=[\\S&&[^{<\\[]])",
          "while": "^(?!\\s*[\"]{3}\\s*)",
          "contentName": "meta.embedded.block.javascript",
          "patterns": [
            {
              "include": "source.js"
            }
          ]
        }
      ]
    }

Я вижу это (файл .mylang, JS выделен, TODO не выделен)

enter image description here

Наконец-то просто отображается что некоторые сантехники есть, чтобы включить подсветку, которую я ищу

, если я переключу "include": "source.js" на "include": "source.js.mylang"

    "fenced-expression": {
      "begin": "(^|\\G)\\s*[\"]{3}\\s*$",
      "end": "(^|\\G)\\s*[\"]{3}\\s*$",
      "contentName": "meta.embedded.block",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "endCaptures": {
        "0": {
          "name": "string.quoted.triple.mylang"
        }
      },
      "patterns": [
        {
          "begin": "^(\\s*)(?=[\\S&&[^{<\\[]])",
          "while": "^(?!\\s*[\"]{3}\\s*)",
          "contentName": "meta.embedded.block.javascript",
          "patterns": [
            {
              "include": "source.js.mylang"
            }
          ]
        }
      ]
    }

я вижу это (файл .mylang , JS не выделено, TODO выделено)

enter image description here

1 Ответ

1 голос
/ 25 февраля 2020

Вам также необходимо ввести mylang-js.tmLanguage.json в source.mylang (injectTo относится только к имени области верхнего уровня, см. Объяснение здесь ):

{
    "scopeName": "source.js.mylang",
    "path": "./syntaxes/mylang-js.tmLanguage.json",
    "injectTo": ["source.js", "source.mylang"]
}

Затем он работает так, как задумано:

Кроме того, вам придется настроить injectionSelector, чтобы убедиться, что подсветка TODO применяется только в комментариях во встроенном JS блоки:

"injectionSelector": "L:comment.line.double-slash.js"
...