| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 | local M = {}local check_backspace = function()  local col = vim.fn.col "." - 1  return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"endlocal function T(str)  return vim.api.nvim_replace_termcodes(str, true, true, true)endlocal is_emmet_active = function()  local clients = vim.lsp.buf_get_clients()  for _, client in pairs(clients) do    if client.name == "emmet_ls" then      return true    end  end  return falseendM.config = function()  local status_cmp_ok, cmp = pcall(require, "cmp")  if not status_cmp_ok then    return  end  local status_luasnip_ok, luasnip = pcall(require, "luasnip")  if not status_luasnip_ok then    return  end  lvim.builtin.cmp = {    confirm_opts = {      behavior = cmp.ConfirmBehavior.Replace,      select = true,    },    formatting = {      format = function(entry, vim_item)        local icons = require("lsp.kind").icons        vim_item.kind = icons[vim_item.kind]        vim_item.menu = ({          nvim_lsp = "(LSP)",          emoji = "(Emoji)",          path = "(Path)",          calc = "(Calc)",          cmp_tabnine = "(Tabnine)",          vsnip = "(Snippet)",          luasnip = "(Snippet)",          buffer = "(Buffer)",        })[entry.source.name]        vim_item.dup = ({          buffer = 1,          path = 1,          nvim_lsp = 0,        })[entry.source.name] or 0        return vim_item      end,    },    snippet = {      expand = function(args)        require("luasnip").lsp_expand(args.body)      end,    },    documentation = {      border = { "╭", "─", "╮", "│", "╯", "─", "╰", "│" },    },    sources = {      { name = "nvim_lsp" },      { name = "path" },      { name = "luasnip" },      { name = "cmp_tabnine" },      { name = "nvim_lua" },      { name = "buffer" },      { name = "calc" },      { name = "emoji" },      { name = "treesitter" },      { name = "crates" },    },    mapping = {      ["<C-d>"] = cmp.mapping.scroll_docs(-4),      ["<C-f>"] = cmp.mapping.scroll_docs(4),      -- TODO: potentially fix emmet nonsense      ["<Tab>"] = cmp.mapping(function()        if vim.fn.pumvisible() == 1 then          vim.fn.feedkeys(T "<down>", "n")        elseif luasnip.expand_or_jumpable() then          vim.fn.feedkeys(T "<Plug>luasnip-expand-or-jump", "")        elseif check_backspace() then          vim.fn.feedkeys(T "<Tab>", "n")        elseif is_emmet_active() then          return vim.fn["cmp#complete"]()        else          vim.fn.feedkeys(T "<Tab>", "n")        end      end, {        "i",        "s",      }),      ["<S-Tab>"] = cmp.mapping(function(fallback)        if vim.fn.pumvisible() == 1 then          vim.fn.feedkeys(T "<up>", "n")        elseif luasnip.jumpable(-1) then          vim.fn.feedkeys(T "<Plug>luasnip-jump-prev", "")        else          fallback()        end      end, {        "i",        "s",      }),      ["<C-Space>"] = cmp.mapping.complete(),      ["<C-e>"] = cmp.mapping.close(),      ["<CR>"] = cmp.mapping(function(fallback)        if not require("cmp").confirm(lvim.builtin.cmp.confirm_opts) then          if luasnip.jumpable() then            vim.fn.feedkeys(T "<Plug>luasnip-jump-next", "")          else            fallback()          end        end      end),    },  }endM.setup = function()  require("luasnip/loaders/from_vscode").lazy_load()  require("cmp").setup(lvim.builtin.cmp)endreturn M
 |