Added lsp capabilities of nvim cmp. It can now do much more as LSPs see
nvim has more functionalities (Show unimported functions etc). Also added better sorting to cmp entries. Added a notification when LSP finished loading.
This commit is contained in:
parent
2f72604e89
commit
3c2807b83c
3 changed files with 154 additions and 126 deletions
|
@ -1,135 +1,140 @@
|
||||||
local cmp_status_ok, cmp = pcall(require, "cmp")
|
local cmp_status_ok, cmp = pcall(require, "cmp")
|
||||||
if not cmp_status_ok then
|
if not cmp_status_ok then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local snip_status_ok, luasnip = pcall(require, "luasnip")
|
local snip_status_ok, luasnip = pcall(require, "luasnip")
|
||||||
if not snip_status_ok then
|
if not snip_status_ok then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
require("luasnip/loaders/from_vscode").lazy_load()
|
require("luasnip/loaders/from_vscode").lazy_load()
|
||||||
|
|
||||||
local check_backspace = function()
|
local check_backspace = function()
|
||||||
local col = vim.fn.col "." - 1
|
local col = vim.fn.col "." - 1
|
||||||
return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
|
return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
|
||||||
end
|
end
|
||||||
|
|
||||||
-- פּ ﯟ some other good icons
|
-- פּ ﯟ some other good icons
|
||||||
local kind_icons = {
|
local kind_icons = {
|
||||||
Text = "",
|
Text = "",
|
||||||
Method = "m",
|
Method = "m",
|
||||||
Function = "",
|
Function = "",
|
||||||
Constructor = "",
|
Constructor = "",
|
||||||
Field = "",
|
Field = "",
|
||||||
Variable = "",
|
Variable = "",
|
||||||
Class = "",
|
Class = "",
|
||||||
Interface = "",
|
Interface = "",
|
||||||
Module = "",
|
Module = "",
|
||||||
Property = "",
|
Property = "",
|
||||||
Unit = "",
|
Unit = "",
|
||||||
Value = "",
|
Value = "",
|
||||||
Enum = "",
|
Enum = "",
|
||||||
Keyword = "",
|
Keyword = "",
|
||||||
Snippet = "",
|
Snippet = "",
|
||||||
Color = "",
|
Color = "",
|
||||||
File = "",
|
File = "",
|
||||||
Reference = "",
|
Reference = "",
|
||||||
Folder = "",
|
Folder = "",
|
||||||
EnumMember = "",
|
EnumMember = "",
|
||||||
Constant = "",
|
Constant = "",
|
||||||
Struct = "",
|
Struct = "",
|
||||||
Event = "",
|
Event = "",
|
||||||
Operator = "",
|
Operator = "",
|
||||||
TypeParameter = "",
|
TypeParameter = "",
|
||||||
}
|
}
|
||||||
-- find more here: https://www.nerdfonts.com/cheat-sheet
|
-- find more here: https://www.nerdfonts.com/cheat-sheet
|
||||||
|
|
||||||
cmp.setup {
|
cmp.setup {
|
||||||
snippet = {
|
snippet = {
|
||||||
expand = function(args)
|
expand = function(args)
|
||||||
luasnip.lsp_expand(args.body) -- For `luasnip` users.
|
luasnip.lsp_expand(args.body) -- For `luasnip` users.
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
mapping = {
|
mapping = {
|
||||||
["<C-k>"] = cmp.mapping.select_prev_item(),
|
["<C-k>"] = cmp.mapping.select_prev_item(),
|
||||||
["<C-j>"] = cmp.mapping.select_next_item(),
|
["<C-j>"] = cmp.mapping.select_next_item(),
|
||||||
["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }),
|
["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }),
|
||||||
["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }),
|
["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }),
|
||||||
["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
|
["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
|
||||||
["<C-y>"] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
|
["<C-y>"] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
|
||||||
["<C-e>"] = cmp.mapping {
|
["<C-e>"] = cmp.mapping {
|
||||||
i = cmp.mapping.abort(),
|
i = cmp.mapping.abort(),
|
||||||
c = cmp.mapping.close(),
|
c = cmp.mapping.close(),
|
||||||
},
|
},
|
||||||
-- Accept currently selected item. If none selected, `select` first item.
|
-- Accept currently selected item. If none selected, `select` first item.
|
||||||
-- Set `select` to `false` to only confirm explicitly selected items.
|
-- Set `select` to `false` to only confirm explicitly selected items.
|
||||||
["<CR>"] = cmp.mapping.confirm { select = true },
|
["<CR>"] = cmp.mapping.confirm { select = true },
|
||||||
["<Tab>"] = cmp.mapping(function(fallback)
|
["<Tab>"] = cmp.mapping(function(fallback)
|
||||||
if cmp.visible() then
|
if cmp.visible() then
|
||||||
cmp.select_next_item()
|
cmp.select_next_item()
|
||||||
elseif luasnip.expandable() then
|
elseif luasnip.expandable() then
|
||||||
luasnip.expand()
|
luasnip.expand()
|
||||||
elseif luasnip.expand_or_jumpable() then
|
elseif luasnip.expand_or_jumpable() then
|
||||||
luasnip.expand_or_jump()
|
luasnip.expand_or_jump()
|
||||||
elseif check_backspace() then
|
elseif check_backspace() then
|
||||||
fallback()
|
fallback()
|
||||||
else
|
else
|
||||||
fallback()
|
fallback()
|
||||||
end
|
end
|
||||||
end, {
|
end, {
|
||||||
"i",
|
"i",
|
||||||
"s",
|
"s",
|
||||||
}),
|
}),
|
||||||
["<S-Tab>"] = cmp.mapping(function(fallback)
|
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||||
if cmp.visible() then
|
if cmp.visible() then
|
||||||
cmp.select_prev_item()
|
cmp.select_prev_item()
|
||||||
elseif luasnip.jumpable(-1) then
|
elseif luasnip.jumpable(-1) then
|
||||||
luasnip.jump(-1)
|
luasnip.jump(-1)
|
||||||
else
|
else
|
||||||
fallback()
|
fallback()
|
||||||
end
|
end
|
||||||
end, {
|
end, {
|
||||||
"i",
|
"i",
|
||||||
"s",
|
"s",
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
formatting = {
|
formatting = {
|
||||||
fields = { "kind", "abbr", "menu" },
|
fields = { "kind", "abbr", "menu" },
|
||||||
format = function(entry, vim_item)
|
format = function(entry, vim_item)
|
||||||
-- Kind icons
|
-- Kind icons
|
||||||
vim_item.kind = string.format("%s", kind_icons[vim_item.kind])
|
vim_item.kind = string.format("%s", kind_icons[vim_item.kind])
|
||||||
-- vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind
|
-- vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind
|
||||||
vim_item.menu = ({
|
vim_item.menu = ({
|
||||||
nvim_lsp = "(LSP)",
|
nvim_lsp = "(LSP)",
|
||||||
luasnip = "(Snippet)",
|
luasnip = "(Snippet)",
|
||||||
buffer = "(Text)",
|
buffer = "(Text)",
|
||||||
path = "(Path)",
|
path = "(Path)",
|
||||||
})[entry.source.name]
|
})[entry.source.name]
|
||||||
return vim_item
|
return vim_item
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
sources = {
|
sorting = {
|
||||||
{ name = "nvim_lsp" },
|
comparators = {
|
||||||
{ name = "luasnip" },
|
cmp.config.compare.exact,
|
||||||
{ name = "buffer" },
|
cmp.config.compare.offset,
|
||||||
{ name = "path" },
|
cmp.config.compare.recently_used,
|
||||||
},
|
}
|
||||||
confirm_opts = {
|
},
|
||||||
behavior = cmp.ConfirmBehavior.Replace,
|
sources = {
|
||||||
select = false,
|
{ name = "nvim_lsp" },
|
||||||
},
|
{ name = "luasnip" },
|
||||||
window = {
|
{ name = "buffer" },
|
||||||
documentation = cmp.config.window.bordered(),
|
{ name = "path" },
|
||||||
completion = cmp.config.window.bordered({
|
},
|
||||||
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None"
|
confirm_opts = {
|
||||||
})
|
behavior = cmp.ConfirmBehavior.Replace,
|
||||||
|
select = false,
|
||||||
|
},
|
||||||
|
window = {
|
||||||
|
documentation = cmp.config.window.bordered(),
|
||||||
|
completion = cmp.config.window.bordered({
|
||||||
|
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None"
|
||||||
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
experimental = {
|
experimental = {
|
||||||
ghost_text = false,
|
ghost_text = false,
|
||||||
native_menu = false,
|
native_menu = false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
local mason_lspconfig = require "mason-lspconfig"
|
local mason_lspconfig = require "mason-lspconfig"
|
||||||
|
local notify = require "notify"
|
||||||
|
|
||||||
mason_lspconfig.setup({
|
mason_lspconfig.setup({
|
||||||
ensure_installed = { "sumneko_lua", "rust_analyzer", "texlab", "hls", "yamlls" },
|
ensure_installed = { "sumneko_lua", "rust_analyzer", "texlab", "hls", "yamlls" },
|
||||||
automatic_installation = true
|
automatic_installation = true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
local opts = { noremap = true, silent = true }
|
local opts = { noremap = true, silent = true }
|
||||||
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
|
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
|
||||||
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
|
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
|
||||||
|
@ -46,15 +48,32 @@ local on_attach = function(client, bufnr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local on_init = function (client, initialize_result)
|
||||||
|
-- Alert user that LSP finished loading
|
||||||
|
notify("Finished loading " ..client.name, "info", {title = "LSP"})
|
||||||
|
end
|
||||||
|
|
||||||
local lspconfig = require "lspconfig"
|
local lspconfig = require "lspconfig"
|
||||||
|
|
||||||
|
-- ADD NVIM CMP AS A CAPABILITY
|
||||||
|
local lsp_defaults = lspconfig.util.default_config
|
||||||
|
|
||||||
|
local capabilities = vim.tbl_deep_extend(
|
||||||
|
'force',
|
||||||
|
lsp_defaults.capabilities,
|
||||||
|
require('cmp_nvim_lsp').default_capabilities()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
mason_lspconfig.setup_handlers {
|
mason_lspconfig.setup_handlers {
|
||||||
|
|
||||||
-- This is a default handler that will be called for each installed server (also for new servers that are installed during a session)
|
-- This is a default handler that will be called for each installed server (also for new servers that are installed during a session)
|
||||||
function(server_name)
|
function(server_name)
|
||||||
lspconfig[server_name].setup {
|
lspconfig[server_name].setup {
|
||||||
on_attach = on_attach,
|
on_attach = on_attach,
|
||||||
|
on_init = on_init,
|
||||||
flags = lsp_flags,
|
flags = lsp_flags,
|
||||||
|
capabilities = capabilities,
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,8 +46,21 @@ local plugins = packer.startup({ function(use)
|
||||||
vim.notify = require("notify")
|
vim.notify = require("notify")
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
-------------------------------------------------------LSP----------------------------------------------
|
|
||||||
|
|
||||||
|
--------------------------------------------------SUGGESTION BOX-----------------------------------------
|
||||||
|
use { "hrsh7th/nvim-cmp",
|
||||||
|
requires = {
|
||||||
|
'hrsh7th/cmp-nvim-lsp', -- lsp
|
||||||
|
'hrsh7th/cmp-buffer', --buffer completions
|
||||||
|
'hrsh7th/cmp-path', --path completions
|
||||||
|
'hrsh7th/cmp-cmdline' --cmdline completions
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
require "plugins.cmp"
|
||||||
|
end
|
||||||
|
}
|
||||||
|
-------------------------------------------------------LSP----------------------------------------------
|
||||||
|
|
||||||
use { "williamboman/mason.nvim",
|
use { "williamboman/mason.nvim",
|
||||||
config = function()
|
config = function()
|
||||||
require "plugins.mason"
|
require "plugins.mason"
|
||||||
|
@ -56,6 +69,8 @@ local plugins = packer.startup({ function(use)
|
||||||
|
|
||||||
use { "williamboman/mason-lspconfig.nvim" }
|
use { "williamboman/mason-lspconfig.nvim" }
|
||||||
|
|
||||||
|
use { "hrsh7th/cmp-nvim-lsp"}
|
||||||
|
|
||||||
use { "neovim/nvim-lspconfig",
|
use { "neovim/nvim-lspconfig",
|
||||||
config = function()
|
config = function()
|
||||||
require "plugins.lspconfig"
|
require "plugins.lspconfig"
|
||||||
|
@ -74,19 +89,8 @@ local plugins = packer.startup({ function(use)
|
||||||
"saadparwaiz1/cmp_luasnip"
|
"saadparwaiz1/cmp_luasnip"
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
--------------------------------------------------SUGGESTION BOX-----------------------------------------
|
|
||||||
use { "hrsh7th/nvim-cmp",
|
|
||||||
requires = {
|
|
||||||
'hrsh7th/cmp-nvim-lsp', -- lsp
|
|
||||||
'hrsh7th/cmp-buffer', --buffer completions
|
|
||||||
'hrsh7th/cmp-path', --path completions
|
|
||||||
'hrsh7th/cmp-cmdline' --cmdline completions
|
|
||||||
},
|
|
||||||
config = function()
|
|
||||||
require "plugins.cmp"
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
use { 'nvim-tree/nvim-tree.lua',
|
use { 'nvim-tree/nvim-tree.lua',
|
||||||
requires = {
|
requires = {
|
||||||
|
|
Loading…
Reference in a new issue