LoginSignup
36
22

More than 5 years have passed since last update.

Rust入門 for Vimmer

Last updated at Posted at 2017-11-29

構成の候補としては、

rust.vim + deoplete-rust

rust.vim + vim-racer

の2パターンがある。

rust.vimは :make build | cw をすることでエラーメッセージをQuickFixに対応させてくれる。

deoplete-rustもvim-racerもどちらもコード補完プラグインだが、どちらもracerを使ってるし挙動がかなり似ている。
私は補完時に最上部に宣言を表示してくれるという理由で、deoplete-rustを選択した。

rust-docを紹介するが、動作がかなり遅く、deoplete-rust/vim-racerのドキュメント機能で十分なため、rust-docは没。
rustfmtも開発中なので没。

  • Rust導入
curl https://sh.rustup.rs -sSf | sh
  • racer導入
# コード補完ツールっぽい。
cargo +nightly install racer # nightlyのrustをまだ持ってない人は`rustup toolchain add nightly`で入れておく
  • rustfmt導入

没。
現状ではこれはnightly版のRustでしか入らないっぽい?
シンタックスチェックは後述のrust.vimでもできる(というかrust.vimを入れるとrustfmt.vimも入る?)っぽいので現状はそれで代用することにします。

# シンタックスチェックツールっぽい。
cargo install --git 'https://github.com/rust-lang-nursery/rustfmt'
  • rust-src
# コード補完するために必要なrust本体のソースコードっぽい。
rustup component add rust-src
  • rustドキュメント

最新版のドキュメントのリンクは https://github.com/rhysd/rust-doc.vim を参照

wget https://static.rust-lang.org/dist/rust-1.0.0-i686-unknown-linux-gnu.tar.gz
tar xf rust-1.0.0-i686-unknown-linux-gnu.tar.gz
mv rust-1.0.0-i686-unknown-linux-gnu/rust-docs {任意}/
  • rust.vim
[[plugins]]
repo = 'rust-lang/rust.vim'
on_ft = 'rust'
hook_source = '''
    let g:rustfmt_autosave = 1
    let g:rust_doc#define_map_K = 0
'''
  • deoplete-rust

先にdeoplete.nvimは自力で入れておいてください

[[plugins]]
repo = 'sebastianmarkow/deoplete-rust'
on_ft = 'rust'
depends = ['deoplete.nvim']
hook_source = '''
    let g:deoplete#sources#rust#racer_binary='{racerバイナリのフルパス}'
    let g:deoplete#sources#rust#rust_source_path='{$(rustc --print sysroot)/lib/rustlib/src/rust/srcをここに書く}'
    let $RUST_SRC_PATH='{$(rustc --print sysroot)/lib/rustlib/src/rust/srcをここに書く}'
    let g:deoplete#sources#rust#show_duplicates=1
    let g:deoplete#sources#rust#disable_keymap=1
    nmap <buffer> gd <plug>DeopleteRustGoToDefinitionDefault
    nmap <buffer> K  <plug>DeopleteRustShowDocumentation
'''

K: カーソル下の単語のドキュメントを開く
gd: カーソル下の単語の宣言へジャンプ

  • vim-racer
[[plugins]]
repo = 'racer-rust/vim-racer'
on_ft = 'rust'
hook_source = '''
    " racerバイナリ指定
    let g:racer_cmd = '{racerバイナリのフルパス}'
    " rust本体のソースコードパス指定
    let $RUST_SRC_PATH='{$(rustc --print sysroot)/lib/rustlib/src/rust/srcをここに書く}'
'''
  • rust-doc.vim

没。
めちゃくちゃ遅い。
deoplete-rust / vim-racer のドキュメントで十分。

[[plugins]]
repo = 'rhysd/rust-doc.vim'
on_ft = 'rust'
hook_source = '''
    " rustドキュメントのパス指定
    let g:rust_doc#downloaded_rust_doc_dir = '{rustドキュメントのフルパス}'
'''

:RustDoc {検索ワード}

以下のエラーが出た方はこちらの記事へ。

rust-doc-open: Failed to open URL: Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/%{ <-- HERE (.*?)}/ at usr/bin/run-mailcap line 528.^@Couldn't find a suitable web browser!^@Set the BROWSER environment variable to your desired browser.^@Warning: program returned non-zero exit code #1^@/usr/bin/xdg-open: 771: /usr/bin/xdg-open: www-browser: not found^@/usr/bin/xdg-open: 771: /usr/bin/xdg-open: links2: not found^@/usr/bin/xdg-open: 771: /usr/bin/xdg-open: elinks: not found^@/usr/bin/xdg-open: 771: /usr/bin/xdg-open: links: not found^@/usr/bin/xdg-open: 771: /usr/bin/xdg-open: lynx: not found^@/usr/bin/xdg-open: 771: /usr/bin/xdg-open: w3m: not found^@xdg-open: no method available for opening '/home/miyagaw61/docs/rust-docs/share/doc/rust/html/std/vec/index.html'^@

補足

  • この手順で導入したところ、なぜか$HOME/bin/neovim/share/nvim/runtime/autoload/以下にrust.vimとrustfmt.vimがいた所為でdeinを切ってもrust.vimが読まれてしまうという事案が発生しました。 deinでプラグイン管理をしている場合は、削除を推奨します。
  • letで変数にパスを代入する場面が結構あるが、ここに$HOMEなどの環境変数を入れると正常に動作しないらしい。

参考

36
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
22