From da840436921f017269b4bd1cc0719a21886b104f Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Wed, 24 Jun 2026 02:40:25 +0300 Subject: Add luasnip and use it to load language and project specific snippets, also add a bunch of mess to get a nice unwrap(), this is committed on purpose as a reference for future me, will be cleaned up in the next commit. It also touches a bunch of blink.cmp to achieve this. --- .config/nvim/lua/plugins/blink-cmp.lua | 84 +++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 27 deletions(-) (limited to '.config/nvim/lua/plugins/blink-cmp.lua') diff --git a/.config/nvim/lua/plugins/blink-cmp.lua b/.config/nvim/lua/plugins/blink-cmp.lua index 0c3f6d5..6d2a72e 100644 --- a/.config/nvim/lua/plugins/blink-cmp.lua +++ b/.config/nvim/lua/plugins/blink-cmp.lua @@ -5,10 +5,26 @@ return { version = '1.*', dependencies = { { 'Kaiser-Yang/blink-cmp-git', dependencies = { 'nvim-lua/plenary.nvim' } }, + { 'L3MON4D3/LuaSnip', version = 'v2.*' }, }, ---@module 'blink.cmp' ---@type blink.cmp.Config opts = { + snippets = { preset = 'luasnip' }, + -- snippets = { + -- expand = function(snippet) + -- require('luasnip').lsp_expand(snippet) + -- end, + -- active = function(filter) + -- if filter and filter.direction then + -- return require('luasnip').jumpable(filter.direction) + -- end + -- return require('luasnip').in_snippet() + -- end, + -- jump = function(direction) + -- require('luasnip').jump(direction) + -- end, + -- }, keymap = { preset = 'enter', [''] = {}, @@ -18,6 +34,36 @@ return { [''] = {}, [''] = { 'scroll_documentation_up', 'fallback' }, [''] = { 'scroll_documentation_down', 'fallback' }, + [''] = { + function(cmp) + local item = cmp.get_selected_item() + + if item and item.label == '.unwrap' then + vim.schedule(function() + local ctx = cmp.get_context() + if not ctx or not ctx.bounds then + return cmp.accept() + end + local partial = ctx.get_keyword() or '' + local full = cmp.get_selected_item().label + local rest = full:sub(#partial + 1 + 1) + + local row = ctx.bounds.line_number - 1 + local col = ctx.bounds.start_col + ctx.bounds.length + + local line = vim.api.nvim_buf_get_lines(ctx.bufnr, row, row + 1, false)[1] + local cursor_at_eol = col > #line + + vim.api.nvim_put({ rest }, 'c', cursor_at_eol, true) + require('luasnip').expand() + end) + return true + end + + return cmp.accept() + end, + 'fallback', + }, }, completion = { @@ -31,7 +77,16 @@ return { keyword = { range = 'full' }, -- Preselect first one, don't complete until confirmation - list = { selection = { preselect = true, auto_insert = false } }, + list = { + selection = { + preselect = true, + -- auto_insert = false, + auto_insert = function(ctx) + -- vim.notify() + return ctx.get_keyword() == 'unwrap' + end, + }, + }, menu = { draw = { @@ -82,31 +137,7 @@ return { }, snippets = { - -- score_offset = 200, -- make snippets highest priority - transform_items = function(_, items) - return vim.tbl_filter(function(item) - -- vim.print(item) - if item.kind ~= require('blink.cmp.types').CompletionItemKind.Snippet then - return true - end - - local name = item.description - -- vim.print(name) - local parts = vim.split(name, ' ', { trimempty = false }) - local namespace = #parts > 1 and parts[1] or nil - -- vim.print(namespace) - if not namespace then - return true - end - - -- vim.print(vim.fn.getcwd()) - local path = vim.split(vim.fn.getcwd(), '/') - local dir = path[#path] - -- vim.print(dir) - - return dir == namespace - end, items) - end, + score_offset = 200, -- make snippets highest priority }, lsp = { @@ -181,7 +212,6 @@ return { opts_extend = { 'sources.default' }, -- TODO: pressing backk (deleting), should re-show completion menu - -- TODO: ghost text only for LLMs? } -- From LazyVim -- cgit v1.3.1