Создание пользовательского языка в коде Visual Studio

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

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

Ответы

Ответ 2

Это возможно с новой версией 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: использование йоменского генератора

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

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

  • Создайте каталог с названием вашего плагина (только строчными буквами). Допустим, мы называем это mylang.
  • Добавьте syntaxes подпапок и поместите в .tmlanguage файл .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 может выбрать неправильное расширение.

Ответ 3

Используя обратную инженерию, вы можете добавить новый язык в 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.

Попробуйте сами: -)

Ответ 4

Чтобы расширить ответ Wosi .tmLanguage, использовать файл .tmLanguage необязательно. Использование обычного .json является вполне допустимой и, на мой взгляд, лучшей читаемой альтернативой.

Для примера, смотрите VSCode_SQF: sqf.json

Внутри package.json вам нужно всего лишь изменить путь с ./syntaxes/mylang.tmLanguage на ./syntaxes/mylang.json.