Copiare negli appunti in Node.js?


93

C'è un modo per copiare negli appunti in Node.js? Eventuali moduli o idee che cosa così mai? Sto usando Node.js su un'applicazione desktop. Spero che questo chiarisca perché voglio che sia in grado di raggiungere questo obiettivo.

Risposte:


19

Gli appunti non sono inerenti a un sistema operativo. È un costrutto di qualunque sistema a finestre il sistema operativo sia in esecuzione. Quindi, se vuoi che funzioni su X, ad esempio, avrai bisogno di collegamenti a Xlib e / o XCB. I collegamenti Xlib per il nodo esistono effettivamente: https://github.com/mixu/nwm . Anche se non sono sicuro che ti dia accesso agli appunti X, potresti finire per scriverne uno tuo. Avrai bisogno di associazioni separate per Windows.

modifica: se vuoi fare qualcosa di hacky, potresti anche usare 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);
});

Avere un equivalente in cromo di copy () sarebbe fantastico.

96

Per OS X:

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

write()può richiedere un buffer o una stringa. La codifica predefinita per una stringa sarà utf-8.


Ciò è molto utile per trasformazioni rapide dei dati in REPL.
William

80

Controlla clipboardy. Ti consente di copiare / incollare multipiattaforma. È mantenuto più attivamente rispetto al copy-pastemodulo menzionato in un'altra risposta e risolve molti dei problemi di quel modulo.

const clipboardy = require('clipboardy');

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

// Paste
clipboardy.readSync();
//🦄

È meglio del modulo "copia-incolla" in quanto supporta anche i caratteri a doppio byte. Ma questo ha un problema con il sistema operativo Windows a 32 bit.
Ponmudi VN

1
@PonmudiVN Il supporto per Windows a 32 bit è stato corretto: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus

Ho installato npm çlipboardyin cipresso, ho un pulsante nella mia applicazione web, facendo clic su quel pulsante dovrebbe ottenere il contenuto degli appunti ma dà undefined, eventuali input sono molto apprezzati stackoverflow.com/questions/61650737/…
soccerway

31

Ecco un modulo che fornisce copye pastefunzioni: https://github.com/xavi-/node-copy-paste

Quando require("copy-paste").global()viene eseguito, vengono aggiunte due funzioni globali:

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

Come molte delle altre risposte menzionate, per copiare e incollare nel nodo è necessario chiamare un programma esterno. Nel caso di node-copy-paste, chiama pbcopy/pbpaste(per OSX), xclip(per linux) eclip (per Windows).

Questo modulo è stato molto utile quando stavo lavorando molto in REPL per un progetto secondario. Inutile dire, copy-pasteè solo una linea di comando - è non pensato per il lavoro del server.


2
Questa è la migliore risposta. È multipiattaforma e funziona come dovrebbe.
gilly3

1
potresti voler aggiungere il tuo codice, per motivi di politica SO
Towc

18

Modo più breve in Windows:

const util = require("util");
require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));

1
lavori! grazie ... Ma prima è necessario richiedere util.
LIXer

2
Grazie! non c'è bisogno della dipendenza "util" per me funziona così: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis

Ho ottenuto ReferenceError: util is not definedsenza prima aver incluso const util = require("util")ho testato sia il processo principale che quello di rendering di Electon senza fortuna. Detto questo dal nodo 12.14.1 CLI ha funzionato. Penso che sia sicuro dire che dovresti definire util per essere al sicuro in base al caso d'uso.
Benargee

Funziona quasi: copia la stringa racchiusa tra virgolette singole. Qualcuno sa come prevenire questo comportamento?
m4cbeth

3

Sono riuscito a farlo creando un'applicazione diversa che lo gestisca. Non è certamente il modo migliore, ma funziona.

Sono su Windows e ho creato un'applicazione 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

Quindi in Node.js, ho usato child_process.execper eseguire l'applicazione VB.NET, con i dati da copiare passati come argomento della riga di comando:

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

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

Pensi di poterlo fare direttamente dalla riga di comando? Scrivere un'app per questo significa che devo compilarla per Mac, Linux e Windows.
Torre

@rFactor: Non ho alcuna esperienza con Mac / Linux, temo e non sono a conoscenza di un comando negli appunti integrato.
pimvdb

Uso il comando 'echo "test foo bar" | clip ', funziona. ma il risultato ha un'interruzione di riga \ n, interrompe il mio lavoro ...
LIXer

3

Il Mac ha una riga di comando nativa pbcopyper questo caso d'uso:

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

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

Stesso codice per Linux ma sostituito pbcopycon Xclip ( apt get install xclip)


Interessante! Pensi che ci sia anche un modo Windows per farlo? E per quanto riguarda il raggruppamento di xclip nel mio programma in quanto non vorrei chiedere all'utente di installare xclip.
Torre

1
Ho trovato che c'è qualcosa in Windows: echo fooo | clip. Ora, come averlo in Linux senza chiedere all'utente di installare qualcosa?
Torre

echo fooo | clippuò funzionare, ma il risultato conterrà una "\ n" nell'ultima stringa primaria, è fuori dalle mie aspettative.
LIXer

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.