|
|
@ -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() |