Sao chép vào khay nhớ tạm trong Node.js?


87

Có cách nào bạn có thể sao chép vào khay nhớ tạm trong Node.js không? Bất kỳ mô-đun hoặc ý tưởng gì đã bao giờ? Tôi đang sử dụng Node.js trên một ứng dụng máy tính để bàn. Hy vọng rằng điều đó làm rõ lý do tại sao tôi muốn nó có thể đạt được điều này.

Câu trả lời:


18

Clipboard không phải là vốn có của một hệ điều hành. Đó là một cấu trúc của bất kỳ hệ thống cửa sổ nào mà hệ điều hành đang chạy. Vì vậy, nếu bạn muốn điều này hoạt động trên X chẳng hạn, bạn sẽ cần các ràng buộc với Xlib và / hoặc XCB. Các ràng buộc Xlib cho nút thực sự tồn tại: https://github.com/mixu/nwm . Mặc dù tôi không chắc liệu nó có cung cấp cho bạn quyền truy cập vào khay nhớ tạm X hay không, nhưng cuối cùng bạn có thể phải tự viết. Bạn sẽ cần các ràng buộc riêng biệt cho các cửa sổ.

chỉnh sửa: Nếu bạn muốn làm điều gì đó hacky, bạn cũng có thể sử dụng 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);
});

Có một lượng tương đương crôm của copy () sẽ thật tuyệt vời.

94

Đối với OS X:

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

write()có thể lấy một bộ đệm hoặc một chuỗi. Mã hóa mặc định cho một chuỗi sẽ là utf-8.


Điều này rất hữu ích cho việc chuyển đổi dữ liệu nhanh chóng trong REPL.
William

73

Kiểm tra clipboardy. Nó cho phép bạn sao chép / dán đa nền tảng. Nó được duy trì tích cực hơn so với copy-pastemô-đun được đề cập trong một câu trả lời khác và nó khắc phục nhiều vấn đề của mô-đun đó.

const clipboardy = require('clipboardy');

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

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

Nó tốt hơn mô-đun "copy-paste" vì nó cũng hỗ trợ các ký tự byte kép. Nhưng điều này có vấn đề với hệ điều hành windows 32 bit.
Ponmudi VN 19/07/17

1
@PonmudiVN Hỗ trợ Windows 32-bit đã được sửa: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus

Tôi đã cài đặt çlipboardynpm trong cypress.Tôi có một nút trong ứng dụng web của mình, khi nhấp vào nút đó sẽ nhận được nội dung khay nhớ tạm nhưng nó không xác định, bất kỳ đầu vào nào được đánh giá cao stackoverflow.com/questions/61650737/…
Soccerway

30

Đây là mô-đun cung cấp copypastehoạt động: https://github.com/xavi-/node-copy-paste

Khi require("copy-paste").global()được thực thi, hai hàm toàn cục được thêm vào:

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

Giống như nhiều câu trả lời khác được đề cập, để sao chép và dán vào nút, bạn cần gọi ra một chương trình bên ngoài. Trong trường hợp của node-copy-paste, nó gọi tới pbcopy/pbpaste(cho OSX), xclip(cho linux) và clip(cho windows).

Mô-đun này rất hữu ích khi tôi đang làm rất nhiều việc trong REPL cho một dự án phụ. Không cần phải nói, copy-pastechỉ là một tiện ích dòng lệnh - nó không dành cho công việc của máy chủ.


2
Đây là câu trả lời tốt nhất. Nó đa nền tảng và hoạt động theo cách mà nó cần.
gilly 3

1
có thể muốn thêm nó là mã của riêng bạn, vì lợi ích của chính sách SO
towc

16

Cách ngắn nhất trong Windows:

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

1
làm! cảm ơn bạn ... Nhưng cần phải yêu cầu utilđầu tiên.
LIXer

2
Cảm ơn! không cần sự phụ thuộc "tận dụng" hoạt động đối với tôi như vậy: request ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis

Tôi đã nhận được ReferenceError: util is not definedmà không có đầu tiên bao gồm const util = require("util")tôi đã thử nghiệm trong cả quá trình kết xuất và điện tử chính mà không may mắn. Điều đó đang được nói từ nút 12.14.1 CLI nó đã hoạt động. Tôi nghĩ rằng thật an toàn khi nói rằng bạn nên xác định tận dụng ở khía cạnh an toàn dựa trên trường hợp sử dụng.
Benargee

Điều này hầu như hoạt động: nó sao chép chuỗi với các dấu ngoặc kép xung quanh nó. Có ai biết cách ngăn chặn hành vi này không?
m4cbeth

3

Tôi đã quản lý để làm như vậy bằng cách tạo một ứng dụng khác xử lý việc này. Đó chắc chắn không phải là cách tốt nhất, nhưng nó hoạt động.

Tôi đang sử dụng Windows và đã tạo một ứng dụng 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

Sau đó, trong Node.js, tôi đã sử dụng child_process.execđể chạy ứng dụng VB.NET, với dữ liệu được sao chép được truyền dưới dạng đối số dòng lệnh:

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

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

Bạn có nghĩ rằng bạn có thể làm điều này trực tiếp trong dòng lệnh không? Viết một ứng dụng cho điều này có nghĩa là tôi cần phải biên dịch nó cho Mac, Linux và Windows.
Tháp

@rFactor: Tôi không hề có kinh nghiệm với Mac / Linux và tôi không biết về lệnh clipboard tích hợp sẵn.
pimvdb

Tôi sử dụng lệnh 'echo "test foo bar" | clip ', nó hoạt động. nhưng kết quả có ngắt dòng \ n, nó làm hỏng công việc của tôi ...
LIXer

3

Mac có một dòng lệnh pbcopyriêng cho usecase này:

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

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

Mã tương tự cho Linux nhưng thay thế pbcopybằng Xclip ( apt get install xclip)


Hấp dẫn! Bạn có nghĩ rằng cũng có một cách Windows để làm điều này không? Và điều gì về việc gói xclip trong chương trình của tôi vì tôi không muốn yêu cầu người dùng cài đặt xclip.
Tháp

1
Tôi thấy có điều gì đó trong Windows: echo fooo | clip. Bây giờ, làm thế nào để có điều này trong Linux mà không yêu cầu người dùng cài đặt thứ gì đó?
Tower

echo fooo | clipcó thể hoạt động, nhưng kết quả sẽ chứa '\ n' ở cuối chuỗi nguyên thủy, điều đó nằm ngoài dự đoán của tôi.
LIXer

-5

kiểm tra zeroclipboard này

npm cài đặt zeroclipboard


Điều này dường như dành cho một trình duyệt, không phải ứng dụng máy tính để bàn NodeJS.
Scott Rippey

1
Điều này cũng sử dụng đèn flash, có vẻ như là một ý tưởng tồi.
CallMeNorm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.