WindowsやMacでは clcl(Windows)や ClipMenu(ClipMenu) と言ったソフトでクリップボードの履歴を呼び出せる様にしています。 正直、これらが無いとやってられないくらいです(OSオリジナルでもって貰いたい)。
vimなんかもちゃんとコピーしたものをレジストリーにしまっておけたりするのですが、 GNU screenを使っている時も頻繁にコピーモードを使うので、 その履歴も取れる様にしました。
さらに、screenでコピーした物を手元のOSのクリップボードに繋げる 事も出来るようにしました。
準備
上のレポジトリからbin/multi_clipboardをとってきて
パスが通ったディレクトリに入れます。
追記: 2013/04/10
Webでの表示上の関係でベル文字(^G, C-v C-gで入力)が空白になってしまうので、
Raw表示をコピペしたりするとこれが消えてしまっておかしくなることがあります。
ので、
wget https://raw.github.com/rcmdnk/multi_clipboard/master/bin/multi_clipboard
で直接ダウンロードするか
git clone [email protected]:rcmdnk/multi_clipboard.git
でscriptsフォルダ毎取って使って下さい。
追記ここまで
このスクリプトはscreenでコピーしたものや引数に与えた物をファイルに書き出しておいて 呼び出すときはそこから読み込むだけなので、 screenを使わないでも、単なる記憶装置として単独でも使えます (必要かどうかはわかりませんが)。
次に、.screenrcにコピーした際にこのスクリプトを呼び出すよう、設定してあげます。
1 2 3 4 5 6 | |
これで、コピーモード時にSPACE、Y、Wでコピーした際に
writebufで1度screenのクリップボードを$SCREENEXCHANGEに書き出してから
multi_clipboardを呼び出して、その中でクリップボードリストを作っています。
さらにC-a a (C-a)
1
によってクリップボードリストが呼び出され、選択して
screenのクリップボードに入れる事が出来るよう、設定しています。
次に、上で設定しているSCREENEXCHANGEを.bashrc等で
1
| |
等と、好きなファイルに指定して下さい。
bufferfileを上の様に設定した場合は必ずSCREENEXCHANGEの値を
正しいものに設定して下さい(そうでないとscreenでコピーしてもmulti_clipboard
に何も渡されません)。
使い方
screen内のwindowで普通にC-a [でコピーモードに入りコピーします。
取り敢えず何回かコピーした後にC-a a
を押してみるとこんな感じになると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
上の例では、元々screenのクリップボードにはApplicationsが入っていて
(C-a ]で貼りつけた所)、
そこでC-a aを押した状態です。
そうするとリストが出て番号を選ぶ様に言われるので、番号を入れれば
それがscreenのクリップボードに入ります。
なので、最後に選んだ後、C-a aで確認すると(@o@) $が出てきました。
2, 4, 5番の例の様に、複数行でも扱える様になっています。
その他、multi_clipboardを直接使う方法
以下の引数を与えることで、それぞれ次の様な働きをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
オプション
次の環境変数を.bashrc等で設定しておくことで設定を変える事が出来ます。
| 環境変数 | 説明 |
|---|---|
| SCREENEXCHANGE | screenのクリップボードを書きだして使える様にするファイル。screenの初期設定は/tmp/screen-exchangeでmulti_clipboardの初期値も位置硫黄ここを指しているので、もしこのファイルを使いたい場合はSCREENEXCHANGEの値もこれにするか、もしくはSCREENEXCHANGE設定せず、.screenrcにもbufferfileの設定を書かないようにする。bufferfileの設定だけ書いてSCREENEXCHANGEの設定をしないと空の名前を指定してしまってクリップボードに何も渡されなくなるので注意。 |
| CLIPBOARD | クリップボードリストを保存しておくファイル。初期値は$HOME/.clipboard。 |
| CLMAXHIST | 保存しておくクリップボードの数。初期値は10。 |
| CLX | OS(Xサーバー)にクリップボードを渡すためのアプリケーション名。初期値は空で、通常のコピーではOSのクリップボードには送らない。xsel(linux)やpbcopy(Mac)などを指定しておくと、毎回コピーするたびに送るようになる。 |
| CLXOS | OS毎のクリップボード渡しソフトの指定。CLXが指定されていない時、multi_clipboard -xを行う事でCLXOSを通じてクリップボードを渡す。初期値はLinuxではxsel、なければxclip、cygwin(Windows)ではputclip、なければxsel、それも無ければxclipl、Macではpbcopy。 |
| CLSEP | CLIPBOARD内で各クリップボードを分けるセパレーター。初期値は^G(C-v C-g、\a、ベル)。 |
| SCREEN_PS1 | screenの中からコマンドを呼ぶと、終了後にプロンプトが表示されないため、それを補完するためにscreenでのbind内で最後に表示させる値。 |
ちなみに、screenの中では、screenを立ち上げた端末の子プロセスとして
各ウィンドウが立ち上がり(記述がおかしかったら教えて下さい)、
上でbind内でスクリプトが実行される際にはscreenを立ち上げた端末の
環境変数が使われます。
なので、CLMAXHIST等、screen内で変更しても意味がありません。
screenを立ち上げた後に、どうしても変更したい場合は、 1度detouchして、環境変数を変えてからattachし、 新しいウィンドウを立ち上げればその中では新しい環境変数が有効になります。 最初に立ち上げたウィンドウで変更する方法は今のところ思いつきませんでした。 (screenの中の変数みたいなものでキープしたり変更したり出来るものが もしあるのであればうれしいのですが。)
SCREEN_PS1についても動的に変えられないため、
カレントディレクトリをプロンプトに表示させていたりすると
どうしても別の物になってしまいます。
ただ、リストから選択するコマンドは無理にscreenコマンドとして呼ぶ必要はないので、
multi_clipboardを適当な値にaliasして上げた方が良いと思います。
(自分のとこではalias c='multi_clipboardとしてます。)
また、自分の運用ではCLXは空にして普段はOSのクリップボードには送らないように
しています。
ローカルだけで作業する時は殆ど問題になりませんが、 ssh先で使う時に多少の遅れがストレスになることもあるので、 普段はクリップボードには送らず、以下の様なaliasを設定し
alias put='multi_clipboard -x
必要な時だけputとしてクリップボードに入れる様にしています。
参考
OS(Xサーバー)にクリップボードを渡す部分で参考にしたサイトや さらに色々screenのクリップボードで遊んでいるサイト。
特に、今の状態だとssh先にXを飛ばして無いときには手元のOSのクリップボードに 持ってこれないので、そのうちやってみたいとも思ってもいます。
- screenのススメ
- screen から簡単操作で X のクリップボードにコピ
OSXでscreenのバッファをクリップボードでも使いたい件- screenのペーストバッファを自動でOSXのクリップボードに送る方法
- screenでコピーした文字列を他のアプリケーションでもペーストできるようにする設定
- ssh先screenのペーストバッファをクリップボードに貼り付ける
ここではescapeキーデフォルトのaにしてますが、自分の環境ではscreenのescapeキーは
escape ^Ttにしてます。 ↩