いちからvimのrust開発環境を構築していく❗️(rust.vim, coc.nvim)
はじめに
この記事はVim Advent Calendar 2020 13日目の記事となっています。
今回は、vimでrustの環境構築をいちから行っていきます。
以下に成果物を上げています。
docker でまっさらな(alpine + rust + vim) vim環境をたてて構築を進めていきます。
やること
- vim plugin managerの導入
- rust.vimで保存時自動フォーマット
- coc.nvimで定義元ジャンプや、構文チェック、自動補完の実現
vim plugin manager
vim-plug
vimのプラグインマネージャーは色々種類があると思いますが、
vim-plug
を最初に使い出して、不満もないためこちらずっと使っています...!
インストールも簡単でこちらで終了です。
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
プラグインの追加は.vimrc
にPlug ~
部分を追記していき、
:PlugInstall
をするだけです..!(簡単!)
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
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を導入し、自動フォーマットできるようにします。
私は、vim のプラグイン管理にplug.vimを使用しているので
以下のような.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
動作例
めちゃくちゃなフォーマットでも:w
だけで整えてくれて素敵...!
rust.vim おまけ
他の機能もいろいろあるんですが、
:RustTest
も地味に便利だったりします。
rustのテストがある場所で :RustTest
とすることでテストを実行して結果を見ることができます。
ターミナル に戻らないで実行できるので便利ですね。
コード補完, 構文チェック
coc.nvim
vimで使えるLSPクライアントはいくつかありますが、
最近coc.nvim
を使っているのでこちらを使って補完機能や構文チェック機能を足していきます。
依存として、node
とnpm
のインストールが必要になります。
coc.nvimのインストール
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を使用します。
coc-rlsのインストール
こちら参考に導入していきます。
┗ https://github.com/neoclide/coc-rls/#quick-start
rustup component add rls rust-analysis rust-src
:CocInstall coc-rls
コード補完(AutoCompletion)
ここまでの作業でこんな感じのリアルタイムでの補完が効くようになっています。
すごい便利!(^o^)/
エラー(Diagnostics)
使用していない変数の警告だったり、
そんな型ないよのエラーがきちんと表示できているのが確認できます。
定義元ジャンプ, 参照先
.vimrc
に記載した以下にのっとって、
gd
で定義元ジャンプ、
gr
で参照先検索...などができます。
" 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になります。
おわりに
以上でvimのrust環境構築は完成です!
プラグインは2つしかいれておりませんが、coc.nvim
がかなり多機能なこともあり、
十分に開発しやすい環境になりました。
今回導入したrust.vim
とcoc.nvim
の2つと、
以下で紹介したvimのプラグインが自分で主に使っているvimの環境になります。
これが無いと個人的に業務が辛いツール紹介(fzf, vim, tmux) ~ひきこもりターミナルライフ~
良かったら参考にしてみてください...!
以上、Vim Advent Calendar 2020 13日目の記事でした!
読んでくださった方、ありがとうございました。
間違い、訂正や他のおすすめプラグインなど、
ご意見あればコメントよろしくお願いします。m(_ _)m
Discussion
手早く簡単に構築できる方法が書かれている、いい入門記事だと思いました!
一点coc-rlsよりもcoc-rust-analyzer https://github.com/fannheyward/coc-rust-analyzer
使った方が補完精度がいいのでおすすめです!