如何在插入模式下在函数中执行 Vim <Plug> 命令?

How to exec Vim <Plug> command in function when insert mode?

我试着在下面输入命令来执行命令

fun! DeoEnter()
    if pumvisible()
        if vsnip#available(1)
           " wanna exec function here, like `exe 'normal <Plug>(vsnip-jump-next)'`
        endif

        call UltiSnips#ExpandSnippetOrJump()
        if g:ulti_expand_or_jump_res > 0
            return ""
        endif

        return "\<C-y>"
    endif

    return "\n"
endfun
ino <CR> <C-R>=DeoEnter()<CR>

,然而,命令实际上没有用,因为它是普通映射,但我想完成插入映射。

我查了文档,里面写的只是普通模式。有什么好办法吗?

你可以这样做:

ino <CR> :exe "a".DeoEnter()<CR>

这样,DeoEnter函数的结果将以插入模式输入

因为你的函数是 return 已经在插入模式下执行击键(通过 <C-r>=... 机制),你可以对这个函数做同样的事情。

您可以 return 双引号字符串并使用反斜杠转义键序列(与您稍后在该函数中为 "\<C-y>" 所做的相同。)

所以可以用\<Plug>输入<Plug>"key"。即使它不是真正的钥匙,它的行为也与真正的钥匙相同。

由于<Plug>(vsnip-jump-next)需要在普通模式下执行,所以可以使用<C-o>,它允许您在插入模式下执行单个普通模式命令,而return到该命令完成时插入模式。

所以这条线将在那里工作:

return "\<C-o>\<Plug>(vsnip-jump-next)"

综合起来:

fun! DeoEnter()
    if pumvisible()
        if vsnip#available(1)
           return "\<C-o>\<Plug>(vsnip-jump-next)"
        endif

        call UltiSnips#ExpandSnippetOrJump()
        if g:ulti_expand_or_jump_res > 0
            return ""
        endif

        return "\<C-y>"
    endif

    return "\r"
endfun
ino <CR> <C-R>=DeoEnter()<CR>

我还将函数的最后一行从 return "\n" 更改为 return "\r",因为那实际上是 "Enter" 键将生成的代码。 (我相信 "\n" 也会起作用,但是 "\r" 在这个地方更正确。)你也可以使用 return "\<CR>",它等同于 "\r" 但更明确关于您发送 "Enter" 密钥的代码这一事实,那就更好了。