Next: , Previous: Non-ASCII Rebinding, Up: Key Bindings


28.4.10 マウスボタンの再定義

Emacsではマウスボタンを表すのにもLispシンボルを使います。 Emacsのもっとも一般的なマウスイベントはクリック(click)イベントです。 これはマウスボタンを押して、マウスを移動せずにボタンを放したときに発生します。 ボタンを押した状態でマウスを移動すると ドラッグ(drag)イベントになります。 そして最後にマウスボタンを放したときにも、 やはりドラッグイベントが発生します。

基本的なクリックイベントに対応するシンボルは、 左ボタンに対してはmouse-1、 左から2番目のボタンに対してはmouse-2、などとなっています。 2番目のボタンをクリックしたときカレントウィンドウを分割するには、 つぎのように設定します。

     (global-set-key [mouse-2] 'split-window-vertically)

ドラッグイベントについても同様ですが、 イベント名の‘mouse’のまえに‘drag-’が付きます。 たとえば、第1ボタンを押したままドラッグすると drag-mouse-1イベントが発生します。

マウスボタンが押されたときに発生するイベントに対して バインディングを指定することもできます。 これらのイベントは‘drag-’のかわりに‘down-’で始まります。 これらのイベントはキーバインディングが定義されているときだけ生成されます。 ‘down-’イベントのあとには、必ず、 対応するクリック/ドラグッイベントが発生します。

必要ならば、シングルクリック/ダブルクリック/トリプルクリックを 区別することもできます。 ダブルクリックとは、ほぼ同じ位置でマウスボタンを2回クリックすることです。 最初のクリックで通常のクリックイベントが発生します。 最初のクリックから十分短い時間内に2回目のクリックが起こると、 クリックイベントではなくダブルクリックイベントが発生します。 ダブルクリックイベントは、‘double-’で始まります。 たとえば、double-mouse-3です。

つまり、同じ場所で2回クリックがあったとき、 2回目のクリックに特別な意味を与えることはできますが、 ただし最初のクリックで発生する通常のシングルクリックに 対して定義された動作も実行されることを前提としなければなりません。

このような制限のため、ダブルクリックで行えることが制約されますが、 ユーザーインターフェイスデザイナは、よいユーザーインターフェイスが つねにそのような制約に従うべきだとの考えを述べています。 つまり、ダブルクリックはシングルクリックと類似した動作をすべきであり、 『それよりいくらか多く』の動作をするのがよい、ということです。 そして、ダブルクリックイベントに対応するコマンドがその 「いくらか多く」のぶんの動作を行うべきだということです。

ダブルクリックイベントに対してバインディングが定義されていなければ、 ダブルクリックは2つのシングルクリックとして扱われます。 その結果、シングルクリックに対応するコマンドが2回実行されることになります。

Emacsではさらにトリプルクリックイベントも使えます (その場合、名前は‘triple-’で始まる)。 しかし4重クリックをイベントタイプとして区別しません。 ですから、3回目以降の連続したクリックは、 すべてトリプルクリックイベントとして報告されます。 ただし、連続したクリックの回数はイベントリストに記録されていますから、 本当に4重以上のクリックを区別したければそうすることもできます。 4重以上のクリックに特別な意味を与えるのはお勧めできませんが、 4回だと1回と同じ、5回だと2回と同じというように3つの選択肢のあいだで 巡回できるようにするのは場合によっては有効かもしれません。

Emacsはまた、ドラッグやボタンイベントでも複数回の押し下げを記録します。 たとえば、ボタンを2回押してからそのままマウスを移動した場合、 Emacsは‘double-drag-’で始まるイベントを生成します。 ドラッグでなくボタンを押し下げただけの場合は同様に、 ‘double-down-’で始まるイベントを生成します (ただし、他のボタンイベントと同様に、そのイベントに対する バインディングがなければ無視される)。

変数double-click-timeは、どれくらいの時間間隔内であれば 2つの隣接するクリックをダブルクリックとみなすかを指定します。 単位はミリ秒です。 値がnilであれば、ダブルクリックを検出しません。 値がtであれば、時間間隔の上限はないものとして扱います。

マウスイベントに対応するシンボルにはさらに、 ‘C-’、‘M-’、‘H-’、‘s-’、‘A-’、 ‘S-’の各プレフィックスで、修飾キーの情報も組み込めます。 順番は、プレフィックスに続いて‘double-’や‘triple-’があり、 そのあとが‘drag-’や‘down-’ということになります。

フレームには、モード行やスクロールバーなどの バッファ中のテキストを表示する以外の部分もあります。 マウスイベントがこれらの特別な部分で発生したものかどうかを調べるために、 ダミーの「プレフィックスキー」があります。 たとえば、マウスがモード行でクリックされた場合、 まずmode-lineというプレフィックスキーが送られ、 続いて通常のマウスボタンに対応したイベントが送られます。 ですから、モード行で第1ボタンがクリックされたときに scroll-upを実行するにはつぎのようにします。

     (global-set-key [mode-line mouse-1] 'scroll-up)

ダミーのプレフィックスキーとその意味はつぎのとおりです。

mode-line
マウスがウィンドウのモード行にある。
vertical-line
マウスが横に隣接するウィンドウ間の境界線上にある。 (スクロールバーを表示させると、 境界線のかわりにスクロールバーが現れる。)
vertical-scroll-bar
マウスが縦スクロールバー上にある。 (Emacsで使えるスクロールバーは、現在のところ縦スクロールバーのみ。)

1つのキー列の中に2つ以上のマウスボタンイベントを含めることもできますが、 普通はあまりしないでしょう。