关于vim:如何在INSERT模式下触发击键的全功能/自动完成功能?

How to trigger omnicomplete/auto-completion on keystrokes in INSERT mode?

VIM的全能自动补全功能无法按预期工作。

有没有办法使它更聪明?例如,监视环绕文本的上下文? (例如,如果在评论或引号内,请勿触发)

我之所以问是因为,与Visual Studio,IntelliJ,Sublime和Atom等IDE中的自动完成/ IntelliSense相比,自从切换到Vim以来,我到处都不开心(我过去将所有这些都用于开发) 。

此问题的基本目标:

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

我刚接触Vim几个月了,他拼命地试图获得一个平稳的工作流程。但是,如果没有好的自动完成选项,虽然迫使我更加警惕地学习要使用的代码,但与过去使用的其他IDE相比,这非常缓慢。

Atom Go-Plus

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

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

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

Atoms autocomplete with Go-Plus

如您所见,有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的一生。这告诉我工作中没有IntelliSense /自动完成功能-只是监视我进行的击键操作:

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

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

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

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

enter image description here

为什么要在预览中给我参数,它仍然不能自动完成我的line 22代码,并且常常让人分心(我经常禁用它,因为我键入的速度比必须停下来并"查找"所有内容要快得多)时间)。

需要花很多时间来调整配置文件才能使以下内容正常工作;但是,我能够获得"点"自动补全功能。因此,存在某种形式的自动完成功能:

vim and vim-go autocompletion with dot

但是同样地,一旦我选择了一个很烦人的函数,就不得不输入ESC + back arrow + back arrow + : + GoDoc来看看它是什么,它就不会填写参数。要查看它是10个字符笔画。

"点自动补全"时,肯定,原子,崇高和VS更漂亮:

atom and go-plus dot autocompletion

(最好按类型排序,尽管我确实有vim设置来记住顶部使用的最后一个,以便有所帮助)。但我不在乎漂亮-我只想在使用"点"进行选择时显示参数。

任何有关如何调整我的vim-go和相关插件的建议都将受到欢迎,因为我希望在任何IDE上都与Vim保持在一起。谢谢。

编辑:

我看到vim-go的作者已经完成了parameters-completion部分,并使其起作用:

autocompletion with parameters in vim-go

尽管,我似乎无法在安装中正常运行(仍在调试它),但我想向其他人展示确实可以通过填充参数来自动完成。


Can Omnicomplete be triggered on A-Za-z keystrokes in INSERT mode?

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

1
2
3
4
5
6
7
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()

How to get Omnicomplete to insert the func's parameters?

我使用sublime已经好几年了,它代表了带有代码片段的内置函数(默认为vim omnicompletion)。因此,如果要将参数插入到缓冲区中,则需要:

  • 安装摘要管理器,如ultisnips,neosnippet,minisnip,xptemplate或其他。
  • 创建一堆代码片段或从某个地方安装。
  • 使您的完成系统识别首选的代码片段管理器(许多完成管理器可以识别ultisnips)。
  • 如果您通过使用所谓的预览窗口的方式改变主意,则上面提到的一些提示:

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