2011-10-15 32 views
29

C'è un modo per copiare negli appunti in Node.js? Qualche modulo o idea che cosa mai? Sto usando Node.js su un'applicazione desktop. Spero che chiarisca perché voglio che sia in grado di raggiungere questo obiettivo.Copia negli appunti in Node.js?

risposta

13

Un blocco appunti non è inerente a un sistema operativo. È un costrutto di qualsiasi sistema di finestre sul quale il sistema operativo è in esecuzione. Quindi, se vuoi che questo funzioni su X, ad esempio, avrai bisogno di collegamenti a Xlib e/o XCB. Esistono effettivamente collegamenti Xlib per il nodo: https://github.com/mixu/nwm. Anche se non sono sicuro che ti dia accesso agli appunti X, potresti finire per scrivere il tuo. Avrai bisogno di collegamenti separati per Windows.

Edit: Se si vuole fare qualcosa hacky, si potrebbe 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); 
}); 
2

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

Sono su Windows e 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 

Poi nel Node.js, ho usato child_process.exec per eseguire l'applicazione VB.NET, con i dati da copiare passato 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 
    } 
); 
+0

Pensi di riuscire a farlo direttamente dalla riga di comando? Scrivere un'app per questo significa che ho bisogno di compilarlo per Mac, Linux e Windows. – Tower

+0

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

+1

C'è un comando 'clip' su Windows, IIRC. –

1

Mac ha una linea di comando nativo pbcopy per 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 sostituire pbcopy con Xclip (apt get install xclip)

+0

Interessante! Pensi che ci sia un modo per farlo anche con Windows? E per quanto riguarda il bundling di xclip nel mio programma come non vorrei chiedere all'utente di installare xclip. – Tower

+1

Ho trovato che c'è qualcosa in Windows: 'echo fooo | clip'. Ora, come avere questo in Linux senza chiedere all'utente di installare qualcosa? – Tower

+0

'echo fooo | clip' può funzionare, ma il risultato conterrà un '\ n' sull'ultimo della stringa principale, è fuori dalla mia aspettativa. – LIXer

21

Ecco un modulo che forniscono copy e paste funzioni: https://github.com/xavi-/node-copy-paste

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

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

Come molti degli altri risposta accennato, da copiare e incollare nel nodo è necessario chiamare fuori ad un esterno programma. Nel caso di node-copy-paste, chiama pbcopy/pbpaste (per OSX), xclip (per linux) e clip (per Windows).

Questo modulo è stato molto utile quando stavo facendo un sacco di lavoro nel REPL per un progetto parallelo. Inutile dire che copy-paste è solo un'utilità da riga di comando - è non destinata al funzionamento del server.

+2

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

40

Per OS X:

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

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

-3

controllo questo zeroclipboard

npm installare zeroclipboard

+0

Questo sembra essere per un browser, non un'applicazione desktop NodeJS. –

+0

Anche questo utilizza il flash, che sembra una cattiva idea. – CallMeNorm

5

via più breve in Windows:

require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard")); 
+1

funziona! grazie ... Ma prima devo richiedere 'util'. – LIXer

+0

Grazie! non c'è bisogno che la dipendenza "util" funzioni in questo modo: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard"); – darmis

7

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

const clipboardy = require('clipboardy'); 

// Copy 
clipboardy.writeSync(''); 

// Paste 
clipboardy.readSync(''); 
+1

Questo modulo funziona perfettamente ed è ben mantenuto. – SamVerschueren

+0

È migliore del modulo "copia-incolla" poiché supporta anche caratteri a doppio byte. Ma questo ha un problema con il sistema operativo Windows 32 bit. –

+1

@PonmudiVN Il supporto per Windows a 32 bit è stato corretto: https://github.com/sindresorhus/clipboardy/commit/3be3ee6b9b9cd736623fcc8ebb1aa9e0c42371b4 –

Problemi correlati