VSCode使用LSP進行Swift開發
LSP簡介
LSP
的全稱是Language Server Protocol
,是微軟推出的一項標準化協議,旨在用來統一開發工具與Language Server
之前的通訊。它支援語言的自動補全、定義跳轉、檢視定義、檢視引用、lint、語法高亮
等等。在這之前,各種IDE都需要自己實現一套類似的東西,顯得比較重複。藉助於LSP
,開發工具只要按規則接入該協議,便可以享受到各種語言提供的服務。
目前支援的語言彙總在這裡,下圖只截出了部分,維護者有民間組織,微軟,還有正牌。比如對swift的支援就是Apple維護的sourcekit-lsp。
LSP如何工作
官網上有段介紹LSP是如何工作的。
client和server之前使用JSONRPC
進行通訊,採用request-response
的方式,如下圖。
主要步驟:
- 使用者開啟文件,client發起
textDocument/didOpen
請求,並帶上引數。這時檔案內容儲存在記憶體中。 - 使用者編輯文件,client發起
textDocument/didChange
請求,然後server會發回textDocument/publishDiagnostics
響應,會分析出error和warning。client根據這些error和warning進行對應的UI顯示。 - 使用者執行跳轉到符號定義,client發起
textDocument/definition
- 使用者關閉文件,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。
安裝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外掛
該外掛的作用是讓VSCode
與SourceKit-LSP
之間可以進行通訊。
-
進入到sourceKit-lsp下面的
Editors/vscode/
目錄cd Editors/vscode/ 複製程式碼
-
執行
npm run createDevPackage
npm run createDevPackage 複製程式碼
如果在這步遇到npm ERR! 404 Not Found: [email protected]
的問題,可以嘗試刪除lock檔案,清除快取試試。
rm package-lock.json
npm cache clean --force
複製程式碼
- 安裝
sourcekit-lsp-vscode-dev.vsix
code --install-extension out/sourcekit-lsp-vscode-dev.vsix
複製程式碼
首先要在VSCode中安裝code
命令,cmd+shift+p
,輸入shell command,然後安裝code命令。如圖所示。
重啟VSCode。
- 配置sourcekit-lsp
使用快捷鍵cmd,
(或者preference-->settings),進入settings
頁面,搜尋sourcekit-lsp
,ToolChain Path
中填入SOURCEKIT_TOOLCHAIN_PATH
。
以上就配置完成了。
最後,開啟一個swift的xcode工程,滑鼠停留在關鍵字上,會展示出具體的定義。如下圖。
另外,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 | ❌ |
同步更新在我的簡書。