Я полагаю, что основная проблема, с которой вы столкнулись, заключается в том, что UltiSnips#ExpandSnippetOrJump()
попытается переместить курсор, и это проблема отображения <expr>
в режиме вставки. Использование <C-R>=...<CR>
вместо этого должно заставить его работать. (По крайней мере, это то, что использует пример в документации UltiSnips.)
Я бы также рекомендовал использовать одну функцию для обработки всех случаев Tab вместо довольно длинной однострочной. Таким образом, вы можете использовать if
s и задокументировать каждый случай отдельно.
Я также думаю, что для случая, когда вы расширяетесь или переходите на UltiSnips, вы хотите расширить ничего, кроме <C-y>
, верно?
Собираем все вместе:
function! HandleTab() abort
" First, try to expand or jump on UltiSnips.
call UltiSnips#ExpandSnippetOrJump()
if g:ulti_expand_or_jump_res > 0
return ""
endif
" Then, check if we're in a completion menu
if pumvisible()
return "\<C-n>"
endif
" Then check if we're indenting.
let col = col('.') - 1
if !col || getline('.')[col - 1] =~ '\s'
return "\<Tab>"
endif
" Finally, trigger deoplete completion.
return deoplete#manual_complete()
endfunction
inoremap <silent> <Tab> <C-R>=HandleTab()<CR>
Возможно, вы захотите пересмотреть порядок проверок. Мне кажется, что проверка на pumvisible()
должна быть первой. Кроме того, проверка того, является ли отступ, вероятно, дешевле, чем проверка расширения UltiSnips, хотя я предполагаю, что вы можете перепрыгивать через поля, когда у вас есть пробел ... В любом случае, это должно быть легко настроить, чтобы это работало.