web-dev-qa-db-fra.com

Copier dans le presse-papiers dans Node.js?

Existe-t-il un moyen de copier dans le presse-papiers dans Node.js? Des modules ou des idées quoi que ce soit? J'utilise Node.js sur une application de bureau. J'espère que cela explique pourquoi je veux qu'il puisse y parvenir.

59
Tower

Un presse-papiers n'est pas inhérent à un système d'exploitation. C'est une construction du système de fenêtres que le système d'exploitation exécute. Donc, si vous vouliez que cela fonctionne sur X par exemple, vous auriez besoin de liaisons avec Xlib et/ou XCB. Les liaisons Xlib pour le nœud existent réellement: https://github.com/mixu/nwm . Bien que je ne sois pas sûr qu'il vous donne accès au presse-papiers X, vous pourriez finir par écrire le vôtre. Vous aurez besoin de liaisons distinctes pour les fenêtres.

edit: Si vous voulez faire quelque chose de hacky, vous pouvez également utiliser xclip:

var exec = require('child_process').exec;

var getClipboard = function(func) {
  exec('/usr/bin/xclip -o -selection clipboard', function(err, stdout, stderr) {
    if (err || stderr) return func(err || new Error(stderr));
    func(null, stdout);
  });
};

getClipboard(function(err, text) {
  if (err) throw err;
  console.log(text);
});
16
chjj

Pour OS X:

function pbcopy(data) {
    var proc = require('child_process').spawn('pbcopy'); 
    proc.stdin.write(data); proc.stdin.end();
}

write() peut prendre un tampon ou une chaîne. L'encodage par défaut d'une chaîne sera utf-8.

64
Benjamin Atkin

Découvrez clipboardy . Il vous permet de copier/coller multiplateforme. Il est plus activement maintenu que le copy-paste module mentionné dans une autre réponse et il corrige de nombreux problèmes de ce module.

const clipboardy = require('clipboardy');

// Copy
clipboardy.writeSync('????');

// Paste
clipboardy.readSync();
//????
36
Sindre Sorhus

Voici un module qui fournit les fonctions copy et paste: https://github.com/xavi-/node-copy-paste

Lorsque require("copy-paste").global() est exécuté, deux fonctions globales sont ajoutées:

> copy("hello") // Asynchronously adds "hello" to clipbroad
> Copy complete
> paste() // Synchronously returns clipboard contents
'hello'

Comme la plupart des autres réponses mentionnées, pour copier et coller dans le nœud, vous devez appeler un programme externe. Dans le cas de node-copy-paste, il appelle pbcopy/pbpaste (pour OSX), xclip (pour linux) et clip (pour windows).

Ce module était très utile lorsque je faisais beaucoup de travail dans le REPL pour un projet parallèle. Inutile de dire, copy-paste n'est qu'un utilitaire de ligne de commande - il n'est pas destiné au travail du serveur.

30
Xavi

Chemin le plus court sous Windows:

require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));
7
Ernst Ernst

J'ai réussi à le faire en créant une application différente qui gère cela. Ce n'est certainement pas la meilleure façon, mais cela fonctionne.

Je suis sous Windows et j'ai créé une application VB.NET:

Module Module1

    Sub Main()
        Dim text = My.Application.CommandLineArgs(0)
        My.Computer.Clipboard.SetText(text)
        Console.Write(text) ' will appear on stdout
    End Sub
End Module

Puis dans Node.js, j'ai utilisé child_process.exec pour exécuter l'application VB.NET, avec les données à copier passées comme argument de ligne de commande:

require('child_process').exec(
    "CopyToClipboard.exe \"test foo bar\"",

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);
2
pimvdb

Mac a une ligne de commande native pbcopy pour ce cas d'utilisation:

require('child_process').exec(
    'echo "test foo bar" | pbcopy',

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);

Même code pour Linux mais remplacez pbcopy par Xclip (apt get install xclip)

1
FGRibreau