51

Stack Overflow と他の場所の両方で、1 時間ほど検索しました。ああ!助けてください。Vim のオムニコンプリートは機能しません

  1. 私は Vim 7.2 を Python サポート付きでコンパイルしました。

  2. filetype plugin onは私の中にあり.vimrcます。

  3. .pyファイルを開くと、 が出力:echo &omnifuncされpythoncomplete#Completeます。

  4. 私は大規模なプロジェクトで作業しており、でtags生成されたファイルがありますexhuberant-ctags。それはVimのctagsパスにあります。シンボルを入力^]してテストすると、シンボルの定義が表示されます。

  5. 更新 1:私のプロジェクトのコードはすべて python-in-Vim のパスにあります。私は:python import myproject成功することができます。

今、私が試したところはどこでもC-x C-o、私が得るのは次のとおりです:

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

私は何を間違っていますか?

更新 2:C-x C-o C-nモジュール レベルで入力すると、Vim はプロジェクト内の他のモジュールからのいくつかのモジュール レベルの定数を含む補完ポップアップを表示します。しかし、それは定数 (シンボルの大文字) だけであり、補完はまだ他の場所では機能しません。

更新 3:C-x C-oファイルの先頭である種のオムニコンプリートが開始され、モジュールpprint.内のすべてのメニューとクイック リファレンスが表示されることがわかりました。pprintただし、自分のモジュールのインポートは完了していません。

更新 4、1 年後:あきらめて Emacs を学びました。私は暗黒面、陰謀とスパイスの神秘的な土地に行ってきました。

更新 5、2 年後: Vim に戻りました。Emacs は美しいですが、Emacs を 1 年半使用した後でも、Vim で作業を完了するのはまだ速いです。しかし、私は今のところ Python を書くのをやめており、これらの提案がどれだけうまく機能するかをテストすることはできません.

4

10 に答える 10

12

完成させようとしているシンボルが含まれているモジュールはどれですか? それはpython stdlibにありますか?それともサードパーティのモジュールですか?

モジュール/パッケージが PYTHONPATH にあることを確認してください。

Vim では、次のようにします。

:python import sys
:python print sys.path

モジュールのディレクトリを追加するには:

:python sys.path.append("/path/to/directory/")
于 2010-01-18T13:35:29.237 に答える
9

あなたは慎重で、コードが PYTHONPATH によって到達可能であることを確認したので、codeape の提案に従って、importVim Python omni-complete のバグに遭遇している可能性はありますか? このバグは Vim 7.2.245 の時点でも存在します。

基本的に、作業中のファイルで import ステートメントが失敗するとTry-Except、それが節でラップされているかどうかに関係なく、オムニコンプリートが完全に壊れます。ほとんどのインポートはファイルの先頭で行われるため、これを確認するのはかなり簡単です。

このバグが問題の原因であると判断した場合は、次のオプションがあります。

  • インポートするモジュールがプロジェクト ファイルだけでなく、システム パス上にあることを確認する
  • import失敗したステートメントをコメントアウトする
  • バグを修正する
  • 完了方法としてropevimを使用する
  • 別のエディターを使用する。Netbeans IDE は Python をサポートしており、jVi プラグインは、私のような Vim 中毒者にとってかなり優れたものです (1990 年代のホームページの外観に惑わされないでください)。
于 2010-02-11T14:38:15.947 に答える
9

質問者様はだいぶ前にダークサイドに堕ちてしまったようですが*、とりあえずこの症状が出ただけで、私の場合、原因は使用していたモジュールが Python 2.7 に依存していたのに、私のバージョンの Vim がPython 2.5 でコンパイルされています。

診断するために を試し:python import mymoduleましたが、依存モジュールのインポートに関するエラーで失敗しました。その後:python import dependentmodule、チェーンの次のステップで失敗しました。Python 2.7以降の新しいシステムモジュールのインポートに失敗するまで、などなど。問題が見つかりました。

解決するために、私はやったsudo port install vim +python27. しかし、それはOSX用です。YMMV。

(* 冗談です。Emacs ユーザーは私たちの友人です。メモ帳でプログラミングしている人たちを救わなければなりません...)

于 2011-08-01T08:15:04.597 に答える
3

あなたは何も悪いことをしていません。Python オムニ補完はタグ ファイルを使用しません。これはわざとです。オムニ補完用のタグファイルを作成する必要はありません。通常のタグ スタック ジャンプ用のタグ ファイルを作成することはできますが、オムニ補完では無視されます。

コムニ補完はタグファイルを使用するため、これを理解するのに長い時間がかかりました。Python オムニ補完の動作は異なります。

この動作は、Python ファイルでpythonfiletype を指定してから次に filetype を指定してオムニ補完を試みることで、すぐに確認できますc

最初:set filetype=pythonに (これがデフォルトです)、次に:echo &omnifunc. タグファイルを使用しない&omnifuncisであるため、オムニコンプリートはタグファイルを無視します。python3complete#Complete

:set filetype=c:echo &omnifunc。Vim は Python スクリプトを C ファイルとして扱います。タグ ファイルを使用する も同様です&omnifuncccomplete#Completeもちろん、Python ファイルを C ファイルのように扱うことは解決策ではありません!

以下は次のとおりです。

  • Python オムニ補完を行う方法の 2 つの例
  • &omnifunc(syntaxcomplete#Complete) Vim スクリプトが実装されている場所
  • タグ ファイル プレビュー ( ) とオムニ完全プレビューでウィンドウの動作がどのようpreviewに異なるか。:pta

タグ補完もあります: <C-x><C-]>. すでにtagsファイルを使用していて、それらのタグを使用して Vim に<C-x><C-]>補完させたい場合は、 ではなく を探してい<C-x><C-o>ます。

しかし、読み進めることをお勧めします。オムニ補完は、タグ補完以上のことを行います:

  1. オムニ補完はモジュール名を認識し、正しい Python 構文を使用してオートコンプリートします。たとえば、 の場合import numpy as np、文字「a」で始まる機能np.a<C-x><C-o>のメニューが表示されます。numpyタグ補完は、タグ ファイル内の一致のみをオートコンプリートします。
  2. オムニ補完により、プレビュー ウィンドウにドキュメントが表示されます。タグ補完でプレビュー ウィンドウが開きません。
  3. また、Python の場合、オムニ補完ではタグ ファイルを更新する必要はありません。

例 1: このファイルのパターンに一致するオムニ コンプリート

Python オムニ補完では、編集中の Python スクリプトが動作する Python コードである必要があります。ローカル変数を使用した簡単な例を次に示します。

foo_name_I_expect_omni_completion

この 1 行のスクリプトは実行されません(変数名が定義されていません)。このスクリプトを編集してオムニ コンプリートを試みると、次のようになります。

foo_name_I_expect_omni_completion
foo_name_<C-x><C-o>

「パターンが見つかりません」というメッセージが表示されます。

一致するはずのパターンが文字通り上記の行にあるため、これは腹立たしいです!

しかし、オムニ補完を機能させるために必要なのは、これを有効な Python コードに変更することだけです。

foo_name_I_expect_omni_completion = 2
foo_name_<C-x><C-o>

オムニ補完が機能するようになりました!

例 2: インポートされたモジュールのパターンに一致するオムニ コンプリート

import2 番目の例として、オムニ補完は、一致するパターンが別のファイルにある場合でも、そのファイルが編集中のスクリプトに (ステートメントと共に) 表示される限り機能します。

繰り返しますが、使用しますfoo_name_I_expect_omni_completion=2。このワンライナーでファイルを として保存しますmymodule.py。今、新しいファイルでexample.py、私はインポートし mymoduleます:

import mymodule

と入力すると、モジュール名import mymoduleで動作します。i_<C-x><C-o>

import mymodule
mym<C-x><C-o>

オムニコンプリートは、これを次のように変換します。

import mymodule
mymodule.

パターンのメニューがポップアップ表示されます (:h completeoptメニューの動作の構成については、「参照」を参照してください)。この時点で、通常どおり<C-n><C-y>リストの最初の項目を選択し、オムニ コンプリートを終了して挿入モードに戻ることができます。

import mymodule
mymodule.foo_name_I_expect_omni_completion

オムニコンプリートが壊れているように見える場合は、インポートされたモジュールが実行可能であることを確認してください

オムニ補完がインポートされたモジュールを認識できないように見える場合は、インポートしているモジュールが実行可能でないことが原因です。

上記のおもちゃの例とは異なり、インポートされたモジュールがパッケージもインポートし、バージョンごとに異なるパッケージがインストールされた複数のバージョンの Python がある場合、これを追跡するのは困難です。

たとえば、私は 3.6 と 3.7 をインストールしていますが、3.6 には特定のパッケージしかインストールしていません。そして、オムニコンプリートで編集しようとしていたスクリプトでインポートしていたモジュールによって、同じパッケージがインポートされました。

どういうわけか、python3.6 は bash からのデフォルトの python3 でしたが、python3.7 は Vim からのデフォルトでした。私のpython3.6インストールには必要なパッケージが含まれていたため、bashから実行したときにモジュールは有効に見えました。

使用している Python Vim のバージョンを確認します。

:py3 print(sys.version)

sys.pathcodeape による回答で説明されているように、も確認してください。

:py3 print(sys.path)

私は Python を多数インストールしており、すべての Python インストールには独自のUSER_SITEパスがあります。

:py3 import site; print(site.USER_SITE)

私は 1 つのUSER_SITEフォルダーを使用し、各 Python インストールをそのフォルダーに向ける方法を見つけます。Vim omni-complete が使用する Python インストールでは、PYTHONPATH 環境変数を編集してこれを行います。

私の場合、私のアクティブなUSER_SITEものは Python 3.7 用で、Vim は Python 3.6 を使用しているので、これを my に入れます.bashrc:

# Python USERSITE folder
pkg=$HOME/.local/lib/python3.7/site-packages/

# Add to PYTHONPATH for Vim omni-complete to see packages I wrote
PYTHONPATH=$PYTHONPATH:$pkg

ドキュメンテーション

これは、補完を行う Vim スクリプトを追跡することでわかりました。

Vim ヘルプから:

:h compl-omni-filetypes

{filetype} に使用されるファイルは、'runtimepath' の autoload/{filetype}complete.vim である必要があります。したがって、「java」の場合は autoload/javacomplete.vim です。

これらのautoload/{filetype}complete.vimファイルは、Vim インストールに含まれています。たとえば、私の C ファイルと Python ファイルは次のとおりです。

/usr/share/vim/vim81/autoload/ccomplete.vim
/usr/share/vim/vim81/autoload/python3complete.vim

:echo &omnifuncまたは、 GitHub で Vimscript を 呼び出して見つけます: https://github.com/vim/vim/blob/master/runtime/autoload/

tagその単語がファイルに表示されないことに気付いたとき、私は問題に対する根本的な誤解を疑うようになりましたpython3complete.vim:)

オムニコンプリートには特別なpreview動作があります

私はいつもプレビュー ウィンドウの動作に混乱していました。オムニコンプリートpreviewは、タグとは動作が異なります。

まず、 でプレビュー ウィンドウを取得するにはomni complete、Vimcompleteoptオプションにpreviewと または のいずれかmenuを含める必要がありますmenuone

completeoptデフォルトはmenu,previewです。オプションを明示的に設定するには、たとえばmenuoneon の代わりに使用するにはmenu:

set completeopt=menuone,preview

menuone一致するパターンが 1 つしかない場合でも、常にメニューが表示されます。を使用menuすると、単一の一致に対してメニューが表示されないため、previewウィンドウも表示されません。を使用すると、ウィンドウがポップアップするmenuoneことが保証されます。preview

オフpreviewにすると、オムニ コンプリート中にウィンドウが分割されなくなります。

set completeopt-=preview

previewの動作(メニュー項目をハイライトすると開く) は、タグの動作 (またはで開く)omni completeとは異なることに注意してください。preview<C-w>}:pta

  • tag-preview はプレビュー ウィンドウでコードを開きます
  • omn​​i-complete-preview でドキュメントが開きます

オムニ コンプリートpreviewでは、コンプリート メニューで強調表示されているアイテムに応じて、さまざまな内容が表示されます。変数の場合、そのデータ型の pydoc が表示されます。関数の場合は、そのドキュメント文字列が表示されます。

于 2019-09-09T21:17:13.257 に答える
2

Fedora 16 に更新した (ただし、まだソースから vim をコンパイルしている) と、上記と同じメッセージでオムニ補完が機能しなくなりました。キーを再マッピングすることで「修正」しました。

inoremap <C-space> <C-x><C-o>

~/.vimrc今では再び機能します。

于 2012-03-15T12:58:30.323 に答える
2

オムニ補完が機能しないという同様の問題がありました。私の場合、minibufexpl.vim プラグインがオムニ補完に干渉していることが判明しました。これが私が見つけた方法です:

通常のキーワード補完は機能します。Omni complete は、Python だけでなく、どの言語でも機能しません。omn​​ifunc が正しく設定されています。I CX CO の後、何も起こりません。私は ":py print globals()" を実行しましたが、pythoncomplete がロードされていないことは明らかです。":call pythoncomplete#Complete(1, '')" を実行すると、ロードされることがわかります。私にとって、これはそれがVimの問題であることを除外しています。何かがキーマッピングを妨害しているか、オムニ完了リクエストを傍受しているようです。そのため、プラグインを 1 つずつ無効にし始めます。私の場合の犯人は「minibufexpl」であることがわかりました。私は github から Holgado バージョンを持っています。

github のイシュー トラッカーによると、MBE には多くの未解決の問題があるようで、2012 年の初めから何の進展もありません。オート コンプリートを使用できるように、今のところ無効にします。その間、複数の変更されたバッファーを同時に開いたままにし、単純なキーシーケンスを使用してそれらを循環させるために、vimrc に次を追加するだけです (MBE は、循環するバッファーをよりインテリジェントに選択しますが、単純な問題にはあまりにも手間がかかるようです) ):

set hidden
noremap <C-TAB> :bnext<CR>
noremap <C-S-TAB> :bprev<CR>
于 2012-09-01T17:54:36.897 に答える
1

使ってみました<C_x><C-]>か?

于 2010-02-11T19:40:53.383 に答える
0

c-x c-nオブジェクトのメンバーのリストを取得します。

于 2010-06-24T00:01:43.930 に答える
0

スーパータブを使用しました (http://www.vim.org/scripts/script.php?script_id=1643)

Cx Coはちょっと使いづらいので

.vimrc で:

let g:SuperTabDefaultCompletionType = "<c-x><c-o>"

次に、オムニコンプリートに Tabb を使用します

于 2011-03-04T10:11:45.790 に答える