OSC52 を使ってリモートからコピペ出来る様にした

読了まで:約1分


と言う小ネタです。


今、僕のメインの開発環境は、

  • [[Archlinux]] on [[Hyper-V]] Gen2 VM

なんですが、はてなブログの Theme を弄ったりする時に、macOS Sierra とか使っていた時に良く行なっていた、

$ cat hogehoge.txt | pbcopy

みたいなコトが出来なくて微妙に不便だったので、それに相当するコトを、

に書かれている OSC52 シーケンスを使って実現してみました。

んで、その実際に僕が使っている、

元ネタほぼそのまんまやんけ

って言うコードはこちら:

#!/usr/bin/env zsh
function has() {
which "${1}" 2>&1 >/dev/null
}
if has pbcopy ; then
cat - | pbcopy
elif has wcmd; then
cat - | wcmd clip
else
payload="$(cat - | base64)"
printf "\x1bPtmux;\x1b\x1b]52;;%s\x1b\x1b\\\\\x1b\\" $payload
fi

ちなみに、このスクリプトは僕の dotfiles に bin/uclip という、 ちょっと微妙な名前で入ってるんですが、行っているコトとしては極めて単純で、

  • 標準入力から文字列を受け取り、その内容を Clipboard にセットする

と言うシンプルな処理だけを行っています。

それで、上記コードの一番最後の printf で始まるヤツが、実際に OSC52 のシーケンスを吐くヤツなんですが、 これが何故にこうもややこしい記述になっているかっていうと、これは、 上記スクリプトから Termnal Emulator までシーケンスが届く間に tmux が挟まっているので、 それを貫通させるために、tmux のエスケープシーケンスで OSC52 を Wrap する必要がある為、です。 まあそれが無かったら tmux 云々のシーケンスは必要ないです。はい。

あと OSC52 のシーケンスは当然の事ながら、OSC52 をサポートしている Terminal Emulator が必要になるため、 OSC52 を使いたい場合には、その OSC52 をサポートしている Terminal Emulator が必要です。

なお、僕は現在のメインの Desktop Environments である Windows 10 Pro では、

を使っています。便利。


と言う事で本日の小ネタは以上です。 なんかコレ、書いていて思った以上に文書量が増えたぞ……

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。