如何按照(luasnip+lsp-popup)指定的方式更改neovim的标签行为

我目前已经按照nvim-cmp建议设置了标签:


    mapping = {
            -------其他映射--------

        ["<Tab>"] = cmp.mapping(function(fallback)
          if cmp.visible() then
            cmp.select_next_item()
          elseif luasnip.expand_or_jumpable() then
            luasnip.expand_or_jump()
          elseif has_words_before() then
            cmp.complete()
          else
            fallback()
          end
        end, { "i", "s" }),
        ["<S-Tab>"] = cmp.mapping(function(fallback)
          if cmp.visible() then
            cmp.select_prev_item()
          elseif luasnip.jumpable(-1) then
            luasnip.jump(-1)
          else
            fallback()
          end
        end, { "i", "s" }),

            -------其他映射--------
    }

这是我所想要的行为,但有一个问题。 假设我使用了一个具有多个占位符的片段,我在其中一个占位符中编写然后退出插入模式并进入命令模式。现在我不更改其他占位符,并想要在代码的其他位置插入制表符,但nvim-cmp假定(或至少对我来说似乎如此)我正在片段中并且想要跳过一些字符,并且选项卡将执行此操作。但实际上,我想插入实际制表符字符。

我想要的行为:

一旦我退出插入模式,它就会忘记所有的占位符位置。然后我就能够插入制表符。根据我,如果我想完成一个片段,我本来就可以在插入模式中完成它。

请提供解决方案或所需配置的提示。

我已经部分实现了此目标(感谢shaeinst),具体如下:


mapping = {
-------其他映射--------

        ["<Tab>"] = cmp.mapping(function(fallback)
          if cmp.visible() then
            cmp.select_next_item()
          elseif luasnip.expand_or_locally_jumpable() then
            luasnip.expand_or_jump()
          --elseif has_words_before() then
            --cmp.complete()
          else
            fallback()
          end
        end, { "i", "s" }),
    }

使用此方法,光标只在我处于片段中时跳转到占位符,而且一旦我涵盖了所有占位符,它就不会跳回。但仍然符合我的要求,一旦我退出插入模式,所有占位符都将被忽略,但是只要我在插入模式中,我甚至也想循环遍历占位符。

原文链接 https://stackoverflow.com/questions/70366949

点赞
stackoverflow用户9616711
stackoverflow用户9616711

我可能有点晚了,但是有些人可能遇到相同的问题,也许我能帮助一些可怜的人。

请查看https://github.com/L3MON4D3/LuaSnip/issues/525

简而言之,您可以使用

luasnip.setup({
    region_check_events = "CursorHold,InsertLeave",
    -- those are for removing deleted snippets, also a common problem
    delete_check_events = "TextChanged,InsertEnter",
})

这个方法就可以解决你的问题。

来自L3MON4D3的解释:

这只是luasnip的默认行为,占位符始终按顺序访问(包括回到$0,这是你要返回的位置)(这并不取决于光标移动),因此如果没有通过一个片段,您最终会返回它,无论光标如何移动。

这可以通过向luasnip.setup传递一些选项进行调整:region_check_events是自动事件,在其中执行检查以查看光标是否仍在活动片段中。如果不是,则会跳过/完成/离开片段,因此您不会跳回它。

希望这可以帮助您。

2023-02-20 21:58:20