¿Copiar al portapapeles en Node.js?

86

¿Hay alguna forma de copiar al portapapeles en Node.js? ¿Algún módulo o idea que tal? Estoy usando Node.js en una aplicación de escritorio. Con suerte, eso aclara por qué quiero que pueda lograr esto.

Torre
fuente

Respuestas:

18

Un portapapeles no es inherente a un sistema operativo. Es una construcción de cualquier sistema de ventanas que el sistema operativo esté ejecutando. Entonces, si quisiera que esto funcionara en X, por ejemplo, necesitaría enlaces a Xlib y / o XCB. Los enlaces Xlib para el nodo realmente existen: https://github.com/mixu/nwm . Aunque no estoy seguro de si le da acceso al portapapeles X, es posible que termine escribiendo el suyo. Necesitará enlaces separados para ventanas.

editar: Si quieres hacer algo hacky, también puedes usar 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
fuente
Tener un equivalente en cromo de copy () sería genial.
94

Para OS X:

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

write()puede tomar un búfer o una cadena. La codificación predeterminada para una cadena será utf-8.

Benjamin Atkin
fuente
Esto es muy útil para transformaciones rápidas de datos en REPL.
William
73

Echa un vistazo clipboardy. Te permite copiar / pegar multiplataforma. Se mantiene más activamente que el copy-pastemódulo mencionado en otra respuesta y soluciona muchos de los problemas de ese módulo.

const clipboardy = require('clipboardy');

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

// Paste
clipboardy.readSync();
//🦄
Sindre Sorhus
fuente
Es mejor que el módulo "copiar y pegar", ya que también admite caracteres de doble byte. Pero esto tiene problemas con el sistema operativo Windows de 32 bits.
Ponmudi VN
1
@PonmudiVN Se ha corregido la compatibilidad con Windows de 32 bits: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus
Hice la instalación çlipboardyde npm en cypress. Tengo un botón en mi aplicación web, al hacer clic en ese botón debería obtener el contenido del portapapeles, pero no está definido, cualquier entrada es muy apreciada. Stackoverflow.com/questions/61650737/…
soccerway
30

Aquí hay un módulo que proporciona copyy pastefunciona: https://github.com/xavi-/node-copy-paste

Cuando require("copy-paste").global()se ejecuta, se agregan dos funciones globales:

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

Como muchas de las otras respuestas mencionadas, para copiar y pegar en el nodo, debe llamar a un programa externo. En el caso de node-copy-paste, llama a pbcopy/pbpaste(para OSX), xclip(para Linux) y clip(para Windows).

Este módulo fue muy útil cuando estaba trabajando mucho en el REPL para un proyecto paralelo. Ni que decir tiene, copy-pastees sólo una utilidad de línea de comandos - es no significaba para el trabajo del servidor.

Xavi
fuente
2
Esta es la mejor respuesta. Es multiplataforma y funciona como debería.
gilly3
1
es posible que desee agregar su propio código, por el bien de la política SO
Towc
16

Camino más corto en Windows:

const util = require("util");
require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard"));
Ernst Ernst
fuente
1
¡trabajos! gracias ... Pero necesito exigir utilprimero.
LIXer
2
¡Gracias! no es necesario que la dependencia "util" funcione para mí así: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis
Logré ReferenceError: util is not definedsin primero incluir const util = require("util")que probé tanto en el proceso principal como en el de renderizado de Electon sin suerte. Dicho esto, desde el nodo 12.14.1 CLI funcionó. Creo que es seguro decir que debe definir util para estar seguro según el caso de uso.
Benargee
Esto casi funciona: copia la cadena con comillas simples alrededor. ¿Alguien sabe cómo prevenir este comportamiento?
m4cbeth
3

Logré hacerlo creando una aplicación diferente que maneja esto. Ciertamente no es la mejor manera, pero funciona.

Estoy en Windows y creé una aplicación 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

Luego, en Node.js, solía child_process.execejecutar la aplicación VB.NET, con los datos que se copiarían pasados ​​como un argumento de línea de comando:

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

    function(err, stdout, stderr) {
        console.log(stdout); // to confirm the application has been run
    }
);
pimvdb
fuente
¿Crees que podrías hacer esto directamente desde la línea de comandos? Escribir una aplicación para esto significa que necesito compilarla para Mac, Linux y Windows.
Torre
@rFactor: Me temo que no tengo experiencia con Mac / Linux, y no tengo conocimiento de un comando integrado en el portapapeles.
pimvdb
Yo uso el comando 'echo "test foo bar" | clip ', funciona. pero el resultado tiene un salto de línea \ n, rompe mi trabajo ...
LIXer
3

Mac tiene una línea de comandos nativa pbcopypara este caso de uso:

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

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

Mismo código para Linux pero reemplaza pbcopycon Xclip ( apt get install xclip)

FGRibreau
fuente
¡Interesante! ¿Crees que también hay una forma de Windows para hacer esto? ¿Y qué hay de incluir xclip en mi programa? No quisiera pedirle al usuario que instale xclip.
Torre
1
He encontrado que hay algo en Windows: echo fooo | clip. Ahora, ¿cómo tener esto en Linux sin pedirle al usuario que instale algo?
Torre
echo fooo | clippuede funcionar, pero el resultado contendrá un '\ n' al final de la cadena principal, está fuera de lo esperado.
LIXer
-5

mira este portapapeles cero

npm instalar zeroclipboard

Damodaran
fuente
Esto parece ser para un navegador, no para una aplicación de escritorio NodeJS.
Scott Rippey
1
Esto también usa flash, lo que parece una mala idea.
CallMeNorm