screenでコピーした文字列を他のアプリケーションでもペーストできるようにする設定

以前も調べたはずだけど結局ずっと何もやってなくて不便な思いをしていて、いい加減アレだなーと思い

と投げてみたところ、また素早く回答いただけました。@さん、ありがとうございます!


…とはいえ、screenド素人の自分にはそのコマンドが何をするものなのかまったく見当もつかず orz
"man screen"を読みつつ、他の人のエントリなどを読み漁ってみた。
http://yoka.at.webry.info/200908/article_1.html
どうも、screenのcopy modeでとれたペーストバッファ?の内容を一発でpbcopyに送るようなことはできないらしい。ファイルに送り込んでそこを経由して取得するのが妥当な方法なようだ。
で、paste bufferの内容を書き出すのが"writebuf"コマンド。

writebuf [-e encoding] [filename]

引数にfilenameを指定しなかった場合、デフォルトで"/tmp/screen-exchange"に書き込まれる(このデフォルト値は"bufferfile"コマンドで変更可能)。


あとはそこに書き込まれた内容をpbcopyコマンドに流し込んでやれば良い。例えばscreenで立ち上がっているシェルのコマンドライン上では、

$ screen -X writebuf && pbcopy < /tmp/screen-exchange

とやることでpaste bufferの内容をMacクリップボードにコピーでき、他のアプリケーションでもペースト可能になる。


これと同じようなことを、screenのコピーモードから範囲を選択して確定させた時点でpbcopyに流し込むように"bindkey"で設定することもできるそうで。

bindkey [-d] [-m] [-a] [[-k|-t] string [cmd args]]

"-m"オプションでcopy modeでのキーバインド設定を変更することが出来るらしい。基本的にcopy modeから選択範囲を確定させるのは" "(space), "W", "Y"くらい?("W", "Y"で単語単位、行単位でコピーできるのを今日初めて知った…)

bindkey -m ' ' eval 'stuff " "' writebuf 'exec sh -c "pbcopy < /tmp/screen-exchange"'
bindkey -m 'Y' eval 'stuff "Y"' writebuf 'exec sh -c "pbcopy < /tmp/screen-exchange"'
bindkey -m 'W' eval 'stuff "W"' writebuf 'exec sh -c "pbcopy < /tmp/screen-exchange"'

こんな設定を"~/.screenrc"に書いておいたら、copy modeでの範囲選択から自動でpbcopyに送られるようになったっぽい。微妙にタイムラグがあるけど。。
stuffとかexecとかの使い方がイマイチ理解できておらず…もうちょっとキレイに正しく書けるのかもしれない。ドキュメントしっかり読もう。