2023-01-10 02:38:06 +01:00
|
|
|
local env = require("my.helpers.env")
|
|
|
|
|
|
|
|
local M = {
|
|
|
|
"hrsh7th/nvim-cmp",
|
|
|
|
event = "InsertEnter",
|
|
|
|
dependencies = {
|
|
|
|
"onsails/lspkind.nvim", -- show icons in lsp completion menus
|
|
|
|
"hrsh7th/cmp-nvim-lsp",
|
|
|
|
"hrsh7th/cmp-buffer",
|
|
|
|
"hrsh7th/cmp-emoji",
|
|
|
|
"hrsh7th/cmp-cmdline",
|
|
|
|
"hrsh7th/cmp-path",
|
|
|
|
"saadparwaiz1/cmp_luasnip",
|
|
|
|
"L3MON4D3/LuaSnip", -- snippeting engine
|
|
|
|
},
|
|
|
|
cond = env.vscode.not_active(),
|
|
|
|
}
|
|
|
|
|
|
|
|
local function has_words_before()
|
|
|
|
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
|
|
|
|
|
|
|
|
function M.config()
|
|
|
|
vim.o.completeopt = "menuone,noselect"
|
|
|
|
|
|
|
|
local cmp = require("cmp")
|
|
|
|
local lspkind = require("lspkind")
|
|
|
|
|
|
|
|
local options = {
|
|
|
|
window = {
|
2023-08-14 13:49:55 +02:00
|
|
|
documentation = cmp.config.window.bordered(),
|
|
|
|
completion = cmp.config.window.bordered({
|
2023-01-10 02:38:06 +01:00
|
|
|
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None",
|
|
|
|
col_offset = -3,
|
|
|
|
side_padding = 0,
|
|
|
|
completeopt = "menu,menuone,noinsert",
|
2023-08-14 13:49:55 +02:00
|
|
|
}),
|
2023-01-10 02:38:06 +01:00
|
|
|
},
|
|
|
|
formatting = {
|
|
|
|
fields = { "kind", "abbr", "menu" },
|
|
|
|
format = function(entry, vim_item)
|
|
|
|
local kind = lspkind.cmp_format({
|
|
|
|
mode = "symbol",
|
|
|
|
maxwidth = 50,
|
|
|
|
symbol_map = {
|
|
|
|
Text = ".",
|
|
|
|
},
|
|
|
|
})(entry, vim_item)
|
|
|
|
local strings = vim.split(kind.kind, "%s", { trimempty = true })
|
|
|
|
|
2023-04-08 06:20:53 +02:00
|
|
|
-- Rust analyzer sometimes has this be nil when working with lifetime arguments.
|
|
|
|
if strings[1] ~= nil then
|
|
|
|
kind.kind = " " .. strings[1] .. " "
|
|
|
|
end
|
|
|
|
|
2023-01-10 02:38:06 +01:00
|
|
|
kind.menu = ""
|
|
|
|
|
|
|
|
return kind
|
|
|
|
end,
|
|
|
|
},
|
|
|
|
snippet = {
|
|
|
|
-- REQUIRED - you must specify a snippet engine
|
|
|
|
expand = function(args)
|
|
|
|
require("luasnip").lsp_expand(args.body)
|
|
|
|
end,
|
|
|
|
},
|
|
|
|
mapping = {
|
|
|
|
["<C-d>"] = cmp.mapping(function(fallback)
|
|
|
|
if cmp.visible() then
|
|
|
|
cmp.select_next_item()
|
|
|
|
elseif has_words_before() then
|
|
|
|
cmp.complete()
|
|
|
|
else
|
|
|
|
fallback()
|
|
|
|
end
|
|
|
|
end, { "i", "s" }),
|
|
|
|
["<C-s>"] = cmp.mapping(function(fallback)
|
|
|
|
if cmp.visible() then
|
|
|
|
cmp.select_prev_item()
|
|
|
|
else
|
|
|
|
fallback()
|
|
|
|
end
|
|
|
|
end, { "i", "s" }),
|
|
|
|
["<CR>"] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
|
|
|
|
},
|
|
|
|
sources = cmp.config.sources({
|
|
|
|
{ name = "nvim_lsp" },
|
|
|
|
{ name = "luasnip" },
|
|
|
|
{ name = "buffers" },
|
|
|
|
{ name = "emoji" },
|
|
|
|
{ name = "path" },
|
|
|
|
-- { name = 'omni' },
|
|
|
|
}),
|
|
|
|
}
|
|
|
|
|
|
|
|
cmp.setup(options)
|
|
|
|
|
|
|
|
-- Use buffer source for `/`
|
|
|
|
cmp.setup.cmdline("/", {
|
|
|
|
mapping = cmp.mapping.preset.cmdline(),
|
|
|
|
sources = {
|
|
|
|
{ name = "buffer" },
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
-- Use cmdline & path source for ':'
|
|
|
|
cmp.setup.cmdline(":", {
|
|
|
|
mapping = cmp.mapping.preset.cmdline(),
|
|
|
|
sources = cmp.config.sources({
|
|
|
|
{ name = "path" },
|
|
|
|
{ name = "cmdline" },
|
|
|
|
}),
|
|
|
|
})
|
2023-08-14 13:49:55 +02:00
|
|
|
|
2023-01-10 02:38:06 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
return M
|