VSCode使用LSP進行Swift開發
LSP
的全稱是 Language Server Protocol
,是微軟推出的一項標準化協議,旨在用來統一開發工具與 Language Server
之前的通訊。它支援語言的 自動補全、定義跳轉、檢視定義、檢視引用、lint、語法高亮
等等。在這之前,各種IDE都需要自己實現一套類似的東西,顯得比較重複。藉助於 LSP
,開發工具只要按規則接入該協議,便可以享受到各種語言提供的服務。
目前支援的語言彙總在這裡,下圖只截出了部分,維護者有民間組織,微軟,還有正牌。比如對swift的支援就是Apple維護的 ofollow,noindex">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
,server返回相關的位置資訊。 - 使用者關閉文件,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: flatmap-stream@0.1.1
的問題,可以嘗試刪除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 | :white_check_mark: | |
C/C++/ObjC | :x: | 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 | :white_check_mark: | |
Quick Help (Hover) | :white_check_mark: | |
Diagnostics | :white_check_mark: | |
Fix-its | :x: | |
Jump to Definition | :white_check_mark: | |
Find References | :white_check_mark: | |
Background Indexing | :x: | Build project to update the index usingIndexing While Building |
Workspace Symbols | :x: | |
Refactoring | :x: | |
Formatting | :x: | |
Folding | :x: | |
Syntax Highlighting | :x: | Not currently part of LSP. |
Document Symbols | :x: |
同步更新在我的簡書。