summaryrefslogtreecommitdiff
path: root/lua/core/cmp.lua
diff options
context:
space:
mode:
authorkylo252 <[email protected]>2021-10-10 21:07:41 +0200
committerGitHub <[email protected]>2021-10-10 21:07:41 +0200
commit52b74557415eb757ad4b7481b0aec8a3f98dd58d (patch)
tree9a05ec71a46c99fbdf8df0043be652b528c7c04e /lua/core/cmp.lua
parente2c85df440564a62fd804555747b1652a6844a5e (diff)
feat: add an independent lvim namespace (#1699)
Diffstat (limited to 'lua/core/cmp.lua')
-rw-r--r--lua/core/cmp.lua265
1 files changed, 0 insertions, 265 deletions
diff --git a/lua/core/cmp.lua b/lua/core/cmp.lua
deleted file mode 100644
index ad06a360..00000000
--- a/lua/core/cmp.lua
+++ /dev/null
@@ -1,265 +0,0 @@
-local M = {}
-
-local check_backspace = function()
- local col = vim.fn.col "." - 1
- return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
-end
-
-local function T(str)
- return vim.api.nvim_replace_termcodes(str, true, true, true)
-end
-
-local 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 false
-end
-
-M.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
- local win_get_cursor = vim.api.nvim_win_get_cursor
- local get_current_buf = vim.api.nvim_get_current_buf
-
- local function inside_snippet()
- -- for outdated versions of luasnip
- if not luasnip.session.current_nodes then
- return false
- end
-
- local node = luasnip.session.current_nodes[get_current_buf()]
- if not node then
- return false
- end
-
- local snip_begin_pos, snip_end_pos = node.parent.snippet.mark:pos_begin_end()
- local pos = win_get_cursor(0)
- pos[1] = pos[1] - 1 -- LuaSnip is 0-based not 1-based like nvim for rows
- return pos[1] >= snip_begin_pos[1] and pos[1] <= snip_end_pos[1]
- end
-
- ---sets the current buffer's luasnip to the one nearest the cursor
- ---@return boolean true if a node is found, false otherwise
- local function seek_luasnip_cursor_node()
- -- for outdated versions of luasnip
- if not luasnip.session.current_nodes then
- return false
- end
-
- local pos = win_get_cursor(0)
- pos[1] = pos[1] - 1
- local node = luasnip.session.current_nodes[get_current_buf()]
- if not node then
- return false
- end
-
- local snippet = node.parent.snippet
- local exit_node = snippet.insert_nodes[0]
-
- -- exit early if we're past the exit node
- if exit_node then
- local exit_pos_end = exit_node.mark:pos_end()
- if (pos[1] > exit_pos_end[1]) or (pos[1] == exit_pos_end[1] and pos[2] > exit_pos_end[2]) then
- snippet:remove_from_jumplist()
- luasnip.session.current_nodes[get_current_buf()] = nil
-
- return false
- end
- end
-
- node = snippet.inner_first:jump_into(1, true)
- while node ~= nil and node.next ~= nil and node ~= snippet do
- local n_next = node.next
- local next_pos = n_next and n_next.mark:pos_begin()
- local candidate = n_next ~= snippet and next_pos and (pos[1] < next_pos[1])
- or (pos[1] == next_pos[1] and pos[2] < next_pos[2])
-
- -- Past unmarked exit node, exit early
- if n_next == nil or n_next == snippet.next then
- snippet:remove_from_jumplist()
- luasnip.session.current_nodes[get_current_buf()] = nil
-
- return false
- end
-
- if candidate then
- luasnip.session.current_nodes[get_current_buf()] = node
- return true
- end
-
- local ok
- ok, node = pcall(node.jump_from, node, 1, true) -- no_move until last stop
- if not ok then
- snippet:remove_from_jumplist()
- luasnip.session.current_nodes[get_current_buf()] = nil
-
- return false
- end
- end
-
- -- No candidate, but have an exit node
- if exit_node then
- -- to jump to the exit node, seek to snippet
- luasnip.session.current_nodes[get_current_buf()] = snippet
- return true
- end
-
- -- No exit node, exit from snippet
- snippet:remove_from_jumplist()
- luasnip.session.current_nodes[get_current_buf()] = nil
- return false
- end
-
- lvim.builtin.cmp = {
- confirm_opts = {
- behavior = cmp.ConfirmBehavior.Replace,
- select = false,
- },
- experimental = {
- ghost_text = true,
- native_menu = false,
- },
- formatting = {
- kind_icons = {
- Class = "ī – ",
- Color = "îˆĢ ",
- Constant = " ",
- Constructor = "īĨ ",
- Enum = "īŠ—",
- EnumMember = "ī… ",
- Event = " ",
- Field = " ",
- File = "",
- Folder = "īŠ ",
- Function = "īž” ",
- Interface = "ī°Ž ",
- Keyword = " ",
- Method = " ",
- Module = " ",
- Operator = "īš”",
- Property = " ",
- Reference = " ",
- Snippet = "īƒ„ ",
- Struct = " ",
- Text = "īž ",
- TypeParameter = "īžƒ ",
- Unit = "īĨŦ",
- Value = "īĸŸ ",
- Variable = "īšĻ ",
- },
- source_names = {
- nvim_lsp = "(LSP)",
- emoji = "(Emoji)",
- path = "(Path)",
- calc = "(Calc)",
- cmp_tabnine = "(Tabnine)",
- vsnip = "(Snippet)",
- luasnip = "(Snippet)",
- buffer = "(Buffer)",
- },
- duplicates = {
- buffer = 1,
- path = 1,
- nvim_lsp = 0,
- luasnip = 1,
- },
- duplicates_default = 0,
- format = function(entry, vim_item)
- vim_item.kind = lvim.builtin.cmp.formatting.kind_icons[vim_item.kind]
- vim_item.menu = lvim.builtin.cmp.formatting.source_names[entry.source.name]
- vim_item.dup = lvim.builtin.cmp.formatting.duplicates[entry.source.name]
- or lvim.builtin.cmp.formatting.duplicates_default
- 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 cmp.visible() then
- cmp.select_next_item()
- elseif luasnip.expandable() then
- luasnip.expand()
- elseif inside_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable() then
- luasnip.jump(1)
- 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 cmp.visible() then
- cmp.select_prev_item()
- elseif inside_snippet() and luasnip.jumpable(-1) then
- luasnip.jump(-1)
- else
- fallback()
- end
- end, {
- "i",
- "s",
- }),
-
- ["<C-Space>"] = cmp.mapping.complete(),
- ["<C-e>"] = cmp.mapping.close(),
- ["<CR>"] = cmp.mapping(function(fallback)
- if cmp.visible() and cmp.confirm(lvim.builtin.cmp.confirm_opts) then
- return
- end
-
- if inside_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable() then
- if not luasnip.jump(1) then
- fallback()
- end
- else
- fallback()
- end
- end),
- },
- }
-end
-
-M.setup = function()
- require("luasnip/loaders/from_vscode").lazy_load()
- require("cmp").setup(lvim.builtin.cmp)
-end
-
-return M