【问题标题】:vimscript for Ultisnips+Deoplete compatibility用于 Ultisnips+Deoplete 兼容性的 vimscript
【发布时间】:2020-04-17 05:22:47
【问题描述】:

我想知道如何编写一个重载<TAB>的函数。

首先它会检查是否有需要完成的sn-p,如果有sn-p,则展开它。

否则,我希望该函数在按下 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 扩展触发器作为“选项卡”的原因是它禁止使用选项卡进行 deoplete(无论出于何种原因)。

【问题讨论】:

  • 我拥有的部分脚本被抓获,以使标签在 github 问题的 deoplete 下正常工作
  • 您可能想查看Vi & Vim StackExchange 以了解有关 Vim 和 Vimscript 的问题!
  • @filbranden 我什至不知道它的存在!谢谢

标签: vim neovim


【解决方案1】:

我相信您遇到的主要问题是UltiSnips#ExpandSnippetOrJump() 将尝试移动光标,这是插入模式下&lt;expr&gt; 映射的问题。改用&lt;C-R&gt;=...&lt;CR&gt; 应该可以让它工作。 (至少 UltiSnips 文档中的示例是这样使用的。)

我还建议使用单个函数来处理所有 Tab 情况,而不是使用相当长的单行。这样您就可以使用ifs 并具体记录每个案例。

我还认为,对于您在 UltiSnips 上扩展或跳转的情况,您希望扩展为空而不是 &lt;C-y&gt;,对吧?

把它们放在一起:

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 扩展更便宜,尽管我想当你有空间时你可能会跳过字段......无论如何,应该很容易调整它以使其工作。

【讨论】:

  • 哇,这几乎是一个完美的解决方案。实际上,它非常适合上述问题。不幸的是,我现在遇到的问题是,当我想自动完成(使用 deoplete)时,光标会跳转!有没有办法让它 ultisnips#expand 但不跳转,然后只有在李子不可见时才跳转?
  • 我接受了答案,因为它确实完全回答了上述问题。
  • @AndresMejia 很高兴这有帮助!您也许可以使用UltiSnips#ExpandSnippet() 来检查您是否只能展开,也许可以使用UltiSnips#JumpForwards() 来检查您是否可以跳跃。有全局变量来检查这些是否成功。有关详细信息,请参阅:help UltiSnips-trigger-functions。 (不知道这是否有帮助......我是否正确理解你只想在不执行完成时跳转,对吗?)希望这会让你朝着正确的方向前进。
猜你喜欢
  • 2013-06-18
  • 2014-08-14
  • 2017-04-23
  • 1970-01-01
  • 2012-08-10
  • 2015-02-14
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多