Copiar para a área de transferência em Node.js?


86

Existe uma maneira de copiar para a área de transferência em Node.js? Quaisquer módulos ou ideias de qualquer tipo? Estou usando o Node.js em um aplicativo de desktop. Espero que isso esclareça por que eu quero ser capaz de conseguir isso.

Respostas:


18

A área de transferência não é inerente a um sistema operacional. É uma construção de qualquer sistema de janela que o sistema operacional esteja executando. Portanto, se você quiser que isso funcione no X, por exemplo, precisará de ligações para Xlib e / ou XCB. As ligações Xlib para o nó realmente existem: https://github.com/mixu/nwm . Embora eu não tenha certeza se isso lhe dá acesso à área de transferência do X, você pode acabar escrevendo a sua própria. Você precisará de ligações separadas para janelas.

editar: Se você quiser fazer algo hacky, você também pode usar o 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);
});

Ter um equivalente em cromo de copy () seria incrível.

94

Para OS X:

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

write()pode levar um buffer ou uma string. A codificação padrão para uma string será utf-8.


Isso é muito útil para transformações rápidas de dados no REPL.
William

73

Confira clipboardy. Ele permite que você copie / cole plataforma cruzada. É mantido mais ativamente do que o copy-pastemódulo mencionado em outra resposta e corrige muitos dos problemas desse módulo.

const clipboardy = require('clipboardy');

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

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

É melhor do que o módulo "copiar e colar", pois também suporta caracteres de byte duplo. Mas isso tem problemas com o sistema operacional Windows de 32 bits.
Ponmudi VN

1
@PonmudiVN O suporte para Windows de 32 bits foi corrigido: github.com/sindresorhus/clipboardy/commit/…
Sindre Sorhus

Eu instalei o npm çlipboardyno cypress. Eu tenho um botão no meu aplicativo da web, ao clicar nesse botão deve obter o conteúdo da área de transferência, mas dá undefined, quaisquer entradas são muito apreciadas stackoverflow.com/questions/61650737/…
soccerway

30

Aqui está um módulo que fornece copye pastefunções: https://github.com/xavi-/node-copy-paste

Quando require("copy-paste").global()é executado, duas funções globais são adicionadas:

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

Como muitas das outras respostas mencionadas, para copiar e colar no nó, você precisa chamar um programa externo. No caso de node-copy-paste, chama para pbcopy/pbpaste(para OSX), xclip(para linux) e clip(para Windows).

Este módulo foi muito útil quando eu estava trabalhando muito no REPL para um projeto paralelo. Escusado será dizer que copy-pasteé apenas uma linha de comando utilidade - é não significava para o trabalho do servidor.


2
Esta é a melhor resposta. É multiplataforma e funciona como deveria.
gilly3,

1
pode querer adicionar seu próprio código, por uma questão de política do SO
até

16

Caminho mais curto no Windows:

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

1
trabalho! obrigado ... Mas preciso exigir utilprimeiro.
LIXer

2
Obrigado! sem necessidade de dependência "util" funciona para mim assim: require ('child_process'). spawn ('clip'). stdin.end ("content_for_the_clipboard");
darmis

Eu comecei ReferenceError: util is not definedsem incluir const util = require("util")eu testei no Electon principal e no processo de renderização sem sorte. Dito isso, a partir do nó 12.14.1 CLI funcionou. Acho que é seguro dizer que você deve definir util para estar do lado seguro com base no caso de uso.
Benargee

Isso quase funciona: ele copia a string com aspas simples. Alguém sabe como evitar esse comportamento?
m4cbeth

3

Consegui fazer isso criando um aplicativo diferente que lida com isso. Certamente não é a melhor maneira, mas funciona.

Estou no Windows e criei um aplicativo 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

Então, no Node.js, eu costumava child_process.execexecutar o aplicativo VB.NET, com os dados a serem copiados passados ​​como um argumento de linha 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
    }
);

Você acha que poderia fazer isso diretamente na linha de comando? Escrever um aplicativo para isso significa que preciso compilá-lo para Mac, Linux e Windows.
Torre de

@rFactor: Não tenho nenhuma experiência com Mac / Linux, infelizmente, e não estou ciente de um comando embutido na área de transferência.
pimvdb,

Eu uso o comando 'echo "test foo bar" | clipe ', funciona. mas o resultado tem uma quebra de linha \ n, ele quebra meu trabalho ...
LIXer

3

O Mac tem uma linha de comando 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
    }
);

Mesmo código para Linux, mas substitua pbcopypor Xclip ( apt get install xclip)


Interessante! Você acha que existe uma maneira do Windows de fazer isso também? E que tal empacotar o xclip no meu programa, pois não gostaria de pedir ao usuário para instalar o xclip.
Torre

1
Achei que há algo no Windows: echo fooo | clip. Agora, como fazer isso no Linux sem pedir ao usuário para instalar algo?
Torre

echo fooo | clippode funcionar, mas o resultado conterá um '\ n' no final da string primária, está fora do meu esperado.
LIXer

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.