Поскольку ваша функция уже возвращает нажатия клавиш для выполнения в режиме вставки (через механизм <C-r>=...
), вы можете сделать то же самое для этого.
Вы можете вернуть строку в двойных кавычках и использовать обратную косую черту для escape-последовательности клавиш (то же, что вы уже делаете для "\<C-y>"
позже в этой функции.)
Таким образом, вы можете использовать \<Plug>
для ввода <Plug>
«ключа». Даже если это не настоящий ключ, он ведет себя так же, как и один.
Поскольку <Plug>(vsnip-jump-next)
должен выполняться в обычном режиме, вы можете использовать <C-o>
, что позволяет вам выполните одну команду в обычном режиме из режима вставки и вернитесь в режим вставки после ее завершения.
Таким образом, эта строка будет работать там:
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"
, но более точно о том, что вы отправляете код для клавиши «Ввод», это даже лучше.