SpacemacsでRust開発環境をあげる

[Spacemacs](https://github.com/syl20bnr/spacemacs)で、Rustのそれなりの開発環境を立ち上げてみます。

※ 記事中の `SPC` は Emacsキースタイルを使っている人は `M-m` に読み替えてください。

## Rust まわりのツールチェインのインストール

### rustup

rustのインストールを管理してくれる、[rustup](https://github.com/rust-lang-nursery/rustup.rs) (rbenvみたいなの)を入れます。

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

これで基本のツール(rustc, cargo など)は入ります。

MacだとHomebrewでもrustは入りますが、色々考えるとrustupのほうがお得そうです。（Homebrewでrustupが入るようになると一番いいですね。）

`cargo install` コマンドでインストールしたツールにパスが通るようにシェルに追加しましょう。

```console
$ echo 'source $HOME/.cargo/env' >> ~/.profile
```

### rustfmt

[Rustのソースコードフォーマッタであるrustfmt](https://github.com/rust-lang-nursery/rustup.rs)を入れます。

```console
$ cargo install rustfmt
```

### racer

![image](https://qiita-image-store.s3.amazonaws.com/0/9619/7f1cb76c-cb87-a585-8e43-9b39a714b50f.png)

[Rustのコード補完ツールであるracer](https://github.com/rust-lang-nursery/rustup.rs)を入れます。

```console
$ # 本体インストール
$ cargo install racer
$ # racerのためにRustのソースコードを追加
$ rustup component add rust-src
$ # パスの確認
$ echo ~/.multirust/toolchains/*/lib/rustlib/src/rust/src
/Users/owner/.multirust/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/src
$ # パスを追加
$ echo "export RUST_SRC_PATH='$(echo ~/.multirust/toolchains/*/lib/rustlib/src/rust/src)'" >> ~/.profile
$ # インストールチェック
$ bash -l
$ racer complete std::io::B
MATCH BufReader,46,11,/Users/owner/.multirust/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/src/libstd/io/buffered.rs,Struct,pub struct BufReader<R>
MATCH BufWriter,298,11,/Users/owner/.multirust/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/src/libstd/io/buffered.rs,Struct,pub struct BufWriter<W: Write>
MATCH BufRead,1198,10,/Users/owner/.multirust/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/src/libstd/io/mod.rs,Trait,pub trait BufRead: Read
MATCH Bytes,1588,11,/Users/owner/.multirust/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/src/libstd/io/mod.rs,Struct,pub struct Bytes<R>
```

## Emacs側のインストール

1. まずはSpacecmacsを入れましょう。
2. `~/.spacemacs` にRustレイヤー追加しましょう。

```lisp:~/.spacemacs
   ;; List of configuration layers to load.
   dotspacemacs-configuration-layers
   '(
     ;; ----------------------------------------------------------------
     ;; Example of useful layers you may want to use right away.
     ;; Uncomment some layer names and press <SPC f e R> (Vim style) or
     ;; <M-m f e R> (Emacs style) to install them.
     ;; ----------------------------------------------------------------

     ;; (... いろいろ...)
     rust

     )

```
3. Emacsを再起動するか、 `SPC(or M-m) f e R` を押してリロードさせましょう。

## 各種機能のチェック

Hello worldプロジェクトを使って [各種機能](https://github.com/syl20bnr/spacemacs/tree/master/layers/%2Blang/rust) の動作を確認します。

### プロジェクトの新規作成

```console
$ cargo new --bin hello
```

上記コマンドでもできるのですが、せっかくなのでEmacsからやってみましょう。

上記と同じようにプロジェクトを作るには、 `M-x cargo-process-new` でOKです。

![image](https://qiita-image-store.s3.amazonaws.com/0/9619/013f42a0-131e-82d2-6321-608564017e0c.png)

1. プロジェクト名: `hello`
2. binプロジェクトか?: `yes`

ただ、普通にコマンドラインから作成で十分ですね。

### 文法チェック (flycheck)

`*.rs` ファイルで編集・保存していれば勝手に文法チェックが行われますが、 `C-c ! ` + `次のキー` にて明示的に文法チェッカ（[flycheck](https://github.com/flycheck/flycheck)） の機能を呼ぶことができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/9619/5fc175a7-58d9-f7e4-770c-c7a1419c0048.png)

ここでは　`C-c ! l` でエラーの一覧を出してみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/9619/68fe766f-02fe-f5f5-5cad-5fe3f1b8623e.png)


### 補完機能 (racer + [emacs racer](https://github.com/racer-rust/emacs-racer))

変数に型の情報があれば、普通に補完がでてきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/9619/79585a64-05a4-d1b6-085a-a694a7266c85.png)

ほか下記の機能があります。

```
M-. 定義へジャンプ
M-, 定義からバック
M-x racer-describe 定義を別バッファに表示
```

### ソースコードフォーマッティング (rustfmt)

`M-RET =` でフォーマットできます。


### cargo

`cargo`　コマンドでプログラムを実行してみましょう。

`SPC m c x`でmainを実行することができます。

```
-*- mode: cargo-process; default-directory: "~/.emacs.d/.cache/junk/2016/11/hello/src/" -*-
Cargo-Process started at Tue Nov 29 13:02:59

cargo run
    Blocking waiting for file lock on build directory
   Compiling hello v0.1.0 (file:///Users/owner/.emacs.d/.cache/junk/2016/11/hello)
    Finished debug [unoptimized + debuginfo] target(s) in 0.46 secs
     Running `/Users/owner/.emacs.d/.cache/junk/2016/11/hello/target/debug/hello`
Hello world

Cargo-Process finished at Tue Nov 29 13:02:59
```

ほかユニットテストの実行などもサポートしているようです。 ( `SPC m c` + `次のキー` )

![image](https://qiita-image-store.s3.amazonaws.com/0/9619/e89ab2f1-aa02-fdab-d614-34ea3a85b657.png)