Next: , Previous: Interactive Call, Up: Command Loop


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

エディタコマンドループは、自身や実行中のコマンドのために 状態記録を数個のLisp変数に設定します。

— Variable: last-command

この変数は、コマンドループが(現在のコマンドの)まえに実行したコマンドの 名前を記録する。 通常、この値は関数定義を持つシンボルであるが、保証はしない。

コマンドが後続のコマンドに対する前置引数を指定する場合を除いて、 コマンドからコマンドループへ戻るとthis-commandから値をコピーする。

この変数は現在の端末に対してつねにローカルであり、 バッファに対してローカルにはならない。 see Multiple Displays

— Variable: real-last-command

last-commandと同様にEmacsがこの変数に設定するが、 Lispプログラムではけっして変更しない。

— Variable: this-command

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

コマンドループは、コマンドを実行する直前にこの変数に設定し、 コマンドが終了すると(コマンドが後続のコマンドに対する 前置引数を指定する場合を除いて) この値をlast-commandにコピーする。

後続のコマンドに対するフラグとして 実行中にこの変数に設定するコマンドもある。 特に、テキストをキルする関数群はthis-commandkill-regionを 設定して、直後に続くキルコマンドでは キルしたテキストをまえのキルに追加するようにする。

特定のコマンドがエラーを起こした場合に 直前のコマンドとは認識されたくない場合には、 読者はそのコマンドがそれを防ぐように書く必要があります。 1つの方法は、以下に示すように、 コマンドの始めでthis-commandtを設定し、 コマンドの終りで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)))

letthis-commandを束縛しません。 というのは、エラーがあるとletは古い値を復元するからです。 これこそがここでは避けたいletの機能です。

— Function: this-command-keys

この関数は、現在のコマンドに対して直前のコマンドが生成した前置引数を含めて、 現在のコマンドを起動したキー列を含んだ文字列かベクトルを返す。 すべてのイベントが文字であれば、値は文字列である。 see Input Events

          (this-command-keys)
          
          ;; C-u C-x C-eを使ってこの式を評価する
               ⇒ "^U^X^E"
— Function: this-command-keys-vector

this-command-keysと同様だが、つねにベクトルでイベントを返すため、 文字列に入力イベントを保持する際の複雑さを扱う必要がない (see Strings of Events)。

— Variable: last-nonmenu-event

この変数は、マウスメニューによるイベントを考慮せずに、 キー列として読んだ最後の入力イベントを保持する。

この変数の1つの用途は、 メニューをポップアップする位置をx-popup-menuに指示することである。 y-or-n-p(see Yes-or-No Queries)も内部的に使っている。

— Variable: last-command-event
— Variable: last-command-char

この変数には、コマンドの一部としてコマンドループが 読んだ最後の入力イベントが設定される。 この変数の主な用途は、どの文字を挿入すべきかを決定するために self-insert-commandが使うことである。

          last-command-event
          
          ;; C-u C-x C-eを使ってこの式を評価する
               ⇒ 5

C-eASCIIコードは5なので、値は5である。

Emacs 18版との互換性のために別名last-command-charがある。

— Variable: last-event-frame

この変数は、最後の入力イベントを振り向けたフレームを記録する。 通常これは、イベントが生成されたときに選択されていたフレームであるが、 そのフレームが入力フォーカスを別のフレームに振り向けていると、 この値はイベントを振り向けた先のフレームである。 see Input Focus