覆盖扩展

时间:2017-09-27 18:21:52

标签: visual-studio-code vscode-extensions

是否可以覆盖现有的VS Code命令,例如editor.action.clipboardPasteAction?通过覆盖,我的意思是注册我自己的命令,每次调用原始命令时都会自动调用它。

例如,在按下editor.action.clipboardPasteAction时(或其他一些快捷方式,取决于键绑定)调用Ctrl+V,但是当在例如代码中显式调用它时调用commands.executeCommand("editor.action.clipboardPasteAction"); 。通过调用

进行各种扩展
{
    "command": "clipboard.paste",
    "key": "ctrl+v",
    "mac": "cmd+v",
    "when": "editorTextFocus"
}

是否可以在我们自己的扩展中“拦截”命令调用,将其替换为我们自己的功能,然后可选择继续执行原始命令或发出应该暂停执行的信号?

我试图自己解决这个问题,但却找不到能提供完整功能的东西。我找到的最接近的解决方案是在例如Clipboard History扩展名。此扩展程序试图通过overriding the key bindings for the Paste Action in its package.json实现“重载”:

editor.action.clipboardPasteAction

然后在clipboard.paste命令中调用package.json,如上所示。

这种方法的问题有两个:

  1. 如果“覆盖”的原始命令具有与我们在commands.executeCommand()中定义的键绑定不同的键绑定,该怎么办?
  2. 如果不通过键盘快捷方式调用原始命令,而是例如,通过使用{{1}}或通过命令调色板进行一些扩展。
  3. 如果有一种方法可以动态地(在我们的扩展注册期间)我们可以获得原始命令的键绑定,然后使用相同的键绑定注册我们的命令,则可以避免第一个问题。 我不确定这是否可行。

1 个答案:

答案 0 :(得分:1)

在VSCode 1.37.1(截至2019年8月30日,当前)中,答案为:无法拦截命令或枚举键绑定。

  • 我怎么知道?我最近花了很多时间在extensions API上翻阅,但是,它们不在那儿。当然,我可能忽略了一些不明显的内容。

Issue #1431 listen 命令的一项功能,它是在最近两个月内实现的,并且据说可以在当前的insiders版本中使用(尚未确认自己)。但是,请注意,计划中的功能不允许一个人拦截(在取消意义上)一个命令。

因此,即使该功能着陆,也可能有必要将其与其他一些监视功能结合使用,具体取决于所需的功能:

  • 您可以观看tasks,即外部进程调用。

  • 您可以观看对selectioncontents等编辑器的更改。

  • 您可以枚举extensions,侦听它们发出的任何事件,调用选择发布的任何方法,并检查其package.json文件。