GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Misc-Events.html ・ emacs-doc.conao3.com

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

他にもいくつかのイベントタイプが、システム内での発生を表しています。

text-conversion

この種のイベントは、システム全体の入力メソッドが1つ以上のバッファに対して編集を行った後に送信されます。

イベントが送信されると、入力メソッドはすでに多くの異なるフレーム内の複数のバッファに変更を加えている可能性があります。どのバッファが変更され、どのような編集が行われたかを確認するには、各text-conversionイベントが送信される前に設定される変数text-conversion-editsを使用してください。この変数は、次のような形式のリストです:


((buffer beg end ephemeral) ...)

ここで、ephemeral は変更されたバッファ、beg と end は編集完了時の位置に設定されたマーカー、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)形式のコンスセルであり、ここでxとyは各軸でスクロールさせるピクセル数(別名ピクセル単位のデルタ)です。通常、2つのうち一方のみが非ゼロとなり、もう一方はゼロまたはゼロに非常に近い値になります。大きい方の数値が、ウィンドウをスクロールさせる軸を示します。変数mwheel-coalesce-scroll-eventsがnilの場合、スクロールコマンドはlines要素が非nilであってもそれを無視し、代わりにpixel-deltaデータを使用します。この場合、スクロール方向はピクセル単位のデルタの符号によって決定され、イベント種別が示す方向(上または下)は無視されます。

これらの x および y のピクセル単位の差分を用いて、マウスホイールが実際にピクセル解像度でどの程度移動したかを判定できます。例えば、これらのピクセル単位の差分を利用して、ユーザーによるマウスホイールの操作通りにピクセル解像度でディスプレイをスクロールさせることが可能です。このピクセル単位のスクロールは mwheel-coalesce-scroll-events が nil である場合にのみ可能であり、一般的にその変数が nil 以外である場合には pixel-delta データは生成されません。

wheel-up および wheel-down イベントは、一部のシステムでのみ生成されます。その他のシステムでは、代わりに mouse-4 や mouse-5 といった別のイベントが使用されます。移植性の高いコードでは、wheel-up および wheel-down イベントに加え、mwheel.el で定義されている変数 mouse-wheel-up-event および mouse-wheel-down-event で指定されるイベントも処理する必要があります。なお、歴史的な経緯により、mouse-wheel-up-event は wheel-down と同様に処理すべきイベントを保持する変数であり、その逆も同様であることに注意してください。

水平方向のホイール操作についても同様であり、通常は wheel-left や wheel-right イベントで表現されますが、ポータブルなコードでは mwheel.el で定義された変数 mouse-wheel-left-event および mouse-wheel-right-event にも準拠する必要があります。ただし、一部のマウスでは、これらのスクロールイベントを生成すると同時に他のイベントも発生させることがあり、それが妨げとなる場合があります。これを解決する一般的な方法は、これらのイベントのバインドを解除することです(例えば mouse-6 や mouse-7 などですが、これはハードウェアやオペレーティングシステムに大きく依存します)。

(pinch position dx dy scale angle)

この種のイベントは、ユーザーがタッチパッド上に2本の指を置き、それらを互いに近づけたり遠ざけたりする「ピンチ」ジェスチャーを行うことで発生します。position はマウス位置リスト(クリックイベントを参照)で、イベント発生時のマウスポインタの位置を表します。dx は、同一シーケンス内の直前のイベントからの指間の水平距離の変化、dy は、同一シーケンス内の直前のイベントからの指の垂直方向の移動、scale は、現在の指間距離とシーケンス開始時の距離との比、angle は、今回のイベントにおける指を結ぶ線の方向と、同一シーケンス内の直前のイベントにおけるその線の方向との角度差(度単位)です。

ピンチイベントは開始時またはピンチシーケンス中にのみ送信されるため、ユーザーがタッチパッド上で指をつままずに2本の指を回転させるように動かしたジェスチャーは報告されません。

position 以降の引数はすべて浮動小数点数です。

このイベントは通常、ユーザーがタッチパッドに2本の指を置いた状態から始まり、指を離すまでで終わる一連のシーケンスの一部として送信されます。dx、dy、およびangleは、シーケンスの最初のイベントでは0.0となり、それ以降のイベントでは、イベント構造のこれらのメンバに対して0以外の値が報告されます。

dx と dy は仮想的な相対単位として報告されており、ここで 1.0 はそれぞれタッチパッドの幅と高さを表します。これらは通常、ジェスチャーの下にあるオブジェクト(画像やウィンドウなど)のサイズに対する相対値として解釈されます。

(preedit-text arg)

このイベントは、システムの入力メソッドが、何が挿入されるかをユーザーに示すためのテキストを表示するようEmacsに指示した際に送信されます。argの内容は、使用されているウィンドウシステムによって異なります。

Xでは、argはカーソルの後ろに配置するテキストを指定する文字列です。nilと指定すれば、それまで表示されていたテキストを削除できます。

PGTKフレーム(Framesを参照)において、argは色や下線属性に関する情報を含む文字列のリストです。その形式は以下の通りです。

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

色の情報は省略でき、文字列のテキストのみとすることも可能です。underline-color は、デフォルトの下線色で下線が引かれたテキストを意味する t とすることもできますし、下線を描画する色名である文字列とすることもできます。

これは特殊イベント(特殊イベントを参照)であり、通常、ユーザーが何らかのコマンドにバインドすべきものではありません。Emacsは通常、イベントを受信すると、そのテキストをポイントの背後にオーバーレイ表示します。

(drag-n-drop position files)

このようなイベントは、Emacs以外のアプリケーションでファイル群が選択され、それがEmacsのフレーム上にドラッグ&ドロップされた際に発生します。

要素 position は、マウスクリックイベント(クリックイベント を参照)と同様の形式でイベントの発生位置を示すリストであり、files はドラッグ&ドロップされたファイル名のリストです。このイベントを処理する一般的な方法は、これらのファイルにアクセスすることです。

この種のイベントは、現時点では一部のシステムでのみ発生します。

help-echo

この種のイベントは、マウスポインタが help-echo テキストプロパティを持つバッファテキストの一部に移動した際に発生します。生成されるイベントは以下の形式となります:

(help-echo frame help window object pos)

イベントパラメータの正確な意味と、これらのパラメータを用いて help-echo テキストを表示する方法については、Text help-echo に記載されています。

sigusr1
sigusr2

これらのイベントは、Emacsプロセスがシグナル SIGUSR1 および SIGUSR2 を受信した際に発生します。シグナルは追加情報を保持しないため、これらに付加的なデータは含まれません。デバッグに有用な場合があります(エラー発生時のデバッガ起動を参照)。

ユーザーシグナルを捕捉するには、対応するイベントを 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)
(sleep-event state)

このイベントは、Emacsが動作しているデバイスがスリープ状態に入ろうとする際、あるいはスリープ状態から復帰した際に発生します。state にはシンボル pre-sleep または post-wake が代入されます。

これはGNU/Linux、macOS、MS-Windowsで実装されています。

language-change

この種のイベントは、MS-Windowsで入力言語が変更された際に発生します。これは通常、キーボードのキーからEmacsに異なる言語の文字が送信されることを意味します。生成されるイベントは以下の形式となります:

(language-change frame codepage language-id)

ここで、frame は入力言語が変更された時点でのフレーム、codepage は新しいコードページ番号、language-id は新しい入力言語の数値IDです。codepage に対応するコーディングシステム(コーディングシステムを参照)は、cpcodepage または windows-codepage です。language-id を文字列に変換する場合(例:set-language-environment などの各種言語依存機能で使用する場合)、次のように w32-get-locale-info 関数を使用します。

;; Get the abbreviated language name, such as "ENU" for English
(w32-get-locale-info language-id)
;; Get the full English name of the language,
;; such as "English (United States)"
(w32-get-locale-info language-id 4097)
;; Get the full localized name of the language
(w32-get-locale-info language-id t)
end-session

このイベントは、オペレーティングシステムがEmacsに対し、ユーザーが対話型セッションを終了したこと、またはシステムがシャットダウン中であることを通知した際に、MS-Windows上で発生します。このイベントの標準的な定義は、Emacsを秩序立てて終了させるためにkill-emacsコマンド(Killing Emacsを参照)を呼び出すことです。保存されていない変更がある場合、これにより自動保存ファイル(Auto-Savingを参照)が生成され、ユーザーはセッションを再開した後にこれを使用して、保存されていない編集内容を復元できます。

これらのイベントのいずれかがキーシーケンスの途中――つまりプレフィックスキーの後――に発生した場合、Emacsはイベントの順序を並べ替え、そのイベントがマルチイベントキーシーケンスの内部ではなく、その前後に来るようにします。

delete-frame などのこれらの特殊イベントの中には、デフォルトで Emacs コマンドを呼び出すものもあれば、バインドされていないものもあります。特殊イベントでコマンドを呼び出すように設定したい場合は、special-event-map 経由で行えます。そのマップのファンクションキーにバインドしたコマンドは、last-input-event で自身を呼び出したイベントの全内容を確認できます。特殊イベント を参照してください。