From 1855b99eb8477f46e89a387aa0146bb4ffcfa6cc Mon Sep 17 00:00:00 2001
From: "flyingscorpio@clevo" <tfranken@protonmail.com>
Date: Mon, 8 Aug 2022 01:25:36 +0200
Subject: [PATCH] Add nvim-cmp

---
 roles/neovim/files/lua/lsp/bash.lua           |  3 ++
 roles/neovim/files/lua/lsp/latex.lua          |  3 ++
 roles/neovim/files/lua/lsp/lua.lua            |  3 ++
 .../files/lua/plugins/options/completion.lua  | 31 +++++++++++++++++++
 .../files/lua/plugins/options/indentline.lua  |  3 +-
 .../neovim/files/lua/plugins/options/init.lua |  1 +
 .../neovim/files/lua/plugins/options/lsp.lua  |  3 +-
 .../files/lua/plugins/options/nerdtree.lua    |  3 +-
 .../files/lua/plugins/options/telescope.lua   |  2 +-
 .../files/lua/plugins/options/treesitter.lua  |  3 +-
 .../files/lua/plugins/options/vimtex.lua      |  3 +-
 roles/neovim/files/lua/plugins/packer.lua     | 10 ++++++
 12 files changed, 57 insertions(+), 11 deletions(-)
 create mode 100644 roles/neovim/files/lua/plugins/options/completion.lua

diff --git a/roles/neovim/files/lua/lsp/bash.lua b/roles/neovim/files/lua/lsp/bash.lua
index 4e6896e..23e83c7 100644
--- a/roles/neovim/files/lua/lsp/bash.lua
+++ b/roles/neovim/files/lua/lsp/bash.lua
@@ -1,6 +1,9 @@
 -- LSP Server for Bash
 
+local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
+
 require'lspconfig'.bashls.setup {
+  capabilities = capabilities,
   on_attach = function()
     vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = 0, remap = false })
     vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { buffer = 0, remap = false })
diff --git a/roles/neovim/files/lua/lsp/latex.lua b/roles/neovim/files/lua/lsp/latex.lua
index e266559..133b931 100644
--- a/roles/neovim/files/lua/lsp/latex.lua
+++ b/roles/neovim/files/lua/lsp/latex.lua
@@ -1,6 +1,9 @@
 -- LSP Server for LaTeX
 
+local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
+
 require'lspconfig'.texlab.setup {
+  capabilities = capabilities,
   on_attach = function()
     vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = 0, remap = false })
     vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { buffer = 0, remap = false })
diff --git a/roles/neovim/files/lua/lsp/lua.lua b/roles/neovim/files/lua/lsp/lua.lua
index f4fca34..5ece084 100644
--- a/roles/neovim/files/lua/lsp/lua.lua
+++ b/roles/neovim/files/lua/lsp/lua.lua
@@ -1,6 +1,9 @@
 -- LSP Server for Lua
 
+local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities())
+
 require'lspconfig'.sumneko_lua.setup {
+  capabilities = capabilities,
   on_attach = function()
     vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = 0, remap = false })
     vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { buffer = 0, remap = false })
diff --git a/roles/neovim/files/lua/plugins/options/completion.lua b/roles/neovim/files/lua/plugins/options/completion.lua
new file mode 100644
index 0000000..ed677e9
--- /dev/null
+++ b/roles/neovim/files/lua/plugins/options/completion.lua
@@ -0,0 +1,31 @@
+-- Completion
+
+vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
+local cmp = require'cmp'
+
+cmp.setup({
+  snippet = {
+    expand = function(args)
+      require('luasnip').lsp_expand(args.body) -- For `luasnip` users.
+    end,
+  },
+  window = {
+    -- completion = cmp.config.window.bordered(),
+    -- documentation = cmp.config.window.bordered(),
+  },
+  mapping = cmp.mapping.preset.insert({
+    ['<C-b>'] = cmp.mapping.scroll_docs(-4),
+    ['<C-f>'] = cmp.mapping.scroll_docs(4),
+    ['<C-Space>'] = cmp.mapping.complete(),
+    ['<C-e>'] = cmp.mapping.abort(),
+    ['<Tab>'] = cmp.mapping.select_next_item(),
+    ['<S-Tab>'] = cmp.mapping.select_prev_item(),
+    ['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
+  }),
+  sources = cmp.config.sources({
+    { name = 'nvim_lsp' },
+    { name = 'luasnip' }, -- For luasnip users.
+  }, {
+      { name = 'buffer' },
+    })
+})
diff --git a/roles/neovim/files/lua/plugins/options/indentline.lua b/roles/neovim/files/lua/plugins/options/indentline.lua
index ad14651..5c05509 100644
--- a/roles/neovim/files/lua/plugins/options/indentline.lua
+++ b/roles/neovim/files/lua/plugins/options/indentline.lua
@@ -1,6 +1,5 @@
--- PLUGINS - OPTIONS
-
 -- indentLine
+
 -- vim.g.indentLine_char = '▏'
 vim.g.indentLine_fileType = { 'html', 'htmldjango', 'tex' }
 vim.g.indentLine_setConceal = 0
diff --git a/roles/neovim/files/lua/plugins/options/init.lua b/roles/neovim/files/lua/plugins/options/init.lua
index 917031b..960a912 100644
--- a/roles/neovim/files/lua/plugins/options/init.lua
+++ b/roles/neovim/files/lua/plugins/options/init.lua
@@ -2,6 +2,7 @@
 
 require('plugins.options.lsp')
 require('plugins.options.treesitter')
+require('plugins.options.completion')
 require('plugins.options.telescope')
 require('plugins.options.nerdtree')
 require('plugins.options.vimtex')
diff --git a/roles/neovim/files/lua/plugins/options/lsp.lua b/roles/neovim/files/lua/plugins/options/lsp.lua
index 3f2e72c..5d97280 100644
--- a/roles/neovim/files/lua/plugins/options/lsp.lua
+++ b/roles/neovim/files/lua/plugins/options/lsp.lua
@@ -1,6 +1,5 @@
--- LSP - OPTIONS
-
 -- LSP Servers
+
 require('lsp.bash')
 require('lsp.latex')
 require('lsp.lua')
diff --git a/roles/neovim/files/lua/plugins/options/nerdtree.lua b/roles/neovim/files/lua/plugins/options/nerdtree.lua
index 11e10f1..cd70cfa 100644
--- a/roles/neovim/files/lua/plugins/options/nerdtree.lua
+++ b/roles/neovim/files/lua/plugins/options/nerdtree.lua
@@ -1,5 +1,4 @@
--- PLUGINS - OPTIONS
-
 -- NERDTree
+
 vim.g.NERDTreeIgnore = { '^__pycache__$', '\\.pyc', '\\~$' }
 vim.keymap.set('n', '<leader>ne', '<cmd>NERDTree<CR>', { remap = true })
diff --git a/roles/neovim/files/lua/plugins/options/telescope.lua b/roles/neovim/files/lua/plugins/options/telescope.lua
index 6c3a6dd..305c46a 100644
--- a/roles/neovim/files/lua/plugins/options/telescope.lua
+++ b/roles/neovim/files/lua/plugins/options/telescope.lua
@@ -1,4 +1,4 @@
--- TELESCOPE
+-- Telescope
 
 require('telescope').setup {
   extensions = {
diff --git a/roles/neovim/files/lua/plugins/options/treesitter.lua b/roles/neovim/files/lua/plugins/options/treesitter.lua
index 1abe327..98d6bd6 100644
--- a/roles/neovim/files/lua/plugins/options/treesitter.lua
+++ b/roles/neovim/files/lua/plugins/options/treesitter.lua
@@ -1,6 +1,5 @@
--- PLUGINS - OPTIONS
-
 -- Treesitter
+
 require'nvim-treesitter.configs'.setup {
   -- A list of parser names, or "all"
   ensure_installed = { "latex", "lua" },
diff --git a/roles/neovim/files/lua/plugins/options/vimtex.lua b/roles/neovim/files/lua/plugins/options/vimtex.lua
index 906ccf6..6268bed 100644
--- a/roles/neovim/files/lua/plugins/options/vimtex.lua
+++ b/roles/neovim/files/lua/plugins/options/vimtex.lua
@@ -1,6 +1,5 @@
--- PLUGINS - OPTIONS
-
 -- VimTex
+
 vim.g.tex_flavor = 'latex'
 vim.g.vimtex_view_method = 'zathura'
 vim.g.vimtex_quickfix_autoclose_after_keystrokes = 2
diff --git a/roles/neovim/files/lua/plugins/packer.lua b/roles/neovim/files/lua/plugins/packer.lua
index 1f4bd9f..a2ddb4f 100644
--- a/roles/neovim/files/lua/plugins/packer.lua
+++ b/roles/neovim/files/lua/plugins/packer.lua
@@ -20,6 +20,16 @@ return require('packer').startup(function(use)
     run = function() require('nvim-treesitter.install').update({ with_sync = true }) end,
   }
 
+  -- Completion
+  use 'hrsh7th/nvim-cmp'
+  use 'hrsh7th/cmp-nvim-lsp'
+  use 'hrsh7th/cmp-buffer'
+  use 'hrsh7th/cmp-path'
+
+  -- LuaSnip
+  use 'L3MON4D3/LuaSnip'
+  use 'saadparwaiz1/cmp_luasnip'
+
   -- Telescope
   use {
     'nvim-telescope/telescope.nvim', branch = '0.1.x',