summary refs log tree commit diff
path: root/.vim/lua/internal/completion.lua
diff options
context:
space:
mode:
Diffstat (limited to '.vim/lua/internal/completion.lua')
-rw-r--r--.vim/lua/internal/completion.lua154
1 files changed, 154 insertions, 0 deletions
diff --git a/.vim/lua/internal/completion.lua b/.vim/lua/internal/completion.lua
new file mode 100644
index 0000000..552a45e
--- /dev/null
+++ b/.vim/lua/internal/completion.lua
@@ -0,0 +1,154 @@
+vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
+vim.opt.shortmess:append('c')
+vim.opt.pumheight = 20 -- max height of completion window
+
+-- re-link the highlight group for the 3rd field in the completion popup
+-- which is populated with the completion source
+vim.schedule(function()
+  local hl = vim.api.nvim_set_hl
+
+  hl(0, 'CmpItemMenu', { link = 'Comment', force = true })
+
+  hl(0, 'CmpItemAbbrMatch', { bold = true, force = true })
+  hl(0, 'CmpItemAbbrMatchFuzzy', { link = 'CmpItemAbbrMatch', force = true })
+
+  hl(0, 'CmpItemKindVariable', { link = 'Normal', force = true })
+  hl(0, 'CmpItemKindInterface', { link = 'CmpItemKindVariable', force = true })
+  hl(0, 'CmpItemKindText', { link = 'CmpItemKindVariable', force = true })
+
+  hl(0, 'CmpItemKindFunction', { link = 'Function', force = true })
+  hl(0, 'CmpItemKindMethod', { link = 'CmpItemKindFunction', force = true })
+
+  hl(0, 'CmpItemKindKeyword', { link = 'Keyword', force = true })
+  hl(0, 'CmpItemKindProperty', { link = 'CmpItemKindKeyword', force = true })
+  hl(0, 'CmpItemKindUnit', { link = 'CmpItemKindKeyword', force = true })
+end)
+
+local cmp = require('cmp')
+
+cmp.setup({
+  sources = {
+    { name = 'nvim_lsp', keyword_length = 1, group_index = 1 },
+    { name = 'nvim_lsp_signature_help', keyword_length = 1, group_index = 1 },
+    { name = 'luasnip', keyword_length = 2, group_index = 1 },
+    -- { name = 'spell' },
+    { name = 'async_path', group_index = 2 },
+    { name = 'buffer', keyword_length = 3, group_index = 2 },
+  },
+
+  mapping = {
+    ['<c-n>'] = cmp.mapping(
+      cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }),
+      { 'i', 'c' }
+    ),
+    ['<c-p>'] = cmp.mapping(
+      cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }),
+      { 'i', 'c' }
+    ),
+    ['<tab>'] = cmp.mapping(
+      cmp.mapping.confirm({
+        behavior = cmp.ConfirmBehavior.Insert,
+        select = true,
+      }),
+      { 'i', 'c' }
+    ),
+  },
+
+  -- enable snippet expansion
+  snippet = {
+    expand = function(args)
+      vim.snippet.expand(args.body)
+    end,
+  },
+
+  experimental = {
+    ghost_text = false,
+    native_menu = false,
+  },
+
+  window = {
+    completion = {
+      scrollbar = true,
+      -- align 'abbr' with cursor, necessary due to 'kind' appearing first
+      col_offset = -3,
+    },
+  },
+
+  formatting = {
+    fields = { 'kind', 'abbr', 'menu' },
+    expandable_indicator = true,
+    format = function(entry, item)
+      item.dup = 0 -- dedup items from the same source, first one wins
+      item.menu = '░ ' .. entry.source.name
+      return require('lspkind').cmp_format({
+        mode = 'symbol',
+        symbol_map = {
+          -- 󰆼  󱆃
+          Array = '󰨾 ',
+          Boolean = '󰦍 ',
+          Class = '󰙀 ',
+          Color = '󰉦 ',
+          Constant = '󰐀 ',
+          Constructor = '󱇿 ',
+          Enum = '󱃢 ',
+          EnumMember = '󱃡 ',
+          Event = '󱐋 ',
+          -- Field = '󰽜 ',
+          Field = '󰆈 ',
+          File = '󰈔 ',
+          Folder = '󰝰 ',
+          Function = '󰊕 ',
+          Interface = '󱦜 ',
+          Key = '󰌋 ',
+          Keyword = '󰓽 ',
+          Method = '󰒓 ',
+          Module = '󰏖 ',
+          Namespace = '󰆧 ',
+          Null = '󰎣 ',
+          Object = '󰘦 ',
+          Operator = '󱓉 ',
+          Property = '󰐱 ',
+          Package = '󰏗 ',
+          Reference = '󰌹 ',
+          Snippet = '󰯁 ',
+          Struct = '󰙅 ',
+          Text = '󰉿 ',
+          TypeParameter = '󰌨 ',
+          Unit = '󰠱 ',
+          Value = '󰎠 ',
+          Variable = '󱄑 ',
+        },
+      })(entry, item)
+    end,
+  },
+})
+
+cmp.setup.cmdline({ ':', '/', '?', '@' }, {
+  sources = {
+    { name = 'cmdline', group_index = 1 },
+    { name = 'cmdline_history', group_index = 1 },
+    { name = 'nvim_lsp_document_symbol', keyword_length = 1, group_index = 1 },
+    { name = 'async_path', group_index = 1 },
+    { name = 'buffer', group_index = 1 },
+  },
+
+  matching = {
+    disallow_symbol_nonprefix_matching = false,
+  },
+
+  view = {
+    entries = { selection_order = 'near_cursor' },
+  },
+
+  formatting = {
+    fields = { 'abbr', 'menu' },
+  },
+})
+
+cmp.setup.cmdline({ '/', '?' }, {
+  sources = {
+    { name = 'nvim_lsp_document_symbol', keyword_length = 1, group_index = 1 },
+    { name = 'path', max_item_count = 12, group_index = 1 },
+    { name = 'buffer', group_index = 2 },
+  },
+})