return { "mfussenegger/nvim-lint", event = { "BufReadPre", "BufNewFile" }, config = function() local lint = require("lint") local severities = { ERROR = vim.diagnostic.severity.ERROR, WARNING = vim.diagnostic.severity.WARN, } lint.linters.phpcs = { name = "phpcs", cmd = "phpcs", stdin = true, args = { "-q", "--report=json", "--standard=~/.config/phpcs.xml", "-", -- need `-` at the end for stdin support }, ignore_exitcode = true, parser = function(output, _) if vim.trim(output) == "" or output == nil then return {} end if not vim.startswith(output, "{") then vim.notify(output) return {} end local decoded = vim.json.decode(output) local diagnostics = {} local messages = decoded["files"]["STDIN"]["messages"] for _, msg in ipairs(messages or {}) do table.insert(diagnostics, { lnum = msg.line - 1, end_lnum = msg.line - 1, col = msg.column - 1, end_col = msg.column - 1, message = msg.message, code = msg.source, source = "phpcs", severity = assert(severities[msg.type], "missing mapping for severity " .. msg.type), }) end return diagnostics end, } -- lint.linters.eslint_d = { -- name = "eslint_d", -- cmd = "eslint_d", -- args = { -- '--config=./frontend/.eslintrc.js', -- '--no-warn-ignored', -- '--format', -- 'json', -- '--stdin', -- '--stdin-filename', -- function() -- return vim.api.nvim_buf_get_name(0) -- end, -- }, -- parser = function(output, _) -- local diagnostics = {} -- local decoded = vim.json.decode(output) -- for _, message in ipairs(decoded[1].messages or {}) do -- table.insert(diagnostics, { -- lnum = message.line - 1, -- end_lnum = message.endLine and message.endLine - 1 or nil, -- col = message.column - 1, -- end_col = message.endColumn and message.endColumn - 1 or nil, -- message = message.message, -- code = message.ruleId, -- source = "eslint_d", -- severity = severities[message.severity], -- }) -- end -- return diagnostics -- end, -- } lint.linters_by_ft = { javascript = { "eslint" }, typescript = { "eslint" }, vue = { "eslint" }, json = { "jsonlint" }, markdown = { "markdownlint" }, php = { "phpcs" }, golang = { "gospell", "golangci-lint" }, python = { "pylint" }, dockerfile = { "hadolint" }, blade = { "phpcs" }, } local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true, }) local function find_nearest_node_modules_dir() -- current buffer dir local current_dir = vim.fn.expand('%:p:h') .. "./frontend" while current_dir ~= "/" do if vim.fn.isdirectory(current_dir .. "/node_modules") == 1 then return current_dir end current_dir = vim.fn.fnamemodify(current_dir, ":h") end return nil end vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave", }, { group = lint_augroup, callback = function() local ft = vim.bo.filetype local js_types = { "javascript", "typescript", "javascriptreact", "typescriptreact", "vue" } if not vim.tbl_contains(js_types, ft) then lint.try_lint() return end local original_cwd = vim.fn.getcwd() local node_modules_dir = find_nearest_node_modules_dir() if node_modules_dir then vim.cmd("cd " .. node_modules_dir) end lint.try_lint() vim.cmd("cd " .. original_cwd) end, }) -- vim.keymap.set("n", "ll", function() -- lint.try_lint() -- end) end, }