Vim、Python 和 Django 的自动补全(pysmell?)

48 投票
5 回答
20460 浏览
提问于 2025-04-15 12:10

有没有人知道怎么在python、django和vim中设置自动补全功能,让它们配合得更好?

我一直在尝试使用pysmell,但似乎没能正确设置(或者我可能不太明白它是怎么工作的)。现在,我在django的目录下运行pysmell(我在用主干版本),然后把生成的标签移动到我的项目目录里,接着我又在项目目录下运行pysmell。不过,vim并没有识别到django的标签,所以自动补全也没有用。

有没有人知道怎么在vim中设置自动补全,这样它不仅能补全django的长函数(比如get_object_or_404),还可以补全我自己代码中的类和函数?我在谷歌上查了很多,但没有找到好的资源。

谢谢。

5 个回答

12

alt text
(来源: dispatched.ch)

你可以把VIM设置成支持多个缓冲区、显示缓冲区、自动补全,甚至可以显示Python文档。

点击这里了解更多

13

正如我在其他地方提到的,我开发了Jedi。我真的觉得它比现有的所有解决方案(甚至是PyCharm)都要好得多。

https://github.com/davidhalter/jedi-vim

它是基于pythoncomplete构建的,功能强大得多!

它可以处理复杂的代码:completion

而且还有额外的功能: enter image description here

这里有一个所有可能功能的列表:

  • 支持内置函数和类
  • 处理复杂的模块、函数和类结构
  • 可以忽略语法和缩进错误
  • 支持多个返回值和生成器
  • 支持元组赋值、数组索引和字典索引
  • 处理异常和with语句
  • 支持可变参数(*args)和关键字参数(**kwargs)
  • 支持装饰器
  • 支持描述符,比如属性、静态方法和类方法
  • 支持闭包
  • 支持生成器(yield语句)和迭代器
  • 支持一些魔法方法,比如 __call____iter____next____get____getitem____init__
  • 支持列表的append、集合的add、列表的extend等操作
  • 支持(嵌套的)列表推导和三元表达式
  • 支持相对导入
  • 支持 getattr()__getattr____getattribute__
  • 支持函数注解(这是Python 3的特性,目前被忽略,但正在解析中。我还不知道该怎么处理它们。)
  • 支持类装饰器(也是Python 3的特性,目前也被忽略,直到我找到一个不适用于Jedi的用例)
  • 简单的 sys.path 修改
  • 支持 isinstance 检查,用于if、while和assert语句
30

首先,感谢你提出这个问题,因为这让我自己也搞清楚了这个事情,真是太好了!

这是我参考的页面: PySmell v0.6 发布 : orestis.gr

  1. 使用 setup.py install 命令来安装 PySmell。
  2. 通过进入你的 site-packages/django 目录,运行 pysmell . -o ~/PYSMELLTAGS.django 来生成 PYSMELLTAGS 文件。
  3. 把这个文件复制到你的项目目录,然后运行 pysmell . 来生成项目的 PYSMELLTAGS 文件。
  4. 确保 pysmell 在你的 PYTHONPATH 中(可以用 export PYTHONPATH=${PYTHONPATH}:/path/to/pysmell/ 来设置)。
  5. 运行 vim(输入 vim .)。
  6. 加载 pysmell.vim 文件(输入 :source /path/to/pysmell/pysmell.vim)。
  7. 设置自动补全命令(输入 :set omnifunc=pysmell#Complete)。
  8. 输入 ^x^o 来进行自动补全,这样应该就能工作了。

我知道这不是一个长期的解决方案,但你可以把这个当作一个开始,慢慢设置成可以一直使用的状态(比如,把 export 加到你的 .bashrc 文件里,把 :source 加到你的 .vimrc 文件里,设置 autocmd FileType python set omnifunc=pysmell#Complete 等等)。

如果这些信息能帮你入门,请告诉我。这对我来说是有效的!

编辑 我只是把这个添加到我的 .vimrc 文件中,只要 PYSMELLTAGSPYSMELLTAGS.django 文件在我的项目根目录下,它就能正常工作,不需要其他操作:

python << EOF
import os
import sys
import vim
sys.path.append("/usr/local/python/lib/python2.5/site-packages")
EOF
exe ":source ~/src/pysmell/pysmell.vim"
autocmd FileType python set omnifunc=pysmell#Complete

撰写回答