diff options
Diffstat (limited to 'lua/talha/plugins/lsp.lua')
| -rw-r--r-- | lua/talha/plugins/lsp.lua | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/lua/talha/plugins/lsp.lua b/lua/talha/plugins/lsp.lua new file mode 100644 index 0000000..2ceebde --- /dev/null +++ b/lua/talha/plugins/lsp.lua @@ -0,0 +1,122 @@ +return { + { + "VonHeikemen/lsp-zero.nvim", + branch = 'v2.x', + dependencies = { + -- LSP Support + {'neovim/nvim-lspconfig'}, -- Required + {'williamboman/mason.nvim'}, -- Optional + {'williamboman/mason-lspconfig.nvim'}, -- Optional + + -- Autocompletion + {'hrsh7th/nvim-cmp'}, -- Required + {'hrsh7th/cmp-nvim-lsp'}, -- Required + {'hrsh7th/cmp-buffer'}, -- Required + {'hrsh7th/cmp-nvim-lua'}, + {'L3MON4D3/LuaSnip'}, -- Required + }, + config = function() + +local lsp = require('lsp-zero').preset({}) +-- @notes on Lsp and Cmp configs here: +--[[ + +# LSP +1. Renamed the keymaps to what I use +2. Added a custom handler for formatting files. + It checks the explicitly defined language servers passed and if they allow formatting, only then will it attempt + to format the buffer + +# Complete +Completion is done by nvim-cmp. The setup for that does a few things. +1. Defines the sources to use for autocompletion: + a. LSP server + b. nvim-lua: only active in lua file I think + c. buffer: uses the current file for auto-completion (similar to default nvim behavior) +2. By default it pops up a list for auto-completion, we have that disabled. +3. When having auto-complete disabled, it takes extra steps to trigger autocomplete, due + to this we need to have it preselect the first item upon triggering autocomplete. +4. We define some custom mappings +--]] + + local function allow_format(servers) + return function(client) return vim.tbl_contains(servers, client.name) end + end + + + lsp.on_attach(function(client, bufnr) + -- see :help lsp-zero-keybindings + -- to learn the available actions + local opts = {buffer = bufnr, remap = false} + vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, opts) + vim.keymap.set("n", "gD", function() vim.lsp.buf.declaration() end, opts) + vim.keymap.set("n", "K", function() vim.lsp.buf.hover() end, opts) + vim.keymap.set("n", "<leader>vws", function() vim.lsp.buf.workspace_symbol() end, opts) + vim.keymap.set("n", "<leader>vd", function() vim.diagnostic.open_float() end, opts) + vim.keymap.set("n", "[d", function() vim.diagnostic.goto_prev() end, opts) + vim.keymap.set("n", "]d", function() vim.diagnostic.goto_next() end, opts) + vim.keymap.set("n", "<leader>vca", function() vim.lsp.buf.code_action() end, opts) + vim.keymap.set("n", "<leader>vrr", function() vim.lsp.buf.references() end, opts) + vim.keymap.set("n", "<leader>vrn", function() vim.lsp.buf.rename() end, opts) + vim.keymap.set("i", "<C-s>", function() vim.lsp.buf.signature_help() end, opts) + vim.keymap.set("n", "<leader>vlf", function() + vim.lsp.buf.format({ + async = false, + timeout_ms = 10000, + filter = allow_format({'rust_analyzer', 'tsserver', 'gopls', 'clangd', 'html-lsp'}), + }) + end, opts) + end) + + require('lspconfig').lua_ls.setup({ + settings = { + Lua = { + diagnostics = { + globals = { 'vim' } + } + } + } + }) + + lsp.setup() + + -- @todo: Look at luasnip and why I would require it + + + local cmp = require('cmp') + local cmp_action = require('lsp-zero').cmp_action() + + + cmp.setup({ + sources = { + { name = 'nvim_lsp' }, + { name = 'nvim_lua' }, + { name = 'buffer' }, + }, + preselect = 'item', + completion = { + autocomplete = false, + completeopt = 'menu,menuone,noinsert' + }, + mapping = cmp.mapping.preset.insert({ + -- Ctrl+Space to trigger completion menu + ['<C-Space>'] = cmp.mapping.complete(), + + -- Navigate between snippet placeholder + -- @note: don't know what this is + ['<C-f>'] = cmp_action.luasnip_jump_forward(), + ['<C-b>'] = cmp_action.luasnip_jump_backward(), + + -- Scroll up and down in the completion documentation + ['<C-u>'] = cmp.mapping.scroll_docs(-4), + ['<C-d>'] = cmp.mapping.scroll_docs(4), + }), + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + }) + end + }, +} |
