Vim ではじめる Rust 1.0

Rust は 1.0.0beta が4月の頭にリリースされ,現在 1.0.0beta5 で 5/15 に 1.0.0 正式版がリリース予定です.

リリース間近であるのと,C++ をやっていた人はとっつきやすいとかデザインが良いというウワサを聞いて少し試してみていて,Vim の環境も少し整えたのでメモがてら書きます.

「こういうのもあるよ」とかあれば是非教えて下さい.

Rust のインストール

本家サイト にあるバイナリをインストールします.解凍して スクリプト一発でいけます.Mac だと Homebrew でも入れられるようです.

Vim の準備

シンタックスハイライト,インデントなど

GitHub の rust-lang organization に公式の Vim 用ファイルタイププラグインがあります.

https://github.com/rust-lang/rust.vim

これをインストールするだけでシンタックスハイライトやインデントは OK です.

補完

Racer という Rust の補完エンジンがあり,リポジトリ直下の plugin ディレクトリに Vim 用のスクリプトがあるため,Racer のリポジトリ root に runtimepath を通せばプラグインとして使えます.cargo build --release でビルドしておく必要があります.

https://github.com/phildawes/racer

補完したい箇所でオムニ補完 <C-x><C-o> を使えるようになります. ただ,僕が試したときは 1.0.0beta5 ではまだ使えませんでした.

フォーマッタ

Rust のフォーマッタはまだ無いようです.RFCにはすで出ているようですが,まだ議論が進んでいないようです. Go の gofmt のようなものが標準でほしいところです.

  • 追記(5/31)

rustfmt というフォーマッタが開発中のようです.

ドキュメント

Rust のビルドシステムかつパッケージマネージャな Cargo は開発中のプロジェクトのドキュメントや依存関係にあるパッケージのドキュメントを html で生成できます. しかし,生成したドキュメントを検索する良い方法はまだ無いようです.(一応こちらもRFCにはすでに要望が出ているみたいです.)

さすがにドキュメントはさっと開けないと面倒だなと思ったので,Vim からさっと開けるプラグインを作りました.

https://github.com/rhysd/rust-doc.vim

cargo doc でドキュメントを生成した後であれば :RustDoc コマンドや K マッピングでドキュメントを開けます.あと,unite.vim で絞り込み検索もできます.

追記(5/18) cargo で管理していないソースコードでも使えるようになりました(標準ライブラリなどのドキュメント)

シンタックスチェック

ファイル保存時にシンタックスチェックを走らせます. 上記の rust.vim には既に syntastic 用のシンタックスチェッカーがあるのでそれを使えば良いようです. vim-watchdogs や自力で設定したい場合は rustc -Zparse-only {file}シンタックスチェックができるようです.

Vim 設定まとめ

ここまでを踏まえて,とりあえず僕がやった設定はこんな感じです.

augroup MyVimrc
    autocmd!
augroup END

" ...

" neobundle.vim でインストール
NeoBundle 'rust-lang/rust.vim'
NeoBundleLazy 'phildawes/racer', {
        \   'build' : {
        \     'mac'  : 'cargo build --release',
        \     'unix' : 'cargo build --release',
        \   },
        \   'autoload' : {
        \     'filetypes' : 'rust',
        \   },
        \ }
NeoBundle 'rhysd/rust-doc.vim'

" ...

" racer の設定
let $RUST_SRC_PATH = expand('~/Dev/github.com/rust-lang/rust/src')

" :QuickRun でファイル保存時にシンタックスチェック
let g:quickrun_config = get(g:, 'quickrun_config', {})
let g:quickrun_config['syntax/rust'] = {
            \   'command' : 'rustc',
            \   'cmdopt' : '-Zparse-only',
            \   'exec' : '%c %o %s:p',
            \   'outputter' : 'quickfix',
            \ }
autocmd MyVimrc FileType BufWritePost *.rs QuickRun -type syntax/rust

チュートリアル

Vimチュートリアルをやりまくります.把握できているドキュメントは以下です.上から順にやると良さそう(?)

  • rustbyexample :「猫でもできる C」 の rust 版みたいなもの.各構文のコード例が載ってます.直接コードを編集してその場で実行できるので,とりあえずこれでざっと構文を眺めます.
  • Learn Rust :Guessing Game や Dining Philosophers を使ったチュートリアル.Cargo の基本的な使い方も学べます.
  • Syntax and Semantics :rustbyexample よりも詳しい構文やセマンティクスの説明.
  • Rust for RubyistRuby ユーザ向けの Rust 入門らしい.まだやってないですがやる予定です.
  • Rust for C++ Programmer C++ ユーザ向け Rust 入門らしい.まだやってないですがやる予定です.

この他にも Effective Rust などの進んだ内容のドキュメントもあるようです.

僕自身はまだ Syntax and Semantics をぼちぼち見ている感じです. 新しい言語の勉強をする時は vim-quickrun がとても便利で,その場で書いたコードを実行できます.デフォルトで rust にも対応しています.