Open2

読者コミュニティ|Language Server Protocol の仕様 及び実装方法

shibashiba

Q&A

本著についてたくさんの反応をいただきありがたく思います。
いくつか見られた疑問に関してお答えしていきます。

Syntax highlightingはどうやるのか?

LSPにはSemantic tokensというコードの色付けを行える機能がありますが、これは通常のSyntax highlightingとは異なる仕組みです。文法ファイルを定義してエディタに渡すようなことがしたい場合、それはLSPというよりかは拡張機能の守備範囲だと思います。
以下でいくつかのケースについて方策を示しておきます。

VSCodeで独自言語のSyntax highlightingを行いたい

以下のリンクが役に立つと思われます。

Monaco Editorで独自言語のSyntax highlightingを行いたい

以前私がそのようなこと(実例)をしましたので、ソースコードを紹介します。
Monaco Editor APIのlanguages.setMonarchTokensProviderを使います。

https://github.com/erg-lang/web-ide/blob/82d78fd39609dbbd15161ae2cc382905e51b3a7f/script/index.ts#L35-L37

文法の定義は以下のようにオブジェクト形式で渡します。

https://github.com/erg-lang/web-ide/blob/82d78fd39609dbbd15161ae2cc382905e51b3a7f/script/syntax.ts#L1-L14

公式のリンクはこちらです。

チュートリアル的なものはないのか?

本文でも少し触れましたが、LSPのチュートリアルやLanguage Serverを作ってみたという趣旨の記事は既にWeb上でいくつか確認することができます(そのため本著は「作って学ぶ」というよりかはコンセプトの解説に寄った内容としました)。こちらでリンクを紹介しておきます。他にもご存じの方がいたらお教えください。

※追記(2023/10/4)
付録2としてLanguage Serverの実作例を追加しました。