スキップしてメイン コンテンツに移動

rust-analyzerによるVimでのコード補完


rust-analyzerとは


rust-analyzerはエディタ上でRustのソースコード入力を補完するツールです。

rust-analyzerを使わずにすべて手入力のプレーンなVimでもコードは書けます。Rustのコンパイラはエラーメッセージが非常に親切(どこをどう直せばよいか具体的に提案してくれる)なため、Vimで書いて cargo run や cargo check を実行する往復作業だけでも、十分に学習を進められます。

ただ、rust-analyzer を導入すると、Rust特有の言語仕様を扱う際に以下のような強力なメリットがあります。

  • リアルタイムのエラー検知:
    Rustはメモリ安全性を担保するため、コンパイルを通すまでが厳しい言語です。「変数の貸し借り(参照)」や「型の不一致」によるエラーを、コンパイルを実行する前にエディタ上で即座に波線で教えてくれます。

  • 型推論の可視化:
    Rustは let x = (1..10).collect(); のように型を省略して書くことが多く、ソースコード上だけでは実際の型が分かりにくい場面が多々あります。rust-analyzer は、コンパイラが推論した型をエディタ上に仮想的なテキスト(インレイヒント)として表示してくれるため、現在何の型を扱っているのか見失わずに済みます。

  • メソッドの提示と自動インポート:
    Rustの標準ライブラリ(特に Option、Result、Iterator など)には非常に便利なメソッドが多数用意されています。変数に . を打つだけで利用可能なメソッド一覧が引数とともに表示されるため、ブラウザで公式ドキュメントを行き来する手間が省けます。また、必要なモジュールの use 文も自動で最上部に追記してくれます。

  • 定義元へのジャンプ:
    プロジェクトが大きくなり複数ファイルに分かれたり、外部ライブラリ(クレート)を利用し始めたりした際、関数や構造体の定義元へショートカットキー一つで瞬時にジャンプして中身を確認できます。

まずはツールに頼らず「Rustの構文を指に覚えさせる」目的でプレーンなVimを使い、標準ライブラリの機能や外部パッケージを多用したくなった段階で導入する、という進め方もおすすめです。

rust-analyzerの導入

Vimで rust-analyzer を利用したコード補完を有効にするには、LSP(Language Server Protocol)クライアントのプラグインを導入するのが現在の標準的な手法です。

ここでは、ピュアVim環境で動作が軽く、設定が容易な vim-lsp とその関連プラグイン(vim-plug での管理)を使用した構成手順を解説します。


1. vim-plug 本体のダウンロード:
ターミナルで以下のコマンドをそのまま実行してください(~/.vim/autoload/ ディレクトリを作成し、スクリプトを1ファイル配置します)。

Bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim


2.rust-analyzer のパス確認:Prerequisite。
前回のアップデート手順でインストールした rust-analyzer にパスが通っているか確認します。rustup でインストールしたコンポーネントは ~/.cargo/bin/ に配置されます。

Bash
rust-analyzer --version
※ コマンドが見つからない場合は、シェルの設定ファイル(~/.bashrc や ~/.zshrc)で export PATH="$HOME/.cargo/bin:$PATH" が設定されているか確認してください。

3.Vimプラグインの追加:
~/.vimrc にLSPクライアント、自動設定用プラグイン、および補完UI(非同期)のプラグインを追記します。

Vim Script
call plug#begin()

" LSPクライアント本体と、サーバーの自動設定
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'

" 補完ポップアップのUIと連携
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'

call plug#end()
4.補完キーマッピングの設定:
同じく ~/.vimrc に、補完メニューを Tab キー等で操作するための基本的な設定を追記します。

Vim Script
" Tabキーで補完候補を選択・移動する設定
inoremap <expr> <Tab>   pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
inoremap <expr> <cr>    pumvisible() ? asyncomplete#close_popup() : "\<cr>"

" 補完のポップアップメニューを表示しやすくする
set completeopt=menuone,noinsert,noselect
5.インストールと動作確認:
Vimを起動し、プラグインをインストールします。

Vim Script
:PlugInstall
インストール完了後、作成した hello_world/src/main.rs をVimで開きます。vim-lsp-settings が環境変数 PATH 上にある rust-analyzer を自動的に検知して起動します。

ファイル内で std:: のように入力し、補完ウィンドウが自動でポップアップすれば成功です。現在のLSPの状態は :LspStatus コマンドで確認できます。

コメント

このブログの人気の投稿

Rustで変数の型を明示的に指定する方法

Rustでは、変数名の後ろに : 型名 を付与することで、すべての変数の型を明示的に指定できます。 Rust // C言語: uint32_t count = 0; let count: u32 = 0 ; // C言語: int32_t offset = -10; let offset: i32 = - 10 ; Rustはデフォルトで変数が「変更不可(イミュータブル)」となるため、後から値を変更(再代入)したい場合は mut キーワードを付けます。 Rust // C言語: size_t index = 0; let mut index: usize = 0 ; index = 1 ; // mutがあるので変更可能 主なプリミティブ型とC言語の対応 ハードウェアに近い制御や厳密なデータ管理が求められる場面では、ビット幅を明示した型指定が多用されます。 u8 , u16 , u32 , u64 : 符号なし整数( uint8_t 等に相当) i8 , i16 , i32 , i64 : 符号付き整数( int8_t 等に相当) usize : メモリアドレスのサイズ(ポインタ長)に依存する符号なし整数( size_t に相当) isize : ポインタ長に依存する符号付き整数( ptrdiff_t に相当) f32 , f64 : 浮動小数点数( float , double に相当) 型の明示が「必須」となる場面 関数内のローカル変数は型を省略(推論)することが許可されていますが、 関数のインターフェース(引数と戻り値) および 定数 については、言語仕様として型の明示が強制されます。 Rust // 引数 (a, b) と戻り値 (-> u32) は型の明示が必須 fn calculate_offset (base: u32 , offset: u32 ) -> u32 { base + offset } // 定数 (const / static) も型の明示が必須 const BASE_ADDRESS: u32 = 0xA0000 ; すべてのローカル変数に型を明示する方針でコードを書けば、LSPの支援がないプレーンなVim上でも、C言語と同等の厳密な可読性を維持したまま開発を進め...