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

22.5 コマンドループからの情報

エディタのコマンドループでは、自身および実行されるコマンドのステータス記録を保持するため、いくつかのLisp変数を設定します。this-command と last-command を除き、Lispプログラム内でこれらの変数を変更することは一般的に避けるべきです。

変数: last-command

この変数には、コマンドループによって実行された直前のコマンド(現在のコマンドのひとつ前)の名前が記録されます。通常、その値は関数定義を持つシンボルですが、必ずしもそうであるとは限りません。

コマンドがコマンドループに戻る際、当該コマンドが次のコマンド用のプレフィックス引数を指定していない限り、値は this-command からコピーされます。

この変数は常に現在のターミナルにローカルであり、バッファローカルにはなり得ません。複数ターミナルを参照してください。

変数: real-last-command

この変数はEmacsによってlast-commandと同様に設定されますが、Lispプログラムによって変更されることはありません。

変数: last-repeatable-command

この変数には、入力イベントの一部ではなかった、直近に実行されたコマンドが格納されます。これは repeat が繰り返そうとするコマンドです。The GNU Emacs Manual の Repeating を参照してください。

変数: this-command

この変数には、エディタのコマンドループで現在実行されているコマンドの名前が記録されます。last-commandと同様に、通常は関数定義を持つシンボルです。

コマンドループは、コマンドを実行する直前にこの変数を設定し、コマンドの終了時にその値を last-command にコピーします(ただし、コマンドが次のコマンド用のプレフィックス引数を指定している場合は除きます)。

一部のコマンドは、実行中にこの変数を、次に実行されるコマンドのフラグとして設定します。具体的には、テキストをキルする関数は this-command を kill-region に設定し、これにより直後に続くキルコマンドが、キルしたテキストを直前のキル内容に追記するように認識します。

エラーが発生した際に、特定のコマンドが直前のコマンドとして認識されるのを防ぎたい場合は、そのコマンドにそれを防ぐ処理を組み込む必要があります。一つの方法は、コマンドの冒頭で this-command を t に設定し、末尾で this-command を本来の値に戻すことです。具体的には次のように記述します。

(defun foo (args...)
  (interactive ...)
  (let ((old-this-command this-command))
    (setq this-command t)
    ...do the work...
    (setq this-command old-this-command)))

this-command を let と紐付けないのは、そうするとエラー時に元の値が復元されてしまうためです—これは let の機能であり、今回のケースではまさに避けたい挙動となります。

変数: this-original-command

これは、コマンドのリマッピングが行われる場合(コマンドのリマッピングを参照)を除き、this-commandと同じ値となります。その場合、this-commandは実際に実行されたコマンド(リマッピングの結果)を、this-original-commandは実行するように指定されたものの別のコマンドにリマッピングされたコマンドをそれぞれ示します。

変数: current-minibuffer-command

これは this-command と同じ値を持ちますが、ミニバッファに入る際に再帰的にバインドされます。この変数は、ミニバッファフックなどで、現在のミニバッファセッションを開いたコマンドを判定するために利用できます。

関数: this-command-keys

この関数は、現在のコマンドを呼び出したキーシーケンスを含む文字列またはベクトルを返します。タイムアウトを指定せずに read-event を用いてコマンドが読み取ったイベントは、末尾に付加されます。

ただし、コマンドが read-key-sequence を呼び出した場合は、最後に読み込まれたキーシーケンスを返します。キーシーケンス入力 を参照してください。シーケンス内のすべてのイベントが文字列に収まる文字であった場合、その値は文字列となります。入力イベント を参照してください。

(this-command-keys)
;; Now use C-u C-x C-e to evaluate that.
     ⇒ "^X^E"
関数: this-command-keys-vector

this-command-keysと同様ですが、常にイベントをベクトル形式で返すため、入力イベントを文字列に格納する際の煩雑な処理を行う必要はありません(キーボードイベントを文字列に格納するを参照)。

関数: clear-this-command-keys &optional keep-record

この関数は、this-command-keys が返すイベントテーブルを空にします。keep-record が nil でない限り、関数 recent-keys(Recording Input を参照)がその後返すレコードも空にします。これは、パスワードを読み取った後、特定のケースでパスワードが意図せず次のコマンドの一部としてエコーされるのを防ぐのに有用です。

変数: last-nonmenu-event

この変数には、マウスメニューに起因するイベントを除き、キーシーケンスの一部として読み取られた直近の入力イベントが格納されます。

この変数の用途の一つに、x-popup-menu にメニューをポップアップさせる場所を指定することがあります。また、y-or-n-p でも内部的に使用されています(Yes-or-No Queries を参照)。

変数: last-command-event

この変数には、コマンドループがコマンドの一部として読み取った直近の入力イベントが設定されます。この変数の主な用途は、どの文字を挿入するかを決定するために使用するself-insert-commandと、直前に挿入された文字にアクセスするために使用するpost-self-insert-hook(ユーザーレベルの挿入コマンドを参照)です。

last-command-event
;; Now use C-u C-x C-e to evaluate that.
     ⇒ 5

値が5なのは、それがC-eのASCIIコードだからです。

変数: last-event-frame

この変数は、直前の入力イベントがどのフレームに向けられたかを記録します。通常、これはイベント発生時に選択されていたフレームですが、そのフレームが入力フォーカスを別のフレームにリダイレクトしていた場合、値はイベントがリダイレクト先となったフレームになります。入力フォーカスを参照してください。

直前のイベントがキーボードマクロによるものである場合、値は macro となります。

入力イベントは何らかのソースから発生します。それがキーボードマクロやシグナル、あるいはunread-command-eventsである場合もありますが、通常はユーザーが操作する、コンピュータに接続された物理的な入力デバイスによるものです。こうしたデバイスは入力デバイスと呼ばれ、Emacsは各入力イベントを、それが発生した入力デバイスに関連付けます。これらのデバイスは、各入力デバイスに固有の名前によって識別されます。

使用された正確な入力デバイスを特定できるかどうかは、各システムの仕様によって異なります。その情報が得られない場合、Emacsはキーボードイベントを‘"Virtual core keyboard"’から、その他のイベントを‘"Virtual core pointer"’から発生したものとして報告します。(詳細なデバイス情報が不明な場合にXサーバーがこれらの値を報告するため、あらゆるプラットフォームでこれらの値が使用されます。)

変数: last-event-device

この変数は、最後に読み取られた入力イベントが発生した入力デバイスの名前を記録します。そのようなデバイスが存在しない場合(すなわち、最後の入力イベントが unread-command-events から読み取られた場合、またはキーボードマクロによるものである場合)は nil となります。

X WindowsでX Input Extensionを使用する場合、デバイス名は、Xサーバーに接続された各物理キーボード、ポインティングデバイス、およびタッチスクリーンに固有の文字列となります。それ以外の場合は、イベントがポインティングデバイス(マウスなど)によって生成されたか、あるいはキーボードによって生成されたかに応じて、文字列 ‘"Virtual core pointer"’ または ‘"Virtual core keyboard"’ のいずれかとなります。

関数: device-class frame name

デバイスにはさまざまな種類があり、それらは名称から判別できます。この関数を使用すると、frameから発生したイベントに対する正しいデバイスタイプnameを特定できます。

戻り値は、以下のシンボル(「デバイスクラス」)のいずれかです。

core-keyboard

コアキーボード。これは当該デバイスがキーボードのようなデバイスであることを意味するが、それ以外の特性は不明である。

core-pointer

コアポインタ。これはデバイスがポインティングデバイスであることを意味しますが、それ以外の特性は不明です。

mouse

コンピューターのマウス。

trackpoint

トラックポイントまたはジョイスティック(あるいはその他の同様の操作デバイス)

eraser

ペンタブレットのスタイラスのもう一方の端、または単体の消しゴム。

pen

ペンタブレットやスタイラス、あるいはその他の類似デバイスの先端の尖った部分。

puck

コンピューターマウスのような外観ながら、別の表面を基準とした絶対座標を報告するデバイス。

power-button

電源ボタンまたは音量ボタン(またはその他の同様の操作部)。

keyboard

コンピューターのキーボード。

touchscreen

コンピューターのタッチパッド。

pad

ペンタブレットの周囲によく見られる、感度の高いボタンやリング、ストリップの総称。

touchpad

タッチパッドなどの間接タッチデバイス。

piano

電子キーボードなどの楽器。

test

XTEST拡張機能が入力を報告するために使用するデバイス。