22.7.12 その他のシステムイベント

他にもシステム内での出来事を表現するイベント型がいくつかあります。

text-conversion

この種のイベントは1つ以上のバッファーを処理するシステムワイドな入力メソッドのに送出される。

一度イベントが送出されると、異なる多数のフレーム内の複数のバッファーにたいして入力メソッドがすでに変更を行っているかもしれない。どのバッファーが変更されているか、どの編集がその変更を行ったかを判断するために変数text-conversion-editsを使用する。この変数は以下のような形式のリストであり、text-conversionそれぞれの送出に先立ちセットされる:

((buffer beg end ephemeral) ...)

ここでephemeralは変更されたバッファー、begendはは編集完了時にマーカーがセットされた位置。ephemeralは挿入された文字列(または削除されたポイントの前にあるすべてのテキスト)、t (その編集が入力メソッドによって一時的に行われた編集であることを意味する)、あるいはnil (ポイントの後の一部テキストが削除されたことを意味する)のいずれか。

このイベントが送出されるかどうかはバッファーローカル変数text-conversion-styleの値次第。この変数はバッファーコンテンツを編集する入力メソッドがどのように振る舞うかを決定する。

以下の4つの値のいずれかを指定できる:

nil

入力メソッドは完全に無効になり、キーイベントはかわりにテキスト変換イベントに送出されることを意味する。

action

入力メソッドは有効になるが、入力メソッドが改行を挿入したいときは常にRETが送出されることを意味する。

password

これは大枠ではactionと同じだが入力メソッドにたいしてASCII文字を挿入する能力も要求すること、テキストの提案等の機密情報を処理できない入力メソッドの機能によって後から取得されたかもしれない場所に入力を保存しないように指示できる点が異なる。

t

これとその他の値の場合には、入力メソッドが有効であり編集後にtext-conversionイベントが発生することを意味する。

この変数の値の変更は、そのバッファーがフレームの選択されたバッファーになった後の再表示のときだけ効果がある。すぐに効果がある方法でテキスト変換を無効にする必要がある場合には、かわりに関数set-text-conversion-styleを呼び出すこと。これにより入力メソッドが無視できない時間ロックされる可能性があるので、慎重に使用すること。

さらにコマンドループやread-key-sequenceがプレフィクスキーを読み取った後は、テキスト変換が自動的に無効になる。これは変数disable-inhibit-text-conversionに非nil値をセットまたはバインドして無効にできる。

(delete-frame (frame))

このイベントの種類はユーザーがウィンドウマネージャーに特定のウィンドウを削除するコマンドを与えたことを示し、Emacsのフレームにたいして発生する。

フレーム削除(delete-frame)イベントの標準的な定義ではframeが削除される。

(iconify-frame (frame))

このイベントの種類はウィンドウマネージャーを使用してユーザーがframeをアイコン化したことを示す。標準的な定義はignore。これはそのフレームがすでにアイコン化されているので、Emacsが行う必要のことは何もないからである。このイベント型の目的は、望むならこのようなイベントの追跡を可能にしておくためである。

(make-frame-visible (frame))

このイベントの種類はウィンドウマネージャーを使用してユーザーがframeを非アイコン化したことを示す。標準的な定義はignore。これは、そのフレームがすでに可視化されているので、Emacsが行う必要のことは何もないからである。

(touch-end (position))

この種のイベントはユーザーの指がマウスホイールやタッチパッドから離れたことを示す。マウス位置リストのposition要素(クリックイベントを参照)は、マウスホイールから指が離れた際のマウスカーソルの位置を指定する。

(wheel-up position clicks lines pixel-delta)
(wheel-down position clicks lines pixel-delta)

これらのイベントはマウスホイールを動かすことによって発生する。position要素はそのイベント発生時のマウスカーソル位置を指定するマウス位置リスト(クリックイベントを参照)。

clicksが与えられた場合には、ホイールが連続して素早く動いた回数を示す数値。リピートイベントを参照のこと。linesが与えられて、それがnilでなければ、それはスクロールされるべきスクリーン行を表す正の行数である(イベントがwheel-upならスクロールアップ、wheel-downならスクロールダウン)。pixel-deltaが与えられた場合には、それが(x . y)という形式のコンスセルであれば、xyはそれぞれの軸方向にたいしてスクロールされたピクセル数、いわゆるピクセル単位デルタ(pixelwise delta)である。通常だと2つのうちの一方が非0、もう一方は0もしくは0に非常に近い値となる。大きい数値はウィンドウをスクロールする軸を示します。変数mwheel-coalesce-scroll-eventsnilの場合には、たとえ非nilであってもスクロールコマンドはlines要素を無視pixel-deltaのデータを使用する。この場合にはイベント種別によって暗示される方向(アップかダウン)を無視して、ピクセル単位デルタの符号によりスクロール方向を判断する。

これらのピクセル単位デルタxyを用いれば、マウスホイールがピクセル解像度で実際にどれだけ動いたかを判断できる。たとえばピクセル単位デルタを使うことによって、ユーザーが回したマウスホイールとまったく同じようにディスプレイをスクロールできるだろう。このピクセル単位のスクロールが可能なのはmwheel-coalesce-scroll-eventsnilのときだけであり、この変数が非nilの場合には通常はpixel-deltaデータは生成されない。

wheel-upwheel-downは一部のシステムでのみ生成されるイベントである。他のシステムではかわりにmouse-4mouse-5のようなイベントが用いられる。コードに可搬性をもたせる場合にはwheel-upwheel-down以外にも、mwheel.elで定義されている変数mouse-wheel-up-eventmouse-wheel-down-eventで指定されているイベントも処理できる必要がある。歴史的な理由によりmouse-wheel-up-eventwheel-downと同じように処理されるべきイベントを保持する変数であり、その逆についても同様であることに注意。

通常はwheel-leftwheel-rightによって表現される水平ホイールの移動についても同じことが当てはまるが、コードに可搬性をもたせるにはmwheel.elで定義されている変数mouse-wheel-left-eventmouse-wheel-right-eventにもしたがう必要がある。ただしこれらのスクロールイベントと同時に別のイベントをも生成するマウスもいくつかあり、邪魔をするかもしれない。この問題を解決するにはこれらのイベントにたいするバインドを削除する方法が一般的である(たとえばmouse-6mouse-7等を削除するがバインドはハードウェアとオペレーティングシステムに大きく依存する)。

(pinch position dx dy scale angle)

この種のイベントはタッチパッドに指を2本置いてそれらを互いに近づけたり離したりする、“ピンチ(pinch)”というジェスチャーをユーザーが行った際に生成される。positionはイベント発生時のマウスポインターの位置を提供するマウス位置リスト(クリックイベントを参照)、dxは同一シーケンス内の最後のイベントから2本の指の間の水平距離の変分、dyは同じく垂直距離の変分、scaleはこのシーケンス開始時の2本の指の間の距離とカレント距離の比率、angleはこのイベントで指と指をつなぐ線分の方向と同一シーケンスの最後のイベントにおける同線分方向との間の角度差(degree)である。

ピンチイベントが送信されるのはピンチシーケンスの開始かその間だけであり、ユーザーがタッチパッド置いた2本の指をピンチではなく回転(rotate)させるように動かすジェスチャーは報告されない。

positionの後の引数はすべて浮動小数点数。

これはユーザーがタッチパッドに2本の指を置いたときが開始、指を離したときに終了するイベントであり、通常はあるシーケンスの一部として送信される。先頭のイベントではdxdyangle0.0になる。後続するイベントではこのイベント構造のこれらのメンバーにたいしては非0値が報告されるだろう。

dxdy1.0がそれぞれタッチパッドの幅と高さに相当するような想像上の相対的単位として報告される。これらは通常はジェスチャーの下にあるイメージやウィンドウ等のオブジェクトサイズに相対的なものと解釈される。

(preedit-text arg)

これは何が挿入されるかをユーザーに示すために、システムのインプットメソッドがEmacsに何らかのテキストを表示するよう伝える際に送信されるイベント。argの内容は使用中のウィンドウシステムに依存する。

Xではargはカーソルの向こうに配置するテキストを記述する文字列。nilなら前に表示していたすべてのテキストの削除を意味する。

PGTKフレーム(フレームを参照)では、argはカラーとアンダーラインの属性に関する情報をもつ文字列リスト。以下の形式をもつ:

   ((string1
     (ul . underline-color)
     (bg . background-color)
     (fg . foreground-color))
    (string2
     (ul . underline-color)
     (bg . background-color)
     (fg . foreground-color))
    ...
   )

文字列に関するテキストを残してカラーの情報は省略可。underline-colortならテキストのアンダーラインがデフォルトのアンダーラインカラーになること、文字列ならそのカラー名によってアンダーラインが描画されることを意味する。

これは通常ならユーザーがコマンドにバインドするべきではないスペシャルイベントである(スペシャルイベントを参照)。Emacsは通常はこのイベントを受信すると、ポインター背後にあるオーバーレイにイベントに含まれるテキストを表示する。

(drag-n-drop position files)

この種類のイベントはEmacs外部アプリケーション内でファイルグループが選択されて、それがEmacsフレーム内にドラッグアンドドロップされたときに発生する。

要素positionは、そのイベント位置を記述しマウスクリックイベントで使用されるフォーマット(クリックイベントを参照)と同じ。要素filesはドラッグアンドドロップされたファイル名のリスト。通常はそれらのファイルをvisitすることによってこのイベントは処理される。

この種類のイベントは現在のところある種のシステムでのみ生成される。

help-echo

この種類のイベントは、テキストプロパティhelp-echoをもつバッファーテキスト部分上にマウスポインターが移動したときに生成される。生成されるイベントは以下の形式をもつ:

(help-echo frame help window object pos)

イベントパラメーターの正確な意味とヘルプテキストを表示するためにこれらのパラメーターを使用する方法は、Text help-echoで説明されている。

sigusr1
sigusr2

これらのイベントはEmacsプロセスがシグナルSIGUSR1SIGUSR2を受け取ったときに生成される。シグナルは追加情報を運搬しないので追加データは含まれない。これらのシグナルはデバッグに有用(エラーによるデバッガへのエンターを参照)。

ユーザーシグナルをcatchするためには、special-event-map (アクティブなキーマップの制御を参照)内で対応するイベントにバインドする。そのコマンドは引数なしで呼び出され、last-input-event内の特定のシグナルイベントが利用できる(その他のイベント入力の機能を参照)。たとえば:

(defun sigusr-handler ()
  (interactive)
  (message "Caught signal %S" last-input-event))

(keymap-set special-event-map "<sigusr1>" 'sigusr-handler)

シグナルハンドラーをテストするために、自身でEmacsにシグナルを送信できる:

(signal-process (emacs-pid) 'sigusr1)
language-change

この種類のイベントはMS-Windows上で入力言語が変更されたときに生成される。これは通常はキーボードキーが異なる言語の文字でEmacsに送られることを意味する。生成されるイベントは以下の形式をもつ:

(language-change frame codepage language-id)

ここでframeは言語が変更されたときカレントだったフレーム、codepageは新たなコードページ番号(codepage number)、language-idは新たな入力言語の数値IDである。codepageに対応するコーディングシステム(コーディングシステムを参照)は、cpcodepagewindows-codepagelanguage-idを文字列に変更する(たとえばset-language-environmentのようなさまざまな言語依存機能にたいしこれを使用する)には、以下のようにw32-get-locale-info関数を使用する:

;; 英語にたいする"ENU"のような言語の省略形を取得する
(w32-get-locale-info language-id)
;; "English (United States)"のような
;; その言語の完全な英語名を取得する
(w32-get-locale-info language-id 4097)
;; その言語の完全なローカライズ名を取得する
(w32-get-locale-info language-id t)
end-session

このイベントはMS-Windowsにおいてユーザーがインタラクティブなセッションを終了したとき、またはシステムがシャットダウンすることをオペレーティングシステムがEmacsに知らせる際に生成される。このイベントの標準的な定義では、秩序に則ってEmacsをシャットダウンできるようにkill-emacsコマンドを呼び出す(Emacsのkillを参照)。未保存の変更が存在する場合には、ユーザーが後で未保存の変更をリストアするセッションの再起動に使用できるauto-saveファイルを生成する(自動保存を参照)。

キーシーケンスの途中、つまりプレフィクスキーの後にこれらのイベントの1つが到着すると、複数イベントキー内ではなくその前か後にそのイベントが到着するようにEmacsはそのイベントを記録する。

いくつかのdelete-frameのようなスペシャルイベントは、デフォルトではEmacsコマンドを呼び出します(他のイベントはバインドされない)。special-event-mapを通じて、あるスペシャルイベントがコマンドを呼び出すようにすることができます。このマップでファンクションキーにバインドしたコマンドは、last-input-event内でそれが呼び出された完全なイベントを調べることができます。スペシャルイベントを参照してください。


This page has generated for branch:work/emacs-30_69b16e5c63840479270d32f58daea923fe725b90, commit:5e3f74b56ff47b5bcef2526c70f53f749bbd45f6 to check Japanese translation.