rust
VisualStudioCode

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

背景

Visual Studio Code(vscode)でRustコードを書く際、選択肢としてあるのが vscode-rust だったが、最近はあんまり実装に時間取れないからrls-vscode使ってね(意訳)という事なので、そちらを使うことにする。

注意

RLSは2017/12月現在まだα開発段階なので、仕様が変わる場合や、致命的なエラーが出る場合もあるので注意。
何かあったら、rustup update nightlyで取得できる最新版で直るのを待つか、ソースから何とかするしかない。

Rust Language Server(RLS)とは

言語開発をする上で、IDEやエディタに補完機能、構文解析等の機能を統一的に提供するために定められた language server protocol のRustのための実装。
公式リポジトリは https://github.com/rust-lang-nursery/rls
2017/12現在ではまだnightlyだが、安定版リリースは2018年前半を目標としているらしい

用意するもの

RLSのインストール

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

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

  1. rustup update nightlyを実行してツールチェインをアップデートする
  2. rustup component add --toolchain=nightly rust-analysis で、標準ライブラリのメタデータを取得
  3. rustup component add --toolchain=nightly rls-previewでrls本体をインストール
  4. rustup component add --toolchain=nightly rust-src で、rust本体のソースをDLする

成功すれば、rustup run nightly rlsを実行すると、rlsプロセスが起動する。(Ctrl+Cで停止)
コンポーネントの更新は、rustup update nightlyで一括更新される

vscodeプラグインの設定

ほとんどデフォルトで動作するが、rust.cfg_testは、テストプロジェクトがある場合はtrueにしておかないと、テストコードを解析してくれないので注意。

確認方法

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

プラグインとRLSからの出力メッセージは"Rust Language Server"で確認可能。
詳しいメッセージが欲しい場合は、rust-client.revealOutputChannelOnを設定する。

RLSの設定項目

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

基本的にはsettings.jsonに対応する項目があるので、それを設定する。

注意点

2017/12現在、Cargo.tomlで指定したような外部crateへの定義ジャンプは可能だが、標準ライブラリにはジャンプできないので、
ウェブのドキュメントを合わせて読むようにすると良い。

rls-previewが消える場合

nightlyの取得タイミングによっては、rls-previewが消えるらしいとのこと。
https://github.com/rust-lang-nursery/rls/issues/611
現在根本的な解決策を考えている段階らしいので、とりあえずの対処法を記しておく。

  1. rls-previewが存在するバージョンを探す(記事執筆時点で確認されているのはnightly-2017-12-01)
  2. rustup install [確認したバージョン]を実行して、特定バージョンのツールチェインを入れる
  3. rustup component add rls-preview rust-src rust-analysis --toolchain [確認したバージョン] で必要コンポーネントをインストールする
  4. vscodeのユーザー設定ファイルを開き、rust-client.channelの値に、確認したバージョンを入れる

どのバージョンが有効か、という効率の良い特定方法は現在調査中。

使ってみた感想

コード補完、文法エラー、定義に移動等、必要と思う機能は一通り揃っているため、割と制約が多いrustでは多いに開発の役に立つのではないかと思う。
ただし、メソッドチェーンでつなげた場合の補完がうまくいかなかったりなど、VSに慣れているとちょっと不便だなという所もまだある。
早く正式リリースになってほしいなぁと思う。