如何在插入模式下在函数中执行 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" 密钥的代码这一事实,那就更好了。
我试着在下面输入命令来执行命令
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" 密钥的代码这一事实,那就更好了。