codefmt is a utility for syntax-aware code formatting. It contains several built-in formatters, and allows new formatters to be registered by other plugins.
For details, see the executable documentation in the vroom/ directory or the
helpfiles in the doc/ directory. The helpfiles are also available via :help codefmt if codefmt is installed (and helptags have been generated).
- Bazel BUILD files (buildifier)
- C, C++ (clang-format)
- Clojure (zprint, cljstyle)
- CSS, Sass, SCSS, Less (js-beautify, prettier)
- Dart (dartfmt)
- Elixir (
mix format) - Fish (fish_indent)
- GN (gn)
- Go (gofmt)
- Haskell (ormolu)
- HTML (js-beautify, prettier)
- Java (google-java-format or clang-format)
- JavaScript (clang-format, js-beautify, or prettier)
- JSON (js-beautify)
- Jsonnet (jsonnetfmt)
- Julia (JuliaFormatter)
- Kotlin (ktfmt)
- Lua (FormatterFiveOne)
- Markdown (prettier)
- Nix (nixpkgs-fmt)
- OCaml (ocamlformat)
- Protocol Buffers (clang-format)
- Python (Autopep8, Black, isort, Ruff, or YAPF)
- Ruby (rubocop)
- Rust (rustfmt)
- Shell (shfmt)
- Swift (swift-format)
- TypeScript (clang-format)
- Vue (prettier)
Use :FormatLines to format a range of lines or use :FormatCode to format the
entire buffer. Use :NoAutoFormatBuffer to disable current buffer formatting.
Before:
intfoo(int * x) { return * x** x ; }After running :FormatCode:
intfoo(int* x) { return *x * *x; }This example uses Vundle, whose
plugin-adding command is Plugin.
" Add maktaba and codefmt to the runtimepath." (The latter must be installed before it can be used.)Plugin'google/vim-maktaba'Plugin'google/vim-codefmt'" Also add Glaive, which is used to configure codefmt's maktaba flags. See" `:help :Glaive` for usage.Plugin'google/vim-glaive'" ...callvundle#end()
" the glaive#Install() should go after the "call vundle#end()"callglaive#Install()
" Optional: Enable codefmt's default mappings on the <Leader>= prefix.
Glaive codefmt plugin[mappings]
Glaive codefmt google_java_executable="java -jar /path/to/google-java-format-VERSION-all-deps.jar"Make sure you have updated maktaba recently. Codefmt depends upon maktaba to register formatters.
Want to just sit back and let autoformat happen automatically? Add this to your
vimrc (or any subset):
augroupautoformat_settingsautocmdFileTypebzl AutoFormatBuffer buildifier
autocmdFileTypec,cpp,proto,javascript,typescript,arduino AutoFormatBuffer clang-format
autocmdFileTypeclojure AutoFormatBuffer cljstyle
autocmdFileTypedart AutoFormatBuffer dartfmt
autocmdFileTypeelixir,eelixir,heex AutoFormatBuffer mixformat
autocmdFileTypefish AutoFormatBuffer fish_indent
autocmdFileTypegn AutoFormatBuffer gn
autocmdFileTypego AutoFormatBuffer gofmt
autocmdFileTypehaskell AutoFormatBuffer ormolu
" Alternative for web languages: prettierautocmdFileTypehtml,css,sass,scss,less,json AutoFormatBuffer js-beautifyautocmdFileTypejava AutoFormatBuffer google-java-format
autocmdFileTypejsonnet AutoFormatBuffer jsonnetfmt
autocmdFileTypejulia AutoFormatBuffer JuliaFormatter
autocmdFileTypekotlin AutoFormatBuffer ktfmt
autocmdFileTypelua AutoFormatBuffer luaformatterfiveone
autocmdFileTypemarkdown AutoFormatBuffer prettier
autocmdFileTypeocaml AutoFormatBuffer ocamlformat
autocmdFileTypepython AutoFormatBuffer yapf
" Alternative: autocmd FileType python AutoFormatBuffer autopep8autocmdFileTyperuby AutoFormatBuffer rubocop
autocmdFileTyperust AutoFormatBuffer rustfmt
autocmdFileTypeswift AutoFormatBuffer swift-format
autocmdFileTypevue AutoFormatBuffer prettier
augroupENDMost formatters have some options available that can be configured via
Glaive You can get a quick view of
all codefmt flags by executing :Glaive codefmt, or start typing flag names and
use tab completion. See :help Glaive for usage details.
Codefmt defines several built-in formatters. The easiest way to see the list of
available formatters is via tab completion: Type :FormatCode <TAB> in vim.
Formatters that apply to the current filetype will be listed first.
To use a particular formatter, type :FormatCode FORMATTER-NAME. This will
either format the current buffer using the selected formatter or show an error
message with basic setup instructions for this formatter. Normally you will
trigger formatters via key mappings and/or autocommand hooks. See
vroom/main.vroom to learn more about formatting features, and see
vroom/FORMATTER-NAME.vroom to learn more about usage for individual formatters.
Assume a filetype myft and a formatter called MyFormatter. Our detailed
guide to creating a formatter
lives here.
Create an issue for your new formatter and discuss!
Create a new file in
autoload/codefmt/myformatter.vimSee `autoload/codefmt/buildifier.vim for an example. This is where all the logic for formatting goes.Register the formatter in plugin/register.vim with:
calls:registry.AddExtension(codefmt#myformatter#GetFormatter())
Create a flag in instant/flags.vim
""" The path to the buildifier executable.calls:plugin.Flag('myformatter_executable', 'myformatter')
Create a vroom test named
vroom/myformatter.vroomto ensure your formatter works properly.Update the README.md to mention your new filetype!
That's it! Of course, the complicated step is in the details of
myformatter.vim.
// TODO(kashomon): Create a worked example formatter.