我在Stack Overflow和其他地方搜索了一个小时.唉! 请帮忙.Vim的omnicompletion 不起作用.
我有使用Python支持编译的Vim 7.2.
filetype plugin on
在我的.vimrc
.
当.py
文件打开时,:echo &omnifunc
打印pythoncomplete#Complete
.
我正在处理一个大型项目,并且我tags
生成了一个文件exhuberant-ctags
.这是在Vim的ctags
路上.我可以通过^]在符号上键入来测试它然后我接受符号的定义.
更新1:我项目的所有代码都在python-in-Vim的路径中.我能:python import myproject
成功.
现在,在我尝试的任何地方C-x C-o,我得到的只是:
-- Omni completion (^O^N^P) Pattern not found
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
更新2:当我C-x C-o C-n在模块级别键入时,Vim会显示一个完成弹出窗口,其中包含项目中其他模块的一些模块级常量.但它只是常量(符号大写字母),完成仍然无法在其他任何地方工作.
更新3:我发现C-x C-o在文件的顶部开始某种omnicompletion,并完成提示pprint.
菜单和pprint
模块中的所有内容的快速参考.但是,我自己的模块的导入都没有完成.
一年后更新4:我放弃并学习了Emacs.我去过黑暗的一面,神秘的阴谋和香料之地,我告诉你我找到了The Way.
两年后更新5:我回到了Vim.Emacs很漂亮,但即使经过1.5年的Emacs,我仍然可以更快地完成Vim的工作.但是,我现在已经停止编写Python了,并且无法测试这些建议的效果如何.
在网上搜索了一下后,似乎我无法映射CtrlSpace到任何东西/很多.今天有办法做到这一点,我发现通常是2岁.
我在使用Vim和Python时遇到了麻烦.事实上,我很困惑这是如何工作的.
我在Windows 7上有通用的gvim 7.3(使用python/dyn)我正在使用SuperTab插件,其中一些是特定于python的,在vimrc中有以下设置:
au FileType python set omnifunc=pythoncomplete#Complete
let g:SuperTabDefaultCompletionType = "context"
let g:SuperTabContextDefaultCompletionType = "<c-n>"
Run Code Online (Sandbox Code Playgroud)
我没有设置PYTHONPATH环境可变性.
完成适用于系统模块.
起初我认为它对于非系统代码根本不起作用,但事实并非如此.以下代码最能显示正在发生的事情:
import numpy.random # if this line is commented completion in last line works
class C(object):
def __init__(self, x_):
self.x=x_
def getX(self):
return self.x
def pr(self):
print 'ok'
a=C(10) # nothing changes if I put C() instead, even though it would be wrong
a. # here is completion in question
Run Code Online (Sandbox Code Playgroud)
问题是如果对导入行进行注释,则完成工作(a.<tab>建议使用getX和pr).但它有导入numpy.random,完成刹车.注意:当我运行代码时,此导入正常工作.
Python完成的先决条件是什么?发生了什么,我该怎么做才能完成Python的完成工作.
因为我(相对)是Vim的新手,所以任何建议都表示赞赏.
编辑: 似乎问题是在导入中使用ab表单.如果我从numpy导入随机,一切都很好.如果这很容易解决,我也想从中工作.但是现在我知道如何绕过它并不是那么重要.
是否有更像这样的不寻常的问题,以便我知道未来会发生什么?
是的Vim OmniComplete和Vim的智能感知互斥还是互补?我对相互矛盾的术语和实现感到困惑,比如这些C++ OmniComplete和 C++ Intellisence插件.
我想知道是否有像OmniCppComplete这样的工具用于C#(缩写中显示的方法签名是我最感兴趣的).我到处搜索都没用.
更新:我将主要从shell终端进行编辑,因此请不要建议使用GUI替代Vim.
Omnicompletion正在运行,但它会自动插入第一个结果.
我想要做的是打开omnicomplete菜单,然后键入以缩小结果范围,然后按Enter或制表符或空格或其他内容以插入所选菜单项.
这可能吗?
VIM的omnicomplete自动完成并没有像预期的那样正常工作.
有没有办法让它变得更聪明?比如,要监控环绕文本的上下文?(例如,如果在评论或引用中不要触发)
我问,因为与IDE中的自动完成/智能感知(如Visual Studio,IntelliJ,Sublime和Atom)相比,自从切换到Vim后我无法进入一个快乐的地方(我过去曾使用所有这些进行开发).
这个问题的基本目标:
我是Vim新手几个月,拼命想要顺利完成工作流程.但是如果没有一个好的自动完成选项,虽然强迫我在学习我试图使用的代码时更加警惕,但它比我过去使用的其他IDE慢得多.
让我们用Atom + Go-Plus来检验我的期望.
我有一个名为func generate(entropy chan<- uint64)
位于同一个包中另一个Go文件中其他位置的func .
当我g
在第22行输入字母时,我立即得到一个以g开头的所有内容的提示:
正如您所看到的,有3个选项可以立即弹出(前两个我认为只是代码片段).我可以使用箭头键向下滚动到任一选项.
如果我选择第3个选项(或者如果我继续输入gen
字段缩小到只有1个选项),press enter
Atom/Visual Studio/Sublime都会为我填写方法的详细信息:
我没有输入任何上述内容.它被插入,我可以覆盖细节,修改它们,或只是TAB关闭并继续键入.
让我们将其与我当前(可能已损坏?)的配置进行比较omnicomplete
.我在.vimrc中有这个:
set completeopt=longest,menuone
在vim中,如果我键入gen
,我得到的就是我之前输入的文本,我在此缓冲区的其他地方输入(并且只在此缓冲区中,而不是在其他缓冲区中).如果我碰巧拼错了一些东西,那么我得到的拼写错误的版本是我之前为了生活而打开的.这告诉我工作中没有智能感知/自动完成 - 只是监控我做的按键操作:
如您所见,自动填充功能无法正常输入.虽然,这确实在其他地方的评论和字符串派上用场,我有点像vim记得我输入的自由文本.
不确定Vim选项启用了什么; 但是,它不是自动完成.
现在,我可以按下CTRL-X + CTRL-O
强制自动完成并generate()
显示出来:
这个更好; 但是,我希望它能在我输入时向我显示自动完成选项:不需要额外的3次击键来实现它.在整个几个小时的编码中,这是很多Cx Co事件.
有没有办法让Vim在INSERT模式下监视我的击键并在有匹配的ctag或函数时显示自动完成? 这可能是此功能的答案.
自动完成有第二个问题omnicomplete
我可以忽略上面的Cx Co要求如果这样做:一旦我选择了我想要自动完成的方法,它就不会为我插入参数/字段.
回到上面的截图,如果我选择那个方法,这就是我得到的:
请注意,它不会插入 func的参数.它与上面发布的第二张图片不匹配,其中Atom,Sublime和Visual Studio中的自动完成功能都完成了参数显示的方法.
我已经阅读了vim wikia,并尝试了各种选项而set completeopt
没有任何可行的选择.
例如,set completeopt+=preview
选择后给我预览窗口: …
我已经阅读了关于Vim所谓的伟大的omnicompletion的大量博客,但无论我做什么,我都无法令人满意地工作.我花了很多时间才发现我的系统上预装的ctags版本是emacs版本,并且没有--recurse选项,但现在我已经在我的OpenJDK副本上运行了ctags-exuberant尝试使用[Cn]或[Cp]调用它时,Vim会挂起来试图获得某种代码的完成.
我真正想要的就像Eclipse中的代码完成一样; 我喜欢Vim作为编辑器,但Eclipse只是具有开箱即用的额外功能,Vim似乎失败了.带有vi-mode插件的Eclipse对我来说并不是特别有用,而且它有太多的内存和CPU占用任何用途; eclim也不太喜欢我.
任何人都可以建议一种更简单的方法来获得在Vim中实际工作的某种代码完成吗?
我输入时考虑一下scenerio:
file.f
Run Code Online (Sandbox Code Playgroud)
当我键入Ctrl-XCtrl-Oomni-completion弹出窗口时,会显示第一个项目.这就是我所看到的:
file.fileno
---------
fileno() <-- highlighted
flush()
---------
Run Code Online (Sandbox Code Playgroud)
请注意,我键入的文本("file.f")已更改为:
file.fileno
Run Code Online (Sandbox Code Playgroud)
我可以将列表中的选项向下移动到'flush',按ENTER键,它最终将会结束
f.flush()
Run Code Online (Sandbox Code Playgroud)
但我想继续键入所需的方法名称而不是使用箭头键.即我想键入"file.f","Ctrl-X Ctrl-O","l"并获得其中之一
file.fileno
---------
flush()
---------
Run Code Online (Sandbox Code Playgroud)
要么
file.fileno
---------
fileno()
flush() <-- highlighted
---------
Run Code Online (Sandbox Code Playgroud)
这可能吗?也许一些全向完成设置必须改变,或者我应该使用不同的键组合而不是Ctrl-XCtrl-O?
我已经搜索了不同类型的变通方法来处理在Omnicompletion中进行选择时将当前窗口拆分为显示文档的预览窗口,如关闭预览窗口(如果它在退出插入模式时存在).
但是,这些解决方案是不切实际的.有时您可能希望进入预览窗口以阅读有关当前完成模块的一些文档,但是如果使用自动命令,则无法进行此操作.
即使它会,我希望文档永远不会出现,因为我真的不想要它.
阅读源代码,pythoncomplete.vim
我看到文档的值是硬编码的,如果有任何内容,它将强制显示预览窗口(如果它不能提供模块的文档,它会跳过它).
是否有一个全局选项,我不知道告诉Vim永远不会显示文档?或者能够切换它?
如果我也想读在拆分窗口中的文档让我(也许一些快捷键),这样做,否则不显示我什么.
我真的想避免复制/粘贴pythoncomplete.vim
以根据自己的喜好调整这个特定的设置.
omnicomplete ×10
vim ×10
autocomplete ×3
python ×2
c# ×1
c++ ×1
ctags ×1
intellisense ×1
java ×1
mapping ×1
menu ×1