gpt4 book ai didi

vim - 在INSERT模式下,如何在按键时触发omnicomplete/auto-completion?

转载 作者:行者123 更新时间:2023-12-03 23:57:26 25 4
gpt4 key购买 nike

VIM的全功能自动补全功能实际上并未按预期工作。

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

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

这个问题的基本目标是:


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


我是Vim的新手,几个月来都在竭尽全力以确保工作流程顺畅。但是,如果没有好的自动完成选项,虽然迫使我更加警惕地学习要使用的代码,但与过去使用的其他IDE相比,这让我非常缓慢。

Atom + Go-Plus

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

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

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

Atom's 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,则得到的似乎只是我先前输入的文本,该文本是我在此缓冲区的其他位置(且仅在此缓冲区,而不是其他缓冲区)中键入的。如果我碰巧拼错了一些东西,我会得到我以前输入的拼写错误的版本,这对我来说是开放的。这告诉我,工作中没有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自动补全还有第二个问题,如果可行,我可能会忽略上述的C-x C-o要求:一旦我选择了要自动完成的方法,就不会为我插入参数/字段。

回到上面的屏幕快照,如果我选择该方法,则将得到以下结果:

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个字符的笔画。

当“点自动补全”时,Sure,Atom,Sublime和VS当然更漂亮:

atom and go-plus dot autocompletion

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

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

编辑:

我看到the author of vim-go在参数完成部分上起作用,并使它起作用:

autocompletion with parameters in vim-go

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

最佳答案

可以在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)。因此,如果要将参数插入缓冲区,则需要:


安装摘要管理器,如ultisnips,neosnippet,minisnip,xptemplate或 others
创建一堆代码片段或从某个地方安装。
使您的完成系统识别首选的代码片段管理器(许多完成管理器可以识别ultisnips)。


如果您以使用所谓的预览窗口的方式改变主意,则上面提到的一些提示:


可以在屏幕 set splitbelow的底部显示预览窗口。
您可以使用 set previewheight选项更改其大小。
完成后自动关闭窗口 autocmd CompleteDone * pclose


要进一步阅读,请 help ins-completionhelp preview-window

关于vim - 在INSERT模式下,如何在按键时触发omnicomplete/auto-completion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35837990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com