return { 'neovim/nvim-lspconfig', event = { 'BufReadPost', 'FileType' }, dependencies = { 'hrsh7th/cmp-nvim-lsp', { 'antosha417/nvim-lsp-file-operations', config = true }, }, config = function() -- import lspconfig plugin local lspconfig = require('lspconfig') -- import cmp-nvim-lsp plugin local cmp_nvim_lsp = require('cmp_nvim_lsp') local keymap = vim.keymap -- for conciseness vim.api.nvim_create_autocmd('LspAttach', { group = vim.api.nvim_create_augroup('UserLspConfig', {}), callback = function(ev) -- Buffer local mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions local opts = { buffer = ev.buf, silent = true } -- set keybinds opts.desc = 'Show LSP references' keymap.set('n', 'gR', 'Telescope lsp_references', opts) -- show definition, references opts.desc = 'Go to declaration' keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) -- go to declaration opts.desc = 'Show LSP definitions' keymap.set('n', 'gd', 'Telescope lsp_definitions', opts) -- show lsp definitions opts.desc = 'Show LSP implementations' keymap.set('n', 'gi', 'Telescope lsp_implementations', opts) -- show lsp implementations opts.desc = 'Show LSP type definitions' keymap.set('n', 'gt', 'Telescope lsp_type_definitions', opts) -- show lsp type definitions opts.desc = 'See available code actions' keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) -- see available code actions, in visual mode will apply to selection opts.desc = 'Smart rename' keymap.set('n', 'rn', vim.lsp.buf.rename, opts) -- smart rename opts.desc = 'Show buffer diagnostics' keymap.set('n', 'D', 'Telescope diagnostics bufnr=0', opts) -- show diagnostics for file opts.desc = 'Show line diagnostics' keymap.set('n', 'd', vim.diagnostic.open_float, opts) -- show diagnostics for line opts.desc = 'Show documentation for what is under cursor' keymap.set('n', 'K', vim.lsp.buf.hover, opts) -- show documentation for what is under cursor opts.desc = 'Restart LSP' keymap.set('n', 'rs', ':LspRestart', opts) -- mapping to restart lsp if necessary end, }) -- used to enable autocompletion (assign to every lsp server config) local capabilities = cmp_nvim_lsp.default_capabilities() -- configure matlab server lspconfig['clangd'].setup({ capabilities = capabilities, on_attach = on_attach, }) -- configure bash server lspconfig['bashls'].setup({ capabilities = capabilities, on_attach = on_attach, }) -- configure html server lspconfig['html'].setup({ capabilities = capabilities, on_attach = on_attach, }) -- configure typescript server with plugin lspconfig['tsserver'].setup({ capabilities = capabilities, on_attach = on_attach, }) -- configure css server lspconfig['cssls'].setup({ capabilities = capabilities, on_attach = on_attach, }) -- configure tailwindcss server lspconfig['tailwindcss'].setup({ capabilities = capabilities, on_attach = on_attach, }) -- configure svelte server lspconfig['svelte'].setup({ capabilities = capabilities, on_attach = function(client, bufnr) on_attach(client, bufnr) vim.api.nvim_create_autocmd('BufWritePost', { pattern = { '*.js', '*.ts' }, callback = function(ctx) if client.name == 'svelte' then client.notify('$/onDidChangeTsOrJsFile', { uri = ctx.file }) end end, }) end, }) -- configure python server lspconfig['pyright'].setup({ capabilities = capabilities, on_attach = on_attach, }) -- configure lua server (with special settings) lspconfig['lua_ls'].setup({ capabilities = capabilities, on_attach = on_attach, settings = { -- custom settings for lua Lua = { -- make the language server recognize "vim" global diagnostics = { globals = { 'vim' }, }, workspace = { -- make language server aware of runtime files library = { [vim.fn.expand('$VIMRUNTIME/lua')] = true, [vim.fn.stdpath('config') .. '/lua'] = true, }, }, }, }, }) local x = vim.diagnostic.severity local config = { -- Enable virtual text virtual_text = { -- or false for disable prefix = '', -- ■  󰊠 suffix = '', format = function(diagnostic) local prefix = '󰊠 ' local suffix = ' ' -- return full message with custom prefix & suffix return prefix .. diagnostic.message .. suffix end, }, update_in_insert = true, signs = { text = { [x.ERROR] = '', [x.WARN] = '', [x.HINT] = '󰌵', [x.INFO] = '' } }, underline = false, severity_sort = true, float = { focusable = false, style = 'minimal', border = 'rounded', source = 'always', header = '', prefix = '', }, } vim.diagnostic.config(config) -- add borders to lsp info window require('lspconfig.ui.windows').default_options.border = 'single' end, }