VSCode 扩展 API - 监听内置上下文菜单事件

VSCode Extension API - listen for built-in context menu events

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

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

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

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

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

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

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);

您必须为多选修改此设置,这应该很容易。

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