zsh osc52
概要
- ターミナルエスケープシーケンスの国際規格
- リモートマシン(SSH経由など)からローカルのクリップボードにテキストをコピーするための標準
- ANSI/VT100互換のターミナルが対応
tmuxの設定
- tmux.confに以下を追加
##! クリップボードのコピー
set -s set-clipboard on
set -g allow-passthrough on
スクリプト例
osc52copy.zsh
#!/usr/bin/env zsh
# OSC52を使用してクリップボードにコピーするスクリプト
# -e: コマンドがエラーで終了したら即座にスクリプトを終了
# -u: 未定義の変数を参照したらエラーとして扱う
set -eu
# 入力元の判定と取得
# -t 0: 標準入力がターミナル(パイプではない)かチェック
# $# -gt 0: コマンドライン引数が1個以上あるかチェック
# 両方の条件を満たす場合:引数の全文字列を使用
# それ以外の場合:標準入力(パイプやリダイレクト)から読み込み
if [[ -t 0 && $# -gt 0 ]]; then
buf="${*}" # 全引数を結合して変数に格納
else
buf="$(cat)" # 標準入力から全テキストを読み込み
fi
# Base64エンコード処理
# printf %s: 改行を追加せずに文字列を出力
# base64: テキストをBase64形式にエンコード
# tr -d '\n': Base64出力から改行文字を削除(OSC52は改行なしのBase64が必要)
b64=$(printf %s "$buf" | base64 | tr -d '\n')
# OSC52エスケープシーケンスを出力
# \e]52;c;: OSC52シーケンスの開始(cはクリップボード指定)
# %s: Base64エンコードされたテキストを挿入
# \a: ベル文字(シーケンスの終端)
# ターミナルがこのシーケンスを解釈してクリップボードに転送
printf '\e]52;c;%s\a\n' "$b64"
使用例
# コマンドライン引数からコピー
$ osc52copy.zsh "コピーしたいテキスト"
# パイプ経由でコピー
$ echo "hello world" | osc52copy.zsh
# ファイルの内容をコピー
$ cat file.txt | osc52copy.zsh