🦨

Rubyで簡単な言語サーバーを書いてみた(VSCode版)

に公開

言語サーバー(language server)を自作できるようにしておくと何かと便利そうなので、自分用の最低限の叩き台みたいなものを書いてみました。

他所に書いていたものを引っ越してきました。元の記事公開日は 2025-03-30 です。

前回の記事↓ ではクライアントとして Emacs + Eglot を使いましたが、VSCode でも試してみました。


https://qiita.com/sonota88/items/86817527bcabdb15b5cd

今回作ったものの概要

  • 言語サーバーを子プロセスとして起動して標準入力・標準出力で通信する一般的な方式
  • 例として test という文字列を含む行に警告を表示する機能だけ
    • textDocument/publishDiagnostics を使う
  • なくても動く部分は省略、エラーハンドリングは適当

動作イメージはこんな感じ:

Peek 2025-03-30 11-52.gif

準備

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 + クライアントが言語サーバーとやりとりして画面上にフィードバックが表示される
    • 保存は不要。編集された現在の内容を元にフィードバックが表示される

編集時の挙動はこんな感じです:

Peek 2025-03-30 11-52.gif

  • 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

Discussion