Skopiować do schowka w Node.js?


86

Czy istnieje sposób kopiowania do schowka w Node.js? Jakieś moduły lub pomysły, co tak zawsze? Używam Node.js w aplikacji komputerowej. Mam nadzieję, że to wyjaśnia, dlaczego chcę, aby to było możliwe.

Odpowiedzi:


18

Schowek nie jest nieodłącznym elementem systemu operacyjnego. Jest to konstrukcja dowolnego systemu okiennego, w którym działa system operacyjny. Więc jeśli chcesz, aby to działało na przykład na X, potrzebujesz powiązań z Xlib i / lub XCB. W rzeczywistości istnieją powiązania Xlib dla węzła: https://github.com/mixu/nwm . Chociaż nie jestem pewien, czy daje to dostęp do schowka X, możesz napisać własny. Będziesz potrzebował oddzielnych powiązań dla systemu Windows.

edycja: Jeśli chcesz zrobić coś hackerskiego, możesz również użyć 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);
});

Posiadanie chromowego odpowiednika funkcji copy () byłoby niesamowite.

94

Dla OS X:

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

write()może przyjąć bufor lub łańcuch. Domyślne kodowanie dla łańcucha to utf-8.


Jest to przydatne do szybkich przekształceń danych w REPL.
William

73

Sprawdź clipboardy. Pozwala kopiować / wklejać między platformami. Jest bardziej aktywnie obsługiwany niż copy-pastemoduł wymieniony w innej odpowiedzi i rozwiązuje wiele problemów z tym modułem.

const clipboardy = require('clipboardy');

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

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

Jest lepszy niż moduł „kopiuj-wklej”, ponieważ obsługuje również znaki dwubajtowe. Ale ma to problem z 32-bitowym systemem operacyjnym Windows.
Ponmudi VN

1
@PonmudiVN Wsparcie dla 32-bitowego systemu Windows zostało naprawione: github.com/sindresorhus/clipboardy/commit/ ...
Sindre Sorhus

Zrobiłem npm install çlipboardyw cypress, mam przycisk w mojej aplikacji internetowej, po kliknięciu tego przycisku powinno dostać się zawartość schowka, ale daje to niezdefiniowane, wszelkie dane wejściowe są bardzo cenione stackoverflow.com/questions/61650737/ ...
soccerway

30

Oto moduł, który zapewnia copyi pastedziała: https://github.com/xavi-/node-copy-paste

Po require("copy-paste").global()uruchomieniu dodawane są dwie funkcje globalne:

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

Podobnie jak w przypadku wielu innych wymienionych odpowiedzi, aby skopiować i wkleić w węźle, musisz wywołać zewnętrzny program. W przypadku node-copy-paste, wywołuje pbcopy/pbpaste(dla OSX), xclip(dla Linuksa) i clip(dla Windows).

Ten moduł był bardzo pomocny, gdy wykonywałem dużo pracy w REPL dla pobocznego projektu. Rzecz jasna, copy-pasteto tylko narzędzie wiersza polecenia - to nie oznaczało dla pracy serwera.


2
To najlepsza odpowiedź. Jest wieloplatformowy i działa tak, jak powinien.
gilly3

1
możesz chcieć dodać swój własny kod, ze względu na politykę SO
towc

16

Najkrótsza droga w systemie Windows:

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

1
Pracuje! dziękuję ... ale utilnajpierw muszę wymagać .
LIXer

2
Dzięki! nie ma potrzeby, aby zależność "util" działała u mnie w ten sposób: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis

Dostałem ReferenceError: util is not definedbez wcześniejszego włączenia const util = require("util"), przetestowałem zarówno w głównym procesie Electon, jak i procesie renderowania bez powodzenia. To powiedziawszy z węzła 12.14.1 CLI, zadziałało. Myślę, że można bezpiecznie powiedzieć, że powinieneś zdefiniować narzędzie jako bezpieczne w oparciu o przypadek użycia.
Benargee

To prawie działa: kopiuje ciąg znaków otoczony pojedynczymi cudzysłowami. Czy ktoś wie, jak temu zapobiec?
m4cbeth

3

Udało mi się to zrobić, tworząc inną aplikację, która to obsługuje. Z pewnością nie jest to najlepszy sposób, ale działa.

Korzystam z systemu Windows i utworzyłem aplikację 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

Następnie w Node.js child_process.execuruchamiałem aplikację VB.NET, z danymi do skopiowania przekazywanymi jako argument wiersza poleceń:

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

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

Czy myślisz, że mógłbyś to zrobić bezpośrednio w wierszu poleceń? Napisanie aplikacji w tym celu oznacza, że ​​muszę ją skompilować dla komputerów Mac, Linux i Windows.
Tower

@rFactor: Obawiam się, że nie mam żadnego doświadczenia z systemem Mac / Linux i nie znam polecenia wbudowanego w schowek.
pimvdb

Używam polecenia „echo" test foo bar "| clip ”, to działa. ale wynik ma podział wiersza \ n, to przerywa mi pracę ...
LIXer,

3

Mac ma natywną linię poleceń pbcopydla tego przypadku:

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

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

Ten sam kod dla Linuksa, ale zastąpić pbcopyz Xclip ( apt get install xclip)


Ciekawy! Czy uważasz, że istnieje sposób na to również w systemie Windows? A co z dołączeniem xclip do mojego programu, ponieważ nie chciałbym prosić użytkownika o zainstalowanie xclip.
Tower

1
Znalazłem tam coś w systemie Windows: echo fooo | clip. A teraz, jak mieć to w Linuksie bez pytania użytkownika o instalację?
Tower

echo fooo | clipmoże działać, ale wynik będzie zawierał „\ n” na końcu pierwotnego ciągu, jest to niezgodne z moim oczekiwaniem.
LIXer

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.