IntelliSense

本家 Visual Studio での目玉機能 IntelliSense も VS Code に実装されている。正確には、エディターで有効になっている拡張機能が対応していれば利用可能だ。IntelliSense は一般的にはコード編集時の支援機能であるコード補完、引数情報の提供、名前空間内メンバーの一覧など、さまざまなコード編集支援機能の総称ということになっているが、本稿では単純なテキスト補完は IntelliSense とはみなさない立場を取り、別項で扱う。

Attention

Visual Studio Code 利用ノート 冒頭の前提条件に留意すること。

導入方法

前提として、IntelliSense 機能はプログラミング言語ごとに内容が異なる。「外付け」の拡張機能が IntelliSense を実装しているのが普通で、VS Code 単体では JavaScript/TypeScript, JSON, HTML, CSS/SCSS モードなどでしか期待できない。

普通はプログラミング言語単位で拡張機能をインストールし、やっと IntelliSense が活用できるという状態になる(拡張 の章を参照)。

機能

IntelliSense の機能は Emacs にある abbrev-expand テキスト補完コマンドを洗練させたものだと解釈される。現在のプログラミング言語モードと、エディターに入力済みのコードを解析して、動的にプログラマーが入力しそうな文字列を、候補の一覧をポップアップ表示して提案するというのが基本だ。この「解析」を言語モードに関する拡張機能が用意する。例えば C++ コードの編集中で、名前空間、オブジェクト、オブジェクトへのポインターを表す識別子の末端にキャレットがある状態で ::, ., -> を入力すると、それぞれ IntelliSense が起動する。

関数呼び出しをタイプし始めると直ちに IntelliSense が発動し、戻り値や引数リストに関する情報がポップアップされるはずだ。

なお、Ctrl + Space を押すと、IntelliSense を手動で起動する。

IntelliSense ポップアップで i アイコンが右端にある項目については、これをクリックするとメソッドなどのクイック情報がポップアップで示される。ここには当該項目に付随する情報が記されていて、プログラマーの選択判断を助ける。

訳あって IntelliSense を常時無効化したい場合は settings.json で指定する。

補完候補

IntelliSense の補完候補一覧は、おおむね次の順序でグループ分けされてから配列されるようだ:

  1. キャレット位置での推論から生じる候補項目

  2. 当該プロジェクトにおける大域的な識別子

シンボル型

補完項目にはシンボル型という属性があり、IntelliSense ポップアップ一覧項目左端のアイコンで表現される。例えば候補がメソッドならば、メソッドアイコンが示される。この規則を理解しておくと、後述する IntelliSense のカスタマイズ時に役に立つ。

公式文書の図表 を一度はチェックしておくといい。

Todo

この型の集合が拡張機能で拡張される場合があるかを調査したい。

カスタマイズ

VS Code の IntelliSense の挙動も他の機能と同様にユーザーが設定可能である設計だ。他の機能のように、settings.json の分類と上述の概念の分類が一致していないことも同様だ。

ユーザー設定ファイル settings.json をエディターで開く場合には文字列 suggest あるいは suggestion で検索する。UI の設定画面を併用するのも重要になる。

タブ補完を有効にする

設定項目: editor.tabCompletion

エディターで編集中に Tab を押すと、IntelliSense ポップアップの表示の有無に依らず入力中の単語が自動補完されるように設定可能だ。補完される単語は IntelliSense が定める最良の候補だ。

キャレット位置の局所性を利用する

設定項目: editor.suggest.localityBonus

補完候補の出現順序は、拡張機能と入力中の単語との合致度で決定される。この挙動に対して、キャレット位置により近い補完候補を一覧のより上位に置かせるように設定することもできる。

補完結果を仮決定しておく

設定項目: editor.suggestSelection

IntelliSense の既定の挙動としては、補完候補一覧の最初の項目をあらかじめ選択されたものとして扱う。これを異なるものに指定するオプションがある。この設定値として次のいずれかを取り得る:

first

いつでも通常の候補一覧の最初の項目をあらかじめ選択されたとする。これが既定値だ。

recentlyUsed

直前に適用された補完項目をあらかじめ選択されたとする。

ただし、これは現在のキャレットの左側の文字列を使って、候補を絞ったり並び替えたりしない場合に限る。そのような調整の結果が recentlyUsed のそれと異なる場合は調整版が優先される。

recentlyUsedByPrefix

それらを補完した以前の接頭辞に基づいて補完項目(複数かもしれない)を採用する。

これを使用すると、IntelliSense は特定の接頭辞に対してどの補完項目が採用されたかを記憶するようになる。例えば co と手動で入力してから補完項目 console を補完候補一覧から選択したとする。このとき、次回 co を手入力したときには console が IntelliSense 補完文字列となる。

直近に採用された項目を選択することは、同じ補完を何度もすばやく挿入するような状況で有用だ。

補完候補とコード片候補の表示の混在を制御する

設定項目: editor.snippetSuggestions

これまで言及しなかったが、カスタマイズしない限り IntelliSensee はコード片と補完候補を同一のポップアップで表示する。その動作を制御するオプションがある。

コード片候補が不要であれば値を none とする。

コード片候補が必要であれば、補完候補群との相対的な順序を値とする:

位置

top

補完候補一覧よりも上に置く

bottom

補完候補一覧よりも下に置く

inline

両者の項目を混在させて配列する

Snippets も参照。

その他

Todo

JavaScript などの動的型付け言語における型推論推進手法など。