{pkgs, ...}: { programs.nixvim = { extraConfigLuaPre = '' 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 ''; plugins = { luasnip = { enable = true; fromVscode = [{}]; settings = { enable_autosnippets = true; store_selection_keys = ""; }; }; friendly-snippets = { enable = true; }; lspkind = { enable = true; mode = "symbol_text"; cmp = { enable = true; # Custom Theme after = '' function(entry, vim_item, kind) local strings = vim.split(kind.kind, "%s", { trimempty = true }) kind.kind = " " .. (strings[1] or "") .. " " kind.menu = " (" .. (strings[2] or "") .. ")" return kind end ''; }; }; cmp-nvim-lsp.enable = true; cmp-nvim-lua.enable = true; cmp_luasnip.enable = true; # cmp-path.enable = true; cmp-latex-symbols.enable = true; cmp-buffer.enable = true; cmp = { enable = true; autoEnableSources = true; settings = { experimental = { ghost_text = true; }; sources = [ { name = "nvim_lsp"; # priority = 1000; # option = { }; } {name = "luasnip";} {name = "buffer";} # { name = "path"; } ]; mapping = { "" = "cmp.mapping.confirm({ select = true })"; "" = '' cmp.mapping(function(fallback) if require("luasnip").expand_or_locally_jumpable() then require("luasnip").expand_or_jump() elseif cmp.visible() then cmp.select_next_item() elseif has_words_before() then cmp.complete() else fallback() end end, { "i", "s" }) ''; "" = '' cmp.mapping(function(fallback) if require("luasnip").jumpable(-1) then require("luasnip").jump(-1) elseif cmp.visible() then cmp.select_prev_item() else fallback() end end, { "i", "s" }) ''; "" = "cmp.mapping.complete()"; "" = "cmp.mapping.abort()"; "" = "cmp.mapping.select_prev_item()"; "" = "cmp.mapping.select_next_item()"; "" = "cmp.mapping.select_prev_item()"; "" = "cmp.mapping.select_next_item()"; "" = "cmp.mapping.scroll_docs(-4)"; "" = "cmp.mapping.scroll_docs(4)"; }; window = { documentation.max_height = "math.floor(40 * (40 / vim.o.lines))"; completion = { winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None"; col_offset = -3; side_padding = 0; border = "rounded"; }; documentation = { border = "rounded"; }; }; snippet.expand = '' function(args) require('luasnip').lsp_expand(args.body) end ''; formatting = { fields = [ "kind" "abbr" "menu" ]; }; menu = { buffer = ""; calc = ""; cmdline = ""; codeium = "󱜙"; emoji = "󰞅"; git = ""; luasnip = "󰩫"; neorg = ""; nvim_lsp = ""; nvim_lua = ""; path = ""; spell = ""; treesitter = "󰔱"; }; }; }; }; extraPlugins = with pkgs.vimPlugins; [vim-snippets]; extraConfigLua = '' luasnip = require("luasnip") kind_icons = { Text = "󰊄", Method = "", Function = "󰡱", Constructor = "", Field = "", Variable = "󱀍", Class = "", Interface = "", Module = "󰕳", Property = "", Unit = "", Value = "", Enum = "", Keyword = "", Snippet = "", Color = "", File = "", Reference = "", Folder = "", EnumMember = "", Constant = "", Struct = "", Event = "", Operator = "", TypeParameter = "", } ''; }; }