Q&A (電気電子)

【VSCode】予測変換が出ない、コードへのハイライト(色付け)が機能しなくなった場合の対処法を紹介する

先日VSコードを使っていた際、ハイライト機能や予測変換が無効になって解決に30分ぐらいかかりました・・・

環境によって理由は様々かもしれませんが、1つの解決策としてまとめておきます。

VSCodeで予測変換やハイライトが無効になってしまう原因

存在しない、認識されていないヘッダファイルをインクルードしているためです。

今回自分はMPLABのプロジェクトをVSCodeで開いていたのですが、開発環境側のヘッダファイルをインクルードしていませんでした。
(MPLABでコンパイルするときはちゃんと通るし別にいいや・・・ぐらいに思ってました・・・)

この状態でファイルを開いていると、他にインクルードしているヘッダファイルでの定義までもが、正しく読み込まれなくなります。

C/C++の拡張機能を入れている場合、エラーが発生した箇所以降のハイライト機能などが無効になるため、一番上に来るインクルード処理などでエラーが出ると、ほぼすべての変数や関数に色がつかなくなります。

※今回はC言語開発で、下記の拡張機能を入れている場合を紹介します。

ハイライトが出ない

最初に今の状態を説明します。

今回自分はMPLABのプロジェクトをVSCodeで開き、編集していました。
MPLABの場合、コンパイル時に開発環境が読み込んでくる共通のインクルードファイルは、プロジェクトファイルの場所とは別にあります。

開きたいプロジェクトの場所
共通のインクルードファイルの場所

このような場合、下の「00_PIC16F1827_ccp_pwm_mode」をVSCodeで開いても、「.../include」に存在するファイルは当然、読み込まれません。

この状態でプロジェクトを開くと下記のような表示になり、正しく認識出てきていないヘッダファイルに赤線が付きます。

このように、正常に認識されていないヘッダファイルがある状態でコードを書いていくと、下記のような症状が発生します。

余談ですが、少し前までヘッダファイルが正しく認識されていなくても、こうはならなかった気がします。

アップデートで変わったのかな・・・

解決策

ハイライトや予測変換を正しく出すには、開発環境で読み込むパスも正しく認識させる必要があります。

設定方法の例を紹介します。

まずはVSCodeの左下にカーソルを合わせ、「Settings:設定」を開きます。

次に、上部の検索ウィンドウで「include」と入力します。

検索すると「include」に関連した設定一覧が表示されます。

その後、拡張機能の中から下記の設定ウィンドウを選択して表示させます。

ここで、「C_Cpp > Default: Include Path (Not synced)」という項目の「Add Item」ボタンを押します。

ここに、強制的に認識させたいヘッダファイルのパスを入力します。

今回の場合、自分はPIC16シリーズの共通ヘッダファイルである「xc.h」を認識させました。

注意点として、VSCode側のコメントに下記の様なことが書かれています。

C_Cpp ' 既定値: インクルード・パス (同期されない)
includePathがc_cpp_properties.jsonで指定されていない場合に設定で使用する値です。includePathが指定されている場合は、${default}を配列に追加して、この設定の値を挿入します。通常は、システム・インクルードを含めるべきではありません。代わりに、C_Cpp ' Default: コンパイラー・パス。

ざっくりですが、開いているプロジェクトファイル内で正式に認識されているわけではない(パスを指定して強制的にOKとしてる?)ので、本来は設定すべきではない、みたいな感じかと思います。

本当であればJsonファイルをいじって・・・というのが正しいのかな~と思います。

設定としては以上になります。

解決後

設定を完了した後、プロジェクトの中のソースファイルを開き、変化を確認してみます。

下記のように、問題が解消されていることが確認できました。

注意点ですが、強制的に認識させたファイルがあるフォルダパス内の定義は全部参照されてしまいます。

不必要に予測変換を表示させたくない場合は空のファイルなどを用意して特定のフォルダに保存し、参照させるのも良いかもしれません。

まとめ

今回はVSCodeにて予測変換、文字の色付け機能が動作しなくなってしまう問題と、解決策の1つを紹介してみました。

ほかのプロジェクトで余計にインクルードされるのも微妙なので、人によっては微妙な対応になってしまうかも。

ワークスペースを作成して・・・ということも試してみましたが、VSCodeの設定ではなくC++拡張機能の設定をしているので、全プロジェクトで共有されてしまうようです。

個別に設定できる方法を見つけたらまた共有してみたいと思います。

-Q&A (電気電子)