Node.js'de panoya kopyalansın mı?


93

Node.js'de panoya kopyalamanın bir yolu var mı? Herhangi bir modül veya fikir var mı? Bir masaüstü uygulamasında Node.js kullanıyorum. Umarım bu, neden bunu başarabilmesini istediğimi açıklar.

Yanıtlar:


19

Bir pano, bir işletim sistemine özgü değildir. Bu, işletim sisteminin çalıştırdığı pencere sisteminin bir yapısıdır. Örneğin, bunun X üzerinde çalışmasını istiyorsanız, Xlib ve / veya XCB'ye bağlanmanız gerekir. Düğüm için Xlib bağlamaları aslında mevcuttur: https://github.com/mixu/nwm . Size X panosuna erişim izni verip vermediğinden emin olmasam da, kendinizinkini yazabilirsiniz. Windows için ayrı bağlamalara ihtiyacınız olacak.

düzenleme: Keskin bir şey yapmak istiyorsanız, xclip'i de kullanabilirsiniz:

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 () 'nin krom eşdeğeri olması harika olurdu.

96

OS X için:

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

write()bir tampon veya dizge alabilir. Bir dizenin varsayılan kodlaması utf-8 olacaktır.


Bu, REPL'deki hızlı veri dönüşümleri için çok kullanışlıdır.
William

80

Kontrol edin clipboardy. Çapraz platform kopyalamanıza / yapıştırmanıza izin verir. Başka bir cevapta bahsedilencopy-paste modülden daha aktif bir şekilde korunur ve bu modülün sorunlarının çoğunu düzeltir.

const clipboardy = require('clipboardy');

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

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

Çift bayt karakterleri de desteklediği için "kopyala-yapıştır" modülünden daha iyidir. Ancak bunun Windows 32 bit işletim sistemi ile ilgili bir sorunu var.
Ponmudi VN

1
@PonmudiVN Windows 32 bit desteği düzeltildi: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus

Selvi çlipboardyiçinde npm yüklemesi yaptım. Web uygulamamda bir düğme var, bu düğmeye tıklandığında pano içeriğini almalı ama tanımsız veriyor, herhangi bir giriş çok takdir ediliyor stackoverflow.com/questions/61650737/…
soccerway

31

İşte sağlayan copyve pasteişlev gören bir modül : https://github.com/xavi-/node-copy-paste

Ne zaman require("copy-paste").global()yürütüldüğünde, iki küresel fonksiyonlar eklenir:

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

Bahsedilen diğer cevapların çoğu gibi, düğümü kopyalayıp yapıştırmak için harici bir programa başvurmanız gerekir. Durumda, (OSX için), (linux için) ve (Windows için) node-copy-pasteçağırır .pbcopy/pbpastexclipclip

Bu modül, bir yan proje için REPL'de çok iş yaparken çok yardımcı oldu. Söylemeye gerek yok, copy-pastesadece bir komut satırı aracıdır - bu olduğunu değil sunucu çalışmaları için geliyordu.


2
Bu en iyi cevap. Çapraz platformdur ve olması gerektiği gibi çalışır.
gilly3

1
SO politikası uğruna kendi kodunuzu eklemek isteyebilirsiniz
towc

18

Windows'ta en kısa yol:

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

1
İşler! teşekkür ederim ... Ama önce ihtiyacın var util.
LIXer

2
Teşekkürler! "kullanım" bağımlılığına gerek yok benim için şu şekilde çalışır: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis

Bende ReferenceError: util is not definedilk içermeden const util = require("util")ben hem Electon main test edilmiş ve hiçbir şans ile süreci işlemek. 12.14.1 CLI düğümünden işe yaradığı söyleniyor. Kullanım durumuna göre faydayı güvenli tarafta tanımlamanız gerektiğini söyleyebilirim.
Benargee

Bu neredeyse işe yarıyor: dizeyi etrafındaki tek tırnak işaretleriyle kopyalar. Bu davranışı nasıl önleyeceğini bilen var mı?
m4cbeth

3

Bunu işleyen farklı bir uygulama oluşturarak başardım. Kesinlikle en iyi yol değil, ama işe yarıyor.

Windows kullanıyorum ve bir VB.NET uygulaması oluşturdum:

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

Daha sonra Node.js'de, child_process.execkopyalanacak veriler komut satırı argümanı olarak iletilerek VB.NET uygulamasını çalıştırırdım:

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

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

Bunu doğrudan komut satırı içinden yapabileceğinizi düşünüyor musunuz? Bunun için bir uygulama yazmak, onu Mac, Linux ve Windows için derlemem gerektiği anlamına geliyor.
Tower

@rFactor: Korkarım ki Mac / Linux ile hiçbir deneyimim yok ve yerleşik bir pano komutunun farkında değilim.
pimvdb

'Echo "test foo bar" komutunu kullanıyorum | klip ', işe yarıyor. ama sonuçta satır sonu \ n, işimi bozuyor ...
LIXer

3

Mac, bu kullanım durumu için yerel bir komut satırına sahiptir 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 için aynı kod ancak Xclip ( ) pbcopyile değiştirinapt get install xclip


İlginç! Sizce bunu yapmanın bir Windows yolu var mı? Kullanıcıdan xclip'i yüklemesini istemediğim için programımda xclip'i paketlemeye ne dersiniz?
Kule

1
Ben bir şey Windows bulunuyor çevrede: echo fooo | clip. Şimdi, kullanıcıdan bir şey yüklemesini istemeden bunu Linux'ta nasıl elde edebilirim?
Kule

echo fooo | clipişe yarayabilir, ancak sonuç ilk dizgenin sonunda bir '\ n' içerecek, bu benim beklentilerimin dışında.
LIXer

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.