stevearc / conform.nvim
- воскресенье, 17 сентября 2023 г. в 00:00:09
Lightweight yet powerful formatter plugin for Neovim
Lightweight yet powerful formatter plugin for Neovim
vim.lsp.buf.format()
.conform.nvim supports all the usual plugin managers
{
'stevearc/conform.nvim',
opts = {},
}
require('packer').startup(function()
use {
'stevearc/conform.nvim',
config = function() require('conform').setup() end
}
end)
require "paq" {
{'stevearc/conform.nvim'};
}
Plug 'stevearc/conform.nvim'
call dein#add('stevearc/conform.nvim')
git clone --depth=1 https://github.com/stevearc/conform.nvim.git ~/.vim/bundle/
git clone --depth=1 https://github.com/stevearc/conform.nvim.git \
"${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/pack/conform/start/conform.nvim
At a minimum, you will need to set up some formatters by filetype
require("conform").setup({
formatters_by_ft = {
lua = { "stylua" },
-- Conform will run multiple formatters sequentially
python = { "isort", "black" },
-- Use a sub-list to run only the first available formatter
javascript = { { "prettierd", "prettier" } },
},
})
Then you can use conform.format()
just like you would vim.lsp.buf.format()
. For example, to format on save:
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*",
callback = function(args)
require("conform").format({ bufnr = args.buf })
end,
})
As a shortcut, conform will optionally set up this format-on-save autocmd for you
require("conform").setup({
format_on_save = {
-- These options will be passed to conform.format()
timeout_ms = 500,
lsp_fallback = true,
},
})
See conform.format() for more details about the parameters.
Conform also provides a formatexpr, same as the LSP client:
vim.o.formatexpr = "v:lua.require'conform'.formatexpr()"
To view configured and available formatters, as well as to see the log file, run :ConformInfo
bash
support.swift build
.swift
code on macOS or Linux.terraform
configuration files to a canonical format and style.A complete list of all configuration options
require("conform").setup({
-- Map of filetype to formatters
formatters_by_ft = {
lua = { "stylua" },
-- Conform will run multiple formatters sequentially
python = { "isort", "black" },
-- Use a sub-list to run only the first available formatter
javascript = { { "prettierd", "prettier" } },
-- Use the "*" filetype to run formatters on all filetypes.
-- Note that if you use this, you may want to set lsp_fallback = "always"
-- (see :help conform.format)
["*"] = { "codespell" },
-- Use the "_" filetype to run formatters on all filetypes
-- that don't have other formatters configured. Again, you may want to
-- set lsp_fallback = "always" when using this value.
["_"] = { "trim_whitespace" },
},
-- If this is set, Conform will run the formatter on save.
-- It will pass the table to conform.format().
-- This can also be a function that returns the table.
format_on_save = {
-- I recommend these options. See :help conform.format for details.
lsp_fallback = true,
timeout_ms = 500,
},
-- If this is set, Conform will run the formatter asynchronously after save.
-- It will pass the table to conform.format().
-- This can also be a function that returns the table.
format_after_save = {
lsp_fallback = true,
},
-- Set the log level. Use `:ConformInfo` to see the location of the log file.
log_level = vim.log.levels.ERROR,
-- Conform will notify you when a formatter errors
notify_on_error = true,
-- Define custom formatters here
formatters = {
my_formatter = {
-- This can be a string or a function that returns a string
command = "my_cmd",
-- OPTIONAL - all fields below this are optional
-- A list of strings, or a function that returns a list of strings
-- Return a single string instead to run the command in a shell
args = { "--stdin-from-filename", "$FILENAME" },
-- If the formatter supports range formatting, create the range arguments here
range_args = function(ctx)
return { "--line-start", ctx.range.start[1], "--line-end", ctx.range["end"][1] }
end,
-- Send file contents to stdin, read new contents from stdout (default true)
-- When false, will create a temp file (will appear in "$FILENAME" args). The temp
-- file is assumed to be modified in-place by the format command.
stdin = true,
-- A function that calculates the directory to run the command in
cwd = require("conform.util").root_file({ ".editorconfig", "package.json" }),
-- When cwd is not found, don't run the formatter (default false)
require_cwd = true,
-- When returns false, the formatter will not be used
condition = function(ctx)
return vim.fs.basename(ctx.filename) ~= "README.md"
end,
-- Exit codes that indicate success (default {0})
exit_codes = { 0, 1 },
-- Environment variables. This can also be a function that returns a table.
env = {
VAR = "value",
},
},
-- These can also be a function that returns the formatter
other_formatter = function()
return {
command = "my_cmd",
}
end,
},
})
-- You can set formatters_by_ft and formatters directly
require("conform").formatters_by_ft.lua = { "stylua" }
require("conform").formatters.my_formatter = {
command = "my_cmd",
}
format(opts, callback): boolean
Format a buffer
Param | Type | Desc | |
---|---|---|---|
opts | nil|table |
||
timeout_ms | nil|integer |
Time in milliseconds to block for formatting. Defaults to 1000. No effect if async = true. | |
bufnr | nil|integer |
Format this buffer (default 0) | |
async | nil|boolean |
If true the method won't block. Defaults to false. If the buffer is modified before the formatter completes, the formatting will be discarded. | |
formatters | nil|string[] |
List of formatters to run. Defaults to all formatters for the buffer filetype. | |
lsp_fallback | nil|boolean|"always" |
Attempt LSP formatting if no formatters are available. Defaults to false. If "always", will attempt LSP formatting even if formatters are available (useful if you set formatters for the "*" filetype) | |
quiet | nil|boolean |
Don't show any notifications for warnings or failures. Defaults to false. | |
range | nil|table |
Range to format. Table must contain start and end keys with {row, col} tuples using (1,0) indexing. Defaults to current selection in visual mode |
|
id | nil|integer |
Passed to vim.lsp.buf.format when lsp_fallback = true | |
name | nil|string |
Passed to vim.lsp.buf.format when lsp_fallback = true | |
filter | nil|fun(client: table): boolean |
Passed to vim.lsp.buf.format when lsp_fallback = true | |
callback | nil|fun(err: nil|string) |
Called once formatting has completed |
Returns:
Type | Desc |
---|---|
boolean | True if any formatters were attempted |
list_formatters(bufnr): conform.FormatterInfo[]
Retrieve the available formatters for a buffer
Param | Type | Desc |
---|---|---|
bufnr | nil|integer |
list_all_formatters(): conform.FormatterInfo[]
List information about all filetype-configured formatters
get_formatter_info(formatter, bufnr): conform.FormatterInfo
Get information about a formatter (including availability)
Param | Type | Desc |
---|---|---|
formatter | string |
The name of the formatter |
bufnr | nil|integer |
Thanks to