2017-06-16 1 views
0

Pour mon extension, j'ai besoin de savoir quand une coupe/copie/coller se produit et être capable d'obtenir le texte associé à ces opérations. Je peux probablement obtenir le texte de l'éditeur si je sais quand ils se produisent.Dans une extension VS Code, comment puis-je être averti lorsque l'utilisateur coupe/copie/colle?

Je ne trouve pas d'écouteur pour ces opérations. Je suppose que je peux rechercher les entrées de clavier ctrl-x, ctrl-c et ctrl-v mais certains utilisateurs peuvent utiliser le menu d'édition et ne pas utiliser le clavier.

Y at-il un moyen d'être averti lorsque ces opérations se produisent à partir du clavier ou du menu d'édition?

Répondre

1

Il n'y a pas d'API pour accéder directement au presse-papiers, mais certaines extensions remplacent les raccourcis de copie et de collage par défaut pour personnaliser le comportement de la copie. Voici deux exemples:

Comme vous le soulignez, cette approche ne fonctionnera pas lors de la copie en utilisant toutefois le menu contextuel. Pour cela également, vous pouvez essayer d'intercepter la commande editor.action.clipboardCopyAction. Voyez comment l'extension Vim intercepte la commande type pour un exemple: https://github.com/VSCodeVim/Vim/blob/aa8d9549ac0d31b393a9346788f9a9a93187c222/extension.ts#L208

+0

Oui, cela fonctionnerait pour moi. Connaissez-vous une documentation pour overrideCommand()? Je devrais encore effectuer le comportement par défaut peut-être avec: vscode.commands.executeCommand ("default: editor.action.clipboardPaste Action"); ? –

0

originale asker ici ...

je suis venu avec une solution qui implique remplaçant la coupe par défaut/copier/actions coller dans l'éditeur . Voici le code pour « copie » en extension.js (je me sers js pas ts):

//override the editor.action.clipboardCopyAction with our own 
var clipboardCopyDisposable = vscode.commands.registerTextEditorCommand('editor.action.clipboardCopyAction', overriddenClipboardCopyAction); 

context.subscriptions.push(clipboardCopyDisposable); 

/* 
* Function that overrides the default copy behavior. We get the selection and use it, dispose of this registered 
* command (returning to the default editor.action.clipboardCopyAction), invoke the default one, and then re-register it after the default completes 
*/ 
function overriddenClipboardCopyAction(textEditor, edit, params) { 

    //debug 
    console.log("---COPY TEST---"); 

    //use the selected text that is being copied here 
    getCurrentSelectionEvents(); //not shown for brevity 

    //dispose of the overridden editor.action.clipboardCopyAction- back to default copy behavior 
    clipboardCopyDisposable.dispose(); 

    //execute the default editor.action.clipboardCopyAction to copy 
    vscode.commands.executeCommand("editor.action.clipboardCopyAction").then(function(){ 

     console.log("After Copy"); 

     //add the overridden editor.action.clipboardCopyAction back 
     clipboardCopyDisposable = vscode.commands.registerTextEditorCommand('editor.action.clipboardCopyAction', overriddenClipboardCopyAction); 

     context.subscriptions.push(clipboardCopyDisposable); 
    }); 
} 

Ce certainement ne porte toutefois pas se sentent comme la meilleure solution ... il ne semble pas fonctionner. Des commentaires/suggestions? Y a-t-il des problèmes que l'enregistrement et le désenregistrement répétés entraîneront?