Rust Language Server(RLS)でVisual Studio Codeの補完を行う

  • 33
    いいね
  • 2
    コメント

背景

Visual Studio Code(vscode)でRustコードを書く際、選択肢としてあるのが vscode-rust で、最近RLSにも対応したらしいので、使えるようにしてみた。
従来方式(racer,rustsym,rustfmtの組み合わせ)はレガシー扱いしていきたいという話らしい。

注意

RLSはまだα開発段階なので、突然仕様が変わる場合や、致命的なエラーが出る場合もあるので、本番開発環境ではまだ使わない方が良い。

Rust Language Server(RLS)とは

言語開発をする上で、IDEやエディタに補完機能、構文解析等の機能を統一的に提供するために定められた language server protocol のRustのための実装。
公式リポジトリは https://github.com/rust-lang-nursery/rls

用意するもの

RLSのインストール

RLSがrustupに対応したので、rustupのみでインストール可能

現在RLSは開発段階のものなので、正式なリリースは存在しない。そのため、ツールチェインはnightlyのものを使用する必要がある。
大体公式リポジトリの説明に書いてある内容。

  1. 更新する場合は、rustup updateを実行してツールチェインをアップデートしておく
  2. rustup component add --toolchain=nightly rust-analysis で、標準ライブラリのメタデータを取得
  3. cargo install racerracer をインストールする(裏で使っている?)
  4. rustup component add rust-src で、rust本体のソースをDLする

成功すれば、rustup run nightly rlsを実行すると、rlsプロセスが起動する。

vscodeプラグインの設定

以下の設定がvscodeのsetting.jsonに必要

  • rust.rustLangSrcPath
    • Rustのソースパス
    • rustupで取得した場合は、 [ホームディレクトリ]/.rustup/toolchains/[ツールチェイン名]/lib/lib/rustlib/src/rust/src を指定する
    • RLSの動作にはRUST_SRC_PATHという環境変数が本来必要だが、vscode-rustはこの設定値を自動的にRLS実行時の環境変数に追加している
  • rust.rls
    • RLSの設定項目
    • デフォルトnullで、nullの場合は従来方式で動作する

rust.rlsについて

以下の設定項目が存在する

  • executable
    • 実行するコマンド名
    • rustup経由で実行するため、"rustup"と入れておく
  • args
    • コマンド引数
    • json配列で以下を入れておく
      • run
      • nightly
      • rls
  • env
    • 環境変数
    • キーは大文字小文字を区別するので、必ず合わせること
    • 詳しいデバッグログメッセージを見たい場合、"RUST_LOG":"rls=debug"を追加すれば、かなり冗長なメッセージが出力ウィンドウに表示される
  • revealOutputChannelOn
    • エラー出力レベル(デフォルトは"error")
    • 特にトラブルが無い限りは設定の必要はない

Windowsでの設定例は以下

    "rust.rls": {
        "executable": "rustup",
        "args": [
            "run",
            "nightly",
            "rls"
        ],
        "revealOutputChannelOn": "info"
    }

確認方法

  1. コマンドプロンプトで、cargo new --bin [プロジェクト名]で新規プロジェクトを作成
  2. ディレクトリが作成されるので、vscodeでフォルダを開く
  3. .rsファイルを開いた時、下の方にRLS: Analysis finishedという表示が出ればOK

プラグインとRLSからの出力メッセージは"Rust Language Server"と"Rust logging"で確認可能。
また、vsodeのsettings.jsonのrust.cargoCwd設定で指定した場所や、vscodeで開いたフォルダのルートにCargo.tomlが無いとエラーが出るようなので注意。
cargoCwdの設定は、必要ならばワークスペースの設定に入れておく。

RLSの設定項目

まだ予告なしに変わるかもしれない段階なので、ここでは詳細に書かないが、
https://github.com/rust-lang-nursery/rls/blob/master/README.md の"Configuration"節を参考にしてRLSの挙動を制御できる。

基本的にはCargo.tomlのあるディレクトリに"rls.toml"というファイルを置いて行う模様。

コードフォーマット機能を有効にする

現在RLSモードではコードフォーマット機能はデフォルトで有効になっていない。
(ドキュメントではオートフォーマットを有効にしたい場合だけと書かれているが、自分の環境では有効にならなかった。)

方法としては、Cargo.tomlのあるディレクトリにrls.tomlというファイルを作成し、unstable_features = true
入れ、RLSを再起動すれば、Shift+Alt+Fでフォーマットを行ってくれる。(RLS内で持っているrustfmtを使っている模様)

ただし、まだ細かいスタイルの設定項目は無い上に、ファイル全体のフォーマットのみなため、
使う際は予めコミットしておく等、元に戻せるようにしておいた方が良い。

使ってみた感想

従来のコード補完に加え、文法エラーの表示や、定義に移動等ができるようになっている。従来方式に比べると格段に使いやすくなっていると言ってもいいと思う。
早く正式リリースになってほしいなぁと思う。