LSP
的全稱是Language Server Protocol
,是微軟推出的一項標準化協議,旨在用來統一開發工具與Language Server
以前的通訊。它支持語言的自動補全、定義跳轉、查看定義、查看引用、lint、語法高亮
等等,但具體實現要看各類語言的LS支持是否完善。在這以前,各類IDE都須要本身實現一套相似的東西,顯得比較重複。藉助於LSP
,開發工具只要按規則接入該協議,即可以享受到各類語言提供的服務。html
目前支持的語言
彙總在這裏,下圖只截出了部分,維護者有民間組織,微軟,還有正牌。好比對swift的支持就是Apple維護的sourcekit-lsp。node
官網上有段介紹LSP是如何工做的。git
client和server以前使用JSONRPC
進行通訊,採用request-response
的方式,以下圖。github
主要步驟:shell
textDocument/didOpen
通知,告訴服務器。這時文件內容保存在內存中。textDocument/didChange
通知,而後server會發回textDocument/publishDiagnostics
通知,會分析出error和warning。client根據這些error和warning進行對應的UI顯示。textDocument/definition
請求,server返回相關的位置信息。textDocument/didClose
通知,文件內容更新到磁盤。下面來看下具體的request和response,以textDocument/definition
來舉例。npm
request: 其主要參數是method
,params
。params會帶上當前的文件信息,要查詢定義的符號信息(第幾行,第幾個字符)json
{
"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: 響應包括符號定義的文件位置,符號的起始和終止位置。swift
{
"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中定義了不少method
,用來區分不一樣事件。包括請求和通知。sublime-text
如initialize
,是client發給server的第一個請求。 Shutdown
,關閉請求。 textDocument/definition
,查看符號定義的請求。 ...xcode
其詳細定義文檔在這裏。
衆所周知,VSCode是一款功能強大的編輯器,其提供了很是豐富的插件來支持各類語言的開發,而且它是衆多編輯器中率先支持LSP
的。
Swift For LSP
還在早期開發的階段,所以並無提供安裝包或者插件。因此目前咱們只能手動下載安裝。步驟以下:
這步應該能夠略過。
這步應該也能夠略過。
到Swift.org下載最新的主幹包,安裝好以後,到XCode->Preferences->Components選擇剛安裝的toolchain。或者這裏不選擇,在vscode中設置toolchain的路徑。
因爲VSCode的插件都是用js/ts來寫的,因此須要js的運行環境。推薦直接下載安裝包來安裝。
驗證是否裝好了,能夠執行如下命令
nmp --version
複製代碼
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
複製代碼
該插件的做用是讓VSCode
與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。
使用快捷鍵cmd,
(或者preference-->settings),進入settings
頁面,搜索sourcekit-lsp
,ToolChain Path
中填入以前下載安裝的toolchain路徑。好比個人是/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2018-11-25-a.xctoolchain
。
以上就配置完成了。
最後,打開一個swift的xcode工程,鼠標停留在關鍵字上,會展現出具體的定義。以下圖。
將設置中的Trace Server打開,設置成message
,能夠看到請求/響應/通知信息;設置成verbose
,會更加詳細,具體字段以及內容。其中請求是有id編號的,通知沒有。
initialize
,initialized
,textDocument/didOpen
。window/logMessage
是server發過來的通知。[Trace - 3:00:00 PM] Sending request 'initialize - (0)'.
[Trace - 3:00:00 PM] Received notification 'window/logMessage'.
could not open compilation database for /Users/liusilan/Documents/workspace/my/LeetCode/countSegments noEntry
[Trace - 3:00:00 PM] Received notification 'window/logMessage'.
failed to open IndexStoreDB: indexstoredb_index_create error: index store path does not exist: /Users/liusilan/Documents/workspace/my/LeetCode/countSegments/.build/debug/index/store
[Trace - 3:00:00 PM] Received response 'initialize - (0)' in 234ms.
[Trace - 3:00:00 PM] Sending notification 'initialized'.
[Trace - 3:00:00 PM] Sending notification 'textDocument/didOpen'.
[Trace - 3:00:00 PM] Received notification 'textDocument/publishDiagnostics'.
[Trace - 3:00:01 PM] Received notification 'textDocument/publishDiagnostics'.
複製代碼
textDocument/didChange
,server會返回textDocument/publishDiagnostics
。[Trace - 2:58:57 PM] Sending notification 'textDocument/didChange'.
[Trace - 2:58:57 PM] Received notification 'textDocument/publishDiagnostics'.
[Trace - 2:58:57 PM] Received notification 'textDocument/publishDiagnostics'.
複製代碼
textDocument/hover
。[Trace - 2:53:43 PM] Sending request 'textDocument/hover - (3)'.
[Trace - 2:53:43 PM] Received response 'textDocument/hover - (3)' in 3ms.
複製代碼
textDocument/documentHighlight
。[Trace - 2:55:07 PM] Sending request 'textDocument/documentHighlight - (22)'.
[Trace - 2:55:07 PM] Received response 'textDocument/documentHighlight - (22)' in 2ms.
複製代碼
textDocument/definition
。[Trace - 2:55:40 PM] Sending request 'textDocument/definition - (43)'.
[Trace - 2:55:40 PM] Received response 'textDocument/definition - (43)' in 8ms.
複製代碼
關於versbose打印的信息,你們能夠嘗試設置看看。
另外,SouceKit-LSP
也是支持Sublime Text
的,具體配置能夠參照sublime-text配置。
目前,由於它還在早期開發中,支持的功能還不是不少,相信之後會愈來愈完善。
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 | ❌ |
調試在開發過程當中是必不可少的,以前老是生成xcodeproj
,而後在xcode
中進行調試,總歸有些不太方便。
在VSCode中
調試swift
也挺簡單的,步驟以下:
安裝插件CoreLLDB
配置launch.json
在插件安裝完成以後,打開swift工程,按F5
,會出現配置彈框,以下。
點擊Open launch.json
進行配置,具體配置以下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
// Running executables
{
"type": "lldb",
"request": "launch",
"name": "Run your Executable",
"program": "${workspaceFolder}/.build/debug/xxx",
"args": [],
"cwd": "${workspaceFolder}",
"preLaunchTask": "swift-build"
}
]
}
複製代碼
注意將"program": "${workspaceFolder}/.build/debug/xxx",
中的xxx
改爲本身工程可執行文件的名字。
launch.json
配置好後,繼續按F5
,此時會出現配置task的彈窗,以下圖。
點擊Configure Task
進行配置,以下:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
// compile your SPM project
{
"label": "swift-build",
"type": "shell",
"command": "swift build"
},
// compile your SPM tests
{
"label": "swift-build-tests",
"type": "process",
"command": "swift",
"group": "build",
"args": [
"build",
"--build-tests"
]
}]
}
複製代碼
至此,所有配置完成。按F5
開始調試,若是仍然出現彈窗,則說明某個地方沒配置好,需對比下上面的配置。
最後就能夠愉快的調試了。