diff --git a/lua/lsp/config/bashls.lua b/lua/lsp/config/bashls.lua index 8627ec0..fa2ded3 100644 --- a/lua/lsp/config/bashls.lua +++ b/lua/lsp/config/bashls.lua @@ -19,8 +19,7 @@ return { rhs = function() utils.format({ cmd = { "shfmt", "-s", "-i", "4", "-" }, - stdin = true, - stdout = true, + output = "stdout", }) end, }, diff --git a/lua/lsp/config/jedi_language_server.lua b/lua/lsp/config/jedi_language_server.lua index 5f4653c..993b448 100644 --- a/lua/lsp/config/jedi_language_server.lua +++ b/lua/lsp/config/jedi_language_server.lua @@ -44,8 +44,7 @@ return { "--quiet", "-", }, - stdin = true, - stdout = true, + output = "stdout", }) utils.format({ cmd = { @@ -53,8 +52,7 @@ return { "--quiet", "-", }, - stdin = true, - stdout = true, + output = "stdout", }) end, }, @@ -73,8 +71,7 @@ return { "--line-ranges=%row_start%-%row_end%", "-", }, - stdin = true, - stdout = true, + output = "stdout", }) end, }, diff --git a/lua/lsp/config/lua_ls.lua b/lua/lsp/config/lua_ls.lua index 44d0a9a..67e80d9 100644 --- a/lua/lsp/config/lua_ls.lua +++ b/lua/lsp/config/lua_ls.lua @@ -16,8 +16,7 @@ return { rhs = function() utils.format({ cmd = { "stylua", "-" }, - stdin = true, - stdout = true, + output = "stdout", }) end, }, @@ -34,8 +33,7 @@ return { "--range-end", "%byte_end%", }, - stdin = true, - stdout = true, + output = "stdout", }) end, }, diff --git a/lua/lsp/config/pyright.lua b/lua/lsp/config/pyright.lua index 87e3f74..44355ee 100644 --- a/lua/lsp/config/pyright.lua +++ b/lua/lsp/config/pyright.lua @@ -44,8 +44,7 @@ return { "--quiet", "-", }, - stdin = true, - stdout = true, + output = "stdout", }) utils.format({ cmd = { @@ -53,8 +52,7 @@ return { "--quiet", "-", }, - stdin = true, - stdout = true, + output = "stdout", }) end, }, @@ -73,8 +71,7 @@ return { "--line-ranges=%row_start%-%row_end%", "-", }, - stdin = true, - stdout = true, + output = "stdout", }) end, }, diff --git a/lua/utils.lua b/lua/utils.lua index 5da2028..f543c7e 100644 --- a/lua/utils.lua +++ b/lua/utils.lua @@ -144,6 +144,10 @@ function M.has_module(module) return has_module end +---@alias OutputStream +---| '"stdout"' +---| '"stderr"' + ---@class FormatOptions ---@field cmd string[] Command to run. The following keywords get replaces by the specified values: --- * %file% - path to the current file @@ -154,8 +158,7 @@ end --- * %col_end% - last column position of selection --- * %byte_start% - byte count of first cell in selection --- * %byte_end% - byte count of last cell in selection ----@field stdout? boolean Use stdout as the result. False by default. ----@field stderr? boolean Use stderr as the result. False by default. +---@field output OutputStream What stream to use as the result. May be one of `stdout` or `stderr`. ---@field auto_indent? boolean Perform auto indent on formatted range. False by default. ---@field only_selection? boolean Only send the selected lines to `stdin`. False by default. @@ -164,14 +167,13 @@ end function M.format(opts) opts = { cmd = opts.cmd, - stdout = opts.stdout or false, - stderr = opts.stderr or false, + output = opts.output, auto_indent = opts.auto_indent or false, only_selection = opts.only_selection or false, } - if not opts.stdout and not opts.stderr then - M.err("one of `stdout` or `stderr` must be set") + if opts.output ~= "stdout" and opts.output ~= "stderr" then + M.err("`output` must be set to either `stdout` or `stderr`.") return end @@ -222,7 +224,7 @@ function M.format(opts) local stdout, stderr, err local resp = vim.system(opts.cmd, { stdin = input, - stdout = opts.stdout and function(e, data) + stdout = opts.output == "stdout" and function(e, data) if data then stdout = stdout and stdout .. data or data end @@ -231,7 +233,7 @@ function M.format(opts) err = err and err .. e or e end end, - stderr = opts.stderr and function(e, data) + stderr = function(e, data) if data then stderr = stderr and stderr .. data or data end @@ -247,19 +249,24 @@ function M.format(opts) return end - if resp.code ~= 0 or resp.signal ~= 0 then - M.err(("Failed to format:\n%s"):format(stderr or "")) + if + resp.code ~= 0 + or resp.signal ~= 0 + or (opts.output ~= "stderr" and stderr) + then + local msg + if stdout then + msg = "\n" .. stdout + end + if stderr then + msg = "\n" .. stderr + end + + M.err(("Failed to format:%s"):format(msg or "")) return end - local output - if opts.stdout then - output = stdout or "" - end - if opts.stderr then - output = stderr or "" - end - + local output = opts.output == "stdout" and stdout or stderr or "" output = output:gsub("\n$", "") local output_lines = vim.fn.split(output, "\n", true) @@ -271,9 +278,7 @@ function M.format(opts) if opts.auto_indent then if is_visual then - vim.api.nvim_command( - ("%d,%dnormal! =="):format(row_start, row_start + #output_lines) - ) + vim.api.nvim_command(("%d,%dnormal! =="):format(row_start, row_start + #output_lines)) else vim.api.nvim_command("normal! gg=G") end