言語サーバー(language server)を自作できるようにしておくと何かと便利そうなので、自分用の最低限の叩き台みたいなものを書いてみました。
前回の記事↓ ではクライアントとして Emacs + Eglot を使いましたが、VSCode でも試してみました。
今回作ったものの概要
- 言語サーバーを子プロセスとして起動して標準入力・標準出力で通信する一般的な方式
- 例として
test
という文字列を含む行に警告を表示する機能だけ-
textDocument/publishDiagnostics
を使う
-
- なくても動く部分は省略、エラーハンドリングは適当
動作イメージはこんな感じ:
準備
VSCode 側の設定
Language Client を作る|Language Server Protocol に対応したミニ言語処理系を作る (zenn.dev / takl)を参考にさせてもらいました。
言語サーバーとして langserver.rb
を使いたいので以下の箇所だけ修正しました。
function activate(context) {
try {
const serverOptions = {
- command: "node",
+ command: "ruby",
args: [
- context.extensionPath + "/oreore.js",
- "--language-server"
+ context.extensionPath + "/langserver.rb"
]
};
const clientOptions = {
langserver.rb
同じく Language Server Protocol に対応したミニ言語処理系を作る (zenn.dev / takl) を参考にさせてもらいました。クライアントのファイルと同じフォルダに置きます。
動かす
- VSCode でクライアントのファイルを置いているフォルダを開く
- F5 を押す
- 別ウィンドウが開く
- 開いたウィンドウの方で
sample.ore
を開く- 自動で oreore モードになり、言語サーバーが起動する
-
sample.ore
を編集すると VSCode + クライアントが言語サーバーとやりとりして画面上にフィードバックが表示される- 保存は不要。編集された現在のバッファの内容を元にフィードバックが表示される
編集時の挙動はこんな感じです:
-
test
という文字列を含む行に赤い下線が表示される -
test
という文字列を含まなくなった行の赤い下線が消える - マウスカーソルのホバーでもメッセージが表示される
メモ
- これを育てて、昔作った自作言語の言語サーバーも書いてみたい(そのうち……)
- 今回は「
test
という文字列を含む行」に警告を表示するというだけの処理だったが、ここは他のコマンドやライブラリと連携させれば手軽にいろんなことができそう。
バージョン
Ruby 3.2.3 ... Ubuntu 24.04 のデフォルト
node.js 7.3.0 ... Ubuntu 24.04 のデフォルト? でインストールされているが使われているかは不明
VSCode 1.98.2
npm install 実行時に使ったのは以下
node.js 22.14.0
npm 11.2.0