rustfmtはRustのコードフォーマッターだ。TOMLファイルを使用してフォーマッティングの設定を行うことができる。この記事では、rustfmtのおすすめの設定方法やVSCodeからの呼び出し方法などを記す。

インストール・実行方法

rustup経由でインストールする場合は、以下のコマンドが使用できる。

$ rustup component add rustfmt --toolchain nightly

いくつかの便利な機能はnightlyが必要になるので、toolchainにnightlyを指定することをおすすめする。VSCodeを使っている場合は、rust-analyzerの拡張機能をインストールすれば一緒にインストールされるので上記のコマンドは必要ない。

コード整形の実行には、下記のコマンドを使用する。コマンドを直接実行しなくても、後述のエディタの設定によって自動でコード整形することができるので、あまり実行する機会はないかもしれない。CI等でフォーマット検査だけしたい場合は、--checkオプションを使用すると良い。

$ cargo +nightly fmt
$ cargo +nightly fmt --check

TOMLファイルで挙動を設定

設定できる項目の一覧はrustfmtのドキュメントから確認することができる。プロジェクトディレクトリに.rustfmt.tomlrustfmt.tomlを配置することでフォーマッティングの設定ができる。以下は僕のおすすめの設定例だ。

unstable_features = true

imports_granularity = "Crate"
group_imports = "StdExternalCrate"
reorder_impl_items = true
condense_wildcard_suffixes = true
format_code_in_doc_comments = true
format_macro_matchers = true
format_strings = true

上記のファイル内で明示的に記述されていない項目はデフォルト値が使用される。ここでは、いくつかの項目について説明をしておこうと思う。まず、unstable_featuresはnightlyを必要とする設定項目を有効化するために必要だ(--unstable-featuresオプションをコマンド実行時に指定することでも有効化できる)。

imports_granularityは、importのまとめ方に関する項目で、Crateを指定すると、例えば以下のようにcrate毎にいい感じにuse文をまとめてくれる。

use std::{
    error::Error,
    io::{BufReader, Write},
    process::{Command, Stdio},
};
use clap::{Args, Parser, Subcommand};

imports_granularity = "Crate" を指定した際のフォーマット例

VSCode / Cursorで使用する

VSCodeやCursorで利用する場合は、rust-analyzer経由で利用すると良い。フォーマット以外にも、Warningや型情報を表示してくれたりするためRustのコーディングをする際には非常に便利だ。エディタのExtensionsタブから、「rust-analyzer」で検索してインストールできる。デフォルトの設定では、ファイルのセーブ時に自動でフォーマットがかけられる。

nightlyの機能をエディタで使用する

エディタの自動フォーマット時にnightlyが必要な機能を使用したい場合は、追加で設定が必要になる。具体的には、プロジェクトのルートディレクトリに.vscode/settings.jsonを作成して以下の設定を追加する。

{
    "rust-analyzer.rustfmt.extraArgs": [
        "+nightly"
    ],
}

これで、rustfmt.tomlでnightlyの機能をオンにしていてもエディタ上で使用することができるようになった。