summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/nvim/lua/lsp.lua83
-rw-r--r--modules/desktop/apps/editors/neovim.nix7
2 files changed, 86 insertions, 4 deletions
diff --git a/config/nvim/lua/lsp.lua b/config/nvim/lua/lsp.lua
index 7f41534..efc3893 100644
--- a/config/nvim/lua/lsp.lua
+++ b/config/nvim/lua/lsp.lua
@@ -1,6 +1,88 @@
vim.o.completeopt = "menuone,noselect"
vim.o.shortmess = vim.o.shortmess .. "c"
+local has_words_before = function()
+ unpack = unpack or table.unpack
+ local line, col = unpack(vim.api.nvim_win_get_cursor(0))
+ return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
+end
+
+local luasnip = require("luasnip")
+local cmp = require("cmp")
+
+cmp.setup({
+ snippet = {
+ -- REQUIRED - you must specify a snippet engine
+ expand = function(args)
+ require('luasnip').lsp_expand(args.body) -- For `luasnip` users.
+ end,
+ },
+ mapping = cmp.mapping.preset.insert({
+ -- Use <C-b/f> to scroll the docs
+ ['<C-b>'] = cmp.mapping.scroll_docs( -4),
+ ['<C-f>'] = cmp.mapping.scroll_docs(4),
+ -- Use <C-k/j> to switch in items
+ ['<C-k>'] = cmp.mapping.select_prev_item(),
+ ['<C-j>'] = cmp.mapping.select_next_item(),
+ -- Use <CR>(Enter) to confirm selection
+ -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
+ ['<CR>'] = cmp.mapping.confirm({ select = true }),
+
+ -- A super tab
+ -- sourc: https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#luasnip
+ ["<Tab>"] = cmp.mapping(function(fallback)
+ -- Hint: if the completion menu is visible select next one
+ if cmp.visible() then
+ cmp.select_next_item()
+ elseif has_words_before() then
+ cmp.complete()
+ else
+ fallback()
+ end
+ end, { "i", "s" }), -- i - insert mode; s - select mode
+ ["<S-Tab>"] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ elseif luasnip.jumpable( -1) then
+ luasnip.jump( -1)
+ else
+ fallback()
+ end
+ end, { "i", "s" }),
+ }),
+
+ -- Let's configure the item's appearance
+ -- source: https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance
+ formatting = {
+ -- Set order from left to right
+ -- kind: single letter indicating the type of completion
+ -- abbr: abbreviation of "word"; when not empty it is used in the menu instead of "word"
+ -- menu: extra text for the popup menu, displayed after "word" or "abbr"
+ fields = { 'abbr', 'menu' },
+
+ -- customize the appearance of the completion menu
+ format = function(entry, vim_item)
+ vim_item.menu = ({
+ nvim_lsp = '[Lsp]',
+ luasnip = '[Luasnip]',
+ buffer = '[File]',
+ path = '[Path]',
+ })[entry.source.name]
+ return vim_item
+ end,
+ },
+
+ -- Set source precedence
+ sources = cmp.config.sources({
+ { name = 'nvim_lsp' }, -- For nvim-lsp
+ { name = 'nvim_lsp_signature_help' },
+ { name = 'luasnip' }, -- For luasnip user
+ { name = 'buffer' }, -- For buffer word completion
+ { name = 'path' }, -- For path completion
+ { name = 'treesitter' },
+ })
+})
+
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
vim.lsp.diagnostic.on_publish_diagnostics, {
virtual_text = true,
@@ -14,4 +96,3 @@ require("nvim-treesitter.configs").setup({
})
require("gitsigns").setup({})
-
diff --git a/modules/desktop/apps/editors/neovim.nix b/modules/desktop/apps/editors/neovim.nix
index bc3ff86..e17dac6 100644
--- a/modules/desktop/apps/editors/neovim.nix
+++ b/modules/desktop/apps/editors/neovim.nix
@@ -46,18 +46,19 @@ in {
gitsigns-nvim
nvim-tree-lua
catppuccin-nvim
-
+
nvim-lspconfig
nvim-cmp
cmp-cmdline
cmp-nvim-lsp
+ cmp-nvim-lsp-signature-help
cmp-buffer
cmp-path
- cmp-vsnip
cmp-treesitter
+
+ luasnip
vim-nix
- vim-vsnip
nvim-treesitter.withAllGrammars
neoformat