Skip to content

代码格式化器

📝 课程笔记

本课核心知识点整理:

5.18 代码格式化器学霸笔记

OpenCode 在文件写入或编辑后自动使用语言特定的格式化器进行格式化。这确保生成的代码遵循项目的代码风格。

内置格式化器

OpenCode 内置了多种流行语言和框架的格式化器:

格式化器扩展名要求
gofmt.gogofmt 命令可用
mix.ex, .exs, .eex, .heex, .leex, .neex, .sfacemix 命令可用
prettier.js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml 等package.json 中有 prettier 依赖
biome.js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml 等存在 biome.json(c) 配置文件
zig.zig, .zonzig 命令可用
clang-format.c, .cpp, .h, .hpp, .ino 等存在 .clang-format 配置文件
ktlint.kt, .ktsktlint 命令可用
ruff.py, .pyiruff 命令可用且有配置
rustfmt.rsrustfmt 命令可用
uv.py, .pyiuv 命令可用
rubocop.rb, .rake, .gemspec, .rurubocop 命令可用
standardrb.rb, .rake, .gemspec, .rustandardrb 命令可用
htmlbeautifier.erb, .html.erbhtmlbeautifier 命令可用
air.Rair 命令可用
dart.dartdart 命令可用
ocamlformat.ml, .mliocamlformat 命令可用且有 .ocamlformat 配置
terraform.tf, .tfvarsterraform 命令可用
gleam.gleamgleam 命令可用
nixfmt.nixnixfmt 命令可用
shfmt.sh, .bashshfmt 命令可用
oxfmt(实验性).js, .jsx, .ts, .tsxpackage.json 中有 oxfmt 依赖且启用实验性环境变量

如果项目的 package.json 中有 prettier,OpenCode 会自动使用它。

工作原理

当 OpenCode 写入或编辑文件时:

  1. 根据文件扩展名检查所有已启用的格式化器
  2. 运行相应的格式化命令
  3. 自动应用格式化更改

这个过程在后台进行,确保代码风格得以维护而无需手动操作。

配置

通过配置文件的 formatter 部分自定义格式化器:

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

每个格式化器配置支持以下选项:

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

禁用格式化器

全局禁用所有格式化器:

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

禁用特定格式化器:

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

自定义格式化器

可以覆盖内置格式化器或添加新的:

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 占位符会被替换为正在格式化的文件路径。

相关资源