| @ -1,90 +1,92 @@ | |||||
| return { | return { | ||||
| "hrsh7th/nvim-cmp", | |||||
| event = "InsertEnter", | |||||
| dependencies = { | |||||
| "hrsh7th/cmp-buffer", -- source for text in buffer | |||||
| "hrsh7th/cmp-path", -- source for file system paths | |||||
| "L3MON4D3/LuaSnip", -- snippet engine | |||||
| "saadparwaiz1/cmp_luasnip", -- for autocompletion | |||||
| "rafamadriz/friendly-snippets", -- useful snippets | |||||
| "onsails/lspkind.nvim", -- vs-code like pictograms | |||||
| }, | |||||
| config = function() | |||||
| local cmp = require("cmp") | |||||
| "hrsh7th/nvim-cmp", | |||||
| event = "InsertEnter", | |||||
| dependencies = { | |||||
| "hrsh7th/cmp-buffer", -- source for text in buffer | |||||
| "hrsh7th/cmp-path", -- source for file system paths | |||||
| "L3MON4D3/LuaSnip", -- snippet engine | |||||
| "saadparwaiz1/cmp_luasnip", -- for autocompletion | |||||
| "rafamadriz/friendly-snippets", -- useful snippets | |||||
| "onsails/lspkind.nvim", -- vs-code like pictograms | |||||
| }, | |||||
| config = function() | |||||
| local cmp = require("cmp") | |||||
| local luasnip = require("luasnip") | |||||
| local luasnip = require("luasnip") | |||||
| local lspkind = require("lspkind") | |||||
| local lspkind = require("lspkind") | |||||
| -- loads vscode style snippets from installed plugins (e.g. friendly-snippets) | |||||
| require("luasnip.loaders.from_vscode").lazy_load() | |||||
| -- loads vscode style snippets from installed plugins (e.g. friendly-snippets) | |||||
| require("luasnip.loaders.from_vscode").lazy_load() | |||||
| 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 has_words_before = function() | |||||
| local line, col = vim.api.nvim_win_get_cursor(0) | |||||
| ---@diagnostic disable-next-line: param-type-mismatch | |||||
| return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil | |||||
| end | |||||
| cmp.setup({ | |||||
| completion = { | |||||
| completeopt = "menu,menuone,preview,noselect", | |||||
| }, | |||||
| snippet = { -- configure how nvim-cmp interacts with snippet engine | |||||
| expand = function(args) | |||||
| luasnip.lsp_expand(args.body) | |||||
| end, | |||||
| }, | |||||
| mapping = cmp.mapping.preset.insert({ | |||||
| ["<C-k>"] = cmp.mapping.select_prev_item(), -- previous suggestion | |||||
| ["<C-j>"] = cmp.mapping.select_next_item(), -- next suggestion | |||||
| ["<C-b>"] = cmp.mapping.scroll_docs(-4), | |||||
| ["<C-f>"] = cmp.mapping.scroll_docs(4), | |||||
| ["<C-Space>"] = cmp.mapping.complete(), -- show completion suggestions | |||||
| ["<C-e>"] = cmp.mapping.abort(), -- close completion window | |||||
| ["<CR>"] = cmp.mapping.confirm({ select = true }), | |||||
| ["<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", | |||||
| }), | |||||
| ["<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", | |||||
| }), | |||||
| }), | |||||
| -- sources for autocompletion | |||||
| sources = cmp.config.sources({ | |||||
| { name = "nvim_lsp" }, | |||||
| { name = "luasnip" }, -- snippets | |||||
| { name = "buffer" }, -- text within current buffer | |||||
| { name = "path" }, -- file system paths | |||||
| }), | |||||
| -- configure lspkind for vs-code like pictograms in completion menu | |||||
| formatting = { | |||||
| format = lspkind.cmp_format({ | |||||
| maxwidth = 50, | |||||
| ellipsis_char = "...", | |||||
| }), | |||||
| }, | |||||
| }) | |||||
| end, | |||||
| cmp.setup({ | |||||
| completion = { | |||||
| completeopt = "menu,menuone,preview,noselect", | |||||
| }, | |||||
| snippet = { -- configure how nvim-cmp interacts with snippet engine | |||||
| expand = function(args) | |||||
| luasnip.lsp_expand(args.body) | |||||
| end, | |||||
| }, | |||||
| window = { | |||||
| completion = cmp.config.window.bordered(), | |||||
| documentation = cmp.config.window.bordered(), | |||||
| }, | |||||
| mapping = cmp.mapping.preset.insert({ | |||||
| ["<C-k>"] = cmp.mapping.select_prev_item(), -- previous suggestion | |||||
| ["<C-j>"] = cmp.mapping.select_next_item(), -- next suggestion | |||||
| ["<C-b>"] = cmp.mapping.scroll_docs(-4), | |||||
| ["<C-f>"] = cmp.mapping.scroll_docs(4), | |||||
| ["<C-Space>"] = cmp.mapping.complete(), -- show completion suggestions | |||||
| ["<C-e>"] = cmp.mapping.abort(), -- close completion window | |||||
| ["<CR>"] = cmp.mapping.confirm({ select = true }), | |||||
| ["<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", | |||||
| }), | |||||
| ["<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", | |||||
| }), | |||||
| }), | |||||
| -- sources for autocompletion | |||||
| sources = cmp.config.sources({ | |||||
| { name = "nvim_lsp" }, | |||||
| { name = "luasnip" }, -- snippets | |||||
| { name = "buffer" }, -- text within current buffer | |||||
| { name = "path" }, -- file system paths | |||||
| }), | |||||
| -- configure lspkind for vs-code like pictograms in completion menu | |||||
| formatting = { | |||||
| format = lspkind.cmp_format({ | |||||
| maxwidth = 50, | |||||
| ellipsis_char = "...", | |||||
| }), | |||||
| }, | |||||
| }) | |||||
| end, | |||||
| } | } | ||||