In Node.js in die Zwischenablage kopieren?

86

Gibt es eine Möglichkeit, die Sie in Node.js in die Zwischenablage kopieren können? Irgendwelche Module oder Ideen, was auch immer? Ich verwende Node.js in einer Desktop-Anwendung. Hoffentlich klärt das, warum ich möchte, dass es dies erreichen kann.

Turm
quelle

Antworten:

18

Eine Zwischenablage gehört nicht zu einem Betriebssystem. Es ist ein Konstrukt eines beliebigen Fenstersystems, auf dem das Betriebssystem gerade ausgeführt wird. Wenn Sie also möchten, dass dies beispielsweise auf X funktioniert, benötigen Sie Bindungen an Xlib und / oder XCB. Xlib-Bindungen für Knoten sind tatsächlich vorhanden: https://github.com/mixu/nwm . Obwohl ich nicht sicher bin, ob Sie damit auf die X-Zwischenablage zugreifen können, schreiben Sie möglicherweise Ihre eigene. Sie benötigen separate Bindungen für Fenster.

edit: Wenn du etwas Hackiges machen willst, kannst du auch xclip verwenden:

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);
});
chjj
quelle
Ein Chromäquivalent von copy () zu haben, wäre fantastisch.
93

Für OS X:

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

write()kann einen Puffer oder eine Zeichenfolge nehmen. Die Standardcodierung für eine Zeichenfolge ist utf-8.

Benjamin Atkin
quelle
Dies ist sehr nützlich für schnelle Datentransformationen in der REPL.
William
73

Auschecken clipboardy. Sie können plattformübergreifend kopieren / einfügen. Es wird aktiver gewartet als das in einer anderen Antwort erwähntecopy-paste Modul und behebt viele Probleme dieses Moduls.

const clipboardy = require('clipboardy');

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

// Paste
clipboardy.readSync();
//🦄
Sindre Sorhus
quelle
Es ist besser als das "Copy-Paste" -Modul, da es auch Doppelbyte-Zeichen unterstützt. Dies hat jedoch ein Problem mit dem 32-Bit-Betriebssystem von Windows.
Ponmudi VN
1
@PonmudiVN Windows 32-Bit-Unterstützung wurde behoben: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus
Ich habe npm installieren çlipboardyin cypress.I haben, auf diese Schaltfläche auf Klick auf eine Schaltfläche in meiner Web - Anwendung sollte den Inhalt der Zwischenablage erhalten , aber es gibt nicht definiert, werden alle Eingaben sehr geschätzt stackoverflow.com/questions/61650737/...
Soccerway
30

Hier ist ein Modul, das Folgendes bereitstellt copyund pastefunktioniert: https://github.com/xavi-/node-copy-paste

Bei der require("copy-paste").global()Ausführung werden zwei globale Funktionen hinzugefügt:

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

Wie bei vielen anderen Antworten müssen Sie zum Kopieren und Einfügen in den Knoten ein externes Programm aufrufen. Im Fall von node-copy-pasteruft es pbcopy/pbpaste(für OSX), xclip(für Linux) und clip(für Windows) auf.

Dieses Modul war sehr hilfreich, als ich viel in der REPL für ein Nebenprojekt gearbeitet habe. Es ist unnötig zu erwähnen, dass copy-pastees sich nur um ein Befehlszeilenprogramm handelt - es ist nicht für die Serverarbeit gedacht.

Xavi
quelle
2
Dies ist die beste Antwort. Es ist plattformübergreifend und funktioniert genau so, wie es sollte.
gilly3
1
Vielleicht möchten es Ihren eigenen Code, aus Gründen der SO Richtlinie hinzuzufügen
towc
15

Kürzester Weg in Windows:

const util = require("util");
require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));
Ernst Ernst
quelle
1
funktioniert! danke ... muss aber utilerstmal verlangen .
LIXer
1
Vielen Dank! Keine Notwendigkeit für "util" Abhängigkeit funktioniert für mich so: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
Darmis
Ich habe ReferenceError: util is not definedohne vorher eingeschlossen, dass const util = require("util")ich sowohl im Electon-Haupt- als auch im Render-Prozess ohne Glück getestet habe. Davon abgesehen hat es ab Knoten 12.14.1 CLI funktioniert. Ich denke, es ist sicher zu sagen, dass Sie util definieren sollten, um auf der sicheren Seite zu sein, basierend auf dem Anwendungsfall.
Benargee
Das funktioniert fast: Es kopiert die Zeichenfolge mit einfachen Anführungszeichen. Weiß jemand, wie man dieses Verhalten verhindert?
m4cbeth
3

Ich habe es geschafft, indem ich eine andere Anwendung erstellt habe, die dies handhabt. Es ist sicherlich nicht der beste Weg, aber es funktioniert.

Ich bin unter Windows und habe eine VB.NET-Anwendung erstellt:

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

Dann habe ich in Node.js child_process.execdie VB.NET-Anwendung ausgeführt, wobei die zu kopierenden Daten als Befehlszeilenargument übergeben wurden:

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

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);
pimvdb
quelle
Denken Sie, Sie könnten dies direkt in der Befehlszeile tun? Wenn ich eine App dafür schreibe, muss ich sie für Mac, Linux und Windows kompilieren.
Turm
@rFactor: Ich fürchte, ich habe überhaupt keine Erfahrung mit Mac / Linux und kenne keinen eingebauten Befehl für die Zwischenablage.
Pimvdb
Ich benutze den Befehl 'echo "test foo bar" | clip ', es funktioniert. aber das Ergebnis hat einen Zeilenumbruch \ n, es bricht meine Arbeit ...
LIXer
3

Mac hat eine native Befehlszeile pbcopyfür diesen Anwendungsfall:

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

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

Gleicher Code für Linux aber ersetzen pbcopymit xclip ( apt get install xclip)

FGRibreau
quelle
Interessant! Glauben Sie, dass es auch eine Windows-Möglichkeit gibt, dies zu tun? Und was ist mit der Bündelung von xclip in meinem Programm, da ich den Benutzer nicht bitten möchte, xclip zu installieren.
Turm
1
Ich habe festgestellt, dass Windows etwas enthält : echo fooo | clip. Wie kann man dies unter Linux haben, ohne den Benutzer zu bitten, etwas zu installieren?
Turm
echo fooo | clipkann funktionieren, aber das Ergebnis enthält ein '\ n' am Ende der ursprünglichen Zeichenfolge. Es liegt außerhalb meiner Erwartungen.
LIXer
-5

Überprüfen Sie diese Nullplatine

npm install zeroclipboard

Damodaran
quelle
Dies scheint für einen Browser zu sein, nicht für eine NodeJS-Desktopanwendung.
Scott Rippey
1
Dies verwendet auch Flash, was eine schlechte Idee zu sein scheint.
CallMeNorm