mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 06:30:03 +08:00
405 lines
15 KiB
Plaintext
405 lines
15 KiB
Plaintext
*neoformat.txt* A Neovim plugin for formatting.
|
|
|
|
CONTENTS *neoformat-contents*
|
|
|
|
Introduction |neoformat-introduction|
|
|
Install |neoformat-install|
|
|
Usage |neoformat-usage|
|
|
Managing Undo History |neoformat-managing-undo-history|
|
|
Supported Filetypes |neoformat-supported-filetypes|
|
|
|
|
==============================================================================
|
|
INTRODUCTION *neoformat-introduction*
|
|
|
|
A [Neovim](https://neovim.io) and Vim8 plugin for formatting code.
|
|
|
|
*Neoformat* uses a variety of formatters for many filetypes. Currently, Neoformat
|
|
will run a formatter using the current buffer data, and on success it will
|
|
update the current buffer with the formatted text. On a formatter failure,
|
|
Neoformat will try the next formatter defined for the filetype.
|
|
|
|
By using `getbufline()` to read from the current buffer instead of file,
|
|
Neoformat is able to format your buffer without you having to `:w` your file first.
|
|
Also, by using `setline()`, marks, jumps, etc. are all maintained after formatting.
|
|
|
|
Neoformat supports both sending buffer data to formatters via stdin, and also
|
|
writing buffer data to `/tmp/` for formatters to read that do not support input
|
|
via stdin.
|
|
|
|
==============================================================================
|
|
INSTALL *neoformat-install*
|
|
|
|
Install with [vim-plug](https://github.com/junegunn/vim-plug)
|
|
>
|
|
Plug 'sbdchd/neoformat'
|
|
<
|
|
==============================================================================
|
|
USAGE *neoformat-usage*
|
|
|
|
Format the entire buffer, or visual selection of the buffer
|
|
>
|
|
:Neoformat
|
|
|
|
<Or specify a certain formatter (must be defined for the current filetype)
|
|
>
|
|
:Neoformat jsbeautify
|
|
|
|
Or format a visual selection of code in a different filetype
|
|
|
|
*Note:* you must use a ! and pass the filetype of the selection
|
|
|
|
>
|
|
:Neoformat! python
|
|
>
|
|
You can also pass a formatter to use
|
|
|
|
>
|
|
:Neoformat! python yapf
|
|
<
|
|
|
|
Or perhaps run a formatter on save
|
|
|
|
>
|
|
augroup fmt
|
|
autocmd!
|
|
autocmd BufWritePre * undojoin | Neoformat
|
|
augroup END
|
|
<
|
|
|
|
The |undojoin| command will put changes made by Neoformat into the same
|
|
|undo-block| with the latest preceding change. See
|
|
|neoformat-managing-undo-history|.
|
|
|
|
|
|
==============================================================================
|
|
CURRENT LIMITATION(S) *neoformat-limitations*
|
|
|
|
If a formatter is either not configured to use `stdin`, or is not able to read
|
|
from `stdin`, then buffer data will be written to a file in `/tmp/neoformat/`,
|
|
where the formatter will then read from
|
|
|
|
==============================================================================
|
|
CONFIG *neoformat-config*
|
|
|
|
Define custom formatters.
|
|
|
|
Options:
|
|
|
|
| `exe` | the name the formatter executable in the path | required
|
|
| `args` | list of arguments | default: [] | optional
|
|
| `replace` | overwrite the file, instead of updating the buffer | default: 0 | optional
|
|
| `stdin` | send data to the stdin of the formatter | default 0 | optional
|
|
| `stderr` | used to specify whether stderr output should be read along with
|
|
the stdin, otherwise redirects stderr to `stderr.log` file in neoformat's
|
|
temporary directory | default 0 | optional
|
|
| `no_append` | do not append the `path` of the file to the formatter command,
|
|
used when the `path` is in the middle of a command | default: 0 |
|
|
optional
|
|
| `env` | list of environment variables to prepend to the command | default: [] | optional
|
|
|
|
| `valid_exit_codes` | list of valid exit codes for formatters who do not respect common unix practices | \[0] | optional
|
|
|
|
Example:
|
|
|
|
Define custom formatters.
|
|
>
|
|
let g:neoformat_python_autopep8 = {
|
|
\ 'exe': 'autopep8',
|
|
\ 'args': ['-s 4', '-E'],
|
|
\ 'replace': 1 " replace the file, instead of updating buffer (default: 0),
|
|
\ 'stdin': 1, " send data to stdin of formatter (default: 0)
|
|
\ 'valid_exit_codes': [0, 23],
|
|
\ 'no_append': 1,
|
|
\ }
|
|
|
|
let g:neoformat_enabled_python = ['autopep8']
|
|
<
|
|
Have Neoformat use &formatprg as a formatter
|
|
>
|
|
let g:neoformat_try_formatprg = 1
|
|
<
|
|
Enable basic formatting when a filetype is not found. Disabled by default.
|
|
>
|
|
" Enable alignment globally
|
|
let g:neoformat_basic_format_align = 1
|
|
|
|
" Enable tab to spaces conversion globally
|
|
let g:neoformat_basic_format_retab = 1
|
|
|
|
" Enable trimmming of trailing whitespace globally
|
|
let g:neoformat_basic_format_trim = 1
|
|
|
|
Run all enabled formatters (by default Neoformat stops after the first
|
|
formatter succeeds)
|
|
|
|
let g:neoformat_run_all_formatters = 1
|
|
|
|
Above options can be activated or deactivated per buffer. For example:
|
|
|
|
" runs all formatters for current buffer without tab to spaces conversion
|
|
let b:neoformat_run_all_formatters = 1
|
|
let b:neoformat_basic_format_retab = 0
|
|
|
|
Have Neoformat only msg when there is an error
|
|
>
|
|
let g:neoformat_only_msg_on_error = 1
|
|
<
|
|
When debugging, you can enable either of following variables for extra logging.
|
|
>
|
|
let g:neoformat_verbose = 1 " only affects the verbosity of Neoformat
|
|
" Or
|
|
let &verbose = 1 " also increases verbosity of the editor as a whole
|
|
<
|
|
==============================================================================
|
|
ADDING A NEW FORMATTER *neoformat-adding-new-formatter*
|
|
|
|
Note: you should replace everything `{{ }}` accordingly
|
|
|
|
1. Create a file in `autoload/neoformat/formatters/{{ filetype }}.vim` if it does not
|
|
already exist for your filetype.
|
|
|
|
2. Follow the following format
|
|
|
|
See Config above for options
|
|
>
|
|
function! neoformat#formatters#{{ filetype }}#enabled() abort
|
|
return ['{{ formatter name }}', '{{ other formatter name for filetype }}']
|
|
endfunction
|
|
|
|
function! neoformat#formatters#{{ filetype }}#{{ formatter name }}() abort
|
|
return {
|
|
\ 'exe': '{{ formatter name }}',
|
|
\ 'args': ['-s 4', '-q'],
|
|
\ 'stdin': 1
|
|
\ }
|
|
endfunction
|
|
|
|
function! neoformat#formatters#{{ filetype }}#{{ other formatter name }}() abort
|
|
return {'exe': {{ other formatter name }}
|
|
endfunction
|
|
<
|
|
|
|
==============================================================================
|
|
MANAGING UNDO HISTORY *neoformat-managing-undo-history*
|
|
|
|
If you use an |autocmd| to run Neoformat on save, and you have your editor
|
|
configured to save automatically on |CursorHold| then you might run into
|
|
problems reverting changes. Pressing |u| will undo the last change made by
|
|
Neoformat instead of the change that you made yourself - and then Neoformat
|
|
will run again redoing the change that you just reverted. To avoid this
|
|
problem you can run Neoformat with the Vim |undojoin| command to put changes
|
|
made by Neoformat into the same |undo-block| with the preceding change. For
|
|
example:
|
|
|
|
>
|
|
augroup fmt
|
|
autocmd!
|
|
autocmd BufWritePre * undojoin | Neoformat
|
|
augroup END
|
|
<
|
|
|
|
When |undojoin| is used this way pressing |u| will "skip over" the Neoformat
|
|
changes - it will revert both the changes made by Neoformat and the change
|
|
that caused Neoformat to be invoked.
|
|
|
|
==============================================================================
|
|
SUPPORTED FILETYPES *neoformat-supported-filetypes*
|
|
|
|
- Arduino
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net),
|
|
[`clang-format`](http://clang.llvm.org/docs/ClangFormat.html),
|
|
[`astyle`](http://astyle.sourceforge.net)
|
|
- Assembly
|
|
- [`asmfmt`](https://github.com/klauspost/asmfmt)
|
|
- Bazel
|
|
- [`buildifier`](https://github.com/bazelbuild/buildtools/blob/master/buildifier/README.md)
|
|
- C
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net),
|
|
[`clang-format`](http://clang.llvm.org/docs/ClangFormat.html),
|
|
[`astyle`](http://astyle.sourceforge.net)
|
|
- C#
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net),
|
|
[`astyle`](http://astyle.sourceforge.net)
|
|
- C++
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net),
|
|
[`clang-format`](http://clang.llvm.org/docs/ClangFormat.html),
|
|
[`astyle`](http://astyle.sourceforge.net)
|
|
- CMake
|
|
- [`cmake_format`](https://github.com/cheshirekow/cmake_format)
|
|
- Crystal
|
|
- `crystal tool format` (ships with [`crystal`](http://crystal-lang.org))
|
|
- CSS
|
|
- `css-beautify` (ships with [`js-beautify`](https://github.com/beautify-web/js-beautify)),
|
|
[`prettier`](https://github.com/prettier/prettier),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff),
|
|
[`stylefmt`](https://github.com/morishitter/stylefmt),
|
|
[`stylelint`](https://stylelint.io/),
|
|
[`csscomb`](http://csscomb.com)
|
|
- CSV
|
|
- [`prettydiff`](https://github.com/prettydiff/prettydiff)
|
|
- D
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net),
|
|
[`dfmt`](https://github.com/Hackerpilot/dfmt)
|
|
- Dart
|
|
- [`dartfmt`](https://www.dartlang.org/tools/)
|
|
- Dhall
|
|
- [`dhall format`](https://dhall-lang.org)
|
|
- dune
|
|
- [`dune format`](https://github.com/ocaml/dune)
|
|
- Elixir
|
|
- [mix format](https://hexdocs.pm/mix/master/Mix.Tasks.Format.html)
|
|
- Elm
|
|
- [`elm-format`](https://github.com/avh4/elm-format)
|
|
- Fish
|
|
- [`fish_indent`](http://fishshell.com)
|
|
- Go
|
|
- [`gofmt`](https://golang.org/cmd/gofmt/),
|
|
[`goimports`](https://godoc.org/golang.org/x/tools/cmd/goimports)
|
|
- GLSL
|
|
- [`clang-format`](http://clang.llvm.org/docs/ClangFormat.html)
|
|
- GraphQL
|
|
- [`prettier`](https://github.com/prettier/prettier)
|
|
- Haskell
|
|
- [`stylish-haskell`](https://github.com/jaspervdj/stylish-haskell)
|
|
- [`hindent`](https://github.com/chrisdone/hindent)
|
|
- [`hfmt`](https://github.com/danstiner/hfmt)
|
|
- [`brittany`](https://github.com/lspitzner/brittany)
|
|
- [`sort-imports`](https://github.com/evanrelf/sort-imports)
|
|
- [`floskell`](https://github.com/ennocramer/floskell)
|
|
- [`ormolu`](https://github.com/tweag/ormolu)
|
|
`let g:ormolu_ghc_opt=["TypeApplications", "RankNTypes"]`
|
|
- PureScript
|
|
- [`purty`](https://gitlab.com/joneshf/purty)
|
|
- HTML
|
|
- `html-beautify` (ships with [`js-beautify`](https://github.com/beautify-web/js-beautify)),
|
|
[`prettier`](https://github.com/jlongster/prettier),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff)
|
|
- Jade
|
|
- [`pug-beautifier`](https://github.com/vingorius/pug-beautifier)
|
|
- Java
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net),
|
|
[`astyle`](http://astyle.sourceforge.net)
|
|
- JavaScript
|
|
- [`js-beautify`](https://github.com/beautify-web/js-beautify),
|
|
[`prettier`](https://github.com/jlongster/prettier),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff),
|
|
[`clang-format`](http://clang.llvm.org/docs/ClangFormat.html),
|
|
[`esformatter`](https://github.com/millermedeiros/esformatter/),
|
|
[`prettier-eslint`](https://github.com/kentcdodds/prettier-eslint-cli),
|
|
[`standard`](https://standardjs.com/)
|
|
- JSON
|
|
- [`js-beautify`](https://github.com/beautify-web/js-beautify),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff),
|
|
[`prettier`](https://github.com/prettier/prettier),
|
|
[`jq`](https://stedolan.github.io/jq/),
|
|
[`fixjson`](https://github.com/rhysd/fixjson)
|
|
- Kotlin
|
|
- [`ktlint`](https://github.com/shyiko/ktlint)
|
|
- LaTeX
|
|
- [`latexindent`](https://github.com/cmhughes/latexindent.pl)
|
|
- Less
|
|
- [`csscomb`](http://csscomb.com),
|
|
[`prettier`](https://github.com/prettier/prettier),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff),
|
|
[`stylelint`](https://stylelint.io/)
|
|
- Lua
|
|
- [`luaformatter`](https://github.com/LuaDevelopmentTools/luaformatter)
|
|
- Markdown
|
|
- [`remark`](https://github.com/wooorm/remark)
|
|
[`prettier`](https://github.com/prettier/prettier),
|
|
- Matlab
|
|
- [`matlab-formatter-vscode`](https://github.com/affenwiesel/matlab-formatter-vscode)
|
|
- Nim
|
|
- nimpretty (ships with [nim](https://nim-lang.org/)),
|
|
- Nix
|
|
- [`nixfmt`](https://github.com/serokell/nixfmt)
|
|
- Objective-C
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net),
|
|
[`clang-format`](http://clang.llvm.org/docs/ClangFormat.html),
|
|
[`astyle`](http://astyle.sourceforge.net)
|
|
- OCaml
|
|
- [`ocp-indent`](http://www.typerex.org/ocp-indent.html)
|
|
- [`ocamlformat`](https://github.com/ocaml-ppx/ocamlformat)
|
|
- Pandoc Markdown
|
|
- [`pandoc`](https://pandoc.org/MANUAL.html)
|
|
- Pawn
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net)
|
|
- Perl
|
|
- [`perltidy`](http://perltidy.sourceforge.net)
|
|
- PHP
|
|
- [`php_beautifier`](http://pear.php.net/package/PHP_Beautifier)
|
|
- [`php-cs-fixer`](http://cs.sensiolabs.org/)
|
|
- [`phpcbf`](https://github.com/squizlabs/PHP_CodeSniffer)
|
|
- Proto
|
|
- [`clang-format`](http://clang.llvm.org/docs/ClangFormat.html)
|
|
- Pug (formally Jade)
|
|
- [`pug-beautifier`](https://github.com/vingorius/pug-beautifier)
|
|
- Python
|
|
- [`yapf`](https://github.com/google/yapf),
|
|
[`autopep8`](https://github.com/hhatto/autopep8),
|
|
[`pydevf`](https://github.com/fabioz/PyDev.Formatter),
|
|
[`pyment`](https://github.com/dadadel/pyment)
|
|
[autoflake](https://github.com/myint/autoflake)
|
|
- R
|
|
- [`styler`](https://github.com/r-lib/styler),
|
|
[`formatR`](https://github.com/yihui/formatR)
|
|
- [`refmt`](https://github.com/facebook/reason)
|
|
- Ruby
|
|
- [`rufo`](https://github.com/asterite/rufo)
|
|
- [`ruby-beautify`](https://github.com/erniebrodeur/ruby-beautify)
|
|
- [`rubocop`](https://github.com/bbatsov/rubocop)
|
|
- Rust
|
|
- [`rustfmt`](https://github.com/rust-lang-nursery/rustfmt)
|
|
- Sass
|
|
- [`sass-convert`](http://sass-lang.com/documentation/#executables),
|
|
[`stylelint`](https://stylelint.io/),
|
|
[`csscomb`](http://csscomb.com)
|
|
- Sbt
|
|
- [`scalafmt`](http://scalameta.org/scalafmt/)
|
|
- Scala
|
|
- [`scalariform`](https://github.com/scala-ide/scalariform),
|
|
[`scalafmt`](http://scalameta.org/scalafmt/)
|
|
- SCSS
|
|
- [`sass-convert`](http://sass-lang.com/documentation/#executables),
|
|
[`stylefmt`](https://github.com/morishitter/stylefmt),
|
|
[`stylelint`](https://stylelint.io/)
|
|
[`prettier`](https://github.com/prettier/prettier),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff),
|
|
[`csscomb`](http://csscomb.com)
|
|
- Shell
|
|
- [`shfmt`](https://github.com/mvdan/sh)
|
|
- SQL
|
|
- [`sqlfmt`](https://github.com/jackc/sqlfmt)
|
|
- `sqlformat` (ships with [`sqlparse`](https://github.com/andialbrecht/sqlparse))
|
|
- `pg_format` (ships with [`pgFormatter`](https://github.com/darold/pgFormatter))
|
|
- Starlark
|
|
- [`buildifier`](https://github.com/bazelbuild/buildtools/blob/master/buildifier/README.md)
|
|
- Svelte
|
|
- [`prettier-plugin-svelte`](https://github.com/UnwrittenFun/prettier-plugin-svelte)
|
|
- Swift
|
|
- [`Swiftformat`](https://github.com/nicklockwood/SwiftFormat)
|
|
- Terraform
|
|
- [`terraform`](https://www.terraform.io/docs/commands/fmt.html)
|
|
- TypeScript
|
|
- [`tsfmt`](https://github.com/vvakame/typescript-formatter),
|
|
[`prettier`](https://github.com/prettier/prettier),
|
|
[`tslint`](https://palantir.github.io/tslint)
|
|
[`eslint_d`](https://github.com/mantoni/eslint_d.js)
|
|
[`clang-format`](http://clang.llvm.org/docs/ClangFormat.html),
|
|
- VALA
|
|
- [`uncrustify`](http://uncrustify.sourceforge.net)
|
|
- Vue
|
|
- [`prettier`](https://github.com/prettier/prettier)
|
|
- XHTML
|
|
- [`tidy`](http://www.html-tidy.org),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff)
|
|
- XML
|
|
- [`tidy`](http://www.html-tidy.org),
|
|
[`prettydiff`](https://github.com/prettydiff/prettydiff)
|
|
- YAML
|
|
- [`pyaml`](https://pypi.python.org/pypi/pyaml),
|
|
[`prettier`](https://github.com/prettier/prettier)
|
|
|
|
==============================================================================
|
|
vim:tw=78:ts=8:ft=help:norl:noet:fen:noet:
|