【问题标题】:VSCode Extension API - listen for built-in context menu eventsVSCode 扩展 API - 监听内置上下文菜单事件
【发布时间】:2022-01-17 06:03:07
【问题描述】:

我正在构建我的第一个 VSCode 扩展并且有点挣扎。

是否可以监听context menu 事件,例如copy

例如: 当用户在上下文菜单中单击“复制”(screenshot of context menu) 我想得到复制的文本。

可以选择添加命令到context menu。但我不想那样,我想听现有的内置copy 命令。

我知道,我可以收听keybinding,但这不会触发context menu 事件。

【问题讨论】:

  • 你不能挂钩现有的菜单项,你想对复制的文本做什么
  • 一种方法(也许是唯一的方法)是通过实现您自己的copy 命令来拦截对copy 命令的调用。然后获取您想要的信息,禁用您的命令并将 arg 发送到 buitin copy 命令。
  • 谁使用上下文菜单中的Copy 命令,只需使用Ctrl+C 并使用您自己的命令定义一个新的键绑定
  • @rioV8 我正在构建一个clipboard history extension。所以onCopy,我想将文本存储到历史记录中。
  • @rioV8 我已经听了快捷键 ctrl+c。但我认为听上下文菜单也会对用户友好。有些人使用它而不是快捷方式

标签: visual-studio-code vscode-extensions


【解决方案1】:

这是我之前答案的更好版本 - 它只是以更简单的方法获取剪贴板文本:

let typeDisposable = vscode.commands.registerCommand('editor.action.clipboardCopyAction', async (arg) => myCopy(typeDisposable) );

async function myCopy(typeDisposable)  {

    typeDisposable.dispose();      // must dispose to avoid endless loops

    // run the built-in copy command
    await vscode.commands.executeCommand('editor.action.clipboardCopyAction');

    // get the copied text
    const clipboardText = await vscode.env.clipboard.readText();
    // use your clipboard text here
    console.log(clipboardText);

    // re-register to continue intercepting copy commands
    typeDisposable = vscode.commands.registerCommand('editor.action.clipboardCopyAction', async (arg) => myCopy(typeDisposable) );
    context.subscriptions.push(typeDisposable);
}

context.subscriptions.push(typeDisposable);

  • [以前的答案版本]

这似乎可行 - 但应该经过彻底测试(此时这是一种思想实验):

let typeDisposable = vscode.commands.registerCommand('editor.action.clipboardCopyAction', async (arg) => myCopy(typeDisposable) );

async function myCopy(typeDisposable)  {

    typeDisposable.dispose();

    // get the selectedText from the editor here
    const selectedRange = new vscode.Range(vscode.window.activeTextEditor.selection.start, vscode.window.activeTextEditor.selection.end);
    const copiedText = vscode.window.activeTextEditor.document.getText(selectedRange);
    // use your copiedText here

    await vscode.commands.executeCommand('editor.action.clipboardCopyAction');
    typeDisposable = vscode.commands.registerCommand('editor.action.clipboardCopyAction', async (arg) => myCopy(typeDisposable) );
    context.subscriptions.push(typeDisposable);
}

context.subscriptions.push(typeDisposable);

您必须修改它以进行多项选择,这应该很容易。

这将拦截对copyALL 调用,包括Ctrl+C。也许您可以将注册命令限制在更有限的情况下?

【讨论】:

  • 是命令,如键绑定,以堆栈方式处理,或者命令名称只是函数字典中的一个键。如果它是一个堆栈,那么处理将导致一个完整列表扫描,或者它是每个字典条目的一个堆栈,他们不太可能实现了命令覆盖
  • 感谢您的解决方案!我在本地尝试过,它奏效了。如果我发现缺点,我会在这里测试它更新这个
  • 我将答案更新了一点,使其更简洁。
猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多