X Window System のクリップボード
X のコピー&ペーストのメカニズムは2種類ある。
- 1.カットバッファ
- STRING エンコーディングの文字列のみ格納可能。EUC-JP 日本語は使えないっぽい。0番から7番まであるが、通常使われるのは0番のみ。データは X サーバが保持し、アプリが終了しても失われない。
- 2.セレクション
- バッファは複数あり、それぞれ名前を持っている。普通使われるのは XA_PRIMARY,XA_SECONDARY, XA_CLIPBOARD。慣習的に、PRIMARY は文字列を選択したとき、CLIPBOARD はユーザが明示的にコピーしたとき使われるらしい。
セレクションは、ペーストするアプリが X サーバを介してコピーしたアプリに問い合わせを行い、データを要求したフォーマットに変換してもらってから受け取る。そのため、コピーした後でそのアプリが終了するとペーストできなくなってしまう。
今やカットバッファは完全に時代遅れとのこと。
firefox でコピーを行うと XA_PRIMARY, XA_SECONDARY, XA_CLIPBOARD に格納される。
xterm で選択すると PRIMARY とカットバッファ0の両方に格納される。真ん中ボタンクリックすると、PRIMARY が利用可能ならば PRIMARY、そうでなければカットバッファ0がペーストされる。
.Xdefaults に
*VT100.translations: #override <Btn2Down>: insert-selection(CLIPBOARD)
と書けば真ん中ボタンクリックで CLIPBOARD セレクションがペーストされるようになると思いきや、CLIPBOARD と PRIMARY 両方がペーストされるようになってしまう。この挙動は謎。
セレクションの内容を表示するには
xclip -o -selection セレクション名
参考:
http://xjman.dsl.gr.jp/X11R6/X11/CH16.html
vim の :h x11-selection がとても詳しい。
カットバッファに文字列を格納するには XStoreBuffer、取得するには XFetchBuffer を使う。
http://xjman.dsl.gr.jp/X11R6/X11/CH16.html
Xt でセレクションからペーストするには XtGetSelectionValue を使う。セレクションにコピーする(正確には、セレクションのオーナーになる)には XtOwnSelection を使う。
gtk2 でセレクションにコピーするには gtk_clipboard_set_text を使う。これはカットバッファにはコピーされない。
GNU screen メモ
Viper Enhanced
viper にテキストオブジェクトやビジュアルモードを追加するためのパッチ。
lisp で vim を再構築したいと考える人は少ないらしい。私はその一人です。
http://www.geocities.jp/emacsjjjj/viper/