Masteries

技術的なことや仕事に関することを書いていきます.

OSC 52でリモートにあるファイルの中身をクリップボードに書き込めるようにする

GitHubのCodespacesで開発する日々を過ごしています。シュッと立ち上げてVSCodeで開けばすぐに作業が開始できて便利ですし、CLIの操作もVSCodeのshellが使えるので、最近は「すべてをVSCodeに任せる」ようになっています。

あれこれ環境を整備していて、ほぼほぼ満足のいく開発体験を得られるようになったのですが、最後に困ったのがクリップボードの扱いでした。例えば「あるファイルの中身をコピーするために一旦クリップボードに入れたい」というとき、Macならcat /path/to/file | pbcopy で済みますが、Codespaces上のファイルだと(リモートにあるファイルなので)そうもいきません。

…で、あれこれ調べていると、「OSC 52」なるものがあり、これを使えば解決できそう、ということがわかりました。

※「OSC 52」については、以下のページの記載が参考になりました:

zenn.dev

自分の場合、Codespaces上でtmux + zshという開発環境を構築しているので、zshでこんな関数を用意しました。

※ このスクリプトは、以下の記事の「clipboardの同期」で紹介されていたスクリプトを参考にしました。

qiita.com

function copy-to-clipboard() {
    if ( test "$#" = 0 ); then
        payload=$(cat -)
    else
        payload=$(echo -n "$1")
    fi

    b64_payload=$(printf "%s" "$payload" | base64 -w0)

    # OSC52
    printf "\e]52;c;%s\a" "$b64_payload"
}

あとは、Codespaces上でcat /path/to/file | copy-to-cliboard するだけで、クリップボードに/path/to/fileの中身が格納されるようになります。

※ 但し、自分のようにCodespaces上でtmuxを動かしている場合は、set -g set-clipboard on しなければ正常に動作しません。


諦めずにいろいろ調べてみた結果、無事に課題が解決できてよかったです。 忘れそうなので、忘備録として参考にしたウェブサイトなどをまとめて、ブログ記事にしておこうと思います。