| @ -1,107 +1,90 @@ | |||
| return { | |||
| "hrsh7th/nvim-cmp", | |||
| event = "InsertEnter", | |||
| dependencies = { | |||
| "hrsh7th/cmp-nvim-lsp", | |||
| "hrsh7th/cmp-buffer", | |||
| "hrsh7th/cmp-path", | |||
| "L3MON4D3/LuaSnip", | |||
| "saadparwaiz1/cmp_luasnip", | |||
| "rafamadriz/friendly-snippets", | |||
| "onsails/lspkind.nvim", | |||
| "kristijanhusak/vim-dadbod-completion", | |||
| }, | |||
| config = function() | |||
| local cmp = require("cmp") | |||
| "hrsh7th/nvim-cmp", | |||
| event = "InsertEnter", | |||
| dependencies = { | |||
| -- Snippet Engine & its associated nvim-cmp source | |||
| { | |||
| "L3MON4D3/LuaSnip", | |||
| build = (function() | |||
| if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then | |||
| return | |||
| end | |||
| return "make install_jsregexp" | |||
| end)(), | |||
| dependencies = { | |||
| { | |||
| "rafamadriz/friendly-snippets", | |||
| config = function() | |||
| require("luasnip.loaders.from_vscode").lazy_load() | |||
| end, | |||
| }, | |||
| }, | |||
| }, | |||
| "saadparwaiz1/cmp_luasnip", | |||
| local luasnip = require("luasnip") | |||
| "onsails/lspkind.nvim", | |||
| "kristijanhusak/vim-dadbod-completion", | |||
| local lspkind = require("lspkind") | |||
| "hrsh7th/cmp-nvim-lsp", | |||
| "hrsh7th/cmp-buffer", | |||
| "hrsh7th/cmp-path", | |||
| "hrsh7th/cmp-nvim-lsp-signature-help", | |||
| }, | |||
| config = function() | |||
| -- See `:help cmp` | |||
| local cmp = require("cmp") | |||
| local luasnip = require("luasnip") | |||
| local lspkind = require("lspkind") | |||
| luasnip.config.setup({}) | |||
| -- loads vscode style snippets from installed plugins (e.g. friendly-snippets) | |||
| require("luasnip.loaders.from_vscode").lazy_load({ paths = { "~/.config/nvim/snippets" } }) | |||
| 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 | |||
| 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 = {}, | |||
| mapping = cmp.mapping.preset.insert({ | |||
| ["<C-k>"] = cmp.mapping.select_prev_item(), -- previous suggestion | |||
| ["<C-j>"] = cmp.mapping.select_next_item(), -- next suggestion | |||
| ["<C-u>"] = cmp.mapping.scroll_docs(-4), | |||
| ["<C-d>"] = 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" }, | |||
| { name = "buffer" }, | |||
| { name = "path" }, | |||
| { name = "vim-dadbod-completion" }, | |||
| }), | |||
| -- configure lspkind for vs-code like pictograms in completion menu | |||
| formatting = { | |||
| format = lspkind.cmp_format({ | |||
| mode = "symbol_text", | |||
| menu = { | |||
| nvim_lua = "[API]", | |||
| nvim_lsp = "[LSP]", | |||
| luasnip = "[SNIP]", | |||
| vim_dadbod_completion = "[DBUI]", | |||
| path = "[PATH]", | |||
| buffer = "[BUFF]", | |||
| }, | |||
| }), | |||
| }, | |||
| event = { | |||
| on = { | |||
| CompleteChanged = function(data) | |||
| if data.entry then | |||
| vim.lsp.buf.hover() | |||
| end | |||
| end, | |||
| }, | |||
| cmp.setup({ | |||
| snippet = { | |||
| expand = function(args) | |||
| luasnip.lsp_expand(args.body) | |||
| end, | |||
| }, | |||
| completion = { | |||
| completeopt = "menu,menuone,noinsert", | |||
| }, | |||
| }) | |||
| end, | |||
| mapping = cmp.mapping.preset.insert({ | |||
| ["<C-n>"] = cmp.mapping.select_next_item(), | |||
| ["<C-p>"] = cmp.mapping.select_prev_item(), | |||
| ["<C-b>"] = cmp.mapping.scroll_docs(-4), | |||
| ["<C-f>"] = cmp.mapping.scroll_docs(4), | |||
| ["<C-y>"] = cmp.mapping.confirm({ select = true }), | |||
| ["<C-Space>"] = cmp.mapping.complete({}), | |||
| ["<C-l>"] = cmp.mapping(function() | |||
| if luasnip.expand_or_locally_jumpable() then | |||
| luasnip.expand_or_jump() | |||
| end | |||
| end, { "i", "s" }), | |||
| ["<C-h>"] = cmp.mapping(function() | |||
| if luasnip.locally_jumpable(-1) then | |||
| luasnip.jump(-1) | |||
| end | |||
| end, { "i", "s" }), | |||
| }), | |||
| sources = { | |||
| { name = "nvim_lsp" }, | |||
| -- { name = "nvim_lsp_signature_help" }, -- TODO: Get this working so hover() doesnt open twice | |||
| { name = "luasnip" }, | |||
| { name = "buffer" }, | |||
| { name = "path" }, | |||
| { name = "vim-dadbod-completion" }, | |||
| }, | |||
| formatting = { | |||
| format = lspkind.cmp_format({ | |||
| mode = "symbol_text", | |||
| menu = { | |||
| nvim_lua = "[API]", | |||
| nvim_lsp = "[LSP]", | |||
| luasnip = "[SNIP]", | |||
| vim_dadbod_completion = "[DBUI]", | |||
| path = "[PATH]", | |||
| buffer = "[BUFF]", | |||
| }, | |||
| }), | |||
| }, | |||
| }) | |||
| end, | |||
| } | |||