<Plug> 函数失败,作为文字“<t_ý>S”插入

<Plug> function failing, inserting as literal "<t_ý>S"

要按回车键自动完成,我有以下地图设置可用于 neocomplete.vim:

inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return pumvisible() ? "\<c-y>" : "\<CR>"
endfunction

这很好用。解释一下,当显示 neocomplete 的 PopUpMenu 时,pumvisible() return 为真。 <c-y> 选择所选单词,将其插入到插入模式光标后,并关闭 neocomplete 弹出窗口。

我想扩展这个映射,这样当自动完成的单词是 "snippet" 单词时,neosnippet.vim 插件会自动扩展它。这是我试过的:

inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return pumvisible() ? "\<c-y>\<Plug>(neosnippet_expand_or_jump)" : "\<CR>"
endfunction

这导致将以下内容直接插入到光标所在的文本中,而不是扩展片段词:

<t_ý>S(neosnippet_expand_or_jump)`

我该如何解决这个问题并让它发挥作用?

可能相关的注意事项: 如果我 return 到代码的工作版本(上面的第一个),点击 "enter",然后手动输入 <C-k> (同时仍处于插入模式),代码段会正确展开。这是 <C-k>:

的映射设置
imap <C-k> <Plug>(neosnippet_expand_or_jump)

<Plug>noremap 版本的命令中没有意义,因为它们本身就是映射。所以你应该使用imap。第二件事是如果你想执行映射的结果,你应该使用表达式映射而不是表达式寄存器。

总共看起来像

imap <silent> <expr> <CR> <SID>my_cr_function()

您可能想看看 :help :map-expression