用于Ultisnips + Deoplete兼容性的脚本

问题描述 投票:1回答:1

我想知道如何编写一个重载<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(无论出于何种原因。]

vim neovim
1个回答
0
投票

我相信您遇到的主要问题是UltiSnips#ExpandSnippetOrJump()会尝试移动光标,而这是插入模式下<expr>映射产生的问题。改用<C-R>=...<CR>应该可以使用。 (至少这是UltiSnips文档中的示例所使用的。)

© www.soinside.com 2019 - 2024. All rights reserved.