From cd75be867f2331b22905f47d28c0c270a69466aa Mon Sep 17 00:00:00 2001 From: Micah Halter Date: Mon, 1 Jul 2024 13:58:55 -0400 Subject: feat(shfmt): add automatic indentation detection (#481) * feat(shfmt): automatically detect indentation * fix(markdown-toc): improve correctness of indentation size calculation * fix(djlint): improve correctness of indentation size calculation * feat: add effective `shiftwidth` to `conform.Context` this also refactors formatters that automatically set indentation level to use the new shiftwidth context --- lua/conform/formatters/djlint.lua | 3 +-- lua/conform/formatters/markdown-toc.lua | 4 ++-- lua/conform/formatters/shfmt.lua | 8 +++++++- lua/conform/runner.lua | 6 ++++++ lua/conform/types.lua | 1 + 5 files changed, 17 insertions(+), 5 deletions(-) (limited to 'lua') diff --git a/lua/conform/formatters/djlint.lua b/lua/conform/formatters/djlint.lua index b7a177b..13c966d 100644 --- a/lua/conform/formatters/djlint.lua +++ b/lua/conform/formatters/djlint.lua @@ -7,8 +7,7 @@ return { }, command = "djlint", args = function(_, ctx) - local indent = vim.bo[ctx.buf].tabstop or 4 -- default is 4 - return { "--reformat", "--indent", indent, "-" } + return { "--reformat", "--indent", ctx.shiftwidth, "-" } end, cwd = util.root_file({ ".djlintrc", diff --git a/lua/conform/formatters/markdown-toc.lua b/lua/conform/formatters/markdown-toc.lua index a7a9694..5e1d80a 100644 --- a/lua/conform/formatters/markdown-toc.lua +++ b/lua/conform/formatters/markdown-toc.lua @@ -6,10 +6,10 @@ return { }, command = "markdown-toc", stdin = false, - args = function(self, ctx) + args = function(_, ctx) -- use the indentation set in the current buffer, effectively allowing us to -- use values from .editorconfig - local indent = vim.bo[ctx.buf].expandtab and (" "):rep(vim.bo[ctx.buf].tabstop) or "\t" + local indent = vim.bo[ctx.buf].expandtab and (" "):rep(ctx.shiftwidth) or "\t" return { "--indent=" .. indent, "-i", "$FILENAME" } end, } diff --git a/lua/conform/formatters/shfmt.lua b/lua/conform/formatters/shfmt.lua index 29b8615..6a75ff9 100644 --- a/lua/conform/formatters/shfmt.lua +++ b/lua/conform/formatters/shfmt.lua @@ -5,5 +5,11 @@ return { description = "A shell parser, formatter, and interpreter with `bash` support.", }, command = "shfmt", - args = { "-filename", "$FILENAME" }, + args = function(_, ctx) + local args = { "-filename", "$FILENAME" } + if vim.bo[ctx.buf].expandtab then + vim.list_extend(args, { "-i", ctx.shiftwidth }) + end + return args + end, } diff --git a/lua/conform/runner.lua b/lua/conform/runner.lua index 3831198..c0a19cd 100644 --- a/lua/conform/runner.lua +++ b/lua/conform/runner.lua @@ -450,6 +450,11 @@ M.build_context = function(bufnr, config, range) end local filename = vim.api.nvim_buf_get_name(bufnr) + local shiftwidth = vim.bo[bufnr].shiftwidth + if shiftwidth == 0 then + shiftwidth = vim.bo[bufnr].tabstop + end + -- Hack around checkhealth. For buffers that are not files, we need to fabricate a filename if vim.bo[bufnr].buftype ~= "" then filename = "" @@ -482,6 +487,7 @@ M.build_context = function(bufnr, config, range) filename = filename, dirname = dirname, range = range, + shiftwidth = shiftwidth, } end diff --git a/lua/conform/types.lua b/lua/conform/types.lua index b00c3f0..05a4e4f 100644 --- a/lua/conform/types.lua +++ b/lua/conform/types.lua @@ -49,6 +49,7 @@ ---@field filename string ---@field dirname string ---@field range? conform.Range +---@field shiftwidth integer ---@class (exact) conform.RangeContext : conform.Context ---@field range conform.Range -- cgit v1.2.3-70-g09d2