VSCodeのCtrl+クリックで「定義へ移動」が反応しない時の対処法

概要

今回はVSCodeでCtrl+クリックの「定義へ移動」(Go to Definition)が効かなくなった時の対処法について紹介していきます。

普段はCtrl+クリック(Macならcmd+クリック)でメソッドの呼び出し元から定義元へジャンプできますよね。
これが何の前触れもなく反応しなくなると、コードを読む速度がかなり落ちてしまいます。

自分の環境でも、設定を変更した記憶が全く無いのに突然この機能が使えなくなったことがありました。
確認した対処法と、直った後に振り返って考えた原因(推測)、次に同じ事象が起きた時の切り分け方法をまとめます。

それではやっていきましょう!

目次

事象

VSCodeで、メソッドの呼び出し元からCtrl+クリック(MacはCmd+クリック)で定義元へジャンプする「Go to Definition」機能が、突然使えなくなりました。

以前は問題なく使えていた機能で、特に設定を変更した記憶もないのに反応しなくなっていたので、最初は何が起きたのか分かりませんでした(- -;

Ctrl+クリックで定義ジャンプが効かない時の切り分けフロー(設定確認→テスト実行/TS Server再起動→拡張機能ホスト再起動の順)
VSCodeでCtrl+クリックの定義へ移動が反応しない時の切り分けフローチャート。multiCursorModifierの設定確認から始まり、テスト実行やTS Server再起動で直るか、まだ直らなければ拡張機能ホストの再起動を試すという分岐を示す図

確認した対処法

1. editor.multiCursorModifierの設定を確認する

まずショートカットの割り当てが変わっていないかを疑いました。

  • Ctrl+,で設定を開き、editor.multiCursorModifierを検索する
    • この値がctrlCmdになっていると、Ctrl(Cmd)クリックは「マルチカーソル追加」に割り当てられてしまい、定義ジャンプはAlt+クリックに変わる
  • デフォルトのaltであればCtrl(Cmd)クリックが定義ジャンプに割り当てられる
    • 通常はこちらの状態のはず

今回はこの設定自体に問題はありませんでした。

2. テストを1回実行したら直った

原因を追っている途中、テストタブからPlaywrightのシナリオを一度実行したところ、Ctrl+クリックでの定義ジャンプが正常に動作するようになりました。

設定変更など明示的な操作はしていないので、テスト実行が何らかのきっかけで内部状態をリセット・再構築したと考えられます。

原因(推測)

はっきりとした原因は特定できていませんが、以下のいずれか、または複数が組み合わさっていたと推測しています。

TypeScript/JS言語サーバー(tsserver)の再インデックス

Playwrightのテストを実行すると、VSCodeはテストファイルとそのimportをコンパイルしてtsserverに解析させます。

これによって、それまで正しく読み込まれていなかったプロジェクトの型情報やモジュール解決が「ついでに」再構築され、定義ジャンプが正常化した可能性があります。
特に規模の大きいプロジェクトでは、起動直後はtsserverのインデックスが完了しておらず、Ctrl+クリックが無反応になることがあるので、心当たりのある方もいるかもしれません。

Extension Host(拡張機能の実行プロセス)のリロード

テストタブでの実行時に、VSCodeの拡張機能ホストが裏で再読み込みされることがあります。

これにより、フリーズ気味だった言語サーバーや拡張機能が結果的に再起動され、直ったように見えるケースが考えられます。

node_modules・型定義の解決

Playwrightのテスト実行時に、node_modules/@typesやプロジェクト参照(project references)が解決され、それまで見えていなかった型情報が使えるようになった可能性もあります。

多分tsserverか型解決がなんじゃ無いかなと思ってます。

次回同様の事象が起きた場合の確認方法

テストを実行する前に、まず以下を試すことで、原因がtsserver側にあるかを切り分けられます。

コマンドパレットから実行

1
TypeScript: Restart TS Server

コマンドパレット(Ctrl+Shift+P)からこのコマンドを実行して直るようであれば、原因はほぼtsserverの初期化・インデックス不足と考えて良さそうです。

VSCodeの再起動は時間がかかることもあるので、
先に試せるかつ、切り分けの手間も少なく済みます。

まとめ

Ctrl+クリックの「定義へ移動」が効かなくなった時の対処法と、考えられる原因をまとめました。

テストを1回実行するだけで直る場合もあるので、再起動する前にまず「TypeScript: Restart TS Server」を試してみることをお勧めします。

また見当違いなことを言ってる可能性もあるので、その辺はご了承ください(- -

以上となります。
vscodeくんはたまに重くなるから困る(拡張機能入れすぎ)(^^
それではお疲れさまでした。