Rustをはじめよう！ Rustの環境構築 Atom & SublimeText

この記事は [Rustアドベントカレンダー](http://qiita.com/advent-calendar/2015/rust-lang)5日目の記事です。

Rustはバージョンがまだ1ではなかった頃、破壊的仕様変更が何度も繰り返されてきましたが、バージョン1になり、だいぶ落ち着いてきました。
過去の破壊的変更からRustに恐怖心を抱いている？方もいるかもしれませんが、Rustこわくないよ！とまず最初に言っておこうと思います！

Rustこわくないよ！

## Rustの開発のキホン
Rustでの開発は、`rustc` コマンドによってビルドすることも出来ますが、基本的には `cargo` コマンドでビルドやテストを行い、開発を勧めます。

```bash
cd /path/to/ # 好きなディレクトリを指定
cargo new hoge
```

Rustは `cargo` コマンドで `cargo new <プロジェクト名>` を実行するだけで、簡単にプロジェクトフォルダが、作成されます。

```bash
cd hoge
```

あとは、ディレクトリに潜り、`cargo test` とするだけで、簡単にビルド&テストが可能です。ただ、`cargo new <プロジェクト名>` ですと、cargoのライブラリを作成するためのテンプレートが用意されるので、`cargo run` することが出来ません。簡単なプログラムを作りたいときは、

```bash
cargo new --bin <プロジェクト名>
cd <プロジェクト名>
cargo run
# => Hello, world!
```

とすると良いでしょう。
では、これを踏まえて、[Atom](https://atom.io/) による開発環境の構築を行いましょう。

## Atomによる開発環境構築

### 1. Atomのダウンロード
[ここ](https://atom.io/)から、Atomをダウンロードし、インストールします。

### 2. apmで必要なパッケージのインストール

```bash
apm install language-rust
apm install racer
apm install linter
apm install linter-rust
apm install build
apm install build-cargo
apm install atom-ctags
```

Atomをインストールすると、apmコマンドがターミナルで使用できるようになるので、これらのパッケージをインストールします。インストール後、必ずAtomは再起動させてください。

### 3. Rustのソースのダウンロード
`racer` というパッケージは、Rustのコマンド候補を表示させるための機能を持っていて、コマンド候補の元データとして、Rustのソースディレクトを必要とします。

```bash
cd /path/to/ # 好きなディレクトリを指定
wget https://static.rust-lang.org/dist/rustc-1.4.0-src.tar.gz
tar xzvf rustc-1.4.0-src.tar.gz
rm -f rustc-1.4.0-src.tar.gz
```

解凍まで終わったら、`~/.bashrc` に

```bash
export RUST_SRC_PATH=/path/to/rustc-1.4.0/src
```
を追加します。`/path/to/`の部分は、rustcのソースファイルの場所に置き換えてください。また、Rustのバージョンが新しくなっているかもしれないので、[公式サイト](https://www.rust-lang.org/) にいって確認をおすすめします。

設定が終わったら、

```bash
source ~/.bashrc
```
`~/.bashrc` を読み込みます。

### 4. racerを入れる
racerは、実体としては実行ファイルになっていて、apmのパッケージのracerがこの実行ファイルを呼び出すような仕組みになっています。

```bash
cargo install racer
```

インストールが終わったら、正しく動いているのかを確認するために

```bash
racer complete std::io::B
```
を実行します。うまく実行できない場合は `RUST_SRC_PATH` がうまく設定されていない可能性があります。

続いて、Atomからracerを使う設定になります。

Atomからは

```
Preferences > Packages > racer > Settings
```
の順に開いてください。`Settings` が表示されていないときは一旦Atomを再起動してみてください。

設定は、`Path to the Racer executable` に racerへのフルパスと、`Path to the Rust source code directory` Rustのソースディレクトリのフルパスを入れます。

エディタに戻って `pri` まで打って `println` 等がでてきたら成功です。

### 5. Linterを入れる
Linterは、syntaxに間違いがあると、すぐにエラー表示してくれて間違いに気付きやすくなるので便利です。

最初に `apm install` でlinterはインストール済みなので、特に特別な設定はする必要はありません。

### 6. Buildする
最初に `apm install` で `build` と `build-cargo` をインストールしたことによって、Atom上からbuild実行が出来るようになっています。

`Shift` + `Ctrl(Cmd)` + `P` を押してコマンドパレットを開き、
`build select` と打つと、ひとつのコマンドがサジェストされるので、エンターを押します。

ここで、ビルドターゲットを選択できるので `cargo run` を選択します。(lib.rsの場合は `cargo test` を選択します)

後は、`Alt` + `Ctrl(Cmd)` + `B` を押すことで、ビルドを行う事が出来ます。

### 7. ctagsを使う

ctagsは、メソッドや構造体が宣言されている行に `Ctrl(Cmd)+R` でジャンプすることが出来る便利な機能です。これは、`atom-ctags` の機能ですが、Rustはデフォルトでは、この機能を使用することが出来ません。

`.ctags` ファイルを編集する必要があります。

```
Preferences > Open Config Folder
```

から、Config フォルダをAtomで開きます。
`Ctrl(Cmd) + P` を押して、`.ctags` と入力しエンターを押します。

```
--langdef=Rust
--langmap=Rust:.rs
--regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/
--regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/
--regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/
--regex-Rust=/^[ \t]*(pub[ \t]+)?(static|const)[ \t]+(mut[ \t]+)?([a-zA-Z0-9_]+)/\4/c,consts,static constants/
--regex-Rust=/^[ \t]*(pub[ \t]+)?(unsafe[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\3/t,traits,traits/
--regex-Rust=/^[ \t]*(pub[ \t]+)?(unsafe[ \t]+)?impl([ \t\n]*<[^>]*>)?[ \t]+(([a-zA-Z0-9_:]+)[ \t]*(<[^>]*>)?[ \t]+(for)[ \t]+)?([a-zA-Z0-9_]+)/\5 \7 \8/i,impls,trait implementations/
--regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/
```

をコピーして貼り付けます。

rustプロジェクトが開かれているAtomウィンドウへ戻り、`Shift + Ctrl(Cmd) + P` を押して、`ctags rebuild` と入力してエンターを押します。

これで、メソッドジャンプが可能になりました。

これで、AtomによるRustの開発環境構築は終わりです。
これで、Rust言語による開発が楽にできるようになりました。
続いて、SublimeTextによる開発環境構築になります。

## SublimeTextによる開発環境の構築

Atom同様、racerのインストールと、Linterのインストールなどになります。


### 1. SublimeTextのダウンロード
SublimeTextは有料ソフトウェアなので、ライセンスの購入を行いましょう。試用期間もあるので、無償で試すことも出来ます。

### 2. パッケージのインストール

SublimeTextを起動し、`Shift + Ctrl(Command) + P` を押したあと、`install` と入力し、エンターを押します。
これを繰り返して下記のパッケージをインストールします。

```
Rust
RustAutoComplete
SublimeLinter
SublimeLinter-contrib-rustc
```


### 3. Rustのソースのダウンロード
`racer` というパッケージは、Rustのコマンド候補を表示させるための機能を持っていて、コマンド候補の元データとして、Rustのソースディレクトを必要とします。

```bash
cd /path/to/ # 好きなディレクトリを指定
wget https://static.rust-lang.org/dist/rustc-1.4.0-src.tar.gz
tar xzvf rustc-1.4.0-src.tar.gz
rm -f rustc-1.4.0-src.tar.gz
```

解凍まで終わったら、`~/.bashrc` に

```bash
export RUST_SRC_PATH=/path/to/rustc-1.4.0/src
```
を追加します。`/path/to/`の部分は、rustcのソースファイルの場所に置き換えてください。また、Rustのバージョンが新しくなっているかもしれないので、[公式サイト](https://www.rust-lang.org/) にいって確認をおすすめします。

設定が終わったら、

```bash
source ~/.bashrc
```
`~/.bashrc` を読み込みます。

### 4. racerを入れる
racerは、実体としては実行ファイルになっていて、`RustAutoComplete` が racer を呼び出すような仕組みになっています。

```bash
cargo install racer
```
インストールが終わったら、正しく動いているのかを確認するために

```bash
racer complete std::io::B
```
を実行します。うまく実行できない場合は `RUST_SRC_PATH` がうまく設定されていない可能性があります。

続いて、SublimeTextからracerを使う設定になります。

SublimeTextからは、

```
Preferences > Package settings > RustAutoComplete > Settings - User
```

からユーザー設定ファイルを開いてください。

設定は、JSONに似たフォーマットになっているので

```js
{
  // The full path to the racer binary. If racer is already
  // in your system path, then this default will be fine.
  "racer": "/path/to/racer",

  // A list of search paths. This should generally just
  // be the path to the rust compiler src/ directory.
  "search_paths": [
    "/path/to/rustc-1.4.0/src"
  ]
}

```

racerのフルパスと、rustのソースファイルの置かれているディレクトリのフルパスを指定します。/path/to/ は置き換えてください。
Macの場合 `/Users/<User>/.cargo/bin/racer` にあります。

エディタに戻って `pri` まで打って `println` 等がでてきたら成功です。

### 5. Linterを入れる
Linterは、syntaxに間違いがあると、すぐにエラー表示してくれて間違いに気付きやすくなるので便利です。

SublimeTextではそのままではうまくLinterは動かないため、設定を行う必要があります。

```
Preferences > Package settings > SublimeLinter > Settings - User
```

開かれた設定ファイルにすでに `user > linters` の欄に `rust` の項目があるともいますが、そこを下記のように変更します。

```
"rust": {
    "@disable": false,
    "args": [],
    "crate-root": null,
    "excludes": [],
    "use-cargo": true,
    "use-crate-root": false
}
```

デフォルトだと、 `cargo` を使用しない設定になっているので、cargoで管理されている依存関係のあるライブラリがうまく認識できないため、このようにします。

SublimeTextは、これで開発環境の構築が完了です。
エディタ経由でのビルドも可能ですが、便利というわけではないので、
ターミナル経由で実行するのをおすすめします。

### 6. rustfmt を入れる(2015-12-18追記)

[rustfmt](https://github.com/rust-lang-nursery/rustfmt) は、rustのフォーマットを自動的に修正してくれる便利なツールです。Rust1.5からcargo に `cargo install` という機能が追加されたので、インストールもとても簡単に行える様になりました。

```rust
cargo install rustfmt
```

たったこれだけです。簡単ですね。

```bash:Macの場合
/Users/<USERNAME>.cargo/bin
```

インストールが終わると、上記の環境変数をexportするように言われるので、 `~/.bashrc` にPATHを追加しておきます。

このrustfmtを、SublimeTextでは簡単に使用することができるプラグインが用意されています。

[BeautifyRust](https://packagecontrol.io/packages/BeautifyRust)

このプラグインを、SublimeText上でインストールし、

```
Preferences > Package settings > BeautifyRust > Settings - User
```

まで遷移し、設定ファイルを開き下記のように入力します。

```
  {
    "run_on_save": true,
    "rustfmt": "/Users/<USERNAME>.cargo/bin/rustfmt"
  }
```

パスが通っている場合は、必要ないかもしれません。
こうすることによって、rustのファイルを保存するタイミングで、コードが自動的に整形されます。


## 最後に

この記事ではAtomとSublimeTextによる開発環境の構築方法を紹介しました。Rustは、言語自体にパッケージ管理システムが組み込まれていてとても便利だと感じています。ちょっとしたツールを作ってみたりするのに、Rustはとてもお手軽で、ビルドするととても小さい実行形式が出来るのでそれをそのままcronに乗せて動かしたりしています。

それでは2015年最後のRustをお楽しみください！

[Rustアドベントカレンダー 2015](http://qiita.com/advent-calendar/2015/rust-lang)