あなたは何も悪いことをしていません。Python オムニ補完はタグ ファイルを使用しません。これはわざとです。オムニ補完用のタグファイルを作成する必要はありません。通常のタグ スタック ジャンプ用のタグ ファイルを作成することはできますが、オムニ補完では無視されます。
コムニ補完はタグファイルを使用するため、これを理解するのに長い時間がかかりました。Python オムニ補完の動作は異なります。
この動作は、Python ファイルでpython
filetype を指定してから次に filetype を指定してオムニ補完を試みることで、すぐに確認できますc
。
最初:set filetype=python
に (これがデフォルトです)、次に:echo &omnifunc
. タグファイルを使用しない&omnifunc
isであるため、オムニコンプリートはタグファイルを無視します。python3complete#Complete
今:set filetype=c
と:echo &omnifunc
。Vim は Python スクリプトを C ファイルとして扱います。タグ ファイルを使用する も同様です&omnifunc
。ccomplete#Complete
もちろん、Python ファイルを C ファイルのように扱うことは解決策ではありません!
以下は次のとおりです。
- Python オムニ補完を行う方法の 2 つの例
&omnifunc
(syntaxcomplete#Complete) Vim スクリプトが実装されている場所
- タグ ファイル プレビュー ( ) とオムニ完全プレビューでウィンドウの動作がどのよう
preview
に異なるか。:pta
タグ補完もあります: <C-x><C-]>
. すでにtags
ファイルを使用していて、それらのタグを使用して Vim に<C-x><C-]>
補完させたい場合は、 ではなく を探してい<C-x><C-o>
ます。
しかし、読み進めることをお勧めします。オムニ補完は、タグ補完以上のことを行います:
- オムニ補完はモジュール名を認識し、正しい Python 構文を使用してオートコンプリートします。たとえば、 の場合
import numpy as np
、文字「a」で始まる機能np.a<C-x><C-o>
のメニューが表示されます。numpy
タグ補完は、タグ ファイル内の一致のみをオートコンプリートします。
- オムニ補完により、プレビュー ウィンドウにドキュメントが表示されます。タグ補完でプレビュー ウィンドウが開きません。
- また、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: インポートされたモジュールのパターンに一致するオムニ コンプリート
import
2 番目の例として、オムニ補完は、一致するパターンが別のファイルにある場合でも、そのファイルが編集中のスクリプトに (ステートメントと共に) 表示される限り機能します。
繰り返しますが、使用します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.path
codeape による回答で説明されているように、も確認してください。
: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
です。オプションを明示的に設定するには、たとえばmenuone
on の代わりに使用するにはmenu
:
set completeopt=menuone,preview
menuone
一致するパターンが 1 つしかない場合でも、常にメニューが表示されます。を使用menu
すると、単一の一致に対してメニューが表示されないため、preview
ウィンドウも表示されません。を使用すると、ウィンドウがポップアップするmenuone
ことが保証されます。preview
オフpreview
にすると、オムニ コンプリート中にウィンドウが分割されなくなります。
set completeopt-=preview
preview
の動作(メニュー項目をハイライトすると開く) は、タグの動作 (またはで開く)omni complete
とは異なることに注意してください。preview
<C-w>}
:pta
- tag-preview はプレビュー ウィンドウでコードを開きます
- omni-complete-preview でドキュメントが開きます
オムニ コンプリートpreview
では、コンプリート メニューで強調表示されているアイテムに応じて、さまざまな内容が表示されます。変数の場合、そのデータ型の pydoc が表示されます。関数の場合は、そのドキュメント文字列が表示されます。