Ответ 1
Это невозможно прямо сейчас, но скоро.
Есть ли способ расширить поддерживаемые языки/грамматики в коде Visual Studio? Я хотел бы добавить настраиваемый синтаксис языка, но я не смог найти никакой информации о том, как предоставляются языковые службы.
Может ли кто-нибудь указать на какие-либо ссылки или даже примеры существующих языковых реализаций?
Это невозможно прямо сейчас, но скоро.
Это возможно с новой версией 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: использование йоменского генератора
npm install -g 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 может выбрать неправильное расширение.
Используя обратную инженерию, вы можете добавить новый язык в 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.
Попробуйте сами: -)
Чтобы расширить ответ Wosi .tmLanguage
, использовать файл .tmLanguage
необязательно. Использование обычного .json
является вполне допустимой и, на мой взгляд, лучшей читаемой альтернативой.
Для примера, смотрите VSCode_SQF: sqf.json
Внутри package.json
вам нужно всего лишь изменить путь с ./syntaxes/mylang.tmLanguage
на ./syntaxes/mylang.json
.