Скопировать в буфер обмена в Node.js?

87

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

Башня
источник

Ответы:

18

Буфер обмена не присущ операционной системе. Это конструкция любой оконной системы, в которой работает операционная система. Поэтому, если вы хотите, чтобы это работало, например, на 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);
});
chjj
источник
Было бы здорово иметь хромовый эквивалент copy ().
94

Для OS X:

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

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

Бенджамин Аткин
источник
Это очень полезно для быстрого преобразования данных в REPL.
Уильям
73

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

const clipboardy = require('clipboardy');

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

// Paste
clipboardy.readSync();
//🦄
Синдре Сорхус
источник
Он лучше, чем модуль «копировать-вставить», так как поддерживает и двухбайтовые символы. Но это проблема с 32-битной ОС Windows.
Ponmudi VN
1
@PonmudiVN Исправлена ​​поддержка 32-разрядной версии Windows: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus
Я установил npm çlipboardyв кипарисе. У меня есть кнопка в моем веб-приложении, при нажатии на эту кнопку должно появиться содержимое буфера обмена, но он дает undefined, любые входные данные очень ценятся stackoverflow.com/questions/61650737/…
soccerway
30

Вот модуль, который предоставляет 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 вам необходимо вызвать внешнюю программу. В случае node-copy-paste, он обращается к pbcopy/pbpaste(для OSX), xclip(для Linux) и clip(для Windows).

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

Хави
источник
2
Это лучший ответ. Он кроссплатформенный и работает так, как должен.
gilly3
1
возможно, вы захотите добавить свой собственный код, ради политики SO
Towc
16

Самый короткий способ в Windows:

const util = require("util");
require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));
Эрнст Эрнст
источник
1
работает! спасибо ... Но utilсначала нужно потребовать .
LIXer
2
Благодарность! у меня нет необходимости в зависимости «util» работает так: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
Дармис
Я получил ReferenceError: util is not definedбез предварительного включения, const util = require("util")я безуспешно тестировал как в основном, так и в процессе рендеринга Electon. При этом от узла 12.14.1 CLI это сработало. Я думаю, можно с уверенностью сказать, что вы должны определить util, чтобы быть в безопасности, исходя из варианта использования.
Бенарджи,
Это почти работает: строка копируется в одинарные кавычки. Кто-нибудь знает, как предотвратить такое поведение?
m4cbeth
3

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

Я в 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
    }
);
pimvdb
источник
Как вы думаете, можно ли сделать это напрямую из командной строки? Написание приложения для этого означает, что мне нужно скомпилировать его для Mac, Linux и Windows.
Башня
@rFactor: Боюсь, что у меня нет опыта работы с Mac / Linux, и я не знаю о встроенной команде буфера обмена.
pimvdb
Я использую команду 'echo "test foo bar" | clip ', это работает. но результат имеет разрыв строки \ n, это
мешает
3

У 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)

FGRibreau
источник
Интересно! Как вы думаете, есть ли способ сделать это в Windows? А как насчет включения xclip в мою программу, поскольку я бы не хотел просить пользователя установить xclip.
Башня,
1
Я обнаружил , что есть что - то в Windows: echo fooo | clip. Теперь, как сделать это в Linux, не прося пользователя что-то установить?
Tower
echo fooo | clipможет работать, но результат будет содержать '\ n' в последней строке первичной строки, это выходит за рамки моих ожиданий.
LIXer
-5

проверь этот zeroclipboard

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

Дамодаран
источник
Это похоже на браузер, а не на настольное приложение NodeJS.
Скотт Риппи,
1
Здесь также используется вспышка, что кажется плохой идеей.
CallMeNorm