vim

Log | Files | Refs

completion.lua (2550B)


      1 return {
      2   {
      3     "hrsh7th/nvim-cmp",
      4     event = "InsertEnter",
      5     dependencies = {
      6       "hrsh7th/cmp-nvim-lsp",
      7       "hrsh7th/cmp-buffer",
      8       "hrsh7th/cmp-path",
      9       "hrsh7th/cmp-cmdline",
     10       "L3MON4D3/LuaSnip",
     11       "saadparwaiz1/cmp_luasnip",
     12       "rafamadriz/friendly-snippets",  -- snippet collection for many languages
     13     },
     14     config = function()
     15       local cmp     = require("cmp")
     16       local luasnip = require("luasnip")
     17 
     18       require("luasnip.loaders.from_vscode").lazy_load()
     19 
     20       cmp.setup({
     21         snippet = {
     22           expand = function(args)
     23             luasnip.lsp_expand(args.body)
     24           end,
     25         },
     26 
     27         mapping = cmp.mapping.preset.insert({
     28           ["<C-b>"]     = cmp.mapping.scroll_docs(-4),
     29           ["<C-f>"]     = cmp.mapping.scroll_docs(4),
     30           ["<C-Space>"] = cmp.mapping.complete(),
     31           ["<C-e>"]     = cmp.mapping.abort(),
     32           ["<CR>"]      = cmp.mapping.confirm({ select = false }),
     33 
     34           ["<Tab>"] = cmp.mapping(function(fallback)
     35             if cmp.visible() then
     36               cmp.select_next_item()
     37             elseif luasnip.expand_or_jumpable() then
     38               luasnip.expand_or_jump()
     39             else
     40               fallback()
     41             end
     42           end, { "i", "s" }),
     43 
     44           ["<S-Tab>"] = cmp.mapping(function(fallback)
     45             if cmp.visible() then
     46               cmp.select_prev_item()
     47             elseif luasnip.jumpable(-1) then
     48               luasnip.jump(-1)
     49             else
     50               fallback()
     51             end
     52           end, { "i", "s" }),
     53         }),
     54 
     55         sources = cmp.config.sources({
     56           { name = "nvim_lsp" },
     57           { name = "luasnip" },
     58           { name = "buffer" },
     59           { name = "path" },
     60         }),
     61 
     62         formatting = {
     63           format = function(entry, item)
     64             local source_labels = {
     65               nvim_lsp = "[LSP]",
     66               luasnip  = "[Snip]",
     67               buffer   = "[Buf]",
     68               path     = "[Path]",
     69             }
     70             item.menu = source_labels[entry.source.name] or ""
     71             return item
     72           end,
     73         },
     74       })
     75 
     76       -- Completion in search
     77       cmp.setup.cmdline({ "/", "?" }, {
     78         mapping = cmp.mapping.preset.cmdline(),
     79         sources = { { name = "buffer" } },
     80       })
     81 
     82       -- Completion in command line
     83       cmp.setup.cmdline(":", {
     84         mapping = cmp.mapping.preset.cmdline(),
     85         sources = cmp.config.sources({
     86           { name = "path" },
     87           { name = "cmdline" },
     88         }),
     89       })
     90     end,
     91   },
     92 }