From 123f8d229eef05869ee4c98dfd4934c22a03b1f6 Mon Sep 17 00:00:00 2001 From: Mathias Fußenegger Date: Fri, 14 Mar 2025 09:51:52 +0100 Subject: feat(snippet): set snippet keymaps permanent instead of dynamic (#31887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Given that `vim.snippet.expand()` sets temporary ``/`` keymaps there is no way to build "smart-tab" functionality where `` chooses the next completion candidate if the popup menu is visible. Solution: Set the keymap permanent in `_defaults`. The downside of this approach is that users of multiple snippet engine's need to adapt their keymaps to handle all their engines that are in use. For example: vim.keymap.set({ 'i', 's' }, "", function() if foreign_snippet.active() then return "lua require('foreign_snippet').jump()" elseif vim.snippet.active({ direction = 1 }) then return "lua vim.snippet.jump(1)" else return key end end, { expr = true }) Upside is that using `vim.keymap.set` to override keymaps is a well established pattern and `vim.snippet.expand` calls made by nvim itself or plugins have working keymaps out of the box. Co-authored-by: Maria José Solano --- runtime/lua/vim/_defaults.lua | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'runtime/lua/vim/_defaults.lua') diff --git a/runtime/lua/vim/_defaults.lua b/runtime/lua/vim/_defaults.lua index dcf9b6ba70..7440af1a96 100644 --- a/runtime/lua/vim/_defaults.lua +++ b/runtime/lua/vim/_defaults.lua @@ -218,6 +218,27 @@ do end, { desc = 'vim.lsp.buf.signature_help()' }) end + do + ---@param direction vim.snippet.Direction + ---@param key string + local function set_snippet_jump(direction, key) + vim.keymap.set({ 'i', 's' }, key, function() + if vim.snippet.active({ direction = direction }) then + return string.format('lua vim.snippet.jump(%d)', direction) + else + return key + end + end, { + desc = 'vim.snippet.jump if active, otherwise ' .. key, + expr = true, + silent = true, + }) + end + + set_snippet_jump(1, '') + set_snippet_jump(-1, '') + end + --- Map [d and ]d to move to the previous/next diagnostic. Map d to open a floating window --- for the diagnostic under the cursor. --- -- cgit