OpenCode 会在文件被写入或编辑后,自动使用语言特定的 formatter(格式化器)对文件进行格式化。这可以确保生成的代码符合你项目的 code style(代码风格)。
Built-in(内置格式化器)
OpenCode 内置了多种常见语言和框架的 formatter。下面列出了 formatter 名称、支持的文件扩展名(file extensions),以及所需的命令或配置要求。
| Formatter | Extensions | Requirements |
|---|---|---|
| gofmt | .go | 系统中可用 gofmt command |
| mix | .ex, .exs, .eex, .heex, .leex, .neex, .sface | 系统中可用 mix command |
| prettier | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml,以及 more | package.json 中存在 prettier dependency |
| biome | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml,以及 more | 存在 biome.json(c) config file |
| zig | .zig, .zon | 系统中可用 zig command |
| clang-format | .c, .cpp, .h, .hpp, .ino,以及 more | 存在 .clang-format config file |
| ktlint | .kt, .kts | 系统中可用 ktlint command |
| ruff | .py, .pyi | 系统中可用 ruff command 并且带有 config |
| rustfmt | .rs | 系统中可用 rustfmt command |
| cargofmt | .rs | 系统中可用 cargo fmt command |
| uv | .py, .pyi | 系统中可用 uv command |
| rubocop | .rb, .rake, .gemspec, .ru | 系统中可用 rubocop command |
| standardrb | .rb, .rake, .gemspec, .ru | 系统中可用 standardrb command |
| htmlbeautifier | .erb, .html.erb | 系统中可用 htmlbeautifier command |
| air | .R | 系统中可用 air command |
| dart | .dart | 系统中可用 dart command |
| ocamlformat | .ml, .mli | 系统中可用 ocamlformat command 且存在 .ocamlformat config file |
| terraform | .tf, .tfvars | 系统中可用 terraform command |
| gleam | .gleam | 系统中可用 gleam command |
| nixfmt | .nix | 系统中可用 nixfmt command |
| shfmt | .sh, .bash | 系统中可用 shfmt command |
| oxfmt(Experimental) | .js, .jsx, .ts, .tsx | package.json 中存在 oxfmt dependency,并且启用了 experimental env variable flag |
因此,如果你的项目在 package.json 中包含 prettier,OpenCode 就会自动使用它。
How it works(工作原理)
当 OpenCode 写入或编辑一个文件时,会执行以下流程:
- 根据文件扩展名(file extension),检查所有已启用的 formatters。
- 对匹配的 formatter 执行对应的 command。
- 自动应用格式化后的修改。
整个过程会在后台完成,无需任何手动操作,即可保证代码风格的一致性。
Configure(配置)
你可以通过 OpenCode config 中的 formatter 配置段来自定义 formatter。
json title="opencode.json"
{
"$schema": "https://opencode.ai/config.json",
"formatter": {}
}
每个 formatter 配置支持以下字段:
| Property | Type | Description |
|---|---|---|
disabled |
boolean | 设置为 true 时禁用该 formatter |
command |
string[] | 执行格式化的 command |
environment |
object | 运行 formatter 时设置的环境变量 |
extensions |
string[] | 该 formatter 需要处理的文件扩展名 |
下面来看几个示例。
Disabling formatters(禁用格式化器)
如果你想 全局禁用所有 formatter,可以将 formatter 设置为 false:
{ “$schema”: “https://opencode.ai/config.json“, “formatter”: false }
如果你只想禁用 某一个 formatter,可以将其 disabled 设置为 true:
{ “$schema”: “https://opencode.ai/config.json“, “formatter”: { “prettier”: { “disabled”: true } } }
Custom formatters(自定义格式化器)
你可以通过指定 command、environment variables(环境变量)以及 file extensions,来覆盖内置 formatter 或新增 formatter:
{ “$schema”: “https://opencode.ai/config.json“, “formatter”: { “prettier”: { “command”: [“npx”, “prettier”, “—write”, “$FILE”], “environment”: { “NODE_ENV”: “development” }, “extensions”: [“.js”, “.ts”, “.jsx”, “.tsx”] }, “custom-markdown-formatter”: { “command”: [“deno”, “fmt”, “$FILE”], “extensions”: [“.md”] } } }
其中,command 中的 $FILE 占位符(placeholder) 会在运行时被替换为当前正在格式化的文件路径(path)。
