diff --git a/lua/lazyvim/plugins/extras/lang/cmake.lua b/lua/lazyvim/plugins/extras/lang/cmake.lua index 30d7718c..cd802edf 100644 --- a/lua/lazyvim/plugins/extras/lang/cmake.lua +++ b/lua/lazyvim/plugins/extras/lang/cmake.lua @@ -18,6 +18,15 @@ return { }) end, }, + { + "mfussenegger/nvim-lint", + optional = true, + opts = { + linters_by_ft = { + cmake = { "cmakelint" }, + }, + }, + }, { "mason.nvim", opts = function(_, opts) diff --git a/lua/lazyvim/plugins/extras/lang/docker.lua b/lua/lazyvim/plugins/extras/lang/docker.lua index 6d85c8d7..d3e06ecb 100644 --- a/lua/lazyvim/plugins/extras/lang/docker.lua +++ b/lua/lazyvim/plugins/extras/lang/docker.lua @@ -25,6 +25,15 @@ return { end, }, }, + { + "mfussenegger/nvim-lint", + optional = true, + opts = { + linters_by_ft = { + dockerfile = { "hadolint" }, + }, + }, + }, { "neovim/nvim-lspconfig", opts = { diff --git a/lua/lazyvim/plugins/extras/lang/terraform.lua b/lua/lazyvim/plugins/extras/lang/terraform.lua index cb3aeaa2..6e368ff3 100644 --- a/lua/lazyvim/plugins/extras/lang/terraform.lua +++ b/lua/lazyvim/plugins/extras/lang/terraform.lua @@ -37,6 +37,16 @@ return { end end, }, + { + "mfussenegger/nvim-lint", + optional = true, + opts = { + linters_by_ft = { + terraform = { "terraform_validate" }, + tf = { "terraform_validate" }, + }, + }, + }, { "stevearc/conform.nvim", optional = true, diff --git a/lua/lazyvim/plugins/extras/linting/nvim-lint.lua b/lua/lazyvim/plugins/extras/linting/nvim-lint.lua new file mode 100644 index 00000000..c6c9629a --- /dev/null +++ b/lua/lazyvim/plugins/extras/linting/nvim-lint.lua @@ -0,0 +1,65 @@ +return { + { + "mfussenegger/nvim-lint", + event = "BufReadPost", + opts = { + events = { "BufWritePost", "BufReadPost", "InsertLeave" }, + linters_by_ft = { + fish = { "fish" }, + }, + linters = {}, + linter_opts = {}, + }, + config = function(_, opts) + local M = {} + M._did_setup = false + + function M.setup() + if M._did_setup then + return + end + local lint = require("lint") + for name, linter in pairs(opts.linters) do + lint.linters[name] = linter + end + lint.linters_by_ft = vim.tbl_extend("force", lint.linters_by_ft, opts.linters_by_ft) + for l, o in pairs(opts.linter_opts or {}) do + lint.linters[l] = vim.tbl_deep_extend("force", lint.linters[l], o) + end + M._did_setup = true + end + + 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() + M.setup() + local lint = require("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 (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, + }, +}