Копіювати в буфер обміну в Node.js?


86

Чи можна скопіювати в буфер обміну в Node.js? Будь-які модулі чи ідеї, що коли-небудь? Я використовую Node.js у настільному додатку. Сподіваюся, це зрозуміло, чому я хочу, щоб це могло цього досягти.

Відповіді:


18

Буфер обміну не властивий операційній системі. Це конструкція будь-якої віконної системи, в якій працює операційна система. Отже, якщо ви хочете, щоб це працювало, наприклад, на X, вам знадобляться прив'язки до Xlib та / або XCB. Прив'язки Xlib для вузла насправді існують: https://github.com/mixu/nwm . Хоча я не впевнений, чи він надає вам доступ до буфера обміну X, ви можете в кінцевому підсумку написати свій власний. Вам знадобляться окремі палітурки для вікон.

редагувати: якщо ви хочете зробити щось хакі, ви також можете використовувати 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);
});

Наявність хромового еквівалента copy () було б неймовірним.

93

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

Це краще, ніж модуль "copy-paste", оскільки він також підтримує двобайтові символи. Але це має проблему з 32-розрядною ОС Windows.
Понмуді В.Н.

1
Виправлено підтримку 32-розрядної версії @PonmudiVN для Windows: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus

Я встановив npm çlipboardyу cypress. У мене є кнопка у моєму веб-додатку, після натискання цієї кнопки слід отримати вміст буфера обміну, але це дає невизначене, будь-які введені
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-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, щоб бути у безпеці на основі випадку використання.
Benargee

Це майже працює: він копіює рядок з одинарними лапками навколо нього. Хтось знає, як запобігти цій поведінці?
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
    }
);

Як ви думаєте, чи могли б ви це зробити безпосередньо в командному рядку? Написання програми для цього означає, що мені потрібно скомпілювати її для Mac, Linux та Windows.
Вежа

@rFactor: Я взагалі не маю досвіду роботи з Mac / Linux, боюся, і я не знаю вбудованої команди буфера обміну.
pimvdb

Я використовую команду 'echo "test foo bar" | кліп ', це працює. але результат має розрив рядка \ n, це порушує мою роботу ...
LIXer

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)


Цікаво! Як ви думаєте, чи є спосіб для Windows також це зробити? А як щодо пакетування xclip у моїй програмі, оскільки я не хотів би просити користувача встановити xclip.
Вежа

1
Я виявив , що є що - то в Windows: echo fooo | clip. Тепер, як це мати в Linux, не просячи користувача встановити щось?
Вежа

echo fooo | clipможе працювати, але результат буде містити '\ n' в кінці первинного рядка, це не очікується.
LIXer

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.