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 では、
を使っています。便利。
と言う事で本日の小ネタは以上です。 なんかコレ、書いていて思った以上に文書量が増えたぞ……