2015/07/21

X Window Systemのクリップボードの種類,xselコマンド,履歴ツール

本記事は過去にX Window System上のクリップボード・コピー/貼り付け関係について書かれた3つの記事を統合し、構成し直したものとなる。

元の記事は2007年の6月と11月に書かれ、xselコマンドについては2010年4月に書かれた。

この記事では

  • クリップボードの種類
  • X Window System上の一部端末エミュレータとGNU Emacsそれぞれにおけるコピー/貼り付けの扱い
  • クリップボードを扱うxselコマンド
  • クリップボード履歴を扱うクリップボードマネージャ

についてを扱う。

  1. X Window Systemにおけるクリップボードの種類
  2. X Window System用の一部端末エミュレータにおけるコピー/貼り付けの扱い
  3. X Window System上のEmacsにおけるコピー/貼り付けの扱い
    1. PRIMARYの扱い
    2. 各操作とそのCLIPBOARD版
      1. CLIPBOARDを対象として操作を行うための設定
  4. xselコマンド
    1. 内容を出力
    2. 内容を更新(入力)する
      1. 入力に関するオプション指定
    3. SECONDARYとPRIMARYの入れ替え
  5. クリップボードマネージャ
    1. Glipper
    2. Klipper
    3. Parcellite
    4. xfce4-clipman

X Window Systemにおけるクリップボードの種類

種類説明詳細
PRIMARY選択範囲マウスなどで選択された範囲(領域)で、内容選択時に即座に新しい内容に更新される・ほとんどのソフトウェアでマウスの真ん中(2番)ボタンを押すことで貼り付け可
SECONDARY基本的に未使用クリップボードを扱う一部のプログラムでのみ読み書き可・しばらく保持したいデータがある場合などに活用できる
CLIPBOARDクリップボード多くのGUIアプリケーションにおいて “コピー” や “切り取り” で書き込まれ、 “貼り付け” で読み出される

X Window System用の一部端末エミュレータにおけるコピー/貼り付けの扱い

X Window System用の一部の端末エミュレータ(Xterm,rxvt-unicode,mltermなど)ではPRIMARYのみしか扱えない。

外部アプリケーションに内容をコピーしたい場合、コピーしたい部分をマウスドラッグして外部アプリケーションの中でマウスの真ん中(2番)ボタンを押すことで貼り付ける。一部端末アプリケーションでは端末内の文字列をマウスドラッグで選択する際にShiftキーを押しておく必要がある。外部アプリケーションから内容を端末に貼り付ける場合は外部アプリケーション側でマウスドラッグする以外は同じ要領となる。

端末エミュレータどうしや同一端末内でのコピペをしたい場合、マウスドラッグと真ん中(2番)ボタンを用いる以外にtmuxGNU screenを動かしてそのコピー機能を用いる方法もある。

mltermでは[ホームディレクトリ]/.mlterm/keyで “INSERT_SELECTION” に設定(右辺にこの値を指定)したキーを入力することでPRIMARYの内容がカーソル位置に挿入される。

見出し:クリップボードマネージャを用いると、メニューを開いてPRIMARYの内容をCLIPBOARDにコピーして外部アプリケーションで貼り付けることができる他、PRIMARYとCLIPBOARDの同期機能のあるクリップボードマネージャで同機能を有効にすると、選択した範囲が自動的にCLIPBOARDにコピーされて簡単に外部アプリケーションで貼り付けられるようになる。ただし、この機能が有効の状態では、例えばウェブログ記事の下書きなどで “テキストエディタ内で書いた文章をCLIPBOARDにコピーした後でWebブラウザ内の既に古い内容が入っているテキスト入力欄へ貼り付ける” という場合において、Webブラウザの入力欄の中身を全選択後に消してから貼り付けを行うと最初にコピーした文章ではなく消した古い内容が貼り付けられてしまうなど、意図しないところで中身が書き換わることがある。[1]

X Window System上のEmacsにおけるコピー/貼り付けの扱い

Emacsでは “kill-ring” と呼ばれる同ソフトウェア固有[2]の記憶用メモリ領域が存在する[3]ため、X Window System上で動作するバージョンの場合でも扱いが他のソフトウェアとは異なる部分があるが、CLIPBOARDを用いるようにする方法も存在する。

PRIMARYの扱い

他のアプリケーションと同様に、X Window System上のEmacs内で範囲選択[4]をするとPRIMARYの内容が更新され、マウスの真ん中(2番)ボタンをクリックするとPRIMARYの内容がカーソル位置に貼り付けられる。

各操作とそのCLIPBOARD版

選択範囲に対するコピー/切り取りと貼り付けの操作は標準では

操作コマンドキー
コピーkill-ring-saveMeta-w
切り取りkill-regionCtrl-w
貼り付けyankCtrl-y

となっているが、代わりに “clipboard-” で始まるコマンドを用いるとCLIPBOARDを対象としてコピー/切り取りと貼り付けが行える。

操作コマンド
コピーclipboard-kill-ring-save
切り取りclipboard-kill-region
貼り付けclipboard-yank

CLIPBOARDを対象として操作を行うための設定

各キーボード操作をCLIPBOARD版に置き換えるための設定は下のようになる。

[一部]ファイル名:[ホームディレクトリ]/.emacs.el
(global-set-key "\C-w" 'clipboard-kill-region)
(global-set-key "\M-w" 'clipboard-kill-ring-save)
(global-set-key "\C-y" 'clipboard-yank)

xselコマンド

XSel(xselコマンド)はX Window System上でクリップボードを操作するコマンドで、同名のパッケージ名でディストリのパッケージとしてインストールできることが多い。

読み書きする記憶の種類は--primary(-p)(省略可),--secondary(-s),--clipboard(-b)のいずれかによって指定する。

内容を出力

--output(-o)オプション(省略可)を付けると、指定された記憶の内容(なければ空文字列)が標準出力に出力される。

(PRIMARYの内容を出力)
$ xsel

(SECONDARYの内容を出力)
$ xsel --secondary

(CLIPCOARDの内容を出力)
$ xsel --clipboard

内容を更新(入力)する

--input(-i)オプションを付けると、出力は行わずに記憶の内容を標準入力から読み込んだものに書き換える。このオプションはシェルのリダイレクトやパイプを用いている場合は省略できる。[5]

(ファイルの内容をPRIMARYの新しい内容とする)
$ xsel < [ファイル]

(ファイルの内容をSECONDARYの新しい内容とする)
$ xsel --secondary < [ファイル]

(ファイルの内容をCLIPCOARDの新しい内容とする)
$ xsel --clipboard < [ファイル]

コマンドの出力結果をコピーする場合はteeコマンドを用いると端末に結果が表示されなくなるのを防げる。

(コマンドの実行結果を表示しつつコピーする)
$ [コマンド行] | tee /dev/stderr | xsel --clipboard

入力に関するオプション指定

内容を更新する操作の場合、--input(-i)オプションの代わりに--append(-a)オプションを付けると内容が記憶の末尾に追加される。

(PRIMARYに "ABC" を入れる)
$ printf "ABC" | xsel
(PRIMARYの内容を確認)
$ xsel
ABC
(PRIMARYの内容に "DEF" を追記)
$ printf "DEF" | xsel -a
(PRIMARYの内容を確認)
$ xsel
ABCDEF

同様に--follow(-f)オプションを付けるとバックグラウンドでプロセスが動作し続け、内容が追記されたときに自動的に記憶の内容を更新するが、手動でどこかを選択するなどして記憶の内容が変更されると、プロセスは終了する。--nodetach(-n)オプションを付けるとバックグラウンドにはならない。

SECONDARYとPRIMARYの入れ替え

--exchange(-x)オプションを指定して実行することでPRIMARYとSECONDARYの内容を入れ替えることができる。

(PRIMARYとSECONDARYの内容を入れ替える)
$ xsel --exchange

クリップボードマネージャ

クリップボードマネージャは動作時のXのクリップボードの変更履歴を保持し、(特定のキーの組み合わせを押すかシステムトレイなどのアイコンのクリックで表示される)履歴一覧のメニューで選択した内容をCLIPBOARDにコピーすることができる。

クリップボードの内容がURLなど特定のパターンに一致したときにコマンドが自動的に実行される “アクション” 機能を持つものもあり、パターンと実行されるコマンドが設定できるが、ツールによってはパターンで判別せずに手動で登録済みのアクションを選択する形の場合もある。

常用したいクリップボードマネージャを1つ決めたらログイン時にそれを自動起動するようにするか、デスクトップ環境に合ったもの(自動的に読み込まれる)を選択する。

PRIMARYはこの類のツールでは “選択” や “選択領域” などと呼ばれる。

Glipper

標準の機能はあまり充実していないほうだが、プラグインシステムを搭載し、機能が拡張できる。

アクション実行の仕組みもプラグインの1つとして存在する。

Klipper

KDE Plasmaの “Clipboard” というウィジェットで、 “plasma-workspace” に含まれる。

アクション実行に対応している他、PRIMARYとCLIPBOARDの同期機能もある。

Parcellite

PRIMARYとCLIPBOARDの同期機能があり、有効にすると、どこかをマウスドラッグするなどしてPRIMARYが更新されると自動的にCLIPBOARDにコピーされる。

アクション機能はCtrlを押したままシステムトレイアイコンをクリックして登録済みアクションの一覧から実行するものを選択する形で、現在のCLIPBOARDの内容に対して処理される。

xfce4-clipman

Xfce向け。システムトレイに常駐するが、 “xfce4-clipman-plugin” をインストールすることで同デスクトップ環境のパネル項目としても使用できる。

アクション実行の他、PRIMARYとCLIPBOARDの同期にも対応している。

xfce4-popup-clipmanコマンドを実行すると一覧のメニューが開く。別途このコマンドを起動するためのキーを設定マネージャー内の “キーボード - アプリケーションショートカットキー” 設定で登録しておくと便利。ツール内設定でマウスポインタ位置にメニューが表示されるようにもできる。

使用したバージョン:
  • Xterm 312
  • mlterm 3.3.8
  • GNU Emacs 24.4
  • xsel 1.2.0
  • Glipper 2.4
  • plasma-workspace 5.2.2
  • Parcellite 1.1.9
  • xfce4-clipman 1.2.6
[1]: このような操作をする際には順番に注意し、この例では最初に古い内容の全選択と削除をしておけばよい
[2]: 別プロセスのEmacsどうしでもやりとりできる
[3]: これ自体が履歴を持ったクリップボードのように扱える
[4]: マウスだけではなく、Ctrl-SPACEの後での移動含む
[5]: 省略不可な例: “xsel -i” として実行する場合