| @ -0,0 +1,101 @@ | |||||
| local lsp = require('lsp-zero') | |||||
| lsp.preset('recommended') | |||||
| local luasnip = require("luasnip") | |||||
| lsp.ensure_installed({ | |||||
| 'tsserver', | |||||
| 'eslint', | |||||
| 'sumneko_lua', | |||||
| 'gopls' | |||||
| }) | |||||
| local has_words_before = function() | |||||
| local line, col = unpack(vim.api.nvim_win_get_cursor(0)) | |||||
| return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match "%s" == nil | |||||
| end | |||||
| local cmp = require('cmp') | |||||
| -- local cmp_select = {behavior = cmp.SelectBehavior.Select} | |||||
| local cmp_mappings = lsp.defaults.cmp_mappings({ | |||||
| ["<C-k>"] = cmp.mapping(cmp.mapping.select_prev_item(), { "i", "c" }), | |||||
| ["<C-j>"] = cmp.mapping(cmp.mapping.select_next_item(), { "i", "c" }), | |||||
| ["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }), | |||||
| ["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }), | |||||
| ["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), | |||||
| ["<C-e>"] = cmp.mapping { i = cmp.mapping.close(), c = cmp.mapping.close() }, | |||||
| ["<CR>"] = cmp.mapping { | |||||
| i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }, | |||||
| c = function(fallback) | |||||
| if cmp.visible() then | |||||
| cmp.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false } | |||||
| else | |||||
| fallback() | |||||
| end | |||||
| end, | |||||
| }, | |||||
| ["<Tab>"] = cmp.mapping( | |||||
| function(fallback) | |||||
| if cmp.visible() then | |||||
| cmp.select_next_item() | |||||
| elseif luasnip.expand_or_jumpable() then | |||||
| luasnip.expand_or_jump() | |||||
| elseif has_words_before() then | |||||
| cmp.complete() | |||||
| else | |||||
| fallback() | |||||
| end | |||||
| end, | |||||
| { | |||||
| "i", | |||||
| "s", | |||||
| "c", | |||||
| }), | |||||
| ["<S-Tab>"] = cmp.mapping(function(fallback) | |||||
| if cmp.visible() then | |||||
| cmp.select_prev_item() | |||||
| elseif luasnip.jumpable(-1) then | |||||
| luasnip.jump(-1) | |||||
| else | |||||
| fallback() | |||||
| end | |||||
| end, | |||||
| { | |||||
| "i", | |||||
| "s", | |||||
| "c", | |||||
| }), | |||||
| }) | |||||
| lsp.setup_nvim_cmp({ | |||||
| mapping = cmp_mappings, | |||||
| window = { | |||||
| documentation = { | |||||
| border = { "╭", "─", "╮", "│", "╯", "─", "╰", "│" }, | |||||
| winhighlight = "NormalFloat:NormalFloat,FloatBorder:TelescopeBorder", | |||||
| }, | |||||
| }, | |||||
| }) | |||||
| lsp.on_attach(function(client, bufnr) | |||||
| local opts = {buffer = bufnr, remap = false} | |||||
| -- Key mappings | |||||
| vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) | |||||
| vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) | |||||
| vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts) | |||||
| vim.keymap.set("n", "[e", function () vim.diagnostic.goto_prev({severity = vim.diagnostic.severity.ERROR}) end, opts) | |||||
| vim.keymap.set("n", "]e", function () vim.diagnostic.goto_next({severity = vim.diagnostic.severity.ERROR}) end, opts) | |||||
| vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts) | |||||
| vim.keymap.set("n", "<leader>ka", vim.lsp.buf.code_action, opts) | |||||
| vim.keymap.set("n", "<leader>of", vim.diagnostic.open_float, opts) | |||||
| vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) | |||||
| vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts) | |||||
| -- vim.keymap.set("n", "gr", function() vim.lsp.buf.references({ includeDeclaration = false }) end, opts) | |||||
| vim.keymap.set("n", "gh", vim.lsp.buf.signature_help, opts) | |||||
| vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts) | |||||
| vim.keymap.set("n", "gT", vim.lsp.buf.type_definition, opts) | |||||
| end) | |||||
| lsp.setup() | |||||