是否可以覆盖现有的 VS Code 命令,例如editor.action.clipboardPasteAction
?通过覆盖,我的意思是注册我自己的命令,每次应该调用原始命令时都会自动调用该命令。
例如,editor.action.clipboardPasteAction
当Ctrl+V
被按下(或其他快捷键,取决于键绑定),而且当它在代码中显式调用时,例如通过调用各种扩展
commands.executeCommand("editor.action.clipboardPasteAction");
是否可以在我们自己的扩展中“拦截”命令调用,将其替换为我们自己的功能,然后可以选择继续执行原始命令或发出应暂停执行的信号?
我试图自己解决这个问题,但找不到任何提供完整功能的东西。我发现的最接近的解决方案是例如中使用的解决方案剪贴板历史记录 https://github.com/aefernandes/vscode-clipboard-history-extension扩大。这个扩展试图通过以下方式实现“重载”覆盖其粘贴操作的键绑定package.json https://github.com/aefernandes/vscode-clipboard-history-extension/blob/master/package.json:
{
"command": "clipboard.paste",
"key": "ctrl+v",
"mac": "cmd+v",
"when": "editorTextFocus"
}
然后调用editor.action.clipboardPasteAction
内clipboard.paste
命令如上所示。
这种方法的问题有两个:
- 如果“覆盖”的原始命令具有与我们定义的键绑定不同的键绑定,该怎么办
package.json
?
- 如果原始命令不是通过键盘快捷键调用而是通过例如通过一些扩展使用
commands.executeCommand()
或通过命令面板。
如果有一种方法可以动态地(在我们的扩展注册期间)我们可以获取原始命令的键绑定,然后使用相同的键绑定注册我们的命令,那么第一个问题就可以避免。
我也不确定这是否可能。
在 VSCode 1.37.1(截至 2019-08-30)中,答案是no:不可能拦截命令,也不可能枚举键绑定。
- 我怎么知道?我最近花了很多时间翻阅扩展API https://code.visualstudio.com/api/references/vscode-api而且,好吧,他们不在那里。当然,我可能忽略了一些不明显的事情。
但有一个功能listen命令是问题 #1431 https://github.com/microsoft/vscode/issues/1431,它是在过去两个月内才实施的,并且据说在当前可用insiders https://code.visualstudio.com/insiders/发布(我自己还没有证实)。然而,请注意,计划中的功能不允许人们截距(在取消的意义上)命令。
因此,即使该功能落地,也可能需要将其与其他一些监控功能结合使用,具体取决于所需的功能:
你可以看tasks https://code.visualstudio.com/api/references/vscode-api#tasks,即外部进程调用。
您可以查看编辑器的更改,例如选择 https://code.visualstudio.com/api/references/vscode-api#window.onDidChangeTextEditorSelection or contents https://code.visualstudio.com/api/references/vscode-api#workspace.onDidChangeTextDocument.
你可以枚举扩展 https://code.visualstudio.com/api/references/vscode-api#extensions,监听它们发出的任何事件,调用它们的任何方法选择发布,并检查他们的package.json https://code.visualstudio.com/api/references/vscode-api#Extension.packageJSON files.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)