jedi-vim与非标准库的全自动补全

8 投票
2 回答
3996 浏览
提问于 2025-04-17 17:47

我看了jedi-vim的说明文档。

在这里有一些使用非标准库(比如Django)的自动补全的截图。

我通过pip安装了Django,然后用完全相同的代码来测试Django的自动补全,但它没有工作。

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

标准库的自动补全运行得很好。

我通常使用一些非标准库,所以我想在这些库上也能使用自动补全。

我需要做什么配置才能在非标准库上使用自动补全吗?

2 个回答

1

你可以试试这个:sys.path.append(/path/to/lib)

我用的是SUMO/TraCI这个非标准库。

在我的Python代码中,我在使用traci方法之前加了sys.path.append("/path/to/SUMO/tools/"),这样在Vim中代码补全就能完美工作了。

2

大多数第三方库都可以直接使用,但Django在自动补全方面就没那么友好了。你需要在你的环境中设置一个叫做 DJANGO_SETTINGS 的变量,否则大部分导入会出现配置不当的错误,自动补全也就无法正常工作了。

你可以在你的虚拟环境中设置这个变量,或者在你的命令行中用别名设置,或者在你的 .vimrc 文件中使用类似下面的代码:

function FindDjangoSettings()
  if strlen($VIRTUAL_ENV) && has('python')
    let output  = system("find $VIRTUAL_ENV \\( -wholename '*/lib/*' -or -wholename '*/install/' \\) -or \\( -name 'settings.py' -print0 \\) | tr '\n' ' '")
    let outarray= split(output, '[\/]\+')
    let module  = outarray[-2] . '.' . 'settings'
    let syspath = system("python -c 'import sys; print sys.path' | tr '\n' ' ' ")
    " let curpath = '/' . join(outarray[:-2], '/')

    execute 'python import sys, os'
    " execute 'python sys.path.append("' . curpath . '")'
    " execute 'python sys.path.append("' . syspath . '")'
    execute 'python sys.path = ' . syspath
    execute 'python os.environ.setdefault("DJANGO_SETTINGS_MODULE", "' . module . '")'
  endif
endfunction
autocmd FileType python call FindDjangoSettings()

这里假设你在项目中使用 virtualenv,如果你在做其他非Django的项目时使用虚拟环境,这可能会让你觉得麻烦。

我还建议你看看 you complete me 插件,这是一个很棒的补全插件,它并不是用来替代jedi的,实际上,它的Python补全功能依赖于jedi。

撰写回答