mirror of
https://github.com/belsabbagh/dotfiles.git
synced 2026-04-11 09:36:46 +00:00
84 lines
2.9 KiB
Lua
84 lines
2.9 KiB
Lua
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,
|
||
}
|