Создать собственный язык в коде Visual Studio

Есть ли способ расширить поддерживаемые языки / грамматики в Visual Studio Code? Я хотел бы добавить собственный синтаксис языка, но мне не удалось найти никакой информации о том, как предоставляются языковые услуги.

Может ли кто-нибудь указать на какие-либо ссылки или даже примеры существующих языковых реализаций?


person Rick Strahl    schedule 06.06.2015    source источник


Ответы (5)


Это возможно с новой версией 0.9.0. Есть официальная документация о том, как добавить собственный язык: https://github.com/Microsoft/vscode-docs/blob/0.9.0/release-notes/latest.md

Вам понадобится .tmLanguage файл для языка, который вы хотите добавить. Вы можете найти существующие файлы, например на GitHub или вы можете определить свой собственный языковой файл. Посмотрите здесь, чтобы получить представление о том, как его создать: http://manual.macromates.com/en/language_grammars

Найдя .tmLanguage файл, у вас есть два способа создать на его основе расширение.

Вариант 1. Использование генератора Yeoman

  • Установите node.js (если вы еще этого не сделали)
  • Установите yo (если вы еще этого не сделали), выполнив npm install -g yo
  • Установите генератор Yo для кода: npm install -g generator-code
  • Запустите yo code и выберите New language support
  • Следуйте инструкциям (определите файл .tmLangauge, укажите имя плагина, расширения файлов и т. Д.)
  • Генератор создает каталог для вашего расширения с именем плагина в вашем текущем рабочем каталоге.

Вариант 2. Создайте каталог самостоятельно

  • Создайте каталог с названием вашего плагина (только строчными буквами). Допустим, мы называем это mylang.
  • Добавьте подпапку syntaxes и поместите в нее файл .tmlanguage
  • Создайте файл package.json в корне папки расширения с таким содержимым

    {
        "name": "mylang",
        "version": "0.0.1",
        "engines": {
            "vscode": ">=0.9.0-pre.1"
        },
        "publisher": "me",
        "contributes": {
            "languages": [{
                "id": "mylang",
                "aliases": ["MyLang", "mylang"],
                "extensions": [".mylang",".myl"]
            }],
            "grammars": [{
                "language": "mylang",
                "scopeName": "source.mylang",
                "path": "./syntaxes/mylang.tmLanguage"
            }]
        }
    }
    

Наконец, добавьте расширение в Visual Studio Code

Скопируйте папку расширения в каталог расширений. Это:

  • в Windows %USERPROFILE%\.vscode\extensions

  • в Mac / Linux $HOME/.vscode/extensions

Код перезагрузки. Теперь ваше расширение будет запускаться автоматически каждый раз, когда вы открываете файл с указанным расширением. Вы можете увидеть название используемого плагина в правом нижнем углу. Вы можете изменить его, нажав на название расширения. Если ваше расширение не единственное, зарегистрированное для определенного расширения файла, Code может выбрать неправильное расширение.

person Wosi    schedule 07.10.2015
comment
Я получаю сообщение об ошибке languageFileName is not defined. Вы когда-нибудь видели это? - person SC_Chupacabra; 05.02.2016
comment
Можно отметить, что scopeName должен быть таким же, как в .tmLanguage-файле - person gr4nt3d; 01.05.2017
comment
Если я пишу языковую поддержку для уже поддерживаемого языка, что мне делать, чтобы убедиться, что Code использует мое расширение и отключает только эту функцию другого? - person joulev; 15.09.2019
comment
Страница GitHub - 404 - person Juan; 06.12.2019
comment
@Wosi, похоже, первая ссылка в вашем ответе не работает. - person Henrik; 21.02.2020
comment
Кажется, первый URL-адрес больше не действителен - person runsun; 23.05.2020
comment
Как мы можем определить новое расширение (например, .mylang), основанное на уже существующем синтаксисе (скажем, файлы HTML), но имеющее некоторые отличия? Например. Я хотел бы определить собственный синтаксис для файлов шаблонов HTML, для этого я хочу создать новое .mylang расширение для своих файлов. Эти файлы будут содержать HTML + некоторые конструкции, добавленные этим языком шаблонов (.mylang, например, ключевые слова для циклов, интерполяции и т. Д.). Как мы можем этого добиться? Спасибо! - person tonix; 04.10.2020
comment
Этот ответ был бы замечательным, если бы первая ссылка не была разорвана. - person Isaac; 05.02.2021


Используя обратный инжиниринг, вы можете добавить новый язык в VSCode. Вы можете посмотреть, как typescript реализован как плагин JavaScript и как он взаимодействует с node.exe через канал. Но это сложно, так как все идет без документации, я предоставлю здесь очень короткую документацию:

Вы можете определить новый плагин в папке плагинов C:\Users\USER\AppData\Local\Code\app-0.3.0\resources\app\plugins.

Скопируйте папку плагина typescript и переименуйте упомянутые расширения файлов и имена языков во всех файлах на свой новый язык, чтобы ваш новый плагин использовался при открытии файла .mylang.

В typescriptServiceClient.js вы видите, что дочерний процесс разветвляется и что его stdout связан с new WireProtocol.Reader. Свяжите свой собственный mylanguage.exe (вам, вероятно, придется написать этот exe самостоятельно). VSCode запрашивает у этого двоичного файла дополнительную информацию о языке.

В typescriptMain.js вы найдете регистрацию функции для языка. Удалите все вызовы monaco.Modes.XXXXXXSupport.register, кроме monaco.Modes.DeclarationSupport.register.

Теперь откройте в VSCode каталог, содержащий файлы .mylang, и откройте один из них через CTRL+P + FileName. Щелкните идентификатор правой кнопкой мыши и выберите Go to Definition. VSCode теперь отправляет такой запрос через StdIn на ваш exe

{"seq":1,"type":"request","command":"definition","arguments":{"file":"d:/Projects/MyProj/Source/MyFile.mylang","line":45,"offset":9}}

VSCode ожидает такого ответа:

Content-Length: 251
[LINE BREAK]
{ "seq" : 1, "type" : "response", "command" : "definition", "request_seq" : 1, "success" : true, "body" : [{ "file" : "d:/Projects/MyProj/Source/MyOtherFile.mylang", "start" : { "line" : 125, "offset" : 3 }, "end" : { "line" : 145, "offset" : 11} }] }

Если все работает, VSCode откроет MyOtherFile.mylang и установит курсор на строку 124 в столбце 3.

Попробуйте самостоятельно ;-)

person Wosi    schedule 24.06.2015

Самый простой рецепт ИМХО по состоянию на 2 квартал 2021 года:

  1. Follow Option 2 in Wosi's answer. You only need two files to get started. Just create the folder structure directly in your extensions directory.
    • Set "path": "./syntaxes/your_language.plist" in package.json
  2. Use IRO to build your regexes.
    • Make sure that in the "Scope Information" screen, anything to do with Textmate is green. Don't worry about the other editors.
    • Сохраните содержимое вкладки Textmate по указанному выше пути, т.е. .syntaxes/your_language.plist
  3. Перезагрузить VSCode

Вот и все. Я также сохраняю текст IRO (левая панель) в свой собственный проект.

person Leo    schedule 17.03.2021

Вы можете прочитать исходный код встроенных языковых расширений в Интернете:

https://github.com/microsoft/vscode/tree/main/extensions

Вы можете выбрать расширение, близкое к синтаксису вашего языка, и изменить его по своему усмотрению. (например, вы можете внести некоторые изменения в расширение JavaScript и переименовать его для использования с jQuery!)

Важно отметить, что это будет слишком много работы, если вы выберете язык, который так сильно отличается от желаемого! Если вам не удалось найти язык, похожий на ваш желаемый, возможно, вы захотите создать совершенно новое расширение с нуля - https://stackoverflow.com/a/32996211/14467698 -.

person EnderAdel    schedule 23.04.2021
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из отзыва - person EricSchaefer; 23.04.2021