跳转到内容

格式化器

OpenCode 使用按语言划分的代码格式化器。

OpenCode 会在写入或编辑文件后,自动调用对应语言的格式化器。这可以保证生成的代码遵循项目现有的代码风格。


内置格式化器

OpenCode 内置了多种常见语言和框架的格式化器。下面是格式化器列表、支持的文件扩展名以及所需的命令或配置:

格式化器扩展名要求
gofmt.go系统中可用 gofmt 命令
mix.ex, .exs, .eex, .heex, .leex, .neex, .sface系统中可用 mix 命令
prettier.js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml 等(详见 Prettier 文档package.json 中安装了 prettier 依赖
biome.js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml 等(详见 Biome存在 biome.json(c) 配置文件
zig.zig, .zon系统中可用 zig 命令
clang-format.c, .cpp, .h, .hpp, .ino 等(详见 ClangFormat 文档存在 .clang-format 配置文件
ktlint.kt, .kts系统中可用 ktlint 命令
ruff.py, .pyi系统中可用 ruff 命令,且有对应配置
rustfmt.rs系统中可用 rustfmt 命令
cargofmt.rs系统中可用 cargo fmt 命令
uv.py, .pyi系统中可用 uv 命令
rubocop.rb, .rake, .gemspec, .ru系统中可用 rubocop 命令
standardrb.rb, .rake, .gemspec, .ru系统中可用 standardrb 命令
htmlbeautifier.erb, .html.erb系统中可用 htmlbeautifier 命令
air.R系统中可用 air 命令
dart.dart系统中可用 dart 命令
ocamlformat.ml, .mli系统中可用 ocamlformat 命令,且存在 .ocamlformat 配置文件
terraform.tf, .tfvars系统中可用 terraform 命令
gleam.gleam系统中可用 gleam 命令
nixfmt.nix系统中可用 nixfmt 命令
shfmt.sh, .bash系统中可用 shfmt 命令
oxfmt (实验性).js, .jsx, .ts, .tsxpackage.json 中安装了 oxfmt,并开启了实验性环境变量

例如,如果你的项目在 package.json 中安装了 prettier,OpenCode 就会自动使用它来格式化对应文件。


工作原理

当 OpenCode 写入或编辑文件时,会按照以下步骤工作:

  1. 根据文件扩展名匹配所有已启用的格式化器
  2. 运行匹配到的格式化器命令
  3. 自动应用格式化后的内容

这一切都在后台完成,无需你手动执行格式化命令。


配置

你可以通过 OpenCode 配置中的 formatter 字段来自定义格式化器行为:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"formatter": {}
}

每个格式化器的配置都支持以下字段:

字段类型说明
disabledboolean设为 true 时禁用该格式化器
commandstring[]运行格式化器时使用的命令
environmentobject运行格式化器时设置的环境变量
extensionsstring[]该格式化器负责处理的文件扩展名

下面是一些配置示例。


禁用格式化器

全局禁用所有格式化器,可以将 formatter 设为 false

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"formatter": false
}

禁用某个特定格式化器,可以在对应项中设置 disabled: true

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"formatter": {
"prettier": {
"disabled": true
}
}
}

自定义格式化器

你可以覆盖内置格式化器的行为,或者增加新的格式化器,通过 commandenvironmentextensions 进行配置:

opencode.json
{
"$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"]
}
}
}

命令中的 $FILE 占位符 会在执行时被替换为当前要格式化的文件路径。