From 90a8200e7c7fefebb73c7f71b98416a3e498cd63 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Tue, 10 Oct 2023 22:12:33 +0200 Subject: [PATCH] feat!: make `conform.nvim` and `nvim-lint` the default formatters/linters --- .../plugins/extras/formatting/black.lua | 1 + .../plugins/extras/formatting/prettier.lua | 1 + lua/lazyvim/plugins/extras/lang/cmake.lua | 3 +- lua/lazyvim/plugins/extras/lang/docker.lua | 3 +- lua/lazyvim/plugins/extras/lang/elixir.lua | 3 +- lua/lazyvim/plugins/extras/lang/go.lua | 14 ++-- lua/lazyvim/plugins/extras/lang/omnisharp.lua | 1 + lua/lazyvim/plugins/extras/lang/terraform.lua | 12 ++-- lua/lazyvim/plugins/extras/lsp/none-ls.lua | 45 +++++++++++++ .../formatting/conform.lua => formatting.lua} | 0 lua/lazyvim/plugins/linting.lua | 67 +++++++++++++++++++ lua/lazyvim/plugins/lsp/init.lua | 43 ------------ lua/lazyvim/util/format.lua | 19 ++++++ 13 files changed, 148 insertions(+), 64 deletions(-) create mode 100644 lua/lazyvim/plugins/extras/lsp/none-ls.lua rename lua/lazyvim/plugins/{extras/formatting/conform.lua => formatting.lua} (100%) create mode 100644 lua/lazyvim/plugins/linting.lua diff --git a/lua/lazyvim/plugins/extras/formatting/black.lua b/lua/lazyvim/plugins/extras/formatting/black.lua index bfa383a8..769c3009 100644 --- a/lua/lazyvim/plugins/extras/formatting/black.lua +++ b/lua/lazyvim/plugins/extras/formatting/black.lua @@ -10,6 +10,7 @@ return { optional = true, opts = function(_, opts) local nls = require("null-ls") + opts.sources = opts.sources or {} table.insert(opts.sources, nls.builtins.formatting.black) end, }, diff --git a/lua/lazyvim/plugins/extras/formatting/prettier.lua b/lua/lazyvim/plugins/extras/formatting/prettier.lua index 81fc1939..6f1f3b58 100644 --- a/lua/lazyvim/plugins/extras/formatting/prettier.lua +++ b/lua/lazyvim/plugins/extras/formatting/prettier.lua @@ -10,6 +10,7 @@ return { optional = true, opts = function(_, opts) local nls = require("null-ls") + opts.sources = opts.sources or {} table.insert(opts.sources, nls.builtins.formatting.prettierd) end, }, diff --git a/lua/lazyvim/plugins/extras/lang/cmake.lua b/lua/lazyvim/plugins/extras/lang/cmake.lua index bc7b235a..404a072a 100644 --- a/lua/lazyvim/plugins/extras/lang/cmake.lua +++ b/lua/lazyvim/plugins/extras/lang/cmake.lua @@ -12,8 +12,7 @@ return { optional = true, opts = function(_, opts) local nls = require("null-ls") - opts.sources = opts.sources or {} - vim.list_extend(opts.sources, { + opts.sources = vim.list_extend(opts.sources or {}, { nls.builtins.diagnostics.cmake_lint, }) end, diff --git a/lua/lazyvim/plugins/extras/lang/docker.lua b/lua/lazyvim/plugins/extras/lang/docker.lua index 86c7175b..da9605ec 100644 --- a/lua/lazyvim/plugins/extras/lang/docker.lua +++ b/lua/lazyvim/plugins/extras/lang/docker.lua @@ -19,8 +19,7 @@ return { optional = true, opts = function(_, opts) local nls = require("null-ls") - opts.sources = opts.sources or {} - vim.list_extend(opts.sources, { + opts.sources = vim.list_extend(opts.sources or {}, { nls.builtins.diagnostics.hadolint, }) end, diff --git a/lua/lazyvim/plugins/extras/lang/elixir.lua b/lua/lazyvim/plugins/extras/lang/elixir.lua index 53454c37..f60dc18e 100644 --- a/lua/lazyvim/plugins/extras/lang/elixir.lua +++ b/lua/lazyvim/plugins/extras/lang/elixir.lua @@ -37,8 +37,7 @@ return { return end local nls = require("null-ls") - opts.sources = opts.sources or {} - vim.list_extend(opts.sources, { + opts.sources = vim.list_extend(opts.sources or {}, { nls.builtins.diagnostics.credo, }) end, diff --git a/lua/lazyvim/plugins/extras/lang/go.lua b/lua/lazyvim/plugins/extras/lang/go.lua index 39410353..7e87678b 100644 --- a/lua/lazyvim/plugins/extras/lang/go.lua +++ b/lua/lazyvim/plugins/extras/lang/go.lua @@ -86,14 +86,12 @@ return { "nvimtools/none-ls.nvim", optional = true, opts = function(_, opts) - if type(opts.sources) == "table" then - local nls = require("null-ls") - vim.list_extend(opts.sources, { - nls.builtins.code_actions.gomodifytags, - nls.builtins.code_actions.impl, - nls.builtins.formatting.goimports, - }) - end + local nls = require("null-ls") + opts.sources = vim.list_extend(opts.sources or {}, { + nls.builtins.code_actions.gomodifytags, + nls.builtins.code_actions.impl, + nls.builtins.formatting.goimports, + }) end, }, { diff --git a/lua/lazyvim/plugins/extras/lang/omnisharp.lua b/lua/lazyvim/plugins/extras/lang/omnisharp.lua index d244fd77..31162e0c 100644 --- a/lua/lazyvim/plugins/extras/lang/omnisharp.lua +++ b/lua/lazyvim/plugins/extras/lang/omnisharp.lua @@ -13,6 +13,7 @@ return { optional = true, opts = function(_, opts) local nls = require("null-ls") + opts.sources = opts.sources or {} table.insert(opts.sources, nls.builtins.formatting.csharpier) end, }, diff --git a/lua/lazyvim/plugins/extras/lang/terraform.lua b/lua/lazyvim/plugins/extras/lang/terraform.lua index 6e368ff3..ea7bd5de 100644 --- a/lua/lazyvim/plugins/extras/lang/terraform.lua +++ b/lua/lazyvim/plugins/extras/lang/terraform.lua @@ -28,13 +28,11 @@ return { "nvimtools/none-ls.nvim", optional = true, opts = function(_, opts) - if type(opts.sources) == "table" then - local null_ls = require("null-ls") - vim.list_extend(opts.sources, { - null_ls.builtins.formatting.terraform_fmt, - null_ls.builtins.diagnostics.terraform_validate, - }) - end + local null_ls = require("null-ls") + opts.sources = vim.list_extend(opts.sources or {}, { + null_ls.builtins.formatting.terraform_fmt, + null_ls.builtins.diagnostics.terraform_validate, + }) end, }, { diff --git a/lua/lazyvim/plugins/extras/lsp/none-ls.lua b/lua/lazyvim/plugins/extras/lsp/none-ls.lua new file mode 100644 index 00000000..aa907b8e --- /dev/null +++ b/lua/lazyvim/plugins/extras/lsp/none-ls.lua @@ -0,0 +1,45 @@ +local Util = require("lazyvim.util") + +return { + -- none-ls + { + "nvimtools/none-ls.nvim", + event = "LazyFile", + dependencies = { "mason.nvim" }, + init = function() + Util.on_very_lazy(function() + -- register the formatter with LazyVim + require("lazyvim.util").format.register({ + name = "none-ls.nvim", + priority = 200, -- set higher than conform, the builtin formatter + primary = true, + format = function(buf) + return Util.lsp.format({ + bufnr = buf, + filter = function(client) + return client.name == "null-ls" + end, + }) + end, + sources = function(buf) + local ret = require("null-ls.sources").get_available(vim.bo[buf].filetype, "NULL_LS_FORMATTING") or {} + return vim.tbl_map(function(source) + return source.name + end, ret) + end, + }) + end) + end, + opts = function(_, opts) + local nls = require("null-ls") + opts.root_dir = opts.root_dir + or require("null-ls.utils").root_pattern(".null-ls-root", ".neoconf.json", "Makefile", ".git") + opts.sources = vim.list_extend(opts.sources or {}, { + nls.builtins.formatting.fish_indent, + nls.builtins.diagnostics.fish, + nls.builtins.formatting.stylua, + nls.builtins.formatting.shfmt, + }) + end, + }, +} diff --git a/lua/lazyvim/plugins/extras/formatting/conform.lua b/lua/lazyvim/plugins/formatting.lua similarity index 100% rename from lua/lazyvim/plugins/extras/formatting/conform.lua rename to lua/lazyvim/plugins/formatting.lua diff --git a/lua/lazyvim/plugins/linting.lua b/lua/lazyvim/plugins/linting.lua new file mode 100644 index 00000000..1fb7ab5d --- /dev/null +++ b/lua/lazyvim/plugins/linting.lua @@ -0,0 +1,67 @@ +return { + { + "mfussenegger/nvim-lint", + event = "LazyFile", + opts = { + -- Event to trigger linters + events = { "BufWritePost", "BufReadPost", "InsertLeave" }, + linters_by_ft = { + fish = { "fish" }, + }, + -- LazyVim extension to easily override linter options + -- or add custom linters. + ---@type table + linters = { + -- -- Example of using selene only when a selene.toml file is present + -- selene = { + -- -- `condition` is another LazyVim extension that allows you to + -- -- dynamically enable/disable linters based on the context. + -- condition = function(ctx) + -- return vim.fs.find({ "selene.toml" }, { path = ctx.filename, upward = true })[1] + -- end, + -- }, + }, + }, + config = function(_, opts) + local M = {} + + local lint = require("lint") + for name, linter in pairs(opts.linters) do + if type(linter) == "table" and type(lint.linters) == "table" then + lint.linters[name] = vim.tbl_deep_extend("force", lint.linters[name], linter) + end + end + lint.linters_by_ft = opts.linters_by_ft + + function M.debounce(ms, fn) + local timer = vim.loop.new_timer() + return function(...) + local argv = { ... } + timer:start(ms, 0, function() + timer:stop() + vim.schedule_wrap(fn)(unpack(argv)) + end) + end + end + + function M.lint() + local names = lint.linters_by_ft[vim.bo.filetype] or {} + local ctx = { filename = vim.api.nvim_buf_get_name(0) } + ctx.dirname = vim.fn.fnamemodify(ctx.filename, ":h") + names = vim.tbl_filter(function(name) + local linter = lint.linters[name] + return linter and not (type(linter) == "table" and linter.condition and not linter.condition(ctx)) + end, names) + + if #names > 0 then + lint.try_lint(names) + end + end + + vim.api.nvim_create_autocmd(opts.events, { + group = vim.api.nvim_create_augroup("nvim-lint", { clear = true }), + callback = M.debounce(100, M.lint), + }) + end, + }, +} diff --git a/lua/lazyvim/plugins/lsp/init.lua b/lua/lazyvim/plugins/lsp/init.lua index b9e38e8b..165367bf 100644 --- a/lua/lazyvim/plugins/lsp/init.lua +++ b/lua/lazyvim/plugins/lsp/init.lua @@ -200,49 +200,6 @@ return { end, }, - -- formatters - { - "nvimtools/none-ls.nvim", - event = "LazyFile", - dependencies = { "mason.nvim" }, - opts = function() - local nls = require("null-ls") - return { - root_dir = require("null-ls.utils").root_pattern(".null-ls-root", ".neoconf.json", "Makefile", ".git"), - sources = { - nls.builtins.formatting.fish_indent, - nls.builtins.diagnostics.fish, - nls.builtins.formatting.stylua, - nls.builtins.formatting.shfmt, - }, - } - end, - config = function(_, opts) - require("null-ls").setup(opts) - - -- register the formatter with LazyVim - require("lazyvim.util").format.register({ - name = "none-ls.nvim", - priority = 50, - primary = true, - format = function(buf) - return Util.lsp.format({ - bufnr = buf, - filter = function(client) - return client.name == "null-ls" - end, - }) - end, - sources = function(buf) - local ret = require("null-ls.sources").get_available(vim.bo[buf].filetype, "NULL_LS_FORMATTING") or {} - return vim.tbl_map(function(source) - return source.name - end, ret) - end, - }) - end, - }, - -- cmdline tools and lsp servers { diff --git a/lua/lazyvim/util/format.lua b/lua/lazyvim/util/format.lua index 05f5f5fd..b9822a95 100644 --- a/lua/lazyvim/util/format.lua +++ b/lua/lazyvim/util/format.lua @@ -124,7 +124,26 @@ function M.format(opts) end end +function M.health() + local Config = require("lazy.core.config") + local has_plugin = Config.spec.plugins["none-ls.nvim"] + local has_extra = vim.tbl_contains(Config.spec.modules, "lazyvim.plugins.extras.lsp.none-ls") + if has_plugin and not has_extra then + Util.warn({ + "`conform.nvim` and `nvim-lint` are now the default forrmatters and linters in LazyVim.", + "", + "You can use those plugins together with `none-ls.nvim`,", + "but you need to enable the `lazyvim.plugins.extras.lsp.none-ls` extra,", + "for formatting to work correctly.", + "", + "In case you no longer want to use `none-ls.nvim`, just remove the spec from your config.", + }) + end +end + function M.setup() + M.health() + -- Autoformat autocmd vim.api.nvim_create_autocmd("BufWritePre", { group = vim.api.nvim_create_augroup("LazyFormat", {}),