このページでは、VSCode で「インテリセンスの有効範囲」を広げる方法について解説していきます。
要は、インテリセンスが効かない関数等でも「インテリセンスが効くようにする方法」を解説します。
C言語で動作確認していますが、おそらく C++ においても同様の手順でインテリセンスの有効範囲を広げることができると思います。
Contents
インテリセンスとは
まず簡単にインテリセンスについて説明しておきます。
インテリセンスの知識がある方や、すぐにインテリセンスの有効範囲を広げる方法を知りたい方はインテリセンスの有効範囲を広げる方法までスキップしていただければと思います。
インテリセンス(IntelliSense)というのは下記のような機能です。
- 関数名の補完
- 構造体変数のメンバ名の補完
- 関数の宣言の表示
などなど。
このインテリセンス機能を提供しているのは、VSCode 本体ではなくプラグイン(拡張機能)になります。
VSCode を利用しているC言語プログラマーの中で最も多く利用されているプラグインは「C/C++」だと思います。C言語や C++ においては、このプラグインがインテリセンス機能を提供してくれています。
関数名や引数に迷ったときのヒントにもなりますし、誤字脱字も防ぐことができ、おそらく VSCode を利用されているほとんどの方が恩恵を感じていると思います。
もちろん私もその恩恵を受けている一人です!
僕もだね!
便利すぎて、これなしでプログラミングするのはもう考えられないなぁ
そうだね!
でも、インテリセンスがどんな関数にも効果があるとは限らないんだ…
このインテリセンスが便利すぎるので、逆にインテリセンスが効かないと不便に感じる人も多いと思います。
ですが、インテリセンスが効かない場合もあります。これは特に「標準ヘッダーで定義されていない関数」です。
例えば自身でインストールした外部ライブラリの関数などは、インテリセンスが効かない可能性が高いです。
インテリセンスが効かない理由
では、なぜインテリセンスが効かないかというと理由は単純で、VSCode がその関数を知らないからです。
そりゃそうだよね…
いくら VScode といえども知らない関数の情報は教えてくれないよね
そうだね!
でも逆に知ってる関数はしっかりインテリセンスが効くよ
なので、その関数の情報を教えてやればいいわけだ!
あくまでもインテリセンスが効かないのは VSCode がその関数を知らないからであって、知っている関数に関しては全てインテリセンスを効かせることができます。
ですので、この VSCode が知らない関数の情報を VSCode に教えてやることで、インテリセンスが有効になる範囲を広げることが可能です。
ここからは VSCode のプラグイン「C/C++」において、インテリセンスが有効になる範囲を追加する具体的方法を解説していきます。
スポンサーリンク
インテリセンスの有効範囲を広げる方法
先ほど「VSCode が知らない関数の情報を VSCode に教えてやる」と説明しました。
具体的に何を VSCode に教えてやれば良いかというと、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」です。
このフォルダのパスを VSCode に教えてやることで、そのフォルダ以下のヘッダーファイルを VSCode が解釈し、その解釈した内容に合わせてインテリセンスが機能するようになります(ヘッダーファイルで宣言されている関数の関数名補完や引数の情報表示をしてくれる)。
では、どうやって VSCode にそのフォルダのパスを教えてやれば良いかというと、結論を言うと c_cpp_properties.json
という .json
ファイルの includePath
にそのフォルダのパスを追記してやれば良いです。
これにより、VSCode が includePath
以下のヘッダーファイルを解釈し、それらのヘッダーファイルで宣言されている関数に対してインテリセンス機能が効くようになります。
c_cpp_properties.json
なんてファイルないよ…おそらく大半の人がそのファイルが無い状態だと思うよ
なので作り方から説明していくね!
c_cpp_properties.json
は、ワークスペース以下の .vscode
フォルダの中にあります。もしそこに無いようであれば、まずはこの c_cpp_properties.json
を追加する必要があります。
ということで、ここからは下記の2つの手順について解説していきます。
c_cpp_properties.json
を追加するc_cpp_properties.json
にincludePath
の設定を追記する
c_cpp_properties.json
を追加する
では c_cpp_properties.json
を追加していきましょう!
まず、てきとうなファイルを作成し、ソースコード編集画面を表示します(わざわざファイルを作成しなくても、ソースコード編集画面さえ表示できれば良いです)。
さらに、そのソースコードで、インテリセンスを有効にしたい関数が宣言されているヘッダーファイルを include
します。
例えば、私は openssl/ssl.h
に宣言されている関数群に対してインテリセンスが効くようにしたかったので、openssl/ssl.h
を include
しました。
インテリセンスが効いていないということは、VSCode がその関数が宣言されているヘッダーファイルを認識できていないということなので、上の図のように include
文のところに波線で警告表示されているはずです。
この波線のところにマウスカーソルを合わせると下記のようなエラーが表示されると思います。
#include エラーが検出されました。includePath を更新してください。この翻訳単位 (/Users/daeu/Documents/programming/includePath/main.c) では、波線が無効になっています。C/C++(1696)
で、その波線(include
文)にマウスカーソルを合わせた状態で「左クリック」すると、下の図のような電球マークが表示されると思います。
続いてこの電球マークを「左クリック」します。すると、下のようなメニューが表示されると思います(初めてこの手順を踏む場合は1行目は表示されない可能性が高いです)。
ここで「”includePath” 設定の編集」を選択すれば、下のような「intelliSense の構成」画面が表示されます。
そして、この画面が表示されるとともに c_cpp_properties.json
が作成されます。作成されたことを、ワークスペース下の .vscode
フォルダ以下を見て確認してみてください。
ファイルの作成が確認できれば、 「c_cpp_properties.json
を追加する」手順は完了です!
c_cpp_properties.json
にincludePath
の設定を追記する
続いて c_cpp_properties.json
の includePath
に、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」を追記します。
この方法は2つあります。どちらで行なっても OK です。
- 「intelliSense の構成」画面から編集する
c_cpp_properties.json
を直接編集する
「intelliSense の構成」画面から編集する
c_cpp_properties.json
を追加する際に表示された「inteliiSense の構成」画面から includePath への追記を行うことが可能です。
この「intelliSense の構成」画面の下の方に行くと、下のような「パスを含める」の項目があります。
インテリセンスの有効範囲を広げるために編集するのはここです。
上の図のテキストボックスに、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」を追記します。
おそらく ${workspaceFolder}/**
がデフォルトで入力されていると思いますので、これの下の行にフォルダのパスを追記します。
例えば、私は openssl/ssl.h
で宣言されている関数をインテリセンスが効くようにしたかったので、openssl/ssl.h
が設置されているフォルダのパス /usr/local/opt/openssl@1.1/include
を追記しました。
これにより、c_cpp_properties.json
の includePath
設定に追記したフォルダパスが追加され、そのフォルダパス以下にあるヘッダーファイルで宣言されている関数等にインテリセンスが効くようになります。
自作した関数などに対してもインテリセンスが効くのは、includePath
に ${workspaceFolder}/**
がデフォルトで設定されているからだと思います
c_cpp_properties.json
を直接編集する
もう一つの方法は c_cpp_properties.json
を直接編集する方法になります。
追加された c_cpp_properties.json
を開いてみてください。私の c_cpp_properties.json
の中身は下記のようになっていました。
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"macFrameworkPath": [],
"compilerPath": "/usr/local/bin/gcc-10",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "macos-gcc-x64"
}
],
"version": 4
}
OS などの環境によって中身は異なると思いますので、上記と一緒でなくても問題ないので安心してください。
今回編集するのは下記の includePath
設定の部分です。
"includePath": [
"${workspaceFolder}/**"
],
この includePath
設定の [ ]
内に、インテリセンスが効くようにしたい関数の宣言が行われている「ヘッダーファイルのフォルダのパス」を追記します。
"${workspaceFolder}/**"
はデフォルトで入力されていると思いますので、この行の最後に ,
(コンマ)を追記し、改行して次の行にフォルダパスを追記します。
例えば /usr/local/opt/openssl@1.1/include
を追加する場合は下記のように編集します。
"includePath": [
"${workspaceFolder}/**",
"/usr/local/opt/openssl@1.1/include"
],
includePath
が追加されたことで、VScode が追加されたフォルダ以下のヘッダーファイルも解釈し、そのヘッダーファイルで宣言されている関数に対してもインテリセンスが効くようになります。
includePath
追加の効果確認
includePath
を追加してインテリセンスが効くようになったかを確認してみましょう!
まず includePath
を追加することで、c_cpp_properties.json を追加する時に include
文が波線で警告表示されていたのが解消されていることが確認できると思います。
さらに、include
文のヘッダーファイル名のところを右クリックしてメニューを表示し、その後「定義へ移動」をクリックすると、そのヘッダーファイルを表示することができるようになっていると思います。
おそらくこれが確認できればインテリセンスが効くようになっているはずです。
続いてソースコード編集画面で、もともとインテリセンスを効くようにしたかった関数名を記述してみましょう。
記述途中で関数名の候補が表示され、タブキーを押すことで関数名が補間されるようになっているはずです。
また、記述した関数名にマウスカーソルを合わせれば、その関数の宣言がポップアップで表示されるようになっているはずです。
この辺りまで確認できれば、ばっちりインテリセンスが効いていると言えると思います。
もし上手くインテリセンスが効いていないようであれば、includePath
に記述したフォルダパスが合っているかどうかを再度ご確認いただければと思います。
スポンサーリンク
コンパイル時の設定への追加も忘れずに
c_cpp_properties.json
の includePath
の変更はあくまでもインテリセンスの対象にヘッダーを追加するための設定である点に注意してください。
コンパイラのインクルードパスに c_cpp_properties.json
で追記したフォルダパスが設定されるわけではないです。
ですので、VSCode からコンパイルを行うような場合は別途 tasks.json
に -I
オプションでフォルダのパスを指定する必要があります。
例えば下記ではコンパイル時のオプションに -I/usr/local/opt/openssl@1.1/include
を追加し、コンパイル時にも /usr/local/opt/openssl@1.1/include
以下のヘッダーを参照するようにした tasks.json
になります(★部分)。
{
// tasks.json 形式の詳細についての資料は、
// https://go.microsoft.com/fwlink/?LinkId=733558 をご覧ください
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "ssl_build",
"command": "gcc",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-Wall",
"-lssl",
"-I/usr/local/opt/openssl@1.1/include",// ★ヘッダーのあるフォルダを追加
"-L/usr/local/opt/openssl@1.1/lib"
],
"group": "build"
}
]
}
まとめ
このページでは、VSCode の「C/C++」拡張機能における「インテリセンスの有効範囲を広げる」方法を解説しました。
いつもインテリセンスの恩恵を受けていると、逆にインテリセンスが効かないとすごく不便です…。
ただし、今回紹介した方法でおそらく全ての関数や定義に対してインテリセンスを効かせることができるようになります!
設定自体も簡単ですので、楽にプログラミングするためにも、是非このページで解説した内容を参考にしてください!