OpenCode 的内置格式化


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

内置了哪些语言的格式化器

OpenCode 本身就支持一大批常见语言和框架的格式化工具,只要本地环境满足对应的命令或配置文件,就能直接使用。下面这张表把每个格式化器对应的文件后缀和前置要求都理清楚了:

  • air :处理 .R 文件,需要系统里能调用 air 命令。
  • biome :覆盖 .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml 等,要求项目中存在 biome.jsonbiome.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 在每次写入或编辑文件时,会悄悄地做三件事:

  1. 根据文件后缀去匹配所有已启用的格式化器。
  2. 对命中的文件执行对应的格式化命令。
  3. 把命令运行后的更改写回文件。

这个过程全程在后台完成,不会额外中断工作流。

配置方式:从全局开启到精细控制

所有格式化器的行为都通过 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 不认识的语言格式化器,则需要显式指定 commandextensions。下面的例子既演示了如何覆盖 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 的格式化系统设计得相当灵活:既能一键全开,也能按项目或语言做精细的裁剪。对于追求代码风格统一、想让工具自动处理格式问题的团队来说,这种内置、可扩展的机制正好省去了来回配置外部流程的麻烦。

相关推荐
oscar99917 小时前
OpenCode 的权限系统:让自动化在可控范围内运行
权限·opencode
HIT_Weston1 天前
86、【Agent】【OpenCode】bash 工具提示词(完结)
人工智能·agent·opencode
程序员柒叔2 天前
OpenCode 一周动态-2026-W20
人工智能·github·copilot·agent·opencode
HIT_Weston2 天前
85、【Agent】【OpenCode】bash 工具提示词(HEREDOC)
人工智能·agent·opencode
HIT_Weston2 天前
83、【Agent】【OpenCode】bash 工具提示词(commit 注意事项)(一)
人工智能·agent·opencode
芯码学徒3 天前
vscode上如何免费使用opencode插件
ide·vscode·编辑器·opencode
HIT_Weston4 天前
82、【Agent】【OpenCode】bash 工具提示词(amend 风险)
人工智能·agent·opencode
HIT_Weston4 天前
81、【Agent】【OpenCode】bash 工具提示词(git 提交规则)
人工智能·agent·opencode
g5zhu58964 天前
opencode无网环境-引用上下文失效问题
opencode