| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- ---
- title: Formatters
- description: OpenCode uses language specific formatters.
- ---
- OpenCode automatically formats files after they are written or edited using language-specific formatters. This ensures that the code that is generated follows the code styles of your project.
- ---
- ## Built-in
- OpenCode comes with several built-in formatters for popular languages and frameworks. Below is a list of the formatters, supported file extensions, and commands or config options it needs.
- | Formatter | Extensions | Requirements |
- | -------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
- | gofmt | .go | `gofmt` command available |
- | mix | .ex, .exs, .eex, .heex, .leex, .neex, .sface | `mix` command available |
- | prettier | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://prettier.io/docs/en/index.html) | `prettier` dependency in `package.json` |
- | biome | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://biomejs.dev/) | `biome.json(c)` config file |
- | zig | .zig, .zon | `zig` command available |
- | clang-format | .c, .cpp, .h, .hpp, .ino, and [more](https://clang.llvm.org/docs/ClangFormat.html) | `.clang-format` config file |
- | ktlint | .kt, .kts | `ktlint` command available |
- | ruff | .py, .pyi | `ruff` command available with config |
- | rustfmt | .rs | `rustfmt` command available |
- | cargofmt | .rs | `cargo fmt` command available |
- | uv | .py, .pyi | `uv` command available |
- | rubocop | .rb, .rake, .gemspec, .ru | `rubocop` command available |
- | standardrb | .rb, .rake, .gemspec, .ru | `standardrb` command available |
- | htmlbeautifier | .erb, .html.erb | `htmlbeautifier` command available |
- | air | .R | `air` command available |
- | dart | .dart | `dart` command available |
- | ocamlformat | .ml, .mli | `ocamlformat` command available and `.ocamlformat` config file |
- | terraform | .tf, .tfvars | `terraform` command available |
- | gleam | .gleam | `gleam` command available |
- | nixfmt | .nix | `nixfmt` command available |
- | shfmt | .sh, .bash | `shfmt` command available |
- | pint | .php | `laravel/pint` dependency in `composer.json` |
- | oxfmt (Experimental) | .js, .jsx, .ts, .tsx | `oxfmt` dependency in `package.json` and an [experimental env variable flag](/docs/cli/#experimental) |
- So if your project has `prettier` in your `package.json`, OpenCode will automatically use it.
- ---
- ## How it works
- When OpenCode writes or edits a file, it:
- 1. Checks the file extension against all enabled formatters.
- 2. Runs the appropriate formatter command on the file.
- 3. Applies the formatting changes automatically.
- This process happens in the background, ensuring your code styles are maintained without any manual steps.
- ---
- ## Configure
- You can customize formatters through the `formatter` section in your OpenCode config.
- ```json title="opencode.json"
- {
- "$schema": "https://opencode.ai/config.json",
- "formatter": {}
- }
- ```
- Each formatter configuration supports the following:
- | Property | Type | Description |
- | ------------- | -------- | ------------------------------------------------------- |
- | `disabled` | boolean | Set this to `true` to disable the formatter |
- | `command` | string[] | The command to run for formatting |
- | `environment` | object | Environment variables to set when running the formatter |
- | `extensions` | string[] | File extensions this formatter should handle |
- Let's look at some examples.
- ---
- ### Disabling formatters
- To disable **all** formatters globally, set `formatter` to `false`:
- ```json title="opencode.json" {3}
- {
- "$schema": "https://opencode.ai/config.json",
- "formatter": false
- }
- ```
- To disable a **specific** formatter, set `disabled` to `true`:
- ```json title="opencode.json" {5}
- {
- "$schema": "https://opencode.ai/config.json",
- "formatter": {
- "prettier": {
- "disabled": true
- }
- }
- }
- ```
- ---
- ### Custom formatters
- You can override the built-in formatters or add new ones by specifying the command, environment variables, and file extensions:
- ```json title="opencode.json" {4-14}
- {
- "$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"]
- }
- }
- }
- ```
- The **`$FILE` placeholder** in the command will be replaced with the path to the file being formatted.
|