web-dev-qa-db-ja.com

Vim Python完了

私はVimとPython完了に問題があります。実際、これがどのように機能するのか完全に混乱しています。

私は一般的なgvim7.3をWindows7(python/dyn付き)で使用しています。SuperTabプラグインを使用しています。その中にはPython固有のものもあり、vimrcで次の設定を行っています。

au FileType python set omnifunc=pythoncomplete#Complete
let g:SuperTabDefaultCompletionType = "context"
let g:SuperTabContextDefaultCompletionType = "<c-n>"

PYTHONPATH環境変数を設定しませんでした。

完了はシステムモジュールで問題なく機能します。

最初は、システム以外のコードではまったく機能しないと思いましたが、そうではありません。何が起こっているかは、次のコードで最もよく示されます。

import numpy.random   # if this line is commented completion in last line works

class C(object):
    def __init__(self, x_):
        self.x=x_

    def getX(self):
        return self.x

    def pr(self):
        print 'ok'

a=C(10)  # nothing changes if I put C() instead, even though it would be wrong
a.  # here is completion in question

問題は、インポート行がコメント化されている場合、完了が機能することです(a。<tab>はgetXとprを提案します)。しかし、インポートnumpy.randomがあり、完了がブレーキダウンします。注:このインポートは、コードを実行すると正常に機能します。

Python完了の前提条件は何ですか?何が起こっているのでしょうか。Pythonで完了を機能させるにはどうすればよいですか。

私は(比較的)Vimに慣れていないので、どんな提案でも大歓迎です。

EDIT:問題はインポートでa.bフォームを使用することにあるようです。 numpy import randomから行う場合、すべて問題ありません。これを修正するのがかなり簡単な場合は、a.bも機能させたいと思います。しかし、今ではそれを回避する方法がわかったので、それほど重要ではありません。

将来何が起こっているのかを知るために、このようなもっと珍しい問題がありますか?

28
Goran Novosel

pythoncompleteはかなり古く、保守されていません。

Jediを使用してみてください: https://github.com/davidhalter/jedi-vim 元々は改良されたpythoncompleteでしたが、今でははるかに強力になっています!

複雑なコードで機能します。completion

そして、追加機能があります: enter image description here

可能なすべての機能のリストがあります。

  • 組み込み関数/クラスのサポート
  • 複雑なモジュール/関数/クラス構造
  • 構文とインデントのエラーを無視します
  • 複数の返品/利回り
  • タプル割り当て/配列インデックス/辞書インデックス
  • 例外/ with-ステートメント
  • * args/** kwargs
  • デコレータ
  • 記述子->プロパティ/ staticmethod/classmethod
  • 閉鎖
  • ジェネレーター(イールドステートメント)/イテレーター
  • いくつかのマジックメソッドのサポート:___call___、___iter___、___next___、___get___、___getitem___、___init___
  • list.append、set.add、list.extendなどのサポート。
  • (ネストされた)リスト内包/三項式
  • 相対輸入
  • getattr()/___getattr___/___getattribute___
  • 関数アノテーション(py3k機能、現在は無視されますが、解析されています。どうしたらよいかわかりません。)
  • クラスデコレータ(py3k機能も無視されています。ユースケースが見つかるまで、Jediでは機能しません)
  • 単純/通常の_sys.path_変更
  • isinstanceはif/while/assertをチェックします
30
Dave Halter

信じられないほど動的な言語であるPythonは、完成には向いていません。そこに本当に良い完成はありません。すべての問題、IMOと戦うよりも、それなしで生きる方が簡単です。そうは言っても、ネオアスセティックが言ったように、 python-mode は本当に素晴らしいです。

5