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);
您必须为多选修改此设置,这应该很容易。
这将拦截 ALL 对 copy
的调用,包括 Ctrl+C.也许您可以将注册命令限制在更有限的情况下?
我正在构建我的第一个 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);
您必须为多选修改此设置,这应该很容易。
这将拦截 ALL 对 copy
的调用,包括 Ctrl+C.也许您可以将注册命令限制在更有限的情况下?