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.

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);
});

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.


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();
//🦄

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.


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"));

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
    }
);

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)


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.