rcmdnk's blog
Last update

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
bufferfile "$SCREENEXCHANGE"
bindkey -m ' ' eval 'stuff \040' 'writebuf' 'exec !!! multi_clipboard -I'
bindkey -m Y eval 'stuff Y' 'writebuf' 'exec !!! multi_clipboard -I'
bindkey -m W eval 'stuff W' 'writebuf' 'exec !!! multi_clipboard -I'
bind a eval "!bash -c 'multi_clipboard -O;echo -n \"$SCREEN_PS1\"'"
bind ^a eval "!bash -c 'multi_clipboard -O;echo -n \"$SCREEN_PS1\"'"

これで、コピーモード時にSPACEYWでコピーした際に writebufで1度screenのクリップボードを$SCREENEXCHANGEに書き出してから multi_clipboardを呼び出して、その中でクリップボードリストを作っています。

さらにC-a a (C-a) 1 によってクリップボードリストが呼び出され、選択して screenのクリップボードに入れる事が出来るよう、設定しています。

次に、上で設定しているSCREENEXCHANGE.bashrc等で

1
export SCREENEXCHANGE=$HOME/.screen-exchange

等と、好きなファイルに指定して下さい。 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
(-_-) $ Applications
 8: Applications Documents    Dropbox      Movies       Pictures     tmp
 7: Downloads
 6: Dropbox
 5: Applications Documents    Dropbox      Movies       Pictures     tmp
    Desktop      Downloads    Library      Music        Public       usr
 4: (.^.) $
    (-_-) $
    (-_-) $
    (-_-) $
 3: (@o@) $
 2: ) $
    (
 1: bash
 0: Applications

choose buffer:3
(-_-) $ (@o@) $

上の例では、元々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
$ multi_clipboard -i [args]
# Push [args] to the clipboard list

$ multi_clipboard -I
# Push the screen's clipboard to the clipboard list

$ multi_clipboard -o
# Will show the clipboard list, then select one, which will be placed
# the top of the clipboard list.

$ multi_clipboard -O # or w/o arguments
# Same as "-o", in addition, sent it to the screen's clipboard

$ multi_clipboard -s [args]
# Push [args] to the clipboard of screen

$ multi_clipboard -x
# Send the last clipboard to the clipboard of OS (X server)
# Even if CLX is not set, it uses CLXOS, is available

オプション

次の環境変数を.bashrc等で設定しておくことで設定を変える事が出来ます。

環境変数 説明
SCREENEXCHANGE screenのクリップボードを書きだして使える様にするファイル。screenの初期設定は/tmp/screen-exchangemulti_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のクリップボードに 持ってこれないので、そのうちやってみたいとも思ってもいます。

Sponsored Links
  1. ここではescapeキーデフォルトのaにしてますが、自分の環境ではscreenのescapeキーはescape ^Ttにしてます。

Sponsored Links

« Octopress Tips ターミナルでのディレクトリ移動 »

}