Подключите внешний языковой сервер к расширению VSCode

Я хочу реализовать расширение VSCode, которое использует протокол языкового сервера, но я хочу серверный компонент должен находиться на реальном сервере (в облаке), а не быть частью расширения VSCode.

Могу ли я настроить клиентское расширение для подключения к серверу через веб-сокеты или HTTP?


person Ido    schedule 27.10.2016    source источник


Ответы (2)


Я не уверен, что вы можете контролировать расположение языкового сервера, но есть еще один вариант. Вам не нужно реализовывать протокол языкового сервера, например, для помощи в синтаксическом анализе. В этом случае вы можете реализовать свой собственный удобный API службы синтаксического анализа (адаптированный к природе языка, который вы хотите поддерживать).

  1. В своем расширении вы подписываетесь на события редактирования рабочей области, используя workspace.onDidChangeTextDocument
  2. Повторно запускать таймаут в 1 секунду каждый раз, когда возникает событие изменения файла.
  3. Когда истечет время ожидания без дальнейшей модификации файла, соберите все соответствующие файлы и отправьте их на свой сервер синтаксического анализа.
  4. В своем расширении создайте DiagnosticCollection, используя https://code.visualstudio.com/api/references/vscode-api#languages.createDiagnosticCollection и заменить заполнить его предупреждениями / ошибками / подсказками, полученными в результате работы сервера синтаксического анализа в облаке.
  5. Подпишитесь на другие workspace события, например workspace.onDidOpenTextDocument или workspace.onDidCloseTextDocument, чтобы содержание DiagnosticCollection оставалось актуальным
person Jan Dolejsi    schedule 02.11.2019

Когда вы инициализируете LanguageClient в соответствии с подписью ServerOptions, поддерживаются несколько ServerOptions. введите описание изображения здесь

вы можете использовать StreamInfo, если хотите использовать настоящий сервер удаления в качестве языкового сервера. Вот пример кода для подключения к вашему серверу через WebSocket и инициализации LanguageClient.

const connection = connectToServer(hostname, path);
const client = new LanguageClient(
    "docfxLanguageServer",
    "Docfx Language Server",
    () => Promise.resolve<StreamInfo>({
        reader: connection,
        writer: connection,
    }),
    {});

private connectToServer(hostname: string, path: string): Duplex {
    const ws = new WebSocket(`ws://${hostname}/${path}`);
    return WebSocket.createWebSocketStream(ws);
}
person Jiayin Pei    schedule 09.02.2021