1. 程式人生 > >VSCode使用LSP進行Swift開發

VSCode使用LSP進行Swift開發

LSP簡介

LSP的全稱是Language Server Protocol,是微軟推出的一項標準化協議,旨在用來統一開發工具與Language Server之前的通訊。它支援語言的自動補全、定義跳轉、檢視定義、檢視引用、lint、語法高亮等等。在這之前,各種IDE都需要自己實現一套類似的東西,顯得比較重複。藉助於LSP,開發工具只要按規則接入該協議,便可以享受到各種語言提供的服務。

目前支援的語言彙總在這裡,下圖只截出了部分,維護者有民間組織,微軟,還有正牌。比如對swift的支援就是Apple維護的sourcekit-lsp

image.png

LSP如何工作

官網上有段介紹LSP是如何工作的。

client和server之前使用JSONRPC進行通訊,採用request-response的方式,如下圖。

image.png

主要步驟:

  1. 使用者開啟文件,client發起textDocument/didOpen請求,並帶上引數。這時檔案內容儲存在記憶體中。
  2. 使用者編輯文件,client發起textDocument/didChange請求,然後server會發回textDocument/publishDiagnostics響應,會分析出error和warning。client根據這些error和warning進行對應的UI顯示。
  3. 使用者執行跳轉到符號定義,client發起textDocument/definition
    ,server返回相關的位置資訊。
  4. 使用者關閉文件,client發起textDocument/didClose請求,檔案內容更新到磁碟。

下面來看下具體的request和response,以textDocument/definition來舉例。

request: 其主要引數是method,params。params會帶上當前的檔案資訊,要查詢定義的符號資訊(第幾行,第幾個字元)

{
    "jsonrpc": "2.0",
    "id" : 1,
    "method": "textDocument/definition",
    "params": {
        "textDocument"
: { "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/use.cpp" }, "position": { "line": 3, "character": 12 } } } 複製程式碼

response: 響應包括符號定義的檔案位置,符號的起始和終止位置。

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/provide.cpp",
        "range": {
            "start": {
                "line": 0,
                "character": 4
            },
            "end": {
                "line": 0,
                "character": 11
            }
        }
    }
}
複製程式碼

LSP定義

LSP中定義了很多method,用來區分不同事件。

initialize,是client發給server的第一個請求。 Shutdown,關閉請求。 textDocument/definition,檢視符號定義的請求。 ...

詳細定義文件在這裡。

VSCode中安裝swift LSP

眾所周知,VSCode是一款功能強大的編輯器,其提供了非常豐富的外掛來支援各種語言的開發,並且它是眾多編輯器中率先支援LSP的。

Swift For LSP還在早期開發的階段,因此並沒有提供安裝包或者外掛。所以目前我們只能手動下載安裝。步驟如下:

安裝XCode

這步應該可以略過。

安裝VSCode

這步應該也可以略過。

安裝最新swift toolChain

Swift.org下載最新的主幹包,安裝好之後,到XCode->Preferences->Components選擇剛安裝的toolchain。

image.png

安裝node和npm

由於VSCode的外掛都是用js/ts來寫的,所以需要js的執行環境。推薦使用直接下載安裝包來安裝。

驗證是否裝好了,可以執行以下命令

nmp --version
複製程式碼

編譯並安裝SourceKit-LSP

clone倉庫:

git clone https://github.com/apple/sourcekit-lsp.git
複製程式碼

跳轉到sourcekit-lsp目錄:

cd sourcekit-lsp
複製程式碼

編譯:

swift build
複製程式碼

編譯成功後,會在.build/debug找到二進位制檔案。我們將其移到/usr/local/bin目錄下,以便可以直接使用。

mv .build/debug/sourcekit-lsp /usr/local/bin
複製程式碼

這個命令會啟動lsp的程序。

sourcekit-lsp
複製程式碼

安裝SourceKit-LSP外掛

該外掛的作用是讓VSCodeSourceKit-LSP之間可以進行通訊。

  1. 進入到sourceKit-lsp下面的Editors/vscode/目錄

    cd Editors/vscode/
    複製程式碼
  2. 執行npm run createDevPackage

    npm run createDevPackage
    複製程式碼

如果在這步遇到npm ERR! 404 Not Found: [email protected]的問題,可以嘗試刪除lock檔案,清除快取試試。

rm package-lock.json
npm cache clean --force
複製程式碼
  1. 安裝sourcekit-lsp-vscode-dev.vsix
code --install-extension out/sourcekit-lsp-vscode-dev.vsix
複製程式碼

首先要在VSCode中安裝code命令,cmd+shift+p,輸入shell command,然後安裝code命令。如圖所示。

image.png

重啟VSCode。

  1. 配置sourcekit-lsp

使用快捷鍵cmd,(或者preference-->settings),進入settings頁面,搜尋sourcekit-lspToolChain Path中填入SOURCEKIT_TOOLCHAIN_PATH

image.png

以上就配置完成了。

最後,開啟一個swift的xcode工程,滑鼠停留在關鍵字上,會展示出具體的定義。如下圖。

image.png

另外,SouceKit-LSP也是支援Sublime Text的,具體配置可以參照sublime-text配置

Suorcekit-LSP支援的特性

目前,因為它還在早期開發中,支援的功能還不是很多,相信以後會越來越完善。

Feature Status Notes
Swift
C/C++/ObjC clangd is not available in the recommended toolchain. You can try out C/C++/ObjC support by building clangd from source and putting it in PATH.
Code completion
Quick Help (Hover)
Diagnostics
Fix-its
Jump to Definition
Find References
Background Indexing Build project to update the index using Indexing While Building
Workspace Symbols
Refactoring
Formatting
Folding
Syntax Highlighting Not currently part of LSP.
Document Symbols

同步更新在我的簡書