Vim-Filetype-Formatter
A simple, cross language Vim code formatter plugin supporting both range and full-file formatting. By default, it provides configurations for the following code formatters:
- biblatex: bibtool
- css: prettier
- go: gofmt
- graphql: prettier
- html: prettier
- javascript/jsx: prettier
- json: prettier
- jsonc: prettier
- markdown: prettier
- mdx: prettier
- nginx: nginxfmt
- ocaml: ocamlformat
- python: black
- rust: rustfmt
- svelte: prettier + prettier-plugin-svelte
- terraform: terraform fmt
- toml: toml-sort
- typescript/tsx: prettier
- yaml: prettier
Don't like the defaults? Writing custom commands is easy!
Each Vim filetype maps to one command-line command command. This plugin supports any code formatter command as long as it:
- Reads from standard input.
- Writes to standard output.
- Is in your PATH.
vim-filetype-formatter
uses code formatters; it does not install them.
Requires:
- A recent version of Neovim or Vim 8.
- Bash (/bin/bash)
Differentiating Features
- Respects configuration files (pyproject.toml, .rustfmt.toml, .prettierrc.toml, etc)
- Accepts visually-selected ranges for any formatter
- Preserves Vim cursor location after the formatter has run
- Clear logging so you can see why a formatter is or isn't working (:LogFiletypeFormat)
- Easy debugging of user configuration (:DebugFiletypeFormat)
- Chain formatters together with Unix pipes
- Configurable, with sane defaults
- Simple, extendable codebase
- Modular: does not pollute your Vim environment with remappings / poor Vim plugin practices
See gif for simple Python example, demonstrating :FiletypeFormat
, :LogFiletypeFormat
, and :DebugFiletypeFormat
:
Although black works out of the box for Python, the above example overrides the default and combines black with isort and docformatter using unix pipes. This specific example can be achieved with the following configuration in your vimrc / init.vim:
let g:vim_filetype_formatter_commands = {
\ 'python': 'black -q - | isort -q - | docformatter -',
\ }
Installation
If using vim-plug, place the following line in the Plugin section of your inti.vim / vimrc:
" ~/.vimrc
Plug 'pappasam/vim-filetype-formatter'
Then run the Ex command:
:PlugInstall
I personally use vim-packager, so if you'd like to go down the "package" rabbit hole, I suggest giving that a try.
Full Documentation
From within Vim, type:
:help filetype_formatter
Key mappings
This plugin provides no default key mappings. I recommend setting a key mapping for normal mode and visual mode like this:
" ~/.vimrc
nnoremap <silent> <leader>f :FiletypeFormat<cr>
vnoremap <silent> <leader>f :FiletypeFormat<cr>
Default configurations
Default configurations may be overridden by creating our own g:vim_filetype_formatter_commands
dictionary. If you would like to map one filetype to another, see g:vim_filetype_formatter_ft_maps
. See here for specifics on how to do this.
Non-standard code formatters
In the rare case where a required code formatter does not read from standard input and/or write to standard output, don't panic. With some effort, you can probably still create a working command by chaining the code formatter with standard Unix programs. See the following example, using nginxbeautifier:
\ 'nginx':
\ 'dd status=none of=/tmp/nginx.conf >& /dev/null && '
\ . 'nginxbeautifier --space 4 /tmp/nginx.conf >& /dev/null && '
\ . 'cat /tmp/nginx.conf && '
\ . 'rm /tmp/nginx.conf',
dd
: read vim-filetype-formatter's standard output as standard input, writing to a temporary file named/tmp/nginx.conf
nginxbeautifier
: read from the temporary file and modify that file in-placecat
: write the contents of the temporary file to stdoutrm
: remove the temporary file to keep things tidy
It's not exactly pretty, but:
- Reality isn't always pretty
- We can use the command because it reads from standard input and writes to standard output
Notes
This plugin prioritizes simplicity and ease of use on a POSIX-compliant system. Support for Windows and other non-Unix derivatives is out of scope.
Written by
Samuel Roeca [email protected]