VIM中的单词/代码自动补全

9
我知道可以通过CTRL+NCTRL+P进行单词完成,通过CTRL+XCTRL+O使用omnifunc进行代码完成。我还尝试了Supertab(非常好用),因为我习惯于使用TAB键补全。这些都很好用。我希望在输入时能够看到可能的匹配项,因此我也尝试了autocomplpop.vim,它可以做到这一点。
不过,我想要实现的是两者的结合,并稍作改进:当我使用TAB键时,单词应该被展开到最大公共匹配项(就像autocompop一样),但在我输入时仍然能够看到建议弹出。
foo bar testor booze test baz teter
te<TAB>

在第二行输入te后,弹出框应该建议testtetertestor
当我按下TAB键时,它不应该执行任何操作,因为没有比te更多的共同点。在我再输入一个s并按下TAB键后,它应该将tes扩展为test(因为它是最小的共同点),并在第二个TAB之后将其扩展为testor
编辑:我尝试让说明更清楚一些...
  • te<TAB>
    • 不应该执行任何操作,因为“我们”不知道接下来应该跟着一个 't' (teter) 还是一个 's' (test, testor)。
  • tes<TAB>
    • 应该扩展为test(因为这对于两者都适用- test和testor - 而teter不再是可能的匹配项)。
  • test<TAB>
    • 应该扩展为testor(唯一可能的匹配项)。
嗯,建议弹出框只是额外的奖励,但我真的很希望看到TAB的行为。希望我没有变得太深奥了,你可以帮我用一些脚本技巧或插件来控制VIM来做到这一点吗?

"test" 不是可能与 "test<TAB>" 匹配吗?这就是 bash 的处理方式…(除了第三种情况外,你的例子反映了 bash 的自动完成规则…) - Stobor
1个回答

6
:set completeopt=longest,menu,preview

也许?

(我不确定您的陈述是否与以下陈述相冲突:

“当我按TAB键时,它应该什么都不做,因为此时没有比“te”更常见的基础。”

在那一点上,“test”似乎是唯一的共同点...除非您的意思是第一个制表符到达最长的公共基础,然后随后的制表符循环遍历其他匹配项,在这种情况下,您想要的是我上面提到的内容...)


如果我使用:set completeopt=longest,menu,preview,并在输入te后按下tab键,它会自动补全为testor。这不是我想要的结果。 - Brutus
Superuser 上有人问了类似的问题(http://superuser.com/questions/117490/vim-autocompletion-making-xu-expand-to-longest-match),他们说 SuperTab 与 longest 有些冲突。你试过禁用 SuperTab 吗? - idbrii
:set completeopt=longest,menu 是你想要的。 - qed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接