You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

112 lines
3.6 KiB

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_by_ft = {
javascript = { "eslint" },
typescript = { "eslint" },
vue = { "eslint" },
json = { "jsonlint" },
markdown = { "markdownlint" },
php = { "phpcs" },
golang = { "gospell", "golangci-lint" },
python = { "pylint" },
dockerfile = { "hadolint" },
blade = { "phpcs" },
html = { "curlylint" },
}
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", "<leader>ll", function()
-- lint.try_lint()
-- end)
end,
}