aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Arcangeli <stevearc@stevearc.com>2023-09-08 09:20:44 -0700
committerSteven Arcangeli <stevearc@stevearc.com>2023-09-08 09:20:44 -0700
commitc3028b327bc44335cc2b5c3014cd6d5c12a54ee4 (patch)
tree81549a571d9784d5f7e99794bb167d837d23fee5
parent0db858075b4d8214a34a6836d994e2100fed51bf (diff)
feat: format() can always fall back to LSP formatting
-rw-r--r--README.md22
-rw-r--r--doc/conform.txt7
-rw-r--r--lua/conform/init.lua17
3 files changed, 30 insertions, 16 deletions
diff --git a/README.md b/README.md
index 72514ef..86cef63 100644
--- a/README.md
+++ b/README.md
@@ -354,17 +354,17 @@ vim.api.nvim_create_autocmd("BufWritePost", {
`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. |
-| | formatters | `nil\|string[]` | List of formatters to run. Defaults to all formatters for the buffer filetype. |
-| | lsp_fallback | `nil\|boolean` | Attempt LSP formatting if no formatters are available. Defaults to false. |
-| | 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 |
-| callback | `nil\|fun(err: nil\|string)` | Called once formatting has completed | |
+| 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. |
+| | 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 |
+| callback | `nil\|fun(err: nil\|string)` | Called once formatting has completed | |
Returns:
diff --git a/doc/conform.txt b/doc/conform.txt
index fada19a..149db88 100644
--- a/doc/conform.txt
+++ b/doc/conform.txt
@@ -99,8 +99,11 @@ format({opts}, {callback}): boolean *conform.forma
to false.
{formatters} `nil|string[]` List of formatters to run. Defaults to
all formatters for the buffer filetype.
- {lsp_fallback} `nil|boolean` Attempt LSP formatting if no formatters
- are available. Defaults to false.
+ {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`
diff --git a/lua/conform/init.lua b/lua/conform/init.lua
index 2761b45..9f844b1 100644
--- a/lua/conform/init.lua
+++ b/lua/conform/init.lua
@@ -213,13 +213,13 @@ end
--- bufnr nil|integer Format this buffer (default 0)
--- async nil|boolean If true the method won't block. Defaults to false.
--- formatters nil|string[] List of formatters to run. Defaults to all formatters for the buffer filetype.
---- lsp_fallback nil|boolean Attempt LSP formatting if no formatters are available. Defaults to false.
+--- 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
---@param callback? fun(err: nil|string) Called once formatting has completed
---@return boolean True if any formatters were attempted
M.format = function(opts, callback)
- ---@type {timeout_ms: integer, bufnr: integer, async: boolean, lsp_fallback: boolean, quiet: boolean, formatters?: string[], range?: conform.Range}
+ ---@type {timeout_ms: integer, bufnr: integer, async: boolean, lsp_fallback: boolean|"always", quiet: boolean, formatters?: string[], range?: conform.Range}
opts = vim.tbl_extend("keep", opts or {}, {
timeout_ms = 1000,
bufnr = 0,
@@ -269,7 +269,18 @@ M.format = function(opts, callback)
if not err_message and not vim.api.nvim_buf_is_valid(opts.bufnr) then
err_message = "buffer was deleted"
end
- callback(err_message)
+ if err_message then
+ return callback(err_message)
+ end
+
+ if
+ opts.lsp_fallback == "always" and not vim.tbl_isempty(lsp_format.get_format_clients(opts))
+ then
+ log.debug("Running LSP formatter on %s", vim.api.nvim_buf_get_name(opts.bufnr))
+ lsp_format.format(opts, callback)
+ else
+ callback()
+ end
end
if opts.async then