根本原因是Sublime进程未将项目根目录设为working_dir,导致rustfmt无法找到.rustfmt.toml;必须在Build System中显式配置"working_dir":"${project_path:${folder}}",并确保已保存项目,否则${project_path}为空而退化为错误路径。

Sublime Text 里 rustfmt 不读 .rustfmt.toml 怎么办
根本原因不是配置文件写错了,而是 Sublime 进程压根没把项目根目录当工作目录,导致 rustfmt 启动时找不到 .rustfmt.toml。即使文件存在且语法正确,rustfmt 默认只在当前工作目录或向上逐级查找,而 Sublime 的构建/格式化命令默认工作路径可能是单个 .rs 文件所在目录,而非 Cargo.toml 所在处。
必须显式指定 working_dir:
- 在构建系统(Build System)JSON 中加
"working_dir": "${project_path:${folder}}"—— 这是关键,不是可选 - 确保你已用
Project → Save Project As…保存过项目,否则${project_path}为空,会退化成${folder},仍可能错位 - 如果只是打开单个文件没建项目,
rustfmt就不会加载项目级配置,只能靠全局--config参数硬指定
想跳过某段代码不被 rustfmt 格式化
Rust 官方支持两种注释标记,rustfmt 能识别,但前提是格式化命令调用的是 rustfmt 本体(不是通过 cargo fmt 封装后丢参数),且未启用 --skip-children 类破坏性选项。
- 整块忽略:在代码块前后加
// rustfmt::skip注释(注意是双冒号) - 单行忽略:在行尾加
// rustfmt-ignore - 注意:这些标记对
cargo fmt也生效,但如果你用的是 LSP 插件(如 rust-analyzer)触发的格式化,得确认它底层调用的是rustfmt而非自己的 formatter - 别写成
// rustfmt-skip或// fmt::skip——拼错就无效
Sublime 里自定义 rustfmt 参数强制忽略规则
多数 Sublime Rust 插件(如 RustEnhanced、LSP)允许传参给 rustfmt,但字段名和位置差异大,容易漏配。
- 如果是 RustEnhanced:在
Packages/User/RustEnhanced.sublime-settings里加"rustfmt_args": ["--config", "max_width=120", "--skip-children"]—— 注意--config后面不能跟等号,值要单独作为数组项 - 如果是 LSP + rust-analyzer:在 LSP 设置中配
"rust-analyzer.rustfmt.extraArgs",例如["--config-path", ".rustfmt.toml"],路径必须是相对项目根的,不能用~或环境变量 - 绝对路径配置更稳:比如
["--config-path", "/full/path/to/.rustfmt.toml"],避免路径解析歧义 - 不要混用
--config和--config-path:前者是内联键值,后者指配置文件,二者互斥
为什么改了 .rustfmt.toml 还没效果
常见假象:文件存了、Sublime 没报错、代码看着也没变——其实 rustfmt 根本没加载它。
- 先验证
rustfmt是否真读到了配置:终端进项目根,运行rustfmt --print-config default > test.toml,再对比.rustfmt.toml是否被合并进去 - Sublime 控制台里跑
import subprocess; subprocess.run(['rustfmt', '--version']),确认调用的是你预期的那一个(比如不是旧版或 alias) - 某些插件(如老版 RustAutoComplete)根本不走
rustfmt,而是调racer或自己实现简易格式化,这类情况加.rustfmt.toml完全无效 - macOS 上若用 M1/M2 芯片,检查
rustfmt是不是 aarch64 架构二进制——x86_64 版本在 Rosetta 下可能跳过部分配置解析
rustfmt 实际执行时的工作目录和参数上,而不是 Sublime 界面里点了几下设置。路径、权限、架构、调用链——漏掉任意一环,.rustfmt.toml 就只是个普通文本文件。


















