Language Server Protocol

Language Server Protocol,

最近才注意到 Language Server Protocol官方中文介紹)這東西,微軟為了 Visual Studio Code 所定的一個協定,專門用來輔助程式開發用的,像是 VSCode 的 IntelliSense 提供的自動補完就可以基於這個協定支援更多語言,這協定其實在 2016 就發表了,感覺我 lag 很久,不過其實我也好奇 VSCode 怎麼處理這問題一陣子了,最近在 TernJS 的 issue 裡面看到 LSP 這個詞,好奇之下才去看到底是什麼東西。

LSP 的設計理念是開發 Editor 的不可能每種程式語言都花時間心力去把它們的編輯輔助功能做起來(還不一定做的好),所以不如就把這塊拆出來,讓分析程式碼、提供輔助功能的部分(Language Server)拆出去給各自領域的人開發,然後透過一個公定的介面來做溝通,這個介面就是 Language Server Protocol 了。

LSP 是架構在 JSON-RPC 這個 protocol 上,只要你的 Editor 可以透過 JSON-RPC 發送請求並接收結果,就可以利用 LSP 來提供功能,現在支援 LSP 的編輯器也不少,不是只有 VSCode 有支援,其它還有 Eclipse、Vim、NeoVim、Sublime Text 3 都已經有方案可以支援了,在社群維護的網站 langserver.org 上有一份清單介紹各個 client 的支援狀況。

送到 Language Server 的指令,目前 Protocol 可以提供以下功能:

其它還有一些是檔案、工作區相關的操作指令,另外由於現在 Language Server 實做和 LSP 是分開的,也沒有限制一定要所有功能都有支援,所以有些 Language Server 可能是沒有支援特定功能的,目前可以找到兩份 Language Server 的列表,一份是 LSP 官網的,另一份則是 langserver.org 上的,社群維護的版本才有標示不同的 Language Server 對應支援的功能,不過說是社群維護,其實 langserver.org 是另外一間公司 Sourcegraph 在維護的,該公司做的東西和 LSP 相關性看起來還蠻大的,也提供了很多 Language Server。

然後我就很感興趣,VSCode 現在內建的 JavaScript 用的 Language Server 是哪一套呢?畢竟仔細一看,兩個列表裡面,都沒有列出內建由微軟維護的 JavaScript 的 Language Server,只有 Sourcegraph 的版本,不止 JavaScript 沒有,TypeScript 也沒,只有 TypeFox 的版本(TypeFox 也是做程式碼相關工具的公司,我有找到一些研討會演講介紹 LSP 的講者就是這間公司的人)。總之兩個語言都沒列這真是太不尋常了,實在引起了我的好奇心,後來到處尋找總算在 JavaScript in VS Code 這頁找到蛛絲馬跡,這頁內文第二句話就有個連結連去 JavaScript Language Service 在 GitHub 的介紹,位置是 TypeScript 專案下的 Wiki 頁面,也有找到 TypeScript 專案內的相關程式碼,實際上 VSCode 對於 JavaScript 和 TypeScript 的編輯輔助功能都是依靠這個 TypeScript Language Service 提供的,或是也可以叫它 tsserver,TypeScript 的大架構可以參考 Architectural Overview 這篇文章;由於 tsserver 比較早推出,所以用的不是 LSP 用的 JSON-RPC,而是 STDIO 然後傳輸 JSON 加上 header,指令也有些落差,不過其實整體而言沒差距很大,因為 VSCode 那些輔助功能幾乎都是從 Visual Studio 來的,TypeScript 的支援也早就都透過 tsserver 來實現了,事實上,Sourcegraph 的 TypeScript Language Service 就是個 tsserver 的 proxy,底層還是 tsserver,不過實際上要用的話應該是 TypeFox 的比較好;然後當然也有人提出來說 TypeScript 是不是應該直接提供 LSP 版本的開發工具支援,在 GitHub 上的 Issue 11274,不過目前看來是沒打算樣子,這點我也是蠻意外的,畢竟 LSP 和 TypeScript 同公司的,沒打算支援自家公司定的標準,也是十足的霸氣,也看的出來各開源專案自治度其實蠻高的。

補充:另外有個 debugger 用的 Debug Adapter Protocol


命名記錄 1

Карта Одинокой Горы

記錄一下這兩年自己覺得還不錯的命名,本來是想累積更多再貼的。

Herculus

海克力士,用在測試服務名稱上,是希臘神話中的大力士,曾經完成十二偉業,這兩年還有部電影,取名源由其實是 Fate/stay night 中,他做為 Berserk 的 Servant 所持有的寶具,稱為 十二の試練,試練就聯想到 test ~

Erebor

用在資料庫相關的服務,哈比人歷險記的孤山的精靈語,因為孤山裡面有很多矮人的寶物,資料庫內的資料某種層面來說也算是個寶物。

Olympus

應該不用介紹來源了,用在 client 端自己寫的 API helper,取這個名字的原因是覺的客戶端跟 server 端要資料就如同在跟眾神請求一樣。


引號

Qutation Marks,

記錄一下搞 i18n 的一些發現,首先是引號,一般寫程式用的單雙引號'"是沒分開關的,不過這和寫作的不一樣,當初 ASCII Code 編定時也是因為資源有限所以才不分開引號還是關引號,不過現在其實這些標點符號都已經有區分的版本了,在 Mac 上也都有快速鍵輸入,像是:

  • ":opt + [
  • ":opt + shift + [
  • ':opt + ]
  • ':opt + shift + ]

一般文字我還蠻喜歡把普通的單引號雙引號都轉成這種,有個意外的好處就是放在 JSON 裡的字串內時,不需要用\跳脫,肉眼看起來和諧許多。

然後當初實做 Markdown 的 John Gruber 有個工具叫 SmartyPants 可以來處理單雙引號的轉換,這工具當年常和 Markdown 一起合作,我則是有把它 port 到 JavaScript,然後其實有些語言的引號不是這種點點得,像是大家都知道的中日文的「」,我要提的則是俄文用的是箭頭引號«»叫 Guillemet,長的和書名號很像,不過大小就有差,當然 Guillemet 也有單線條的版本‹›,輸入方法如下:

  • «:opt + \
  • »:opt + shift + \
  • :opt + shift + 3
  • :opt + shift + 4

德文又比較特別,左邊的引號是放在底部的,輸入方法為:

  • :opt + shift + w

當然這些不同語言的不同型式好像現在也沒有講究一定要用,我隨便找一些該語言的新聞網站也還是很多用普通的雙引號,而且實際上這些引號的組合很多,wikipedia 上有人整理好。

另外想特別提一下西班牙文,它的問句和驚嘆句,除了在句尾加問號和驚嘆號之外,還可以在句首加上反過來的問號和驚嘆號,一樣,現在似乎也沒一定要這樣寫了,輸入方法為:

  • ¿:opt + shift + /
  • ¡:opt + 1

最後補篇少數派的文章 别再用「六个点」当省略号了,这些标点都有更规范的输入方式


Monokai Pro

Monokai Pro VSCode

因為用 Dank Mono 字體的關係,最近開始有想要讓 Vim 支援斜體的 syntax highlight,於是又花了不少時間測試,過程中想起在 Twitter 上看到有人說過有一款付費的 Sublime/VSCode 佈景主題(印象中是 @yorkxin),叫 Monokai Pro,因為可以免費評估,可能是用幾天後才會出現 popup 吧,就一時興起就裝來玩玩看,結果還蠻滿意的。

Monokai Pro Sublime

雖然我主力是 Vim,但是 Sublime 和 VSCode 都還是有用,後來又繼續研究了一下,原來 Monokai 是在 Textmate 2 的佈景主題,還蠻有名的,也很多人 port 到不同環境,Vim 那邊比較多人用的應該是 molokai,然後 Monokai Pro 是同個作者做的,如果有 Vim 版的我會支持一下吧~

然後弄一弄發現我用 jellybean 的配色用到 256 色的,結果把 True Color 支援打開之後發現有點難看,又開始我的探索之旅了,目前暫時是用 tender

tender.vim


更之前的文章