¿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.

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);
});

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.


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

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.


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"));

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
    }
);

¿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)


¡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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.