vim.keymap.set('n', 'd', vim.diagnostic.open_float, { noremap = true, silent = true }) vim.diagnostic.config({ update_in_insert = false, virtual_text = { prefix = '', -- remove annoying ▎ etc format = function(diagnostic) -- Show the source (e.g. "luacheck", "lua_ls") before the message if diagnostic.source then return string.format('[%s] %s', diagnostic.source, diagnostic.message) end return diagnostic.message end, }, float = { border = 'rounded', source = true, -- show source in floating window too }, severity_sort = true, }) vim.lsp.enable({ 'lua_ls' }) vim.lsp.enable({ 'json_ls' }) return { { 'mason-org/mason.nvim', config = true }, -- { 'saghen/blink.cmp', version = '1.*' }, { 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate', main = 'nvim-treesitter.configs', opts = { highlight = { enable = true }, incremental_selection = { enable = true }, textobjects = { enable = true }, ensure_installed = { -- Documentation 'vim', 'vimdoc', 'markdown', 'markdown_inline', -- Data 'gitcommit', 'gitignore', 'dockerfile', 'diff', 'json', 'jsonc', -- Scripting 'bash', 'lua', 'sql', -- Programming 'c', 'cpp', 'go', 'rust', 'python', -- Web 'html', 'css', 'javascript', 'typescript', 'tsx', }, }, }, { 'mfussenegger/nvim-lint', event = { 'BufReadPre', 'BufNewFile' }, opts = { linters_by_ft = { lua = { 'luacheck' }, python = { 'ruff' }, javascript = { 'eslint_d' }, }, }, config = function(_, opts) local lint = require('lint') lint.linters_by_ft = opts.linters_by_ft vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, { group = vim.api.nvim_create_augroup('lint_autocmd', { clear = true }), callback = function() lint.try_lint() end, }) end, }, { 'stevearc/conform.nvim', event = { 'BufWritePre' }, opts = { -- Automatically format on save format_on_save = { timeout_ms = 500, lsp_format = 'fallback', -- Use LSP when no formatter is configured }, -- Formatters per filetype default_format_opts = { stop_after_first = true }, formatters_by_ft = { lua = { 'stylua' }, sh = { 'shfmt' }, swift = { 'swift_format' }, python = { 'isort', 'black' }, javascript = { 'prettierd', 'prettier' }, javascriptreact = { 'prettierd', 'prettier' }, typescript = { 'prettierd', 'prettier' }, typescriptreact = { 'prettierd', 'prettier' }, }, }, config = function(_, opts) require('conform').setup(opts) -- Create a command to format manually vim.api.nvim_create_user_command('Format', function() require('conform').format({ async = true, lsp_format = 'fallback', }) end, { desc = 'Format current buffer' }) end, }, }