OpenCode 除了能帮开发者生成和修改代码,还悄悄内置了一套"代码美容"系统------语言格式化器。这套机制能在文件写入或编辑后自动整理格式,让代码风格始终保持一致。不过它默认是关闭的,需要手动在配置里打开才会生效。

内置了哪些语言的格式化器
OpenCode 本身就支持一大批常见语言和框架的格式化工具,只要本地环境满足对应的命令或配置文件,就能直接使用。下面这张表把每个格式化器对应的文件后缀和前置要求都理清楚了:
- air :处理
.R文件,需要系统里能调用air命令。 - biome :覆盖
.js,.jsx,.ts,.tsx,.html,.css,.md,.json,.yaml等,要求项目中存在biome.json或biome.jsonc配置。 - cargofmt :针对
.rs文件,要求cargo fmt命令可用。 - clang-format :处理
.c,.cpp,.h,.hpp,.ino等,需要有一份.clang-format配置文件。 - cljfmt :格式化
.clj,.cljs,.cljc,.edn,要求能运行cljfmt。 - dart :适用于
.dart,依赖dart命令。 - dfmt :处理
.d文件,需要dfmt命令。 - gleam :针对
.gleam,依赖gleam命令。 - gofmt :处理
.go,依赖gofmt。 - htmlbeautifier :用于
.erb和.html.erb,需要htmlbeautifier命令。 - ktlint :覆盖
.kt和.kts,要求ktlint命令可用。 - mix :处理
.ex,.exs,.eex,.heex,.leex,.neex,.sface,依赖mix命令。 - nixfmt :针对
.nix,需要nixfmt命令。 - ocamlformat :适用于
.ml和.mli,除了需要ocamlformat命令,还要求有.ocamlformat配置文件。 - ormolu :处理
.hs,依赖ormolu命令。 - oxfmt(实验性) :格式化
.js,.jsx,.ts,.tsx,需要package.json中含有oxfmt依赖,并设置一个实验性的环境变量开关。 - pint :针对
.php,要求composer.json中包含laravel/pint依赖。 - prettier :覆盖
.js,.jsx,.ts,.tsx,.html,.css,.md,.json,.yaml等,需要package.json里有prettier依赖。特别说明一下,一旦启用了格式化功能,如果项目里装了 Prettier,OpenCode 会优先用 Prettier 来处理能匹配上的文件。 - rubocop :处理
.rb,.rake,.gemspec,.ru,需要rubocop命令可用。 - ruff :针对
.py和.pyi,要求ruff命令可用并带有相应配置。 - rustfmt :处理
.rs,依赖rustfmt命令。 - shfmt :用于
.sh和.bash,需要shfmt命令。 - standardrb :覆盖
.rb,.rake,.gemspec,.ru,依赖standardrb命令。 - terraform :处理
.tf和.tfvars,需要terraform命令。 - uv :针对
.py和.pyi,要求uv命令可用。 - zig :覆盖
.zig和.zon,需要zig命令。
从这份列表能看出,OpenCode 已经照顾到了从系统编程、前端开发到数据科学等众多领域的主流文件类型。
背后是怎么运作的
当开发者开启格式化功能后,OpenCode 在每次写入或编辑文件时,会悄悄地做三件事:
- 根据文件后缀去匹配所有已启用的格式化器。
- 对命中的文件执行对应的格式化命令。
- 把命令运行后的更改写回文件。
这个过程全程在后台完成,不会额外中断工作流。
配置方式:从全局开启到精细控制
所有格式化器的行为都通过 OpenCode 配置文件(opencode.json)里的 formatter 字段来控制。最简单的做法是直接设为 true,这样就一次性启用上面列出的所有内置格式化器:
json
{
"$schema": "https://opencode.ai/config.json",
"formatter": true
}
如果希望在保持内置格式化工的前提下做进一步的自定义,可以把 formatter 的值写成一个空对象:
json
{
"$schema": "https://opencode.ai/config.json",
"formatter": {}
}
这样内置的格式化器全部生效,之后可以在此基础上做覆盖或添加自定义设定。
每个格式化器的配置项都支持以下几个属性:
- disabled (布尔值):设为
true可单独禁用该格式化器。 - command(字符串数组):指定要执行的格式化命令。对于自定义格式化器这是必填项,对内置格式化器则可以覆盖原有命令。
- environment(对象):运行格式化命令时注入的环境变量。
- extensions(字符串数组):让格式化器只处理指定的文件后缀列表。
怎么禁用格式化器
如果配置里完全不写 formatter 字段,所有格式化器默认都是关闭的。如果之前某个配置开启了格式化,现在想彻底关闭,直接设为 false:
json
{
"$schema": "https://opencode.ai/config.json",
"formatter": false
}
只想关掉某一个的话,在对象里给对应格式化器加上 "disabled": true 就行。比如不用 Prettier:
json
{
"$schema": "https://opencode.ai/config.json",
"formatter": {
"prettier": {
"disabled": true
}
}
}
自定义和覆盖内置格式化器
内置格式化器也允许调整运行环境或限定处理的扩展名。如果要新增一个 OpenCode 不认识的语言格式化器,则需要显式指定 command 和 extensions。下面的例子既演示了如何覆盖 Prettier 的命令和环境,又添加了一个全新的 custom-markdown-formatter 来用 Deno 格式化 Markdown:
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 是一个占位符,实际运行时会自动替换成将要格式化的文件路径。开发者完全可以把这种模式套用到任何自己喜欢的命令行格式化工具上,无论是针对某种小众语言,还是自己团队写的脚本。
整体来看,OpenCode 的格式化系统设计得相当灵活:既能一键全开,也能按项目或语言做精细的裁剪。对于追求代码风格统一、想让工具自动处理格式问题的团队来说,这种内置、可扩展的机制正好省去了来回配置外部流程的麻烦。