From 5bc52062120fb3bbdee7a9086328b3ef66d58185 Mon Sep 17 00:00:00 2001 From: Fernando Schauenburg Date: Sat, 15 Jul 2023 00:33:29 +0200 Subject: [PATCH] vim: fix behavior for autocomplete Insert: confirm if completion active, normal tab otherwise Command: confirn if completion active, start completion otherwise --- config/nvim/lua/user/plugins/completion.lua | 76 +++++++++++++-------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/config/nvim/lua/user/plugins/completion.lua b/config/nvim/lua/user/plugins/completion.lua index 99599f4..58f8977 100644 --- a/config/nvim/lua/user/plugins/completion.lua +++ b/config/nvim/lua/user/plugins/completion.lua @@ -1,50 +1,57 @@ local config = function() local cmp = require('cmp') + -- flip(f)(a, b) == f(b, a) + local flip = function(f) return function(a, b) return f(b, a) end end + + -- partial(f, x)(...) == f(x, ...) + local partial = function(f, x) return function(...) return f(x, ...) end end + + -- assign('i', { key = func, ... }) == { key = { i = func }, ... } + -- assign({'i', 'c'}, { key = func, ... }) == { key = { i = func, c = func }, ...} + local assign = function(modes, tbl) + modes = type(modes) == 'table' and modes or { modes } + return vim.tbl_map(partial(flip(cmp.mapping), modes), tbl) + end + + local invoke_fallback = function(fallback) fallback() end + local when = function(condition) - local default = function(fallback) fallback() end return function(opts) - local yes = opts.yes or default - local no = opts.no or default + local yes = opts.yes or invoke_fallback + local no = opts.no or invoke_fallback return function(fallback) if condition() then yes(fallback) else no(fallback) end end end end - local keymap = setmetatable({}, { - __newindex = function(t, k, v) - rawset(t, k, { i = v, c = v }) - end, - }) + local keymap = { + [''] = when(cmp.visible) { + yes = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Select }, + no = cmp.mapping.complete(), + }, - keymap[''] = when(cmp.visible) { - yes = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Select }, - no = cmp.mapping.complete(), - } + [''] = when(cmp.visible) { + yes = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Select }, + no = cmp.mapping.complete(), + }, - keymap[''] = when(cmp.visible) { - yes = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Select }, - no = cmp.mapping.complete(), - } + [''] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Select }, + [''] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Select }, - keymap[''] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Select } - keymap[''] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Select } + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(-4), - keymap[''] = cmp.mapping.scroll_docs(4) - keymap[''] = cmp.mapping.scroll_docs(4) - keymap[''] = cmp.mapping.scroll_docs(-4) - keymap[''] = cmp.mapping.scroll_docs(-4) - - keymap[''] = cmp.mapping.abort() - keymap[''] = cmp.mapping.confirm { select = true } - keymap[''] = when(cmp.visible) { - yes = cmp.mapping.confirm { select = true }, - no = cmp.mapping.complete(), + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm { select = true }, + [''] = when(cmp.visible) { yes = cmp.mapping.confirm { select = true } }, } cmp.setup { - mapping = keymap, + mapping = assign('i', keymap), enabled = function() local c = require 'cmp.config.context' @@ -119,8 +126,17 @@ local config = function() }, } + cmp.setup.cmdline(':', { - mapping = keymap, + mapping = assign( + 'c', + vim.tbl_extend('force', keymap, { + [''] = when(cmp.visible) { + yes = cmp.mapping.confirm { select = true }, + no = cmp.mapping.complete(), + } + }) + ), completion = { autocomplete = false,