我想知道如何编写一个重载<TAB>
的函数。
首先,它将进行检查以查看是否需要完成一个代码段,如果存在,请展开它。
否则,我希望函数执行检查以查看在按下Tab之前光标(或我们在新行上)之前是否有空格。如果是这样,则应定期执行<tab>
。否则,我想打电话给
deoplete#manual_complete()
除非菜单已经打开,在这种情况下,我应该可以通过它进行切换。
这是我的尝试(完全失败了,还有一些设置可供参考:
let g:ulti_expand_or_jump_res = 0 "default value, just set once
function! Ulti_ExpandOrJump_and_getRes()
call UltiSnips#ExpandSnippetOrJump()
return g:ulti_expand_or_jump_res
endfunction
inoremap <silent><expr> <tab>
\ (Ulti_ExpandOrJump_and_getRes() > 0) ? "\<C-y>"
\ : pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ deoplete#manual_complete()
function! s:check_back_space() abort "{{{
let col = col('.') - 1
return !col || getline('.')[col - 1] =~ '\s'
endfunction "}}}
奇怪的是,当我按下tab键时,vim的右下角显示我键入了“ ^ I”,这是非常奇怪的行为。
我没有使用ultisnips扩展触发器作为“ tab”的原因是,它禁止将deoplete使用tab(无论出于何种原因。]
我相信您遇到的主要问题是UltiSnips#ExpandSnippetOrJump()
会尝试移动光标,而这是插入模式下<expr>
映射产生的问题。改用<C-R>=...<CR>
应该可以使用。 (至少这是UltiSnips文档中的示例所使用的。)