Format code with one button press (or automatically on save).
This plugin makes use of external formatting programs to achieve the most decent results.
Check the list of formatprograms below to see which languages are supported by default.
Most formatprograms will obey vim settings, such as textwidth and shiftwidth().
You can easily customize existing formatprogram definitions or add your own formatprogram.
When no formatprogram exists (or no formatprogram is installed) for a certain filetype,
vim-autoformat falls back by default to indenting, (using vim's auto indent functionality), retabbing and removing trailing whitespace.
vim-autoformat requires vim to have python support (python 2 or python 3). You can check your vim has python support by running :echo has("python3") and :echo has("python2").
Neovim does not come with python support by default, and additional setup is required.
First install pynvim
python3 -m pip install pynvim
And add the following configuration in your .vimrc
let g:python3_host_prog="/path/to/python/executable/"
Put this in your .vimrc.
Plugin 'vim-autoformat/vim-autoformat'Then restart vim and run :PluginInstall. Alternatively, you could run :source $MYVIMRC
to reload your .vimrc without restarting vim.
To update the plugin to the latest version, you can run :PluginUpdate.
Download the source and extract in your bundle directory. Updating has to be done manually, as far as I'm aware.
It is highly recommended to use a plugin manager such as Vundle, since this makes it easy to update plugins or uninstall them. It also keeps your .vim directory clean. Still you can decide to download this repository as a zip file or whatever and extract it to your .vim folder.
First you should install an external program that can format code of the programming language you are using. This can either be one of the programs that are listed below as defaultprograms, or a custom program. For defaultprograms, vim-autoformat knows for which filetypes it can be used. For using a custom formatprogram, read the text below How can I change the behaviour of formatters, or add one myself? If the formatprogram you want to use is installed in one of the following ways, vim automatically detects it:
- It suffices to make the formatprogram globally available, which is the case if you install it via your package manager.
- Alternatively you can point vim-autoformat to folders containing formatters, by putting the absolute paths to these folders in
g:formatterpathin your .vimrc, like:
let g:formatterpath = ['/some/path/to/a/folder', '/home/superman/formatters']Remember that when no formatprograms exists for a certain filetype, vim-autoformat falls back by default to indenting, retabbing and removing trailing whitespace. This will fix at least the most basic things, according to vim's indentfile for that filetype.
When you have installed the formatter you need, you can format the entire buffer with the command :Autoformat.
You can provide the command with a file type such as :Autoformat json, otherwise the buffer's filetype will be used.
Some formatters allow you to format only a part of the file, for instance clang-format and
autopep8.
To use this, provide a range to the :Autoformat command, for instance by visually selecting a
part of your file, and then executing :Autoformat.
For convenience it is recommended that you assign a key for this, like so:
noremap <F3> :Autoformat<CR>Or to have your code be formatted upon saving your file, you could use something like this:
au BufWrite * :AutoformatYou can also format the current line only (without having to make a visual selection) by executing :AutoformatLine.
To disable the fallback to vim's indent file, retabbing and removing trailing whitespace, set the following variables to 0.
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0To disable or re-enable these option for specific buffers, use the buffer local variants:
b:autoformat_autoindent, b:autoformat_retab and b:autoformat_remove_trailing_spaces.
So to disable autoindent for filetypes that have incompetent indent files, use
autocmd FileType vim,tex let b:autoformat_autoindent=0You can manually autoindent, retab or remove trailing whitespace with the following respective commands.
gg=G
:retab
:RemoveTrailingSpacesFor each filetype, vim-autoformat has a list of applicable formatters.
If you have multiple formatters installed that are supported for some filetype, vim-autoformat
tries all formatters in this list of applicable formatters, until one succeeds.
You can set this list manually in your vimrc (see section How can I change the behaviour of formatters, or add one myself?,
or change the formatter with the highest priority by the commands :NextFormatter and :PreviousFormatter.
To print the currently selected formatter use :CurrentFormatter.
These latter commands are mostly useful for debugging purposes.
If you have a composite filetype with dots (like django.python or php.wordpress),
vim-autoformat first tries to detect and use formatters for the exact original filetype, and
then tries the same for all supertypes occurring from left to right in the original filetype
separated by dots (.).
It is possible to apply multiple formatters for single file, for example, html can use special formatters for js/css etc.
Support can be enabled via the g:run_all_formatters_<identifier> option.
In this case, formatters from g:formatdef_<identifier> will be applied to the file one by one. Fallback (vim) formatting
isn't used if at least one formatter has finished sucessfully.
Sample config:
let g:formatters_vue = ['eslint_local', 'stylelint']
let g:run_all_formatters_vue = 1Here is a list of formatprograms that are supported by default, and thus will be detected and used by vim when they are installed properly. They are defined in https://github.com/Chiel92/vim-autoformat/blob/master/plugin/defaults.vim. They are simply tried in the order they are listed until one succeeds.
-
asmfmtfor Assembly. An assembly formatter. Can be installed withgo get -u github.com/klauspost/asmfmt/cmd/asmfmt. See https://github.com/klauspost/asmfmt for more info. -
astylefor C#, C++, C and Java. Download it here: http://astyle.sourceforge.net/. Important: version2.0.5or higher is required, since only those versions correctly support piping and are stable enough. -
autopep8for Python (supports formatting ranges). It's probably in your distro's repository, so you can download it as a regular package. For Ubuntu typesudo apt-get install python-autopep8in a terminal. Here is the link to the repository: https://github.com/hhatto/autopep8. And here the link to its page on the python website: http://pypi.python.org/pypi/autopep8/0.5.2. -
blackfor Python. Most users can install with the terminal commandsudo pip install blackorpip install --user black. Here is the link to the repository: https://github.com/ambv/black -
buildifierfor bazel build files. (https://github.com/bazelbuild/buildtools/tree/master/buildifier) -
clang-formatfor C, C++, Objective-C, Protobuf (supports formatting ranges). Clang-format is a product of LLVM source builds. If youbrew install llvm, clang-format can be found in /usr/local/Cellar/llvm/bin/. Vim-autoformat checks whether there exists a.clang-formator a_clang-formatfile up in the current directory's ancestry. Based on that it either uses that file or tries to match vim options as much as possible. Details: http://clang.llvm.org/docs/ClangFormat.html. -
cmake-formatfor CMake. Installcmake_formatwithpip. See https://github.com/cheshirekow/cmake_format for more info. -
css-beautifyfor CSS. It is shipped withjs-beautify, which can be installed by runningnpm install -g js-beautify. Note thatnodejsis needed for this to work. Here is the link to the repository: https://github.com/einars/js-beautify. -
dartfmtfor Dart. Part of the Dart SDK (make sure it is on your PATH). See https://www.dartlang.org/tools/dartfmt/ for more info. -
dfmtfor D. It can be built or downloaded from https://github.com/dlang-community/dfmt. Arch Linux users can install it from thecommunityrepository withpacman -S dfmt. Ifdfmtis not found inPATH, Vim-autoformat will try to usedub run dfmtcommand to automatically download and rundfmt. -
dhall formatfor Dhall. The standard formatter, bundled with the interpreter. See https://github.com/dhall-lang/dhall-lang for more info. -
erlfmtfor Erlang. Source code and installation instructions can be found at https://github.com/WhatsApp/erlfmt. Building the escript as described in their README and adding it to yourPATHor your defined formatter path is necessary for the formatter to work correctly. -
ESlintfor Javascript. http://eslint.org/ It can be installed by runningnpm install eslintfor a local project or by runningnpm install -g eslintfor global use. The linter is then installed locally at$YOUR_PROJECT/node_modules/.bin/eslintor globally at~/.npm-global/bin/eslint. When running the formatter, vim will walk up from the current file to search for such local installation and a ESLint configuration file (either.eslintrc.jsoreslintrc.json). When the local version is missing it will fallback to the global version in your home directory. When both requirements are found eslint is executed with the--fixargument. Note that the formatter's name is stilleslint_localfor legacy reasons even though it already supports globaleslint. Currently only working on *nix like OS (Linux, MacOS etc.) as it requires the OS to provide sh like shell syntax. -
fish_indentfor Fish-shell. Fish shell builtin fish_indent formatter for fish shell script. -
fixjsonfor JSON. It is a JSON file fixer/formatter for humans using (relaxed) JSON5. It fixes various failures while humans writing JSON and formats JSON codes. It can be installed withnpm install -g fixjson. More info is available at https://github.com/rhysd/fixjson. -
fprettifyfor modern Fortran. Download from official repository. Install with./setup.py installor./setup.py install --user. -
gnatppfor Ada. http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gnat_ugn_unw/The-GNAT-Pretty_002dPrinter-gnatpp.html -
gofmtfor Golang. The default golang formatting program is shipped with the golang distribution. Make suregofmtis in your PATH (if golang is installed properly, it should be). Here is the link to the installation: https://golang.org/doc/install An alternative formatter is gofumpt, which enforces a stricter format thangofmt. To enablegofumptsupport, you should install it by runninggo install mvdan.cc/gofumpt latest, and then change the default golang formatter by configuringlet g:formatters_go = ['gofumpt']. -
haxe-formatterfor Haxe.haxe-formatteris a thin wrapper around the haxelib formatter library. It can be installed by runninghaxelib install formatter. Here is the link to the repository: https://github.com/HaxeCheckstyle/haxe-formatter -
html-beautifyfor HTML. It is shipped withjs-beautify, which can be installed by runningnpm install -g js-beautify. Note thatnodejsis needed for this to work. Here is the link to the repository: https://github.com/einars/js-beautify. -
js-beautifyfor Javascript and JSON. It can be installed by runningnpm install -g js-beautify. Note thatnodejsis needed for this to work. The python version version is also supported by default, which does not neednodejsto run. Here is the link to the repository: https://github.com/einars/js-beautify. -
JSCSfor Javascript. https://jscs-dev.github.io/ -
jqfor JSON. https://jqlang.org/ -
JuliaFormatter.jlfor Julia. It can be installed by runningjulia -e 'import Pkg; Pkg.add("JuliaFormatter")'. You will need to install Julia and have thejuliabinary in yourPATH. See https://github.com/domluna/JuliaFormatter.jl for more information on how to configureJuliaFormatter.jl. Note that sincevim-autoformatworks by running a subprocess, a new instance of Julia is instantiated every time it is invoked. And since Julia needs to precompile the code to runformat_text, this may block the vim instance while the subprocess is running. Once Julia finishes executing, control will be handled back to the user and the formatted text will replaces the current buffer. You can consider precompilingJuliaFormatter.jlto make this process faster (SeePackageCompiler.jlfor more information on that), or consider using a dedicatedJuliaFormatter.vimplugin that works asynchronously. -
latexindent.plfor LaTeX. Installation instructions at https://github.com/cmhughes/latexindent.pl. On mac you can install it withbrew install latexindent, then you have to addlet g:formatdef_latexindent = '"latexindent -"'to.vimrc. -
luafmtfor Lua. Installluafmtwithnpm. See https://github.com/trixnz/lua-fmt for more info. -
styluafor Lua. Installstyluawithcargo. See https://github.com/JohnnyMorganz/StyLua for more info. -
mix formatfor Elixir.mix formatis included with Elixir 1.6+. -
nginxfmt.pyfor NGINX. See https://github.com/slomkowski/nginx-config-formatter for more info. -
nixfmtfor Nix. It can be installed from nixpkgs withnix-env -iA nixpkgs.nixfmt. See https://github.com/serokell/nixfmt for more. -
ocamlformatfor OCaml. OCamlFormat can be installed with opam:opam install ocamlformat. Details: https://github.com/ocaml-ppx/ocamlformat. We also provideocp-indentas reserve formatter. -
packer fmtfor Packer. The standard formatter included with Packer. See https://www.packer.io/docs/commands/fmt for more info. -
perltidyfor Perl. It can be installed from CPANcpanm Perl::Tidy. See https://metacpan.org/pod/Perl::Tidy and http://perltidy.sourceforge.net/ for more info. -
prettierfor PHP. It can be installed by runningnpm install prettier @prettier/plugin-phpand adding"plugins": ["@prettier/plugin-php"]to your prettier configuration file. https://github.com/prettier/plugin-php -
purtyfor Purescript It can be installed usingnpm install purty. Further instructions available at https://gitlab.com/joneshf/purty -
rbeautifyfor Ruby. It is shipped withruby-beautify, which can be installed by runninggem install ruby-beautify. Note that compatibleruby-beautify-0.94.0or higher version. Here is the link to the repository: https://github.com/erniebrodeur/ruby-beautify. This beautifier developed and tested with ruby2.0+, so you can have weird results with earlier ruby versions. -
remarkfor Markdown. A Javascript based markdown processor that can be installed withnpm install -g remark-cli. More info is available at https://github.com/wooorm/remark. -
rubocopfor Ruby. It can be installed by runninggem install rubocop. Here is the link to the repository: https://github.com/bbatsov/rubocop -
rustfmtfor Rust. It can be installed usingcargo, the Rust package manager. Up-to-date installation instructions are on the project page: https://github.com/rust-lang/rustfmt#quick-start. -
sass-convertfor SCSS. It is shipped withsass, a CSS preprocessor written in Ruby, which can be installed by runninggem install sass. Here is the link to the SASS homepage: http://sass-lang.com/. -
shfmtfor Shell. A shell formatter written in Go supporting POSIX Shell, Bash and mksh that can be installed withgo get -u mvdan.cc/sh/cmd/shfmt. See https://github.com/mvdan/sh for more info. -
sqlformatfor SQL. Installsqlparsewithpip. -
standardfor Javascript. It can be installed by runningnpm install -g standard(nodejsis required). No more configuration needed. More information about the style guide can be found here: http://standardjs.com/. -
stylelintfor CSS. https://stylelint.io/ It can be installed by runningnpm install stylelint stylelint-config-standardfor a local project or by runningnpm install -g stylelint stylelint-config-standardfor global use. The linter is then installed locally at$YOUR_PROJECT/node_modules/.bin/stylelintor globally at~/.npm-global/bin/stylelint. When running the formatter, vim will walk up from the current file to search for such local installation. When the local version is missing it will fallback to the global version in your home directory. When both requirements are found styelint is executed with the--fixargument. Currently only working on *nix like OS (Linux, MacOS etc.) as it requires the OS to provide sh like shell syntax. -
stylish-haskellfor Haskell It can be installed usingcabalbuild tool. Installation instructions are available at https://github.com/jaspervdj/stylish-haskell#installation -
terraform fmtfor Terraform. The standard formatter included with Terraform. See https://www.terraform.io/docs/cli/commands/fmt.html for more info. -
tidyfor HTML, XHTML and XML. It's probably in your distro's repository, so you can download it as a regular package. For Ubuntu typesudo apt-get install tidyin a terminal. -
typescript-formatterfor Typescript.typescript-formatteris a thin wrapper around the TypeScript compiler services. It can be installed by runningnpm install -g typescript-formatter. Note thatnodejsis needed for this to work. Here is the link to the repository: https://github.com/vvakame/typescript-formatter. -
xofor Javascript. It can be installed by runningnpm install -g xo(nodejsis required). Here is the link to the repository: https://github.com/sindresorhus/xo. -
yapffor Python (supports formatting ranges). Vim-autoformat checks whether there exists a.style.yapfor asetup.cfgfile up in the current directory's ancestry. Based on that it either uses that file or tries to match vim options as much as possible. Most users can install with the terminal commandsudo pip install yapforpip install --user yapf. YAPF has one optional configuration variable to control the formatter style. For example:let g:formatter_yapf_style = 'pep8'
pep8is the default value, or you can choose:google,facebook,chromium. Here is the link to the repository: https://github.com/google/yapf -
zigformatfor Zig. It is an unofficial binary. You can find the installation instructions from the repo: zigformat
If you're struggling with getting a formatter to work, it may help to set vim-autoformat in verbose-mode. Vim-autoformat will then output errors on formatters that failed. The value of g:autoformat_verbosemode could set as 0, 1 or 2. which means: 0: no message output. 1: only error message output. 2: all message output.
let g:autoformat_verbosemode=1
" OR:
let verbose=1To read all messages in a vim session type :messages. Since one cannot always easily copy
the contents of messages (e.g. for posting it in an issue), vim-autoformats command :PutMessages may
help. It puts the messages in the current buffer, allowing you to do whatever you want.
Please report bugs by creating an issue in this repository. When there are problems with getting a certain formatter to work, provide the output of verbose mode in the issue.
If you need a formatter that is not among the defaults, or if you are not satisfied with the default formatting behaviour that is provided by vim-autoformat, you can define it yourself. The formatprogram must read the unformatted code from the standard input, and write the formatted code to the standard output.
The formatprograms that available for a certain <filetype> are defined in g:formatters_<filetype>.
This is a list containing string identifiers, which point to corresponding formatter definitions.
The formatter definitions themselves are defined in g:formatdef_<identifier> as a string
expression.
Defining any of these variable manually in your .vimrc, will override the default value, if existing.
For example, a complete definition in your .vimrc for C# files could look like this:
let g:formatdef_my_custom_cs = '"astyle --mode=cs --style=ansi -pcHs4"'
let g:formatters_cs = ['my_custom_cs']In this example, my_custom_cs is the identifier for our formatter definition.
The first line defines how to call the external formatter, while the second line tells
vim-autoformat that this is the only formatter that we want to use for C# files.
Please note the double quotes in g:formatdef_my_custom_cs.
This allows you to define the arguments dynamically:
let g:formatdef_my_custom_cs = '"astyle --mode=cs --style=ansi -pcHs".&shiftwidth'
let g:formatters_cs = ['my_custom_cs']Please notice that g:formatdef_my_custom_cs contains an expression that can be evaluated, as required.
As you see, this allows us to dynamically define some parameters.
In this example, the indent width that astyle will use, depends on the buffer local value of &shiftwidth, instead of being fixed at 4.
So if you're editing a csharp file and change the shiftwidth (even at runtime), the g:formatdef_my_custom_cs will change correspondingly.
For the default formatprogram definitions, the options expandtab, shiftwidth and textwidth are taken into account whenever possible.
This means that the formatting style will match your current vim settings as much as possible.
You can have look look at the exact default definitions for more examples.
They are defined in vim-autoformat/plugin/defaults.vim.
As a small side note, in the actual defaults the function shiftwidth() is used instead of the
property. This is because it falls back to the value of tabstop if shiftwidth is 0.
If you have a composite filetype with dots (like django.python or php.wordpress),
vim-autoformat internally replaces the dots with underscores so you can specify formatters
through g:formatters_django_python and so on.
To override these options for a local buffer, use the buffer local variants:
b:formatters_<filetype> and b:formatdef_<identifier>. This can be useful, for example, when
working with different projects with conflicting formatting rules, with each project having settings
in its own vimrc or exrc file:
let b:formatdef_custom_c='"astyle --mode=c --suffix=none --options=/home/user/special_project/astylerc"'
let b:formatters_c = ['custom_c']If your format program supports formatting specific ranges, you can provide a format
definition which allows to make use of this.
The first and last line of the current range can be retrieved by the variables a:firstline and
a:lastline. They default to the first and last line of your file, if no range was explicitly
specified.
So, a ranged definition could look like this.
let g:formatdef_autopep8 = "'autopep8 - --range '.a:firstline.' '.a:lastline"
let g:formatters_python = ['autopep8']This would allow the user to select a part of the file and execute :Autoformat, which
would then only format the selected part.
This project is community driven. I don't actively do development on vim-autoformat myself, as its current state fulfills my personal needs. However, I will review pull requests and keep an eye on the general sanity of the code.
If you have any improvements on this plugin or on this readme, if you have some formatter definition that can be added to the defaults, or if you experience problems, please open a pull request or an issue in this repository.
- We also take the returncode of the formatter process into account, not just the presence of output on stderr.
- We don't use the option formatprg internally anymore, to always have the possible of using the default
gqcommand. - More fallback options have been added.
- Backward incompatible patch!
- Multiple formatters per filetype are now supported.
- Configuration variable names changed.
- Using
gqas alias for:Autoformatis no longer supported. :Autoformatnow supports ranges.- Composite filetypes are fully supported.
html-beautifyis now the new default for HTML since it seems to be better maintained, and seems to handle inline javascript neatly.- The
formatters/folder is no longer supported anymore, because it is unnecessary. js-beautifycan no longer be installed as a bundle, since it only makes this plugin unnecessarily complex.
- The default behaviour of gq is enabled again by removing the fallback on auto-indenting.
Instead, the fallback is only used when running the command
:Autoformat.
- The options
expandtab,shiftwidth,tabstopandsofttabstopare not overwritten anymore. - This obsoletes
g:autoformat_no_default_shiftwidth g:formatprg_args_expr_<filetype>is introduced.
- It is now possible to prevent vim-autoformat from overwriting your settings for
tabstop,softtabstop,shiftwidthandexpandtabin your .vimrc.
- When no formatter is installed or defined, vim will now auto-indent the file instead. This uses the indentfile for that specific filetype.
- Customization of formatprograms can be done easily now, as explained in the readme.
- I set the default tabwidth to 4 for all formatprograms as well as for vim itself.
- phpCB has been removed from the defaults, due to code-breaking behaviour.