return { 'mason-org/mason-lspconfig.nvim', dependencies = { { 'neovim/nvim-lspconfig' }, { 'mason-org/mason.nvim', opts = { ui = { icons = { package_installed = "✓", package_pending = "➜", package_uninstalled = "✗", }, }, }, }, { 'hrsh7th/nvim-cmp', event = { 'InsertEnter', 'CmdlineEnter' }, config = function() local cmp = require 'cmp' local lspkind = require 'lspkind' local cmp_select = { behavior = cmp.SelectBehavior.Select } local luasnip = require 'luasnip' cmp.setup({ snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'copilot' }, }, { { name = 'buffer', keyword_length = 4 }, { name = 'path' }, { name = 'dotenv' }, { name = 'emoji' }, }), formatting = { format = lspkind.cmp_format({ mode = 'symbol', maxwidth = { menu = 50, abbr = 50 }, symbol_map = { Copilot = '' }, ellipsis_char = '...', show_labelDetails = true, before = function(_, vim_item) return vim_item end, }), }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.select_prev_item(cmp_select), [''] = cmp.mapping.select_next_item(cmp_select), [''] = cmp.mapping.confirm({ select = true }), [''] = cmp.mapping.complete(), [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.abort(), }), preselect = cmp.PreselectMode.Item, completion = { completeopt = 'menu,menuone,noinsert', }, }) cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'git' }, }, { { name = 'buffer' }, }), }) cmp.setup.filetype({ 'json', 'jsonc' }, { sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'npm' }, }, { { name = 'buffer', keyword_length = 4 }, }), }) cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' }, }, }) cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' }, }, { { name = 'cmdline' }, }), matching = { disallow_symbol_nonprefix_matching = false }, }) end, }, { 'hrsh7th/cmp-nvim-lsp' }, { 'nvim-lua/plenary.nvim' }, { 'hrsh7th/cmp-path' }, { 'zbirenbaum/copilot-cmp', config = function() require 'copilot_cmp'.setup() end, }, { 'hrsh7th/cmp-buffer' }, { 'hrsh7th/cmp-emoji' }, { 'SergioRibera/cmp-dotenv' }, { 'saadparwaiz1/cmp_luasnip' }, { 'onsails/lspkind.nvim' }, { 'rafamadriz/friendly-snippets' }, { 'petertriho/cmp-git', config = function() require 'cmp_git'.setup({}) end, }, { 'David-Kunz/cmp-npm', config = function() require 'cmp-npm'.setup({}) end, }, { 'j-hui/fidget.nvim', config = function() require 'fidget'.setup({}) end, }, { 'stevearc/conform.nvim', config = function() require 'conform'.setup({ formatters_by_ft = { cs = { 'csharpier', 'lsp' }, javascript = { 'prettierd', 'prettier' }, javascriptreact = { 'prettierd', 'prettier' }, typescript = { 'prettierd', 'prettier' }, typescriptreact = { 'prettierd', 'prettier' }, json = { 'prettierd', 'prettier' }, html = { 'prettierd', 'prettier' }, css = { 'prettierd', 'prettier' }, lua = { 'stylua' }, }, }) vim.api.nvim_create_user_command( 'Format', function(args) local range if args.count ~= -1 then local start_line = vim.fn.line("'<") local end_line = vim.fn.line("'>") range = { start = { start_line, 0 }, ["end"] = { end_line, 0 } } end require 'conform'.format({ async = true, lsp_fallback = true, range = range, }) end, { range = true, desc = "Format current buffer or range" }) end, keys = { { 'fk', ':Format', mode = { 'n', 'v' }, silent = true, desc = "Format with conform", }, }, }, { 'L3MON4D3/LuaSnip', version = 'v2.*', build = 'make install_jsregexp', }, { 'zbirenbaum/copilot.lua', cmd = 'Copilot', event = 'InsertEnter', config = function() require 'copilot'.setup({ -- Disable native ghost text so copilot-cmp can manage suggestions instead suggestion = { enabled = false }, panel = { enabled = false }, }) end, }, { 'AndreM222/copilot-lualine' }, { 'windwp/nvim-autopairs', event = 'InsertEnter', config = true, }, { 'windwp/nvim-ts-autotag', config = function() require 'nvim-ts-autotag'.setup({}) end, }, { 'hrsh7th/cmp-cmdline' }, }, config = function() vim.diagnostic.config({ float = { focusable = false, style = 'minimal', border = 'rounded', source = true, header = '', prefix = '', }, }) require 'mason'.setup({}) local cmp = require 'cmp' local cmp_lsp = require 'cmp_nvim_lsp' local lspconfig = require 'lspconfig' local capabilities = vim.tbl_deep_extend( 'force', {}, vim.lsp.protocol.make_client_capabilities(), cmp_lsp.default_capabilities() ) local cmp_autopairs = require 'nvim-autopairs.completion.cmp' cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done()) cmp.event:on('menu_opened', function() vim.b.copilot_suggestion_hidden = true end) cmp.event:on('menu_closed', function() vim.b.copilot_suggestion_hidden = false end) require 'mason-lspconfig'.setup({ ensure_installed = { 'angularls', 'bashls', 'clangd', 'cssls', 'css_variables', 'cssmodules_ls', 'docker_compose_language_service', 'docker_language_server', 'dockerls', 'eslint', 'gopls', 'graphql', 'html', 'htmx', 'intelephense', 'jsonls', 'kotlin_lsp', 'ltex', 'ltex_plus', 'lua_ls', 'markdown_oxide', 'phpactor', 'postgres_lsp', 'prismals', 'pylyzer', 'pyright', 'remark_ls', 'rust_analyzer', 'sqlls', 'svelte', 'tailwindcss', 'tinymist', 'vtsls', 'yamlls', }, handlers = { function(server_name) lspconfig[server_name].setup({ capabilities = capabilities, }) end, zls = function() lspconfig.zls.setup({ root_dir = lspconfig.util.root_pattern('.git', 'build.zig', 'zls.json'), settings = { zls = { enable_inlay_hints = true, enable_snippets = true, warn_style = true, }, }, }) vim.g.zig_fmt_parse_errors = 0 vim.g.zig_fmt_autosave = 0 end, ['vtsls'] = function() lspconfig.vtsls.setup({ capabilities = capabilities, root_dir = lspconfig.util.root_pattern('turbo.json', 'pnpm-workspace.yaml', '.git'), settings = { vtsls = { autoUseWorkspaceTsdk = true, experimental = { completion = { enableServerSideFuzzyMatch = true, }, }, }, typescript = { updateImportsOnFileMove = { enabled = 'always' }, suggest = { completeFunctionCalls = true }, preferences = { importModuleSpecifier = 'non-relative', includePackageJsonAutoImports = 'auto', }, inlayHints = { parameterNames = { enabled = 'literals' }, parameterTypes = { enabled = true }, variableTypes = { enabled = true }, propertyDeclarationTypes = { enabled = true }, functionLikeReturnTypes = { enabled = true }, enumMemberValues = { enabled = true }, }, }, javascript = { updateImportsOnFileMove = { enabled = 'always' }, suggest = { completeFunctionCalls = true }, inlayHints = { parameterNames = { enabled = 'literals' }, parameterTypes = { enabled = true }, variableTypes = { enabled = true }, propertyDeclarationTypes = { enabled = true }, functionLikeReturnTypes = { enabled = true }, enumMemberValues = { enabled = true }, }, }, }, }) end, ['lua_ls'] = function() lspconfig.lua_ls.setup({ capabilities = capabilities, settings = { Lua = { runtime = { version = 'LuaJIT' }, diagnostics = { globals = { 'vim' } }, workspace = { library = vim.api.nvim_get_runtime_file('', true), checkThirdParty = false, maxPreload = 100000, preloadFileSize = 10000, }, telemetry = { enable = false }, format = { enable = true, defaultConfig = { indent_style = 'space', indent_size = '2', }, }, }, }, }) end, }, }) end, }