Vim的Python Omnicompletion不起作用
我search了一个小时,堆栈溢出和其他地方。 唉! 请帮忙。 Vim的omnicompletion只是不起作用 。
-
我有Vim 7.2与Python支持编译。
-
filetype plugin on
是在我的.vimrc
。 -
当
.py
文件打开时,:echo &omnifunc
打印pythoncomplete#Complete
。 -
我正在处理一个大型项目,并使用
exhuberant-ctags
生成了一个tags
文件。 这是在Vim的ctags
path中。 我可以通过在符号上键入^]来testing它,然后我将其带到符号的定义中。 -
更新1:我所有的项目代码都在python-in-Vim的path中。 我可以
:python import myproject
成功:python import myproject
。
现在,在我尝试Cx Co的地方,我所得到的是:
-- Omni completion (^O^N^P) Pattern not found
我究竟做错了什么?
更新2:当我在模块级inputCx Co Cn时,Vim将显示一个完成popup窗口,其中包含我项目中其他模块的几个模块级常量。 但它只是常量(符号大写字母),并且完成在其他任何地方都不起作用。
更新3:我发现文件顶部的Cx Co启动某种omnicompletion,并完成pprint.
调出pprint
模块中所有内容的菜单和快速参考。 但是,我自己的模块没有import正在完成。
一年后更新4:我放弃了,学习了Emacs。 我去过黑暗的一面,阴谋和香料的神秘之地,我告诉你,我find了路。
两年后的更新5:我回到了Vim。 Emacs很漂亮,但即使经过了1.5年的Emacs,我仍然能够更快地完成Vim的工作。 现在我已经停止编写Python,并且无法testing这些build议的效果。
哪个模块包含您正在尝试完成的符号? 它是在Python的stdlib? 或者它是第三方模块?
确保模块/包装在PYTHONPATH中。
在Vim中,做:
:python import sys :python print sys.path
要添加模块的目录:
:python sys.path.append("/path/to/directory/")
听起来像提问者已经走到了黑暗的一边*,但是对于我刚刚出现这种症状的价值,在我的情况下,原因是我使用的模块依赖于Python 2.7,但是我的Vim版本是用Python 2.5编译。
诊断我试过了:python import mymodule
,其中失败了一个有关导入依赖模块的错误。 然后:python import dependentmodule
失败,在链中的下一步。 等等,直到它失败,试图导入自Python 2.7以来新的系统模块。 发现问题。
为了解决,我只是做了sudo port install vim +python27
。 但是这是OSX。 因人而异。
(*我在开玩笑,Emacs用户是我们的朋友,这是记事本中的人员编程,我们都必须保存…)
既然你是谨慎的,并确定你的代码是可以通过PYTHONPATH,按照codeape的build议,是否有可能运行到Vim Python omni-complete的import
bug ? 这个bug在Vim 7.2.245中仍然存在。
从本质上讲,如果你正在使用的文件中有任何导入语句失败,不pipe它是否被包含在一个Try-Except
子句中,它将完全破坏全向完成。 检查这个应该相当容易,因为大多数导入都是在文件的开头。
如果你确定这个bug是你的麻烦的原因,你的select包括:
- 确保您导入的模块位于系统path中,而不仅仅是项目文件
- 评论任何失败的
import
报表 - 修复错误
- 使用ropevim作为完成方法
- 使用不同的编辑器; Netbeans IDE支持Python, jVi插件相当不错,如果你是像我这样的Vim成瘾者(不要让20世纪90年代的主页欺骗你)
更新到Fedora 16(但仍然从源代码编译vim),omni完成停止工作与上面相同的消息。 我通过重新映射键来“固定”它。
inoremap <C-space> <Cx><Co>
在~/.vimrc
,现在它再次工作。
我有一个类似的问题omni完成不工作。 在我看来,minibufexpl.vim插件干扰了omni完成。 以下是我的发现:
普通关键字完成工作。 Omni完全不适用于任何语言,不仅仅是Python。 omnifunc设置正确。 我CX CX后,没有任何反应。 我做“:py打印全局()”,很明显,pythoncomplete没有加载。 我可以“:调用pythoncomplete#完成(1,'')”,并看到它加载。 对我来说,这就排除了它是一个Vim问题。 看起来有些事情正在干扰keymapping或者截取omni完成请求。 所以我开始逐个禁用我的插件。 事实certificate,在我的情况下,罪魁祸首是“minibufexpl”。 我有github的Holgado版本。
根据github上的问题跟踪器,MBE看起来有许多开放性的问题,自2012年初以来,还没有任何进展。我现在只是要禁用它,所以我可以使用自动完成。 与此同时,我只是添加以下内容到我的vimrc同时打开多个修改后的缓冲区,并使用一个简单的按键序列循环它们(MBE更智能地select缓冲区循环但似乎过于强调一个简单的问题):
set hidden noremap <C-TAB> :bnext<CR> noremap <CS-TAB> :bprev<CR>
你有没有尝试过使用<C_x><C-]>
?
cx cn
用于获取对象的成员列表。
我用supertab(http://www.vim.org/scripts/script.php?script_id=1643);
由于Cx Co使用起来有点令人沮丧
在.vimrc中:
let g:SuperTabDefaultCompletionType = "<cx><co>"
那么只需使用Tabb来实现omnicompletion
如果你正在使用python2,确保你
sudo apt-get install vim.nox-py2
并使用vim.nox-py2代替vim。