VSCodeで「定義に移動」ができない原因と対処法について

採用はこちら

VSCodeの「定義に移動」は、関数やクラス、変数、メソッドなどが定義されている場所へすぐに移動できる便利な機能です。

Windowsでは一般的にF12、またはCtrl + クリックで実行できます。

しかし、状況によっては「定義に移動」が反応しなかったり、「定義が見つかりません」と表示されたりすることがあります。

この場合、VSCode本体の不具合だけでなく、言語拡張機能やLanguage Server、プロジェクト設定、依存関係などに原因がある可能性があります。

ここでは、VSCodeで「定義に移動」ができない主な原因と対処法を詳しく解説します。

目次

VSCodeの「定義に移動」とは

VSCodeの「定義に移動」は、コード上のシンボルから、そのシンボルが定義されている場所へ移動する機能です。

たとえば、別ファイルで定義されている関数を呼び出している場合、その関数名にカーソルを合わせて「定義に移動」を実行すると、定義元のファイルへジャンプできます。

Windowsでは主に次の方法で利用できます。

  • F12
  • Ctrl + クリック
  • 右クリックして「定義に移動」を選択する

ただし、「定義に移動」は単純な文字列検索ではありません。

使用している言語のサポート機能や拡張機能、Language Serverなどがコードを解析し、「このシンボルはどこで定義されているか」を判断しています。

そのため、コード解析が正常に行われていないと、「定義に移動」も利用できないことがあります。

原因1:使用している言語に対応した拡張機能がない

VSCodeでは、言語によって必要な拡張機能が異なります。

JavaScriptやTypeScriptのようにVSCode標準で比較的充実した言語サポートが用意されているものもありますが、Python、PHP、C/C++、Go、Javaなどでは、適切な拡張機能を利用することが一般的です。

対処法

まず、VSCodeの拡張機能画面を開きます。

Windowsでは次のショートカットを使用できます。

Ctrl + Shift + X

使用している言語に対応した拡張機能がインストールされ、有効になっているか確認してください。

代表例としては、次のようなものがあります。

Python
→ Python、Pylanceなど

PHP
→ IntelephenseなどのPHP言語サポート拡張機能

C / C++
→ C/C++

Go
→ Go

Java
→ Extension Pack for Java

拡張機能がインストールされていても、現在のワークスペースだけで無効になっている場合もあります。

拡張機能ページで状態を確認しておきましょう。

原因2:Language Serverや言語機能が正常に動作していない

多くのプログラミング言語では、Language Serverや言語拡張機能がコード解析を担当しています。

これらは、「定義に移動」だけでなく、次のような機能にも関係しています。

入力補完
型情報の表示
参照の検索
エラー検出
シンボルのリネーム
定義への移動

そのため、Language Serverや拡張機能に問題が発生すると、「定義に移動」だけでなく、複数のコード支援機能が同時に動かなくなることがあります。

IntelliSenseも動かないか確認する

「定義に移動」が使えない場合は、入力補完も確認してみましょう。

Windowsでは、コード上で次のショートカットを実行します。

Ctrl + Space

補完候補も表示されない場合は、Language Serverや言語拡張機能全体が正常に動いていない可能性があります。

一方で、補完は正常に動作しているのに「定義に移動」だけができない場合は、キーバインドや特定シンボルの解析に問題がある可能性があります。

VSCodeを再読み込みする

一時的な不具合であれば、VSCodeの再読み込みで改善することがあります。

Ctrl + Shift + Pでコマンドパレットを開き、次を実行します。

Developer: Reload Window

拡張機能やLanguage Serverの一時的な不調であれば、これだけで改善する場合があります。

原因3:ファイルの言語モードが間違っている

VSCodeがファイルを正しいプログラミング言語として認識していない場合、「定義に移動」が正常に動作しないことがあります。

たとえばPHPファイルを開いているにもかかわらず、画面右下に次のように表示されているケースです。

Plain Text

この場合、PHP用の言語機能が有効にならない可能性があります。

対処法

VSCode画面右下に表示されている言語モードを確認します。

たとえば、次のように正しい言語名が表示されていることを確認してください。

JavaScript
TypeScript
Python
PHP
C++

間違っている場合は、言語名をクリックして正しい言語を選択します。

コマンドパレットから「Change Language Mode」を実行することもできます。

原因4:プロジェクト全体を開いていない

単一ファイルだけをVSCodeで開いている場合でも、「定義に移動」が利用できるケースはあります。

ただし、言語やプロジェクト構成によっては、プロジェクト全体をワークスペースとして開かないと、他ファイルや依存関係を十分に解析できないことがあります。

プロジェクトルートを開く

たとえば次のような構成の場合です。

project/
├─ src/
│  ├─ index.js
│  └─ user.js
├─ package.json
└─ node_modules/

index.jsだけを直接開くのではなく、projectフォルダ全体をVSCodeで開く方が、言語機能が正しくプロジェクトを認識しやすくなります。

VSCodeのメニューから、次のように開きます。

ファイル
↓
フォルダーを開く

ターミナルから開く場合は、プロジェクトルートで次を実行します。

code .

特に次のような設定ファイルがある場合は、プロジェクトルートを正しく開くことが重要です。

package.json
tsconfig.json
jsconfig.json
composer.json
pyproject.toml
go.mod
Cargo.toml
pom.xml

原因5:依存パッケージがインストールされていない

外部ライブラリの定義へ移動できない場合は、依存パッケージがローカル環境に存在していない可能性があります。

たとえばNode.jsで次のコードを書いているとします。

import express from "express";

しかし、node_modulesが存在しない場合、Language Serverがexpressの定義や型情報を十分に解析できないことがあります。

Node.jsの場合

npm install

または、ロックファイルを基準に環境を再現する場合は次を利用します。

npm ci

PHPの場合

Composerを利用している場合は次を実行します。

composer install

Pythonの場合

仮想環境を有効にしたうえで、必要なパッケージをインストールします。

pip install -r requirements.txt

依存パッケージがないからといって、必ずすべての定義ジャンプが利用できなくなるわけではありません。

ただし、外部ライブラリへの移動ができない場合は、依存関係の状態を確認する価値があります。

原因6:importやrequireのパスが間違っている

インポートパスそのものが間違っていると、定義元を正しく特定できません。

たとえば、次のコードを書いているとします。

import User from "./models/User";

しかし、実際のファイルが次の場所にある場合です。

src/model/User.js

modelsとmodelが一致していないため、正しく解決できません。

確認したいポイント

特に次の項目を確認してください。

  • 相対パス
  • ディレクトリ階層
  • ファイル名
  • 拡張子
  • 大文字・小文字
  • パスエイリアス

Windowsでは大文字・小文字の違いが問題にならない場合でも、Linux環境では別ファイルとして扱われることがあります。

原因7:tsconfig.jsonやjsconfig.jsonの設定に問題がある

JavaScriptやTypeScriptでは、tsconfig.jsonやjsconfig.jsonの設定がコード解析に影響します。

特にパスエイリアスを利用している場合は注意が必要です。

pathsやbaseUrlを確認する

たとえば次のような設定です。

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*"]
}

この設定を利用して、次のようにインポートしているとします。

import User from "@/models/User";

pathsやbaseUrlの設定と実際のディレクトリ構成が一致していなければ、Userの定義を正しく解決できないことがあります。

また、includeやexcludeの設定によって対象ファイルが解析対象から外れていないかも確認しておくとよいでしょう。

原因8:C/C++のインクルード設定に問題がある

C/C++では、ヘッダーファイルやコンパイラの設定が「定義に移動」に影響することがあります。

確認したい項目

C/C++拡張機能を利用している場合、次のような設定を確認します。

includePath
compilerPath
browse.path

ヘッダーファイルを正しく見つけられない場合、シンボルの定義情報も正しく取得できないことがあります。

特に外部ライブラリを利用しているプロジェクトでは、インクルードパスの設定を確認しましょう。

原因9:拡張機能同士が競合している

同じ言語を解析する拡張機能を複数インストールしている場合、競合が発生することがあります。

たとえばPHPなら、複数のIntelliSense系拡張機能やLanguage Server系拡張機能を同時に有効にしている場合です。

対処法

不要な拡張機能を一時的に無効化し、動作を確認します。

拡張機能画面から対象の拡張機能を選び、歯車アイコンから「無効にする」を選択できます。

原因を切り分ける場合は、必要最低限の拡張機能だけを有効にして試す方法が有効です。

原因10:Workspace Trustの制限モードになっている

VSCodeにはWorkspace Trustというセキュリティ機能があります。

信頼されていないフォルダを開くと「制限モード」に入り、一部の拡張機能や機能が制限される場合があります。

対処法

VSCodeの画面や通知に次のような表示がないか確認します。

Restricted Mode
制限モード

自分で作成したプロジェクトなど、安全性を確認できるフォルダであれば、ワークスペースを信頼することで通常の状態に戻せます。

ただし、制限モードだから必ず「定義に移動」が使えなくなるわけではありません。

利用している拡張機能のWorkspace Trust対応状況によって影響は異なります。

原因11:WSLやSSH、Dev Containers側に拡張機能がない

WSL、Remote SSH、Dev Containersなどを利用している場合は、拡張機能がどこで動作しているか確認する必要があります。

たとえばWindows上のVSCodeからWSL内のプロジェクトを開いている場合、言語解析を行う拡張機能をWSL側へインストールする必要があることがあります。

確認するポイント

拡張機能画面で、次のような表示がないか確認します。

Install in WSL
Install in SSH
Install in Dev Container

リモート環境にソースコードがある場合は、言語解析を担当する拡張機能もリモート側で動作するケースが多いため注意しましょう。

原因12:インデックス作成やコード解析が終わっていない

大規模なプロジェクトでは、VSCodeを開いた直後にコード解析やインデックス作成が行われる場合があります。

この処理中は、定義ジャンプや参照検索が一時的に不安定になることがあります。

発生しやすいタイミング

たとえば次のようなタイミングです。

プロジェクトを初めて開いた直後
Gitブランチを切り替えた直後
依存パッケージを更新した直後
大量のファイルを変更した直後
Language Serverを再起動した直後

ステータスバーや出力パネルに、Language Serverの解析状況が表示されていないか確認してみましょう。

原因13:重大な構文エラーがある

ファイル内に大きな構文エラーがあると、Language Serverや言語拡張機能がコード構造を正しく解析できなくなる場合があります。

たとえば、次のように構文が途中で崩れているケースです。

function test( {

ただし、構文エラーがあるからといって、必ず「定義に移動」が利用できなくなるわけではありません。

Language Serverによっては、不完全なコードでもある程度解析できます。

問題パネルを確認する

Windowsでは次のショートカットで問題パネルを開けます。

Ctrl + Shift + M

重大な構文エラーが大量に表示されている場合は、先に修正してから再度「定義に移動」を試してみましょう。

原因14:動的に生成されるコードである

VSCodeや拡張機能に問題がなくても、コードの仕組みによっては定義先を特定できない場合があります。

たとえば次のようなケースです。

動的メソッド
マジックメソッド
メタプログラミング
ORM
動的プロパティ
依存性注入
コード生成

静的解析では定義元を特定しにくいため、「定義に移動」が正常に動作しないことがあります。

フレームワークによっては、専用拡張機能やIDEヘルパー、型情報の生成によって改善できる場合があります。

原因15:F12のキーバインドが変更されている

コード解析には問題がなくても、F12の設定だけが変更されている可能性があります。

キーボードショートカットを確認する

Windowsでは次を実行します。

Ctrl + K
Ctrl + S

キーボードショートカット画面で、次を検索します。

Go to Definition

標準ではF12が割り当てられています。

右クリックメニューから「定義に移動」が利用できるのに、F12だけが動かない場合は、キーバインドを疑うとよいでしょう。

原因16:F12がPCの特殊キーになっている

ノートPCでは、F1〜F12キーが音量や画面輝度などの操作に割り当てられている場合があります。

その場合は、次のように操作する必要があります。

Fn + F12

Ctrl + クリックでは正常に定義へ移動できるのであれば、VSCodeのコード解析機能ではなく、キーボード側の問題である可能性が高いでしょう。

「定義が見つかりません」と表示される場合

F12を押したときに、次のようなメッセージが表示される場合があります。

No definition found
定義が見つかりません

この場合、ショートカット自体は正常に実行されています。

そのため、キーボード操作ではなく、コード解析側の問題を疑うとよいでしょう。

主な原因

次のような可能性があります。

シンボルを正しく解析できていない
import先を解決できていない
依存パッケージが不足している
プロジェクト設定に問題がある
対象が動的に生成されている

「F12を押しても何も起きない場合」と「定義が見つかりませんと表示される場合」は、原因を分けて考えることが大切です。

「定義をここに表示」も試してみる

VSCodeには、定義先へ直接移動するだけでなく、現在の画面内に定義を表示する「Peek Definition」という機能もあります。

Windowsでは次のショートカットです。

Alt + F12

これが正常に動作するか確認することで、問題の切り分けに役立つことがあります。

VSCodeで「定義に移動」ができないときの確認手順

原因が分からない場合は、簡単に確認できるものから順番に調べると効率的です。

1. Ctrl + クリックや右クリックを試す

まず、F12だけの問題ではないか確認します。

Ctrl + クリックや右クリックメニューから「定義に移動」ができるのであれば、キーバインドやF12キー側の問題である可能性があります。

2. 言語モードを確認する

VSCode右下を確認し、現在のファイルが正しいプログラミング言語として認識されているか確認します。

3. 言語拡張機能を確認する

使用しているプログラミング言語に対応した拡張機能がインストールされ、有効になっているか確認します。

4. IntelliSenseが動くか確認する

Ctrl + Spaceを実行し、入力補完が利用できるか確認します。

補完も利用できない場合は、言語機能全体に問題がある可能性があります。

5. プロジェクトルートを開く

単一ファイルではなく、package.jsonやtsconfig.jsonなどを含むプロジェクトのルートフォルダを開きます。

6. 依存関係を確認する

npm install、composer install、pip installなどを実行し、必要な依存パッケージが存在するか確認します。

7. プロジェクト設定を確認する

tsconfig.json、jsconfig.json、C/C++のインクルードパスなどが正しく設定されているか確認します。

8. VSCodeを再読み込みする

コマンドパレットから次を実行します。

Developer: Reload Window

9. 拡張機能の競合を確認する

同じ言語を解析する拡張機能が複数ある場合は、一時的に不要なものを無効化します。

10. 出力ログを確認する

ここまで試しても改善しない場合は、Language Serverや拡張機能のログを確認します。

改善しない場合は「出力」を確認する

VSCodeには、拡張機能や言語機能のログを確認できる「出力」パネルがあります。

Windowsでは次のショートカットで表示できます。

Ctrl + Shift + U

右側のプルダウンから、使用している言語や拡張機能に関連する項目を選択します。

たとえば次のようなものです。

TypeScript
Python
Pylance
Go
C/C++
Extension Host
PHP関連拡張機能

Language Serverの起動失敗や設定エラー、パス解決エラーなどが表示されていないか確認します。

まとめ

VSCodeで「定義に移動」ができない場合は、まずVSCode本体の不具合を疑うのではなく、言語サポート機能がコードを正しく解析できているかを確認することが重要です。

特に確認したいポイントは次のとおりです。

言語モードが正しいか
↓
言語拡張機能が有効か
↓
IntelliSenseが動くか
↓
プロジェクトルートを開いているか
↓
importや依存関係が正常か
↓
プロジェクト設定が正しいか
↓
Language Serverや拡張機能が正常に動いているか

「F12だけが動かない」場合は、キーバインドやファンクションキーの設定を確認するとよいでしょう。

一方で、F12、Ctrl + クリック、入力補完などがすべて動かない場合は、言語拡張機能やLanguage Server、プロジェクト設定を重点的に確認するのがおすすめです。

原因を一つずつ切り分けていけば、多くの場合は「定義に移動」ができない理由を特定できます。

以上、VSCodeで「定義に移動」ができない原因と対処法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次