【问题标题】:Why does SuperTab output self when I press <tab>?为什么按下 <tab> 时 SuperTab 会输出 self?
【发布时间】:2012-02-08 12:31:32
【问题描述】:

设置

在我的.vimrc 我有以下几行:

" .vimrc
let g:virtualenv_directory="/Users/Kit/Development/virtualenv"

然后在~/.vim/ftplugin/python/virtualenv.vim 我有这些:

py << EOF
import os.path
import sys
import vim
if 'VIRTUAL_ENV' in os.environ:
    project_base_dir = os.environ['VIRTUAL_ENV']
    sys.path.insert(0, project_base_dir)
    activate_this = os.path.join(project_base_dir, 'bin/activate_this.py')
    execfile(activate_this, dict(__file__=activate_this))
    print "virtualenv in os.environ!"
EOF
VirtualEnvActivate my-virtualenv-python-2.7

~/.vim/ftplugin/python/virtualenv.vim 我有这些 SuperTab 设置:

setlocal omnifunc=pythoncomplete#Complete
setlocal completeopt=menuone,longest,preview
let g:SuperTabDefaultCompletionType="<c-x><c-]>"

在我一直工作的工作目录中,我执行了以下 bash 命令来为我的所有 .py 文件生成一个 TAGS 文件

find . -name '*.py' -type f -print0 | xargs -0 etags -l python

问题

例如,我有一个main.py,其中有一个对象app,这样下面的脚本就可以正常工作:

import main
new_app = main.app() # works totally fine Python-wise

例如,如果我编写了一些新代码并尝试使用 SuperTab omnicompletion:

import main
new_new_app = main.<Tab>

这是我得到的:

new_new_app = mainself.

如果我按 Tab 几次:

new_new_app = mainselfselfselfself.

什么对我有用

但是,如果我执行以下操作:

new_new_app = main.a<Tab>

我得到了 a.. 对象的完整列表,其中包括不属于模块 main 的对象。

我想要什么

如果我在.vimrc 中设置以下内容:

let g:SuperTabDefaultCompletionType="context"

然后,我使用标准 Python 库中的一个模块:

import sys
sys.<Tab> # This will still result in sysselfselfself.
sys.p<Tab> # This will result in the correct list of `sys` members beginning with `p`

"context" 设置不适用于我自己的模块:

new_new_app = main.a<Tab>
# Will say at the bottom: Omni completion (^O^N^P) Pattern not found

问题

我应该如何设置omnicompletion 和SuperTab,以便它对我自己的模块和标准库模块一样起作用?以及消除selfselfself. 的烦恼?

【问题讨论】:

  • 我可能错了,但我认为 SuperTab 做了其他类似插件所做的事情:他们尝试猜测上下文并调用正确的内置全能补全来提出最准确的结果。您是否在没有 SuperTab 的情况下尝试过全能补全? &lt;C-x&gt;&lt;C-o&gt;, &lt;C-x&gt;&lt;C-]&gt;, &lt;C-x&gt;&lt;C-u&gt; 结果如何?还有你使用什么 Pyton 完成脚本?
  • @romainl,是的,你提到的键序列结果很好。我认为这是由 SnipMate 错误引起的。 github.com/garbas/vim-snipmate/issues/65
  • 尝试恢复到原来的 SnipMate。

标签: vim autocomplete tags code-completion supertab


【解决方案1】:

正如您所指出的,这是由 snipmate 引起的:https://github.com/garbas/vim-snipmate/issues/65

我还提出了一个解决方案: https://github.com/garbas/vim-snipmate/pull/84

它没有被接受,因为 snipmate 不应该是上下文敏感的。

对此有两种解决方案:

  1. 拿起我的 snipmate 叉子:

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

    这可能不是最好的主意,因为它只是我的分支,我不会积极维护它。

  2. Fork https://github.com/honza/snipmate-snippets 并删除点的映射(不能再使用点来完成 self)。

【讨论】:

  • 感谢您的回答!我刚刚克隆了你的叉子,还发现了你和其他人在 Snipmate 的新叉子上所做的所有很酷的工作!很棒。
猜你喜欢
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多