vim:无法自动补全Python包路径

-1 投票
2 回答
1152 浏览
提问于 2025-04-18 05:40

我正在使用vim,并且安装了neocomplete、jedi-vim和supertab,想在输入以下代码时实现自动补全:

from django.shortcuts import get_object_or_404

当我在django.后按下tab键时,会出现一个下拉菜单,里面包含了

        sys                  file [FI]
        VERSION                   [O]
        __doc__                   [O]
         __path__                  [O]
         __name__                  [O]
         __file__                  [O]
         __package__               [O]
         get_version(...,***)      [O]
         __builtins__()            [O]

而不是显示django包的子包目录。不过,如果我把django文件夹从/usr/local/lib/python2.7/dist-packages/django复制到我的本地目录,

按下tab键后在django.后会显示

   bin.          dir  [FI]
   conf.         dir  [FI]
   contrib.      dir  [FI]
   core.         dir  [FI]
   .
   .

这可能是因为neocomplete从本地路径获取了信息,并显示了目录列表。

但在这两种情况下,我都无法使用

from django.shortcuts import get_object_or_404

因为get_object_or_404是在django/shortcuts/__init__.py中定义的,而jedi-vim似乎无法识别它。所以我有以下问题:

  1. 如果包不在当前目录,但在PYTHONPATH中,如何在vim中实现包的自动补全?

  2. 如何将像get_object_or_404这样的函数包含在自动补全中?(为此,我尝试在整个/usr/local/lib/python2.7/dist-packages/django目录上使用ctags,但这并没有按照显示特定包中的方法的意图进行检查——它显示了所有模糊匹配的标记方法,这在编码时会产生很多干扰)?

我为supertab、neocomplete和jedi-vim设置的~/.vimrc如下:

Bundle 'Shougo/neocomplete.vim'
let g:neocomplcache_enable_at_startup = 1
let g:acp_enableAtStartup = 0
let g:neocomplete#enable_at_startup = 1
let g:neocomplete#enable_smart_case = 1
let g:neocomplete#sources#syntax#min_keyword_length = 3
let g:neocomplete#lock_buffer_name_pattern = '\*ku\*'
let g:neocomplcache_enable_fuzzy_completion=0

Bundle 'ervandew/supertab'
set omnifunc=syntaxcomplete#Complete
"au FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
set completeopt=menu
let g:SuperTabDefaultCompletionType="context"
" to do text select via j/k
inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

Bundle 'davidhalter/jedi-vim'
let g:jedi#popup_select_first = 0
let g:jedi#auto_vim_configuration = 1
let g:jedi#use_tabs_not_buffers = 1
let g:jedi#completions_enabled=0
let g:jedi#goto_assignments_command = "<leader>g"
let g:jedi#goto_definitions_command = "<leader>d"
let g:jedi#documentation_command = "K"
let g:jedi#usages_command = "<leader>n"
let g:jedi#completions_command = "<C-Space>"
let g:jedi#rename_command = "<leader>r"
let g:jedi#show_call_signatures = "1"
au FileType python setlocal completeopt-=preview

2 个回答

1

你可以试试 YouCompleteMe (YCM):https://github.com/Valloric/YouCompleteMe

YCM 替代了以下的 Vim 插件,因为它不仅包含了这些插件的所有功能,还有更多额外的功能:

clang_complete
AutoComplPop
Supertab
neocomplcache

我一直在用它搭配 Django 和其他一些包(包括虚拟环境)。它省去了很多配置的麻烦,开箱即用,非常方便。

0

这是我犯的一个愚蠢错误。我以为这个选项:

let g:jedi#completions_enabled=0

是说它不会自动补全第一个选项。但实际上,把这个选项关掉会让自动补全失效——我搞错了。把这个值保持为1就解决了这个问题。

撰写回答