#language-server-protocol
#язык-сервер-протокол
Вопрос:
У меня есть персональный редактор, который реализует свой собственный «протокол» для завершения кода, и я хотел бы переключиться на протокол Language server, чтобы облегчить себе некоторое бремя разработки. Однако я не смог полностью понять документацию LSP, касающуюся реализации клиента. Это перепутано с серверной реализацией и не может найти четкой разницы между ними.
Большая часть онлайн-документации (включая вопросы по SO) вращалась вокруг расширений VSCode, о которых я ничего не знаю и которые бесполезны.
Я был бы признателен за любую помощь, чтобы начать писать простой клиент, который просто запрашивает автозаполнение. Я пишу свой редактор на C и был бы признателен за любое руководство, объясняющее, как создать client. Я понимаю Python, C, C #, чистый JavaScript, C , PHP и подобные языки, поэтому я могу легко следовать любому руководству на этих языках.
Если что-то непонятно, дайте мне знать, чтобы я мог объяснить (это мой первый пост в LSP :))
Ответ №1:
Мэтти, конечно, ведет меня в правильном направлении. Самым сложным для меня было понять запрос / ответ. В LSP есть очень полезная страница с неудачным названием (ИМХО), которое ввело меня в заблуждение, «инспекция». Оказывается, это хороший пример для запроса / ответа.
Ответ №2:
Я успешно написал клиент, который получает результаты завершения с сервера. Вот (приблизительно) что он делает:
- отправьте
initialize
- отправить
initialized
уведомление - отправьте
textDocument/didOpen
На этом этапе ваш сервер должен быть готов ответить на textDocument/completion
запрос. В зависимости от ответа вам также может потребоваться использовать completionItem/resolve
. Однако на сегодняшний день мне это никогда не требовалось для серверов, которые я использовал.
Удачи!
Комментарии:
1. Спасибо за ответ. Какие интерфейсы вы использовали в клиенте?
2. Я не уверен на 100%, что понимаю вопрос. Какие интерфейсы вы имеете в виду? Вы имеете в виду возможность регистрации / отмены регистрации? Они необязательны и используются для динамической настройки вашей поддержки функций. Я ими вообще не пользовался.
3. Я понял. Спасибо
4. можете ли вы обновить содержимое вашего jsonrpc, поскольку мой здесь не работает. Вот что я отправляю в initialize:
{"jsonrpc": "2.0", "method": "initialize", "params":{ "rootPath": "/Users/userpc/Desktop/folder", "rootUri": "file:////Users/userpc/Desktop/folder", "initializationOptions": {}, "trace": "verbose", } }
5. Спасибо. LSP — это хорошая вещь. Однако одна ошибка заключается в том, что они думают, что все разбираются в VSCode / Typescript. и документации очень не хватает для кого-то за пределами этого сообщества (где существует множество инструментов для LSP)