From d4a78a7fbdfa9df9b5eeb8a5de4882c560b73e29 Mon Sep 17 00:00:00 2001 From: aarondill Date: Mon, 25 Mar 2024 01:22:43 -0500 Subject: [PATCH] feat: add tabnine.keymaps.has/accept/dismiss_suggestion --- lua/tabnine/completion.lua | 2 ++ lua/tabnine/keymaps.lua | 37 ++++++++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/lua/tabnine/completion.lua b/lua/tabnine/completion.lua index 4a3f811..41d3fe6 100644 --- a/lua/tabnine/completion.lua +++ b/lua/tabnine/completion.lua @@ -14,6 +14,8 @@ end function M.accept() M.clear() + --- Don't error if no completion available! + if not state.rendered_completion or state.rendered_completion == "" then return end local lines = utils.str_to_lines(state.rendered_completion) if utils.starts_with(state.rendered_completion, "\n") then diff --git a/lua/tabnine/keymaps.lua b/lua/tabnine/keymaps.lua index 9eb6554..d0119db 100644 --- a/lua/tabnine/keymaps.lua +++ b/lua/tabnine/keymaps.lua @@ -3,21 +3,36 @@ local completion = require("tabnine.completion") local config = require("tabnine.config") local state = require("tabnine.state") +---@return boolean +function M.has_suggestion() + return state.active == true and state.completions_cache ~= nil +end +M.accept_suggestion = vim.schedule_wrap(function() + if not M.has_suggestion() then return end + return completion.accept() +end) +M.dismiss_suggestion = vim.schedule_wrap(function() + if not M.has_suggestion() then return end + completion.clear() + state.completions_cache = nil +end) + function M.setup() local accept_keymap = config.get_config().accept_keymap local dismiss_keymap = config.get_config().dismiss_keymap - vim.keymap.set("i", accept_keymap, function() - if not state.completions_cache then return accept_keymap end - vim.schedule(completion.accept) - end, { expr = true }) + if accept_keymap then -- allow setting to `false` to disable + vim.keymap.set("i", accept_keymap, function() + if not M.has_suggestion() then return accept_keymap end + return M.accept_suggestion() + end, { expr = true }) + end - vim.keymap.set("i", dismiss_keymap, function() - if not state.completions_cache then return dismiss_keymap end - vim.schedule(function() - completion.clear() - state.completions_cache = nil - end) - end, { expr = true }) + if dismiss_keymap then -- allow setting to `false` to disable + vim.keymap.set("i", dismiss_keymap, function() + if not M.has_suggestion() then return dismiss_keymap end + return M.dismiss_suggestion() + end, { expr = true }) + end end return M