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

edu*_*911 13 vim autocomplete omnicomplete

VIM的omnicomplete自动完成并没有像预期的那样正常工作.

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

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

这个问题的基本目标:

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

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

Atom + Go-Plus

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

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

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

Atom使用Go-Plus自动完成

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

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

具有go-plus自动完成的原子

我没有输入任何上述内容.它被插入,我可以覆盖细节,修改它们,或只是TAB关闭并继续键入.

Vim + Vim-Go(真的是Omnicomplete)

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

set completeopt=longest,menuone

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

vim与omnicomplete和自动完成无法正常工作

如您所见,自动填充功能无法正常输入.虽然,这确实在其他地方的评论和字符串派上用场,我有点像vim记得我输入的自由文本.

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

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

vim与omnicomplete和自动完成

这个更好; 但是,我希望它能在我输入时向我显示自动完成选项:不需要额外的3次击键来实现它.在整个几个小时的编码中,这是很多Cx Co事件.

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

使用参数自动完成

自动完成有第二个问题omnicomplete我可以忽略上面的Cx Co要求如果这样做:一旦我选择了我想要自动完成的方法,它就不会为我插入参数/字段.

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

vim与vim-go自动完成未完全完成

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

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

例如,set completeopt+=preview选择后给我预览窗口:

在此输入图像描述

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

为了得到以下工作,需要对配置文件进行大量调整; 但是,我能够让"点"自动完成工作.因此,有一些形式的自动完成工作:

带点的vim和vim-go自动完成

但同样,一旦我选择了一个非常烦人的函数,它ESC + back arrow + back arrow + : + GoDoc只是为了看它是什么而不是填充参数:这是10个字符的笔画来看它是什么.

当然,Atom,Sublime和VS在"点自动完成"时更漂亮:

原子和go-plus点自动完成

(它也更好地按类型排序,虽然我确实有vim设置来记住最后一个在顶部使用,这样有帮助).但是我并不关心漂亮 - 我只是想在选择'dot'时显示我的参数.

在如何调整我的任何意见,VIM,去相关的插件将是非常欢迎的,因为我更愿意在任何的IDE留在Vim的.谢谢.

编辑:

我看到作者vim-go已参与完成参数完成部分并使其正常工作:

在vim-go中使用参数自动完成

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

Evg*_*niy 9

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

您可以监听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()
Run Code Online (Sandbox Code Playgroud)

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

如需进一步阅读,请执行help InsertCharPre, help autocmd-events, help pumvisible(), help feedkeys()

如何让Omnicomplete插入func的参数?

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

  1. 安装片段管理器,如ultisnipsneosnippetminisnipxptemplate其他
  2. 创建一堆片段或从某个地方安装。
  3. 让您的完成系统识别首选代码段管理器(许多完成管理器识别ultisnips)。

如果您改变了使用上面提到的所谓预览窗口的方式,这里有一些提示:

  1. 可以在屏幕底部显示预览窗口set splitbelow
  2. 您可以set previewheight选择更改其大小。
  3. 完成后自动关闭窗口autocmd CompleteDone * pclose

进一步阅读做help ins-completionhelp preview-window