Скопировать в буфер обмена в Node.js? - PullRequest
56 голосов
/ 15 октября 2011

Есть ли способ скопировать в буфер обмена в Node.js? Какие-нибудь модули или идеи, что так всегда? Я использую Node.js в настольном приложении. Надеюсь, это прояснит, почему я хочу, чтобы это было в состоянии достичь этого.

Ответы [ 8 ]

60 голосов
/ 06 декабря 2012

Для OS X:

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

write() может принимать буфер или строку. Кодировка по умолчанию для строки будет utf-8.

34 голосов
/ 01 апреля 2017

Выезд clipboardy. Это позволяет копировать / вставлять кросс-платформенный. Он поддерживается более активно, чем copy-paste модуль , упомянутый в другом ответе, и устраняет многие проблемы этого модуля.

const clipboardy = require('clipboardy');

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

// Paste
clipboardy.readSync();
//?
29 голосов
/ 23 августа 2012

Вот модуль, который обеспечивает функции copy и paste: https://github.com/xavi-/node-copy-paste

Когда выполняется require("copy-paste").global(), добавляются две глобальные функции:

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

Как и многие другие упомянутые ответы, чтобы скопировать и вставить в узел, вам нужно вызвать внешнюю программу. В случае node-copy-paste он вызывает pbcopy/pbpaste (для OSX), xclip (для Linux) и clip (для окон).

Этот модуль был очень полезен, когда я много работал над REPL для стороннего проекта. Само собой разумеется, copy-paste - это только утилита командной строки - она ​​ не предназначена для работы сервера.

16 голосов
/ 16 октября 2011

Буфер обмена не присущ операционной системе. Это конструкция любой оконной системы, в которой работает операционная система. Поэтому, если вы хотите, чтобы это работало, например, на X, вам понадобятся привязки к Xlib и / или XCB. Привязки Xlib для узла на самом деле существуют: https://github.com/mixu/nwm. Хотя я не уверен, дает ли он вам доступ к буферу обмена X, вы можете в конечном итоге написать свой собственный. Вам понадобятся отдельные привязки для окон.

edit: если вы хотите сделать что-то хакерское, вы также можете использовать 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);
});
7 голосов
/ 26 августа 2016

Кратчайший путь в Windows:

require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));
2 голосов
/ 15 октября 2011

Мне удалось сделать это, создав другое приложение, которое обрабатывает это.Это, конечно, не лучший способ, но он работает.

Я нахожусь в Windows и создал приложение 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

Затем в Node.js я использовал child_process.execдля запуска приложения VB.NET с копируемыми данными, передаваемыми в качестве аргумента командной строки:

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

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);
1 голос
/ 16 октября 2011

Mac имеет собственную командную строку pbcopy для этого варианта использования:

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

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

Тот же код для Linux, но замените pbcopy на Xclip (apt get install xclip)

0 голосов
/ 21 декабря 2012

отметьте это zeroclipboard

npm установить zeroclipboard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...