語(yǔ)言服務(wù)器協(xié)議(LSP)是Visual Studio Code的一個(gè)重要組件。語(yǔ)言服務(wù)器實(shí)際上是單獨(dú)運(yùn)行的編譯器或分析器,它負(fù)責(zé)處理各種任務(wù),如編譯器錯(cuò)誤報(bào)告、文本懸浮、代碼自動(dòng)完成(也就是IntelliSense),等。
語(yǔ)言服務(wù)器并不是個(gè)新概念,Vim和Emacs早就在用它實(shí)現(xiàn)代碼自動(dòng)完成功能。C#的語(yǔ)言服務(wù)器叫作OmniSharp,支持VS Code、Sublime、Atom、Emacs、Vim和Brackets。
VS Code為T(mén)ypeScript實(shí)現(xiàn)了另一種語(yǔ)言服務(wù)器。與OmniSharp不同的是,它是基于HTTP的,“通過(guò)標(biāo)準(zhǔn)輸入和輸出與服務(wù)器進(jìn)程打交道,并使用了JSON消息格式,類(lèi)似V8調(diào)試器協(xié)議的請(qǐng)求和響應(yīng)”。
VS Code現(xiàn)在有兩種語(yǔ)言服務(wù)器,微軟認(rèn)為有必要制定一個(gè)通用的標(biāo)準(zhǔn),現(xiàn)有和未來(lái)的新語(yǔ)言共同遵循該標(biāo)準(zhǔn)。于是,語(yǔ)言服務(wù)器協(xié)議出現(xiàn)了。
語(yǔ)言服務(wù)器協(xié)議采用JSON-RPC作為最基本的消息格式。JSON-RPC是SOAP的替代品,更為輕量級(jí)。與SOAP類(lèi)似,它對(duì)傳輸層沒(méi)有特殊的要求,因此可以通過(guò)標(biāo)準(zhǔn)輸入輸出、管道、套接字等方式進(jìn)行傳輸。
Visual Studio本身不支持語(yǔ)言服務(wù)器協(xié)議,所以需要使用適配器,讓VS語(yǔ)言服務(wù)與LSP客戶(hù)端發(fā)生交互。微軟開(kāi)發(fā)實(shí)驗(yàn)室提供了一個(gè)叫作語(yǔ)言服務(wù)器協(xié)議客戶(hù)端的工具。
除了客戶(hù)端工具,可能還需要一個(gè)語(yǔ)言擴(kuò)展。GitHub上的語(yǔ)言服務(wù)器協(xié)議示例演示了如何創(chuàng)建語(yǔ)言擴(kuò)展。
Adam Driscoll提供了一個(gè)更為復(fù)雜的示例,叫作PowerShell的Visual Studio語(yǔ)言服務(wù)器協(xié)議擴(kuò)展。Adam說(shuō):
我認(rèn)為未來(lái)要支持更多的語(yǔ)言需要依賴(lài)LSP客戶(hù)端。Visual Studio和Visual Studio Code共享同一個(gè)語(yǔ)言服務(wù),這是一個(gè)大好局面。但我們還可以做得更好。LSP現(xiàn)在不支持調(diào)試。它是一種特殊的協(xié)議。LSP在Visual Stuido中還不夠完善,文檔中已經(jīng)有一個(gè)圖表說(shuō)明了這個(gè)問(wèn)題。要完善它尚需時(shí)日。查看英文原文:Language Server Protocol Support for Visual Studio