Help us understand the problem. What is going on with this article?

VSCode・インテリセンスが効かない?を解消

More than 1 year has passed since last update.

マイクロソフトのインテリセンス(コード補完機能)は大変優秀だと個人的に思っている。
中でもVBAのインテリセンスが非常に優秀で
インテリセンスを効かせた書き方を意識して以降、生産性が数倍になった。

VSCodeでもインテリセンスの優秀さを引き継いでいるのか、
動的型付け言語のPythonでもバンバン補完機能を表示してくれる。

…が、特定のパターンでインテリセンスが出てこないことに気が付いた。
VSCodeでインテリセンスが効かない&一部に効かない場合の
解消方法を調査&検証した結果を整理してみた。

前提条件

  • VSCode 1.33.1
  • CentOS7.6 64bit
  • anaconda 4.6.14
  • Python 3.7.3

発生事象

外部モジュールをVSCodeが参照できていない模様
以下では、比較のため「標準モジュールの場合(問題なし)」と「外部モジュールの場合(問題あり)」を記載

標準モジュールの場合(問題なし)

  • インテリセンスが有効
  • あるべき姿、ありがたや

image.png

外部モジュールの場合(問題あり)

外部モジュールのインテリセンスに関して、事象が2つ発生。
1. インテリセンスが完全に表示されないケース
    これは、VSCode上で.を打った以降、候補が完全に表示されないのでわかりやすい(参考画像なし)

2. 一部インテリセンスの候補がおかしいケース
    下図がその事例。
image.png
    本来、pyarrow.parquetモジュールはwrite_と入力すれば
    write_tablewrite_to_datasetwrite_metadata
    write_から始まるファンクションが3つ表示されるはずだが
    なぜか表示されずに_parquet_writer_arg_docsという見当違いの候補が出る。
    このエラーは、モジュールのドキュメントとインテリセンスを見比べないと発見できない。
    「なんで効かないんだろ?でもコードは動くからいいか…」で見過ごすユーザーもいると思う1

原因と対策

【原因】インテリセンスが効かない事象は、VSCodeの初期設定値が原因
1. 初期値では、外部モジュールのパス指定がない(故に認識できていない)
2. 初期値のインテリセンスエンジン(jedi)がうまく動かない2

【対策】VSCodeの設定ファイル(settings.json)を2か所変更
1. インテリセンス参照先に、外部モジュールのパスを追記
2. インテリセンスエンジンをMicroSoft Language Serverに変更

手順

ここからは、インテリセンスを有効化するための手順を解説

1. 外部モジュールのパスを確認

terminal
$ sudo find -name "pyarrow"
./home/myuser/.conda/envs/py3.7/lib/python3.7/site-packages/pyarrow
./home/myuser/.conda/pkgs/pyarrow-0.11.1-py37he6710b0_0/lib/python3.7/site-packages/pyarrow
find: ‘./run/user/1000/gvfs’: 許可がありません
$

2つあるけど、どちらもsite-packages/配下が共通のようなので↓を登録してみる
./home/myuser/.conda/envs/py3.7/lib/python3.7/site-packages/pyarrow

2. 設定ファイル(settings.json)を編集

①ファイル -> ②基本設定 -> ③設定 -> ④設定の検索 に python.autoComplete.extraPaths と入力
image.png

④のあと、settings.jsonをクリック、json形式でパスを記述。
image.png

記述例を2つ挙げます。
ここでは、外部パスの記述と同時に、インテリセンスエンジンにjediを利用しない設定も記述してます
【例1】・・・完全に初期状態での記述の場合↓

settings.json
{
    "python.autoComplete.extraPaths": [
        "/home/myuser/.conda/envs/py3.7/lib/python3.7/site-packages/"
    ],
    "python.jediEnabled": false
}

【例2】・・・複数の既存設定がある場合(カンマ区切りで追加。末尾でなくてもよい)↓

settings.json
{
    "既存項目A": false,
    "既存項目B": true,
    "既存項目C": [
        "Cの内容"
    ],
    "python.autoComplete.extraPaths": [
        "~.conda/envs/py3.7/lib/python3.7/site-packages/"
    ],
    "python.jediEnabled": false
}

3. 保存

赤丸部分にカーソル合わせると×ボタンになる。
×ボタン押下し閉じるときに保存を選択
image.png

4. 結果確認

VSCodeを再起動後、インテリセンスの挙動を確認する。
外部モジュールでも、インテリセンスが無事に表示された。
image.png

※下記に個人設定を記述したので、参考になれば幸いです

個人メモ【VSCodeの設定】

  • インテリセンス
    • 外部モジュールパス:"python.autoComplete.extraPaths"
      • condaで作成した仮想環境下のライブラリを指定"~.conda/envs/py3.7/lib/python3.7"など
      • zip圧縮されたモジュールも読込対象とするため、拡張子.zipも記述
  • flake8(コードフォーマット)の設定
    • 有効/無効:"python.linting.flake8Enabled"
      • true で有効
    • フォーマット設定:"python.linting.flake8Args"
      • "--ignore=E501"で、1行の記述文字長制限を外す
  • エディタの設定
    • フォントサイズ:"editor.fontSize"
      • 14ポイントに設定(解像度の関係で大き目にした)
    • 保存時のフォーマット自動成型:"editor.formatOnSave"
      • trueで有効
  • condaコマンドの設定
    • condaのパス:"python.condaPath"
      • "/usr/local/anaconda3/bin/conda"を指定 ※人によって違います
  • インテリセンスエンジンの設定
    • エンジンにjediを利用するか:"python.jediEnabled"
      • false でエンジンはMicroSoft Language Serverに変更
settings.json
{
    "python.autoComplete.extraPaths": [
        "~.conda/envs/py3.7/lib/python3.7/lib-dynload",
        "~.conda/envs/py3.7/lib/python3.7/site-packages"
    ],
    "python.pythonPath": "python",
    "python.jediEnabled": false,
    "python.linting.flake8Enabled": true,
    "editor.formatOnSave": true,
    "python.autoComplete.addBrackets": true,
    "python.linting.flake8Args": [
        "--ignore=E501"
    ],
    "editor.fontSize": 14,
    "python.analysis.symbolsHierarchyDepthLimit": 20,
    "python.condaPath": "/usr/local/anaconda3/bin/conda",
    "terminal.integrated.rendererType": "dom"
}

参考


  1. ドキュメントの記述とインテリセンスの候補が違うことに数日悩みました… 

  2. 僕の環境下ではたまたま動かなかった可能性があります。jediから切り替えたことで、
    逆に標準モジュールのインテリセンスが一部表示されなくなったので、悩ましいところです。
    ※osモジュールやtypingモジュールのNoReturnなど、一部がインテリセンス効かなくなりました。 

kusanoiskuzuno
飲食→証券→エンタメ→商社 と業種を横断。 今は飯田橋の某商社で、データ分析基盤を構築してます。 「かな入力」人間。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away