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/doc/lua.txt | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) (limited to 'runtime/doc') diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt index 6705768aeb..a99b050195 100644 --- a/runtime/doc/lua.txt +++ b/runtime/doc/lua.txt @@ -4551,16 +4551,6 @@ vim.snippet.active({filter}) *vim.snippet.active()* Returns `true` if there's an active snippet in the current buffer, applying the given filter if provided. - You can use this function to navigate a snippet as follows: >lua - vim.keymap.set({ 'i', 's' }, '', function() - if vim.snippet.active({ direction = 1 }) then - return 'lua vim.snippet.jump(1)' - else - return '' - end - end, { expr = true }) -< - Parameters: ~ • {filter} (`vim.snippet.ActiveFilter?`) Filter to constrain the search with: @@ -4585,14 +4575,15 @@ vim.snippet.jump({direction}) *vim.snippet.jump()* Jumps to the next (or previous) placeholder in the current snippet, if possible. - For example, map `` to jump while a snippet is active: >lua + By default `` is setup to jump if a snippet is active. The default + mapping looks like: >lua vim.keymap.set({ 'i', 's' }, '', function() if vim.snippet.active({ direction = 1 }) then return 'lua vim.snippet.jump(1)' else return '' end - end, { expr = true }) + end, { descr = '...', expr = true, silent = true }) < Parameters: ~ -- cgit