LoginSignup
1
0

Node.js上のCLIツールで文字列をクリップボードにコピーさせる

Posted at

概要

個人的な用途で、Node.jsのCLIツールを作っていました。求める機能としては、「標準入力した複数行の文字列を、(若干加工した後)1行ずつ逐次クリップボードにコピーさせる」というものでした。クリップボードへのアクセス以外については比較的苦しむことなく実装できたのですが、クリップボードへのアクセスを行う方法について簡単に調べたところ、殆どの記事で「このnpmパッケージを使え」みたいなことが書かれており……「その部分除けば50行もないコードの為にpackage.json書けとでも……?!」という気分になった結果、どうにかNode.jsに付属している機能だけで何とかすることができたので、それについて書いていきたいと思います。

コード

完成形としては以下のようなものになりました。

const {exec} = require('node:child_process');
function clip(str) {
  exec(`echo ${str} | clip`);// ※Windows以外の環境ではここをいじる必要がある
}

const rl = require('node:readline/promises')
function createReader() {
  return rl.createInterface({
    input: process.stdin,
    output: process.stdout
  });
}

async function main() {
  const chunk = [];
  console.log('Please input.');

  for await (const inputstr of createReader()) {
    if (!inputstr) break;// 空行で脱出
    chunk.push(inputstr);
  }

  for (str of chunk) {
    clip(str);
    const waiter = createReader();
    await waiter.question(`copied: ${str}`);
    waiter.close();
  }
}

main();

解説

……おおよそ要件通りと言えばそうです。
readlineについては、割と見れば分かるでしょうし、他にも有益な記事が多数あると思うので、割愛します。

クリップボードへのコピー機能については、苦戦した割にコードとしてはシンプルにまとまりました。
要は、「クリップボードへのコピーを行うプロセスを起動する」という方法で実現させています。コード内では、Windowsのcmd.exe上で実行する際のコマンドが書かれています。もし他の環境で実行する場合は、ここがその環境に応じたコマンドに変えられる必要があります。

最後に

色々分からないことがありながら捻り出したコードなので、もっといい方法があるかもしれません。その時は……もっと良い方法について記事を書いていただければと思います。
ここまで読んで下さり、ありがとうございます!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0