Beanfmt
A fast beancount file formatter with CJK double-width character support.
Features
- Column-aligned currencies and costs with CJK-aware display width
- Thousands separator normalization (add, remove, or keep)
- Brace spacing control for cost annotations
- Date-based entry sorting
- Recursive formatting of
included files (with glob support) - Multi-platform: CLI, Python library, WASM module, and VSCode extension
Installation
CLI
Python
VSCode Extension
Search for beanfmt in the VSCode Marketplace, or install from the command line:
From Source
Note:
pythonandwasmfeatures are mutually exclusive.
Usage
CLI
# Format from stdin
|
# Format a file (print to stdout)
# Format in-place
# Recursively format all included files in-place
# Custom alignment columns
# Add thousands separators and sort by date
Options
| Flag | Default | Description |
|---|---|---|
--indent <STR> |
4 spaces | Indentation string for postings and metadata |
--currency-column <N> |
70 |
Target column for currency alignment |
--cost-column <N> |
75 |
Target column for cost/price alignment |
--thousands <MODE> |
keep |
Thousands separator: add, remove, or keep |
--spaces-in-braces |
off | Add spaces inside cost braces { ... } |
--no-fixed-cjk-width |
off | Disable CJK double-width alignment |
--sort |
off | Sort entries by date |
--recursive |
off | Follow and format included files |
-w, --write |
off | Write output back to file (in-place) |
Python
# Format a string
=
# Format a file
=
# Reusable options
=
=
# Recursive formatting — returns list of (path, content) tuples
=
WASM
import from "beanfmt";
// Format with default options
const output = ;
// Format with full options
const output = ;
VSCode
Install the extension, then configure in settings.json:
"[beancount]": {
"editor.defaultFormatter": "beanfmt.beanfmt-beancount-formatter",
"editor.formatOnSave": true
}
Available settings:
| Setting | Default | Description |
|---|---|---|
beanfmt.indent |
" " |
Indentation string |
beanfmt.currencyColumn |
70 |
Currency alignment column |
beanfmt.costColumn |
75 |
Cost/price alignment column |
beanfmt.thousandsSeparator |
"keep" |
"add", "remove", or "keep" |
beanfmt.spacesInBraces |
false |
Spaces inside cost braces |
beanfmt.fixedCJKWidth |
true |
CJK double-width alignment |
beanfmt.sort |
false |
Sort entries by date |
License
MIT