1. ホーム
  2. visual-studio-code

[解決済み] Visual Studio Codeでpeekを無効にする

2023-08-23 16:19:27

質問

Visual Studio Code で、Ctrl キーを押しながらクリックする 'peek' 機能を無効にする方法はありますか。理想的には、Ctrl キーを押しながらクリックすると、新しいタブで定義を含むファイルを開くだけにしてほしいのですが。

編集 : 私は 課題 を提出し、少なくとも混乱はなくなるようにしました。どうやら私の専門用語は少し間違っているようです。

明確にするために、2つのアクションがあります。

  1. 右クリック -> ピー クの定義
  2. 右クリック -> 定義へ移動 (ctrl-クリックにバインドされます)

その動作は以下の通りです。

  1. PD、単一定義
    • 定義を表示するインライン インターフェイスを開きます。
  2. PD、複数の定義

    • 定義を表示するインライン インターフェイスを開きます。
  3. GtD、単一の定義

    • 定義を含むファイルを開きます。
  4. GtD、複数の定義
    • 定義からランダムに1つ選び、そのファイルを開く。 を開くと、すべての定義を表示するインライン インターフェイスが表示されます。

最後のものを除けば、すべて問題ありません。両方のことをやると、このように本当に冗長で混乱したUIになります。

これらの動作のいずれかを持つ方法があるはずです。

  • 定義からランダムに 1 つを選び、そのファイルを開きます。

または

  • すべての定義を表示するインラインインタフェースを開く ( を表示します。 )

どのように解決するのですか?

この問題を解決するためにプルリクエストを作成しました。 https://github.com/Microsoft/vscode/pull/68023 しかし、それまでは、VSCode のインストール ファイルにパッチを適用する臨時の修正版があります。アップデートのたびに再適用する必要があります。

EDIT: 修正は vscode にマージされました。これは、以降のバージョンに含まれるはずです。

この修正により、Ctrl+Click が可能になります。

  • 複数の定義がある場合、peek を使用する
  • peek を使用すると、エディタ内で最適なマッチングにナビゲートされず、スポットを失うことになります。
  • 定義が 1 つしかない場合、最も一致するものに移動し、peek を開きません。

  1. パッチを当てる必要がある関数がどのようなものかを把握します。そのメソッドは DefinitionAction.prototype._onResult(editorService, editor, model)

  2. VSCodeのインストールディレクトリに移動します。 %LocalAppData%\Programs\Microsoft VS Code を右クリックして、VSCodeでディレクトリを開き、VSCodeの検索機能を使って、すべてのファイルのテキストを検索できるようにします。

  3. 検索対象 _onResult を検索し、すべての結果を評価し、署名と本文が手順1で見た関数から期待されるものと一致するかどうかをチェックします。

    • ステップ1からわかっている、関数 _openReference が近くにあることがわかります。それを使って検索を絞り込みます。
    • で見つけた workbench.main.js2454 . ブラケットマッチングを使って終わりを見つけるか、直前で終わっていることがわかるように t.prototype._openReference
    • 関数をフォーマットすると以下のようになります(async funcはstatemachineにコンパイルされます、そのためソースのtypescriptとは全く違って見えます)。

      t.prototype._onResult = function (e, t, r) {
        return i(this, void 0, void 0, function () {
          var i, s, a;
          return n(this, function (n) {
            switch (n.label) {
              case 0:
                return i = r.getAriaMessage(), o.alert(i), this._configuration.openInPeek ? (this._openInPeek(e, t, r), [3, 3]) : [3, 1];
              case 1:
                return s = r.nearestReference(t.getModel().uri, t.getPosition()), [4, this._openReference(t, e, s, this._configuration.openToSide)];
              case 2:
                (a = n.sent()) && r.references.length > 1 ? this._openInPeek(e, a, r) : r.dispose(), n.label = 3;
              case 3:
              return [2]
            }
          })
        })
      }
      
      
  4. この関数を次のように置き換えます。 (同じバージョンを使用している場合) または、この例と同様に、見つけた関数をフォーマットして編集してください。また o 変数はglobalwindowオブジェクトであり、変更される可能性があることに注意してください。

    t.prototype._onResult = function (e, t, r) {
      return i(this, void 0, void 0, function () {
        return n(this, function (n) {
          switch (n.label) {
            case 0:
              return r.getAriaMessage(), o.alert(r.getAriaMessage()), this._configuration.openInPeek || r.references.length > 1 ? (this._openInPeek(e, t, r), [3, 3]) : [3, 1];
            case 1:
              return [4, this._openReference(t, e, r.nearestReference(t.getModel().uri, t.getPosition()), this._configuration.openToSide)];
            case 2:
              r.dispose(), n.label = 3;
            case 3:
            return [2]
          }
        })
      })
    }
    
    
  5. VSCodeを起動します。を取得します。 Your Code installation appears to be corrupt. Please reinstall . ただ、歯車のアイコンを押して Don't Show Again.