Vim的Python自动补全就是无法使用

53 投票
10 回答
23031 浏览
提问于 2025-04-15 18:09

我在Stack Overflow和其他地方找了一个小时,结果还是没找到解决办法。真是太糟糕了!请帮帮我。Vim的自动补全功能就是不管用

  1. 我用的是支持Python的Vim 7.2。

  2. 我的.vimrc里有filetype plugin on这行代码。

  3. 当我打开一个.py文件时,输入:echo &omnifunc会显示pythoncomplete#Complete

  4. 我在做一个大项目,并且有一个用exuberant-ctags生成的tags文件。这个文件在Vim的ctags路径下。我可以通过在一个符号上按^]来测试,它会带我去那个符号的定义。

  5. 更新 1:我项目里的所有代码都在Vim的路径下。我可以成功执行:python import myproject

现在,无论我在哪里按C-x C-o,得到的结果都是:

-- Omni completion (^O^N^P) Pattern not found

我哪里做错了?

更新 2:当我在模块级别输入C-x C-o C-n时,Vim会显示一个补全弹窗,里面有我项目中其他模块的一些常量。但这些只是一部分常量(大写字母的符号),而且补全在其他地方还是不管用。

更新 3:我发现,在文件顶部按C-x C-o会启动某种自动补全,输入pprint.时会弹出菜单和快速参考,显示pprint模块里的所有内容。不过,我自己模块的导入却没有被补全。

更新 4,一年后:我放弃了,转而学习Emacs。我已经去过黑暗的一面,那个神秘而充满魅力的地方,我告诉你,我找到了正确的道路。

更新 5,两年后:我又回到了Vim。Emacs很美,但即使在Emacs上用了1.5年,我在Vim上完成工作的速度还是更快。不过,我现在暂时不写Python了,所以无法测试这些建议的效果。

10 个回答

9

看起来提问的人已经走上了“黑暗面”,不过我也遇到过类似的问题。在我的情况下,问题出在我使用的一个模块需要 Python 2.7,但我用的 Vim 版本是用 Python 2.5 编译的。

为了找出问题,我试着运行 :python import mymodule,结果报错,说是导入一个依赖模块失败。接着我又试了 :python import dependentmodule,结果又失败了,继续往下查,直到最后尝试导入一个自 Python 2.7 以来的新系统模块时又失败了。问题就这样找到了。

解决方法很简单,我只需要运行 sudo port install vim +python27。不过这是针对 OSX 系统的,其他系统可能会有所不同。

(* 我是在开玩笑。Emacs 用户是我们的朋友。真正需要拯救的是那些在记事本里编程的人……)

10

既然你已经小心翼翼地确保你的代码可以通过PYTHONPATH访问,按照codeape的建议,是否有可能你遇到了import在Vim中的自动补全错误? 这个错误在Vim 7.2.245版本中仍然存在。

简单来说,如果你正在编辑的文件中任何的import语句出错,不管它是否被放在了Try-Except块里,这都会导致自动补全完全失效。检查这个问题应该比较简单,因为大多数import语句都是放在文件的开头。

如果你确定这个错误是导致你麻烦的原因,你可以考虑以下几种解决办法:

  • 确保你导入的模块在系统路径上,而不仅仅是在项目文件中
  • 注释掉任何出错的import语句
  • 修复这个错误
  • 使用ropevim作为你的补全工具
  • 换一个编辑器;Netbeans IDE支持Python,而如果你像我一样是Vim的忠实粉丝,jVi插件也相当不错(别被主页90年代的风格给迷惑了)
12

你想要完成的符号是在哪个模块里的?它是在Python自带的库里吗?还是说是一个第三方的模块?

确保这个模块或包在PYTHONPATH里面。

在Vim中,你可以这样做:

:python import sys
:python print sys.path

要添加模块的目录,可以这样:

:python sys.path.append("/path/to/directory/")

撰写回答