diff --git a/lua/plugins/lsp.lua b/lua/plugins/lsp.lua index fca5c10..ffb78b0 100644 --- a/lua/plugins/lsp.lua +++ b/lua/plugins/lsp.lua @@ -1,128 +1,55 @@ --- 1. Setup for all requested language servers: --- - Ruby (ruby_lsp) --- - TypeScript/JavaScript (ts_ls) --- - HTML (html) --- - CSS (cssls) --- - Dart (dartls) --- --- 2. Standard LSP keybindings: --- - gD: Go to declaration --- - gd: Go to definition --- - K: Hover documentation --- - gi: Go to implementation --- - : Signature help --- - wa: Add workspace folder --- - wr: Remove workspace folder --- - wl: List workspace folders --- - D: Type definition --- - rn: Rename --- - ca: Code actions --- - gr: Find references --- - f: Format code +local on_attach = function(client, bufnr) + local opts = { noremap = true, silent = true, buffer = bufnr } + + vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) + vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) + vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) + vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) + vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) + vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) + vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, opts) + vim.keymap.set('n', 'wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, opts) + vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, opts) + vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) + vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, opts) + vim.keymap.set('n', 'li', vim.lsp.buf.implementation, opts) + vim.keymap.set('n', 'ld', vim.lsp.buf.definition, opts) + vim.keymap.set('n', 'lt', vim.lsp.buf.type_definition, opts) + vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) + vim.keymap.set('n', 'f', function() + vim.lsp.buf.format { async = true } + end, opts) +end + +local config = function(_, opts) + local lspconfig = require('lspconfig') + for server, config in pairs(opts.servers) do + -- passing config.capabilities to blink.cmp merges with the capabilities in your + -- `opts[server].capabilities, if you've defined it + config.capabilities = require('blink.cmp').get_lsp_capabilities(config.capabilities) + lspconfig[server].setup(config) + end +end return { { "neovim/nvim-lspconfig", dependencies = { - "hrsh7th/cmp-nvim-lsp", + -- "hrsh7th/cmp-nvim-lsp", + 'saghen/blink.cmp' }, - config = function() - local lspconfig = require('lspconfig') - - -- Global LSP settings - local capabilities = require('cmp_nvim_lsp').default_capabilities() - - -- LSP keymaps - local on_attach = function(client, bufnr) - local opts = { noremap = true, silent = true, buffer = bufnr } - - vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) - vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) - vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) - vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) - vim.keymap.set('n', '', vim.lsp.buf.signature_help, opts) - vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, opts) - vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, opts) - vim.keymap.set('n', 'wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, opts) - vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, opts) - vim.keymap.set('n', 'rn', vim.lsp.buf.rename, opts) - vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, opts) - vim.keymap.set('n', 'li', vim.lsp.buf.implementation, opts) - vim.keymap.set('n', 'ld', vim.lsp.buf.definition, opts) - vim.keymap.set('n', 'lt', vim.lsp.buf.type_definition, opts) - vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) - vim.keymap.set('n', 'f', function() - vim.lsp.buf.format { async = true } - end, opts) - end - - -- Custom Diagnostics Keymaps - vim.keymap.set('n', 'cd', vim.diagnostic.open_float, { desc = 'Line Diagnostics' }) - vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Previous Diagnostic' }) - vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Next Diagnostic' }) - vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Set Loclist Diagnostics' }) - - -- Ruby LSP - lspconfig.ruby_lsp.setup({ - -- cmd = { vim.fn.expand("~/.asdf/shims/ruby"), "-S", "ruby-lsp" }, - capabilities = capabilities, - on_attach = on_attach, - }) - - -- TypeScript/JavaScript LSP - lspconfig.ts_ls.setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - -- HTML LSP - lspconfig.html.setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - -- CSS LSP - lspconfig.cssls.setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - -- Dart LSP (Flutter) - lspconfig.dartls.setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - - -- NOTE: Not sure this works - -- Auto-import missing imports on save for JS/TS - vim.api.nvim_create_autocmd("BufWritePre", { - pattern = { "*.ts", "*.tsx", "*.js", "*.jsx" }, - callback = function() - local params = { - context = { - only = { "source.addMissingImports.ts" }, - }, - } - local clients = vim.lsp.get_active_clients({ name = "ts_ls" }) - for _, client in ipairs(clients) do - if client.supports_method("textDocument/codeAction") then - vim.lsp.buf_request(0, "textDocument/codeAction", vim.lsp.util.make_range_params(), function(_, result) - if result and result[1] then - if result[1].edit then - vim.lsp.util.apply_workspace_edit(result[1].edit, client.offset_encoding or "utf-8") - end - if result[1].command then - vim.lsp.buf.execute_command(result[1].command) - end - end - end) - end - end - end, - }) - end, + opts = { + servers = { + ruby_lsp = { on_attach = on_attach }, + ts_ls = { on_attach = on_attach }, + html = { on_attach = on_attach }, + cssls = { on_attach = on_attach }, + dartls = { on_attach = on_attach }, + lua_ls = { on_attach = on_attach }, + } + }, + config = config, } }