vscode-lsp插件開發

LSP 是什麼

LSP, 全稱 Language Server Protocol, 即語言服務器協議, 這是微軟創建的一個協議(目前已有 Codenvy, Red Hat 和 Sourcegraph 等公司一起支持它的發展)。定義了在編輯器或 IDE 中與語言服務器之間使用的協議, 該語言服務器提供諸如自動完成, 轉到定義, 查找所有引用等語言功能。語言服務器索引格式(LSIF, 其發音類似於" else if")的目標是支持開發工具或 Web UI 中的富代碼導航, 而不需要源代碼的本地副本。

目前該協議得到了編輯器和語言社區的廣泛支持。

LSP 的官方網站: https://microsoft.github.io/language-server-protocol/, GitHub 地址: https://github.com/Microsoft/language-server-protocol。目前最新版本(2020-09-06): 3.15。

LSP 解決了什麼問題

爲編程語言添加諸如自動完成、轉到定義或鼠標懸停出現文檔之類的功能需要付出大量的努力。傳統上, 這項工作必須爲每個開發工具重複進行, 因爲每個工具爲實現相同的特性提供不同的 api。

語言服務器(Language Server)旨在提供特定語言的智能功能, 並通過支持進程間通訊協議與開發工具進行通信。

語言服務器協議(LSP)背後的思想是爲這些服務器和開發工具的通信方式提供標準化協議支持。通過這種方式, 可以在多個開發工具中重用單個 Language Server, 而這些工具反過來可以用最少的工作支持多種語言。

例如, 之前需要爲 VSCode 構建 Go 插件、爲 Sublime Text 構建 Go 插件、爲 Vim 構建 Go 插件、爲 Sourcegraph 構建 Go 插件, 很多重複的工作。現在, 對於每種語言, LSP 允許語言社區將精力集中在一個高性能語言服務器上, 這個服務器可以提供代碼完成, 懸停文檔提示、跳轉到定義、查找引用等功能, 而編輯器和客戶端社區可以專注於構建一個單一的、高性能的、直觀的和慣用的擴展, 這個擴展可以與任何語言服務器通信, 即時提供深入的語言支持。

LSP 是語言提供商和工具供應商的雙贏!

LSP 的工作原理

語言服務器(Language Server)作爲單獨的進程運行, 開發工具在 LSP 基礎上通過 JSON-RPC 與服務器通信。下面是一個開發工具和語言服務器在進行編輯時如何通信的例子:

圖片來自 LSP 官網, 演示了協議如何在文檔引用(uri)和文檔位置級別與語言服務器通信。這些數據類型與編程語言無關, 適用於所有編程語言。

用戶在開發工具中打開一個文件(稱爲文檔) : 開發工具通知語言服務器文檔已打開(textDocument/didOpen)。從現在開始, 關於文檔內容的真實信息不再存儲在文件系統中, 而是由開發工具保存在內存中。現在必須在開發工具和語言服務器之間同步內容。
用戶進行編輯 : 該開發工具通知服務器文檔更改(textDocument/didChange), 並由語言服務器更新文檔的語言表示形式。在這種情況下, 語言服務器會分析這些信息, 並將檢測到的錯誤和警告通知開發工具(textDocument/publishDiagnostics)。
在打開的文檔中, 用戶就一個符號(symbol)執行 Go to Definition : 該開發工具發送一個帶有兩個參數的 “textdocument/Definition” 請求: (1) 文檔 URI 和 (2) 發出 “Go to Definition” 請求的文本位置, 發送到服務器。服務器的響應包含文檔 URI 和該符號在該文檔中的定義位置。
用戶關閉文檔(文件) : 開發工具發出 “textDocument/didClose” 的通知, 告知語言服務器文檔現在不在內存中了。文件系統上的當前內容現在是最新的。

vscode

VS Code Go 擴展 是go官方推斷維護的go語言擴展插件,使用gopls提供語言的如自動完成、轉到定義或鼠標懸停出現文檔功能。

LSP

What is the Language Server Protocol?

Adding features like auto complete, go to definition, or documentation on hover for a programming language takes significant effort. Traditionally this work had to be repeated for each development tool, as each tool provides different APIs for implementing the same feature.

A Language Server is meant to provide the language-specific smarts and communicate with development tools over a protocol that enables inter-process communication.

The idea behind the Language Server Protocol (LSP) is to standardize the protocol for how such servers and development tools communicate. This way, a single Language Server can be re-used in multiple development tools, which in turn can support multiple languages with minimal effort.

LSP is a win for both language providers and tooling vendors!

https://microsoft.github.io/language-server-protocol/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章