Files
dotfiles/.config/nvim/lua/plugins/linter.lua
Belal Elsabbagh 8b6f7c4467 moved to stow
2024-12-23 10:51:37 +02:00

84 lines
2.9 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
return {
'mfussenegger/nvim-lint',
event = { 'BufReadPre', 'BufNewFile' },
dependencies = {
{ 'williamboman/mason.nvim', config = true },
},
config = function()
local lint = require 'lint'
-- Define a custom biome linter
local mason_registry = require 'mason-registry'
local biome_path = mason_registry.get_package('biome'):get_install_path() .. '/node_modules/@biomejs/biome/bin/biome'
lint.linters.biome = {
name = 'biome',
cmd = biome_path, -- Command to run the linter
args = { 'lint' }, -- Arguments for the command
stdin = false, -- Send content via stdin
append_fname = true, -- Automatically add the current file name to the command arguments
stream = 'both', -- Result stream
ignore_exitcode = true, -- Treat exit code != 1 as an error
parser = function(output)
local diagnostics = {}
-- The diagnostic details we need are spread in the first 3 lines of
-- each error report. These variables are declared out of the FOR
-- loop because we need to carry their values to parse multiple lines.
local fetch_message = false
local lnum, col, code, message
-- When a lnum:col:code line is detected fetch_message is set to true.
-- While fetch_message is true we will search for the error message.
-- When a error message is detected, we will create the diagnostic and
-- set fetch_message to false to restart the process and get the next
-- diagnostic.
for _, line in ipairs(vim.fn.split(output, '\n')) do
if fetch_message then
_, _, message = string.find(line, '%s×(.+)')
if message then
message = (message):gsub('^%s+×%s*', '')
table.insert(diagnostics, {
source = 'biomejs',
lnum = tonumber(lnum) - 1,
col = tonumber(col),
message = message,
code = code,
})
fetch_message = false
end
else
_, _, lnum, col, code = string.find(line, '[^:]+:(%d+):(%d+)%s([%a%/]+)')
if lnum then
fetch_message = true
end
end
end
return diagnostics
end, -- Custom parser for output
}
-- Set up linters by filetype
lint.linters_by_ft = {
vue = { 'biome' }, -- Lint Vue files using the overridden biome command
javascript = { 'biome' },
json = { 'biome' },
typescript = { 'biome' },
javascriptreact = { 'biome' },
typescriptreact = { 'biome' },
python = { 'ruff', 'mypy' },
-- Add more filetypes as needed
}
local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true })
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
group = lint_augroup,
callback = function()
lint.try_lint()
end,
})
end,
}