|
|
@ -1,86 +1,144 @@ |
|
|
|
return { |
|
|
|
"mfussenegger/nvim-lint", |
|
|
|
event = { "BufReadPre", "BufNewFile" }, |
|
|
|
config = function() |
|
|
|
local lint = require("lint") |
|
|
|
"mfussenegger/nvim-lint", |
|
|
|
event = { "BufReadPre", "BufNewFile" }, |
|
|
|
config = function() |
|
|
|
local lint = require("lint") |
|
|
|
|
|
|
|
local severities = { |
|
|
|
ERROR = vim.diagnostic.severity.ERROR, |
|
|
|
WARNING = vim.diagnostic.severity.WARN, |
|
|
|
} |
|
|
|
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 |
|
|
|
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 |
|
|
|
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"] |
|
|
|
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 |
|
|
|
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, |
|
|
|
} |
|
|
|
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" }, |
|
|
|
} |
|
|
|
-- 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, |
|
|
|
-- } |
|
|
|
|
|
|
|
local lint_augroup = vim.api.nvim_create_augroup("lint", { |
|
|
|
clear = true, |
|
|
|
}) |
|
|
|
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" }, |
|
|
|
} |
|
|
|
|
|
|
|
vim.api.nvim_create_autocmd({ |
|
|
|
"BufEnter", |
|
|
|
"BufWritePost", |
|
|
|
"InsertLeave", |
|
|
|
}, { |
|
|
|
group = lint_augroup, |
|
|
|
callback = function() |
|
|
|
lint.try_lint() |
|
|
|
end, |
|
|
|
}) |
|
|
|
local lint_augroup = vim.api.nvim_create_augroup("lint", { |
|
|
|
clear = true, |
|
|
|
}) |
|
|
|
|
|
|
|
-- vim.keymap.set("n", "<leader>ll", function() |
|
|
|
-- lint.try_lint() |
|
|
|
-- end) |
|
|
|
end, |
|
|
|
|
|
|
|
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, |
|
|
|
} |