【问题标题】:Disable peek in Visual Studio Code在 Visual Studio Code 中禁用 peek
【发布时间】:2017-01-04 09:54:21
【问题描述】:

有没有办法在 Visual Studio Code 中禁用 ctrl-click 'peek' 功能?理想情况下,我希望 ctrl-click 仅在新选项卡中打开包含定义的文件。

编辑:我提交了an issue 至少可以减少混乱。显然我的术语有点错误。

为了澄清,有两个动作:

  1. 右键-> 查看定义
  2. 右键单击 -> 转到定义(绑定到 ctrl-click)

他们的行为如下:

  1. PD,单一定义
    • 打开显示定义的内联界面。
  2. PD,多重定义

    • 打开显示定义的内联界面。
  3. GtD,单一定义

    • 打开包含定义的文件。
  4. GtD,多重定义
    • 随机选择一个定义,打开该文件,一个显示所有定义的内联界面。

所有这些都很好,除了最后一个。做这两件事会导致一个非常多余和令人困惑的 UI,如下所示:

应该有一种方法来实现这些行为之一:

  • 随机选择一个定义,打开该文件。

或者:

  • 打开显示所有定义的内联界面(在当前文件中

【问题讨论】:

  • 支持您,但您在 gh 上的问题与“ctrl-click 只需在新选项卡中打开包含定义的文件”无关(我的意思是,禁用它)。我开了一个新问题here
  • @Matt,你到底想要什么?你想完全禁用偷看吗?或者您希望在查看窗口中打开多个引用而不是第一个引用?
  • @TarunLalwani 在玩了更多之后我意识到我有很多东西。首先,Flow JavaScript 支持中存在一个错误,即在多个定义相同时显示它们。这当然超出了这个问题的范围。对于这个赏金,我会说如果 VSCode 已经打开另一个文件并且该选项卡包含两个定义,我会接受禁用 peek 显示的东西。我知道如果定义在两个单独的文件中,随机选择它们并没有多大意义。希望我更清楚并为混乱感到抱歉:)
  • @Matt,这需要在github.com/Microsoft/vscode/blob/… 修改代码,所以我无法提出代码更改的答案,但给你一个方向,因为这需要重建 vscode
  • 具体VS版本?

标签: visual-studio-code


【解决方案1】:

我已经提出了修复此https://github.com/Microsoft/vscode/pull/68023 的请求请求,但在此之前,这里有一个修补 VSCode 安装文件的临时修复程序。您需要重新应用每个更新。

编辑:该修复已合并到 vscode 中。它应该在以后的版本中。

通过此修复 Ctrl+Click 将:

  • 如果有多个定义,请使用 peek
  • 使用 peek 时,将无法导航到编辑器中的最佳匹配并导致您失去位置
  • 如果只有一个定义,它将导航到最佳匹配,而不是打开 peek。

  1. 弄清楚需要修补的功能是什么样的。方法是DefinitionAction.prototype._onResult(editorService, editor, model)

  2. 进入 VSCode 安装目录。 %LocalAppData%\Programs\Microsoft VS Code 并在 VSCode 中右键打开该目录,这样我们就可以使用 VSCode 的搜索功能在每个文件中搜索文本。

  3. 搜索 _onResult 并评估每个结果,检查签名和正文是否与我们在步骤 1 中看到的函数的预期相符。

    • 我们从第一步知道,函数_openReference就在附近。使用它来缩小搜索范围。
    • 我在workbench.main.js2454 中找到了它。使用括号匹配来查找结尾或知道它在t.prototype._openReference 之前立即结束
    • 格式化后的函数如下(async func 被编译为状态机,这就是它看起来不像源打字稿的原因):

      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 变量是 global\window 对象,可能会发生变化。

    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.

【讨论】:

    【解决方案2】:

    我试图找到一种解决方法来改变 CMD 的行为 + 点击进入实施,但似乎还没有解决方案?

    VSCode 文档显示其默认设置为转到定义而无需修改它: https://code.visualstudio.com/docs/editor/editingevolved

    在我的机器 (Mac) 上,如果我在某个方法上按 CMD + 单击或 F12,它将引导我进入定义的 Peek 视图,但是 CMD+F12 将引导我执行,而不会出现偷看。

    【讨论】:

      【解决方案3】:

      这似乎已在较新的版本中得到修复。如果我现在将鼠标悬停在foo.cpp 中的FOO 上,我会看到正常的工具提示#define FOO 2。如果我按下 Ctrl 键,消息会展开以添加文本“单击以显示 2 个定义”,如果我在按住 Ctrl 键的同时单击,则会按要求显示查看窗口。

      【讨论】:

        猜你喜欢
        • 2019-03-26
        • 2018-05-04
        • 2021-01-07
        • 2015-07-10
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        相关资源
        最近更新 更多