いちからvimのrust開発環境を構築していく❗️(rust.vim, coc.nvim)

2020/12/13に公開1

はじめに

この記事はVim Advent Calendar 2020 13日目の記事となっています。

今回は、vimでrustの環境構築をいちから行っていきます。

以下に成果物を上げています。
docker でまっさらな(alpine + rust + vim) vim環境をたてて構築を進めていきます。
https://github.com/yuucu/vimrc-sandbox/tree/rust

やること

  • vim plugin managerの導入
  • rust.vimで保存時自動フォーマット
  • coc.nvimで定義元ジャンプや、構文チェック、自動補完の実現

vim plugin manager

vim-plug

vimのプラグインマネージャーは色々種類があると思いますが、
vim-plugを最初に使い出して、不満もないためこちらずっと使っています...!

https://github.com/junegunn/vim-plug

インストールも簡単でこちらで終了です。

ターミナル
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

プラグインの追加は.vimrcPlug ~部分を追記していき、
:PlugInstallをするだけです..!(簡単!)

.vimrc
call plug#begin('~/.vim/plugged')
  Plug 'rust-lang/rust.vim'
call plug#end()

次からrustのためのプラグインを追加していきます。

rustfmtによる自動フォーマット

rustfmt紹介

Rustにはコードフォーマットのガイドラインを示す「Rust Style Guide」が存在します。
https://github.com/rust-dev-tools/fmt-rfcs/blob/master/guide/guide.md

このガイドラインにそってコードを自動整形してくれるツールが rustfmt になります。
rustfmt
https://github.com/rust-lang/rustfmt

rustupを用いて、rustfmtをインストールします。
(rustup: Rustプロジェクト公式が提供しているインストーラ)

ターミナル
rustup component add rustfmt

インストールが完了すると、以下のコマンドが使えるようになっているはずです。

ターミナル
# helpを見る。
$ rustfmt -h

# インデントが崩れたrustソースコード
$ cat hello.rs 
fn main() {
    println!("hello!");
        println!("hello!");
            println!("hello!");
}

# フォーマット実行
$ rustfmt hello.rs 

# 整形されている!
$ cat hello.rs 
fn main() {
    println!("hello!");
    println!("hello!");
    println!("hello!");
}

以上のように、引数にファイルを渡してあげるとフォーマットを整えてくれるのがrustfmtになります。

こちら、vimでの保存時に自動でフォーマットを整えるようにしていこうと思います。

vim でプログラム保存時にrustfmt

rust.vim インストール

rust.vimを導入し、自動フォーマットできるようにします。
https://github.com/rust-lang/rust.vim

私は、vim のプラグイン管理にplug.vimを使用しているので
以下のような.vimrcになりました。

.vimrc
call plug#begin('~/.vim/plugged')
  Plug 'rust-lang/rust.vim'
call plug#end()

syntax enable
filetype plugin indent on

" 保存時に自動でrustfmt
let g:rustfmt_autosave = 1

プラグインを導入し、以下の一行をvimrcに記載することで、
保存時に自動フォーマットが走るようになります。
let g:rustfmt_autosave = 1

動作例

rustfmt-vim

めちゃくちゃなフォーマットでも:wだけで整えてくれて素敵...!

rust.vim おまけ

他の機能もいろいろあるんですが、
:RustTest も地味に便利だったりします。

rustのテストがある場所で :RustTest とすることでテストを実行して結果を見ることができます。
ターミナル に戻らないで実行できるので便利ですね。

rusttest

コード補完, 構文チェック

coc.nvim

vimで使えるLSPクライアントはいくつかありますが、
最近coc.nvimを使っているのでこちらを使って補完機能や構文チェック機能を足していきます。
依存として、nodenpmのインストールが必要になります。

coc.nvimのインストール

https://github.com/neoclide/coc.nvim

.vimrc
call plug#begin('~/.vim/plugged')
  Plug 'rust-lang/rust.vim'
  Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()

syntax enable
filetype plugin indent on

" rust auto format
let g:rustfmt_autosave = 1


set number

" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable
" delays and poor user experience.
set updatetime=300

" Always show the signcolumn, otherwise it would shift the text each time
" diagnostics appear/become resolved.
if has("patch-8.1.1564")
  " Recently vim can merge signcolumn and number column into one
  set signcolumn=number
else
  set signcolumn=yes
endif

" Make <CR> auto-select the first completion item and notify coc.nvim to
" format on enter, <cr> could be remapped by other vim plugin
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

coc.nvim 公式の設定ファイル例ですが、かなり長いので、
必要そうな部分のみを抜粋して使用しています。

coc.nvimの各機能に関しては、他の記事の方が参考になると思います。
Vimにcoc.nvimを入れたら便利すぎて感動したっていう話

rustのlsp設定

coc-rlsを使用します。
https://github.com/neoclide/coc-rls/

coc-rlsのインストール

こちら参考に導入していきます。
https://github.com/neoclide/coc-rls/#quick-start

ターミナル
rustup component add rls rust-analysis rust-src
vim上で
:CocInstall coc-rls

コード補完(AutoCompletion)

ここまでの作業でこんな感じのリアルタイムでの補完が効くようになっています。
すごい便利!(^o^)/

AutoCompletion

エラー(Diagnostics)

使用していない変数の警告だったり、
そんな型ないよのエラーがきちんと表示できているのが確認できます。

error

定義元ジャンプ, 参照先

.vimrcに記載した以下にのっとって、
gdで定義元ジャンプ、
grで参照先検索...などができます。

.vimrc
" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)

gdで定義元ジャンプ、
grで参照先検索しているgifになります。

jump

おわりに

以上でvimのrust環境構築は完成です!
プラグインは2つしかいれておりませんが、coc.nvimがかなり多機能なこともあり、
十分に開発しやすい環境になりました。

今回導入したrust.vimcoc.nvimの2つと、
以下で紹介したvimのプラグインが自分で主に使っているvimの環境になります。

これが無いと個人的に業務が辛いツール紹介(fzf, vim, tmux) ~ひきこもりターミナルライフ~

良かったら参考にしてみてください...!

以上、Vim Advent Calendar 2020 13日目の記事でした!
読んでくださった方、ありがとうございました。

間違い、訂正や他のおすすめプラグインなど、
ご意見あればコメントよろしくお願いします。m(_ _)m

Discussion