如何在INSERT模式下触发键盘上的omnicomplete / auto-completion?

时间:2016-03-07 07:06:40

标签: vim autocomplete omnicomplete

VIM的omnicomplete自动完成功能并没有按预期正常工作。

有没有办法让它变得更聪明?比如,要监控环绕文本的上下文? (例如,如果在评论或引用中不要触发)

我问,因为与Visual Studio,IntelliJ,Sublime和Atom等IDE中的自动完成/智能感知相比,切换到Vim后我无法进入一个快乐的地方(我已经将所有这些用于开发中)过去)。

这个问题的基本目标:

  • 可以在INSERT模式下通过A-Za-z击键触发Omnicomplete吗?我已经通过"触发了它。"点符号。
  • 如何让Omnicomplete插入func的参数?

我是Vim新手几个月,拼命想要顺利完成工作流程。但是如果没有一个好的自动完成选项,虽然强迫我在学习我想要使用的代码时更加警惕,但它在我过去使用过的其他IDE中的速度要慢得多。

Atom + Go-Plus

让我们用Atom + Go-Plus来检验我的期望。

我有一个名为func generate(entropy chan<- uint64)的func位于同一个包中另一个Go文件的其他位置。

当我在第22行输入字母g时,我会立即收到以g开头的所有内容的提示:

Atom's autocomplete with Go-Plus

正如您所看到的,有3个选项可以立即弹出(前两个我认为只是代码片段)。我可以使用箭头键向下滚动到任一选项。

如果我选择第3个选项(或者如果我继续输入gen,则字段缩小到只有1个选项),press enter Atom / Visual Studio / Sublime全部填写详细信息我的方法:

atom with go-plus autocompletion

我没有输入任何上述内容。它被插入,我可以覆盖细节,修改它们,或者只是选择TAB并继续输入。

Vim + Vim-Go(真的是Omnicomplete)

让我们将其与omnicomplete的当前(可能已损坏?)配置进行比较。我在.vimrc中有这个:

set completeopt=longest,menuone

在vim中,如果我输入gen,我得到的就是我之前输入的文本,我在此缓冲区的其他地方输入(并且只在此缓冲区中,而不是在其他缓冲区中)。如果我碰巧拼错了一些东西,那么我得到的拼写错误的版本是我之前为了生活而打开的。这告诉我工作中没有智能感知/自动完成功能 - 只是监控我做的按键操作:

vim with omnicomplete and autocomplete not working

正如您所看到的,自动填充功能在我输入时并不起作用。虽然,这确实在其他地方的评论和字符串派上用场,我有点像vim记得我输入的自由文本。

不确定Vim选项启用了什么;但是,它不是自动完成。

现在,我可以按CTRL-X + CTRL-O强制自动完成并显示generate()

vim with omnicomplete and autocomplete

这更好;但是,我希望它能在我输入时向我显示自动完成选项:不需要额外的3次击键来实现它。这是在整个几个小时的编码过程中发生的大量C-x C-o事件。

有没有办法让Vim在INSERT模式下监控我的击键并在有匹配的ctag或函数时显示自动完成?这可能就是这个功能的答案。

使用参数自动完成

使用omnicomplete进行自动完成存在第二个问题,如果可行,我可以忽略上述Cx Co要求:一旦我选择了我想要自动完成的方法,它就不会插入参数/字段对我来说。

回到上面的截图,如果我选择那个方法,这就是我得到的:

vim with vim-go autocomplete not fully completing

请注意它不会插入 func的参数。它与上面发布的第二张图片不匹配,其中Atom,Sublime和Visual Studio中的自动完成功能都完成了参数显示的方法。

我已经阅读了vim wikia并尝试了set completeopt的各种选项而没有任何可行的选择。

例如,set completeopt+=preview在选择后为我提供了预览窗口:

enter image description here

为什么在预览中给我参数,它仍然不会自动完成我的line 22代码并且通常会分散注意力(我常常禁用它,因为我键入的速度远远快于停止和&#34;一直查找&#34;。

需要对配置文件进行大量调整才能实现以下功能;但是,我能够得到&#34; dot&#34;自动完成工作。因此,有一些形式的自动完成工作:

vim and vim-go autocompletion with dot

但是再一次,一旦我选择了一个非常烦人的函数,只是为了看看它是什么非常令人讨厌,它不会填充参数:那个10个字符的笔画看看它是什么是

当然,Atom,Sublime和VS在#34; dot autocompleting&#34;:

时更漂亮

atom and go-plus dot autocompletion

(它也更好地按类型排序,但我确实有vim设置来记住最后一次使用的顶部,这样有帮助)。但是我并不关心漂亮 - 我只是希望在选择“点”时显示我的参数。

任何关于如何调整我的vim-go和相关插件的建议都会非常受欢迎,因为我更喜欢在任何IDE上使用Vim。谢谢。

编辑:

我看到the author of vim-go已经参与了参数完成部分并使其正常工作:

autocompletion with parameters in vim-go

虽然,我似乎无法让它在我的安装上工作(仍在调试它),但我想向其他人展示,确实可以自动完成参数被填充。

1 个答案:

答案 0 :(得分:3)

  

在INSERT模式下,可以在A-Za-z击键时触发Omnicomplete吗?

您可以收听InsertCharPre事件并检查已按下的键。

function! OpenCompletion()
    if !pumvisible() && ((v:char >= 'a' && v:char <= 'z') || (v:char >= 'A' && v:char <= 'Z'))
        call feedkeys("\<C-x>\<C-o>", "n")
    endif
endfunction

autocmd InsertCharPre * call OpenCompletion()

此外,您应该set completeopt+=menuone,noselect,noinsert以避免vim自动插入完成文本。但请记住,这不是常见的决定,您可能会遇到一些问题。我找到的是它打破了cgn命令。

如需进一步阅读,请help InsertCharPrehelp autocmd-eventshelp pumvisible()help feedkeys()

  

如何让Omnicomplete插入func的参数?

我使用sublime多年,它代表内置函数(默认vim omnicompletion)与片段。因此,如果您希望将参数插入缓冲区,则需要:

  1. 安装代码段管理器,例如 ultisnips neosnippet minisnip xptemplate others。< / LI>
  2. 创建一堆代码段或从某个地方安装。
  3. 让您的完成系统识别首选代码段管理器(许多完成管理员会识别 ultisnips )。
  4. 如果您改变主意,使用所谓的预览窗口,您在上面提到了一些提示:

    1. 可以在屏幕底部显示预览窗口set splitbelow
    2. 您可以set previewheight选项更改其大小。
    3. 完成完成后自动关闭窗口autocmd CompleteDone * pclose
    4. 如需进一步阅读,请help ins-completionhelp preview-window