2016-03-07 115 views
9

VIM的omnicomplete自动完成功能并不像预期的那样工作。如何在INSERT模式下触发omnicomplete/auto-completion键击?

有没有办法让它变得更聪明?就像监视环绕文字的上下文一样? (例如,如果在评论或引用内不触发)

我问,因为与自动完成/ IDE中的IntelliSense(如Visual Studio,IntelliJ,Sublime和Atom)中的IntelliSense相比,切换到Vim后无法获得愉快的地方(过去我已经将这些用于开发)。

的基本目标,这个问题:

  • 可以Omnicomplete在INSERT模式A-ZA-Z按键被触发?我已经通过“。”触发了它。点符号。
  • 如何获取Omnicomplete插入func的参数?

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

Atom + Go-Plus

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

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

当我在第22行中键入字母g,我立即得到一个提示与相克开始的一切:

Atom's autocomplete with Go-Plus

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

如果我选择第三选项(或者,如果我继续键入gen领域范围缩小到只有1个选项),press enter的Atom/Visual Studio中/崇高所有填写方法的细节对我来说:

atom with go-plus autocompletion

我没有输入任何上述内容。它被插入,我可以覆盖细节,修改它们,或者仅仅关闭并继续输入。

的Vim + VIM-围棋(真的Omnicomplete)

我们来比较一下与omnicomplete我目前(也许坏了吗?)配置。我有这个在我的.vimrc:

set completeopt=longest,menuone

在VIM,如果我输入gen,我得到的是什么似乎是我的,我在这个缓冲输入别处以前输入的文本(只有在该缓冲区,而不是其他缓冲区)。如果我碰巧拼错了某些东西,我会得到我之前输入的用于打开vim的生活的拼写错误版本。这告诉我有在工作中没有智能感知/自动完成 - 只是一些监视我让击键:

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共同需求,如果这工作了第二个问题:一旦我做选择我要自动完成的方法,它不会插入我的参数/字段。

让我们再回到上面的截图中,如果我选择的方法,这就是我得到:

vim with vim-go autocomplete not fully completing

注意它不会插入的FUNC的paramters。它与上面发布的第二张图片不匹配,Atom,Sublime和Visual Studio中的自动完成全部通过参数显示完成该方法。

我已阅读vim维基,并试过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和相关插件的建议都会非常受欢迎,因为我宁愿在Vim中使用任何IDE。谢谢。

编辑:

我看到the author of vim-go对参数完成部分工作,并得到了它的工作:

autocompletion with parameters in vim-go

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

+0

1的Vim是一个文本编辑器,而不是一个IDE。如果您需要/需要IDE功能,请使用IDE。 2. Vim只做*手动*完成,而不是*自动*完成。 – romainl

+0

2017年秋季,仍然是故事的寓意是停止尝试让vim像IDE一样工作。 Vim是一个很棒的文本编辑器,但是很遗憾我们需要IDE来高效地工作。在经过THAT STEEP学习曲线并尝试了几十个插件之后,会得到一个Vim,它会突出显示包含几百个LOC的文件(阅读:真实生活代码)。完成和intellisense似乎只能在精心策划的演示中工作:( – Ejaz

回答

0

我不确定它是否支持完全自动完成,但supertab是一个非常强大的IDE风格完成插件。

+1

是的,我有Supertab配置为在此问题之前触发Omni,但这并不是问题的答案。 – eduncan911

0

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() 

你也应该set completeopt+=menuone,noselect,noinsert避免vim自动插入完成文本。但请记住这不是一个普通的决定,你可能会遇到一些问题。我找到的那个是打破cgn命令。

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

如何获取Omnicomplete插入func的参数?

我使用了一些年的崇高,它代表了内置函数(默认vim omnicompletion)与片段。所以,如果你想参数被插入到缓冲区,你需要:

  1. 安装片断经理像ultisnipsneosnippetminisnipxptemplateothers
  2. 创建一堆片段或从某处安装。
  3. 使您的完成系统识别首选片段管理器(许多完成管理器识别ultisnips)。

如果你改变主意在使用所谓的预览你上面这里提到窗口的方式有一些提示:

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

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