Salin ke clipboard di Node.js?

93

Apakah ada cara untuk menyalin ke clipboard di Node.js? Ada modul atau ide apa saja? Saya menggunakan Node.js pada aplikasi desktop. Mudah-mudahan itu menjelaskan mengapa saya ingin bisa mencapai ini.

Menara
sumber

Jawaban:

19

Papan klip tidak melekat pada sistem operasi. Ini adalah konstruksi dari sistem jendela apa pun yang kebetulan sedang dijalankan oleh sistem operasi. Jadi, jika Anda ingin ini berfungsi pada X misalnya, Anda memerlukan binding ke Xlib dan / atau XCB. Binding Xlib untuk node sebenarnya ada: https://github.com/mixu/nwm . Meskipun saya tidak yakin apakah itu memberi Anda akses ke papan klip X, Anda mungkin akhirnya menulis milik Anda sendiri. Anda membutuhkan binding terpisah untuk windows.

edit: Jika Anda ingin melakukan sesuatu yang hacky, Anda juga dapat menggunakan 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);
});
chjj
sumber
Memiliki kromium yang setara dengan copy () akan luar biasa.
96

Untuk OS X:

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

write()dapat mengambil buffer atau string. Pengkodean default untuk string adalah utf-8.

Benjamin Atkin
sumber
Ini sangat berguna untuk transformasi data cepat di REPL.
William
80

Lihat clipboardy. Ini memungkinkan Anda menyalin / menempel lintas platform. Ini lebih aktif dipelihara daripada copy-pastemodul yang disebutkan dalam jawaban lain dan memperbaiki banyak masalah modul itu.

const clipboardy = require('clipboardy');

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

// Paste
clipboardy.readSync();
//🦄
Sindre Sorhus
sumber
Ini lebih baik daripada modul "copy-paste" karena mendukung karakter byte ganda juga. Tetapi ini memiliki masalah dengan OS windows 32 bit.
Ponmudi VN
1
@PonmudiVN Dukungan Windows 32-bit telah diperbaiki: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus
Saya melakukan npm install çlipboardydi cypress. Saya memiliki tombol di aplikasi web saya, dengan mengklik tombol itu akan mendapatkan konten clipboard tetapi memberikan tidak ditentukan, input apa pun sangat dihargai stackoverflow.com/questions/61650737/…
soccerway
31

Berikut adalah modul yang menyediakan copydan pasteberfungsi: https://github.com/xavi-/node-copy-paste

Saat require("copy-paste").global()dijalankan, dua fungsi global ditambahkan:

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

Seperti banyak jawaban lain yang disebutkan, untuk menyalin dan menempel di node Anda perlu memanggil program eksternal. Dalam kasus node-copy-paste, itu memanggil pbcopy/pbpaste(untuk OSX), xclip(untuk linux), dan clip(untuk windows).

Modul ini sangat membantu ketika saya melakukan banyak pekerjaan di REPL untuk proyek sampingan. Tak perlu dikatakan, copy-pastehanya utilitas baris perintah - itu tidak dimaksudkan untuk pekerjaan server.

Xavi
sumber
2
Ini jawaban terbaik. Ini lintas platform dan berfungsi sebagaimana mestinya.
gilly3
1
mungkin ingin menambahkan itu kode Anda sendiri, demi kebijakan SO
towc
18

Cara terpendek di Windows:

const util = require("util");
require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));
Ernst Ernst
sumber
1
berhasil! terima kasih ... Tapi perlu meminta utildulu.
LIXer
2
Terima kasih! tidak perlu ketergantungan "util" yang bekerja untuk saya seperti itu: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis
Saya mendapatkan ReferenceError: util is not definedtanpa terlebih dahulu termasuk const util = require("util")saya menguji di kedua utama Electon dan proses render tidak berhasil. Yang dikatakan dari node 12.14.1 CLI itu berhasil. Saya pikir aman untuk mengatakan Anda harus mendefinisikan util agar berada di sisi yang aman berdasarkan kasus penggunaan.
Benargee
Ini hampir berhasil: ini menyalin string dengan tanda kutip tunggal di sekitarnya. Adakah yang tahu bagaimana mencegah perilaku ini?
m4cbeth
3

Saya berhasil melakukannya dengan membuat aplikasi berbeda yang menangani ini. Ini tentu bukan cara terbaik, tapi berhasil.

Saya menggunakan Windows dan membuat aplikasi 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

Kemudian di Node.js, saya biasa child_process.execmenjalankan aplikasi VB.NET, dengan data yang akan disalin diteruskan sebagai argumen baris perintah:

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

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);
pimvdb.dll
sumber
Apakah Anda pikir Anda dapat melakukan ini dalam baris perintah secara langsung? Menulis aplikasi untuk ini berarti saya perlu mengkompilasinya untuk Mac, Linux dan Windows.
Menara
@rFactor: Saya tidak memiliki pengalaman sama sekali dengan Mac / Linux, dan saya tidak mengetahui perintah clipboard bawaan.
pimvdb
Saya menggunakan perintah 'echo "test foo bar" | klip ', berhasil. tetapi hasilnya memiliki jeda baris \ n, itu merusak pekerjaan saya ...
LIXer
3

Mac memiliki baris perintah asli pbcopyuntuk usecase ini:

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

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

Kode yang sama untuk Linux tetapi ganti pbcopydengan Xclip ( apt get install xclip)

FGRibreau
sumber
Menarik! Apakah menurut Anda ada cara Windows untuk melakukan ini juga? Dan bagaimana dengan memaketkan xclip dalam program saya karena saya tidak ingin meminta pengguna untuk menginstal xclip.
Menara
1
Saya menemukan ada sesuatu pada Windows: echo fooo | clip. Sekarang, bagaimana memiliki ini di Linux tanpa meminta pengguna untuk menginstal sesuatu?
Menara
echo fooo | clipdapat bekerja, tetapi hasilnya akan berisi '\ n' di akhir string utama, itu di luar dugaan saya.
LIXer
-5

periksa zeroclipboard ini

npm instal zeroclipboard

Damodaran
sumber
Tampaknya ini untuk browser, bukan aplikasi desktop NodeJS.
Scott Rippey
1
Ini juga menggunakan flash, yang sepertinya ide yang buruk.
CallMeNorm