2011-10-15 170 views
29

有沒有一種方法可以在Node.js中複製到剪貼板?任何模塊或想法都是如此嗎?我在桌面應用程序上使用Node.js。希望這清楚了爲什麼我希望它能夠實現這一點。複製到Node.js中的剪貼板?

回答

13

剪貼板不是操作系統固有的。它是操作系統正在運行的任何窗口系統的結構。因此,如果您希望以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); 
}); 
2

我設法通過創建一個不同的應用程序來處理這個。這當然不是最好的方式,但它是有效的。

我在Windows和創建VB.NET應用程序:在Node.js的

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 

然後,我用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 
    } 
); 
+0

您是否認爲您可以直接在命令行中執行此操作?爲此編寫應用程序意味着我需要爲Mac,Linux和Windows編譯它。 – Tower

+0

@rFactor:我完全沒有使用Mac/Linux的經驗,但我並不知道內置的剪貼板命令。 – pimvdb

+1

在Windows上有一個'clip'命令,IIRC。 –

1

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,但替換pbcopyXclipapt get install xclip

+0

有趣!你認爲有Windows方式也可以這麼做嗎?那麼在我的程序中綁定xclip,因爲我不想讓用戶安裝xclip。 – Tower

+1

我發現Windows中有東西:'echo fooo | clip'。現在,如何在Linux中不要求用戶安裝某些東西? – Tower

+0

'echo fooo | clip'可以工作,但結果會在原始字符串的最後包含'\ n',這超出了我的期望。 – LIXer

21

這裏是一個模塊,提供copypaste功能: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

40

對於OS X:

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

write()可以採取緩衝劑或字符串。字符串的默認編碼將是utf-8。

-3

檢查這個zeroclipboard

NPM安裝zeroclipboard

+0

這似乎是用於瀏覽器,而不是NodeJS桌面應用程序。 –

+0

這也使用閃光燈,這似乎是一個壞主意。 – CallMeNorm

5

最短的方式在Windows中:

require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard")); 
+1

作品!謝謝你......但需要首先需要'util'。 – LIXer

+0

謝謝!不需要像'util'這樣的依賴對我有用:require('child_process')。spawn('clip')。stdin.end(「content_for_the_clipboard」); – darmis

7

退房clipboardy。它可以讓你複製/粘貼跨平臺。在另一個答案中,它比copy-paste模塊mentioned更積極地維護,它修復了該模塊的許多問題。

const clipboardy = require('clipboardy'); 

// Copy 
clipboardy.writeSync(''); 

// Paste 
clipboardy.readSync(''); 
+1

此模塊完美工作,維護良好。 – SamVerschueren

+0

它比「複製粘貼」模塊更好,因爲它也支持雙字節字符。但是這與Windows 32位操作系統有關。 –

+1

@PonmudiVN Windows 32位支持已修復:https://github.com/sindresorhus/clipboardy/commit/3be3ee6b9b9cd736623fcc8ebb1aa9e0c42371b4 –