Rust入門 for Vimmer

構成の候補としては、

**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導入

```bash
curl https://sh.rustup.rs -sSf | sh
```

- racer導入  

```bash
# コード補完ツールっぽい。
cargo +nightly install racer # nightlyのrustをまだ持ってない人は`rustup toolchain add nightly`で入れておく
```

- rustfmt導入

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

```bash
# シンタックスチェックツールっぽい。
cargo install --git 'https://github.com/rust-lang-nursery/rustfmt'
```

- rust-src

```bash
# コード補完するために必要なrust本体のソースコードっぽい。
rustup component add rust-src
```

- rustドキュメント

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

```bash
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

```bash
[[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は自力で入れておいてください

```bash
[[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

```bash
[[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 のドキュメントで十分。

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

:RustDoc {検索ワード}

以下のエラーが出た方は[こちら](https://qiita.com/miyagaw61/items/48d45d3176469d665f2a)の記事へ。

```
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などの環境変数を入れると正常に動作しないらしい。

# 参考

- » プログラミング言語Rust https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/
- » 気付いたらRustの環境構築がかなり楽になってた | κeenのHappy Hacκing Blog http://keens.github.io/blog/2016/12/29/kizuitararustnokankyoukouchikugakanarirakuninatteta/
- » プログラミング言語Rustはじめてみる | ぬわーーーーーーー！！！ https://yoheikoga.github.io/2017/04/04/start-rust-lang/
- » VimにRust開発用の設定入れる - Qiita https://qiita.com/hinagishi/items/f43538ce8120e483077e
- » Rustでコード補完（Windowsにracer, vim-racer導入) - Read -> Blog http://codom.hatenablog.com/entry/2017/07/29/203348
- » Rust開発の環境設定 https://skoji.jp/blog/2017/05/rust-env.html
- » Vim ではじめる Rust 1.0 - はやくプログラムになりたい http://rhysd.hatenablog.com/entry/2015/05/15/212054
- » Rust入門 - 開発環境構築 - 無理なご乗車はおやめ下さい。 http://tydk27.hatenadiary.com/entry/20160713/1468416790