Next: , Previous: , Up: Command Loop   [Contents][Index]


20.5 Information from the Command Loop

エディターコマンドループは、自分自身と実行するコマンドのために、いくつかのLisp変数にステータス記録を保持します。this-commandおよびlast-command以外は、一般的にこれらの変数をLispプログラム内で変更するのは、良いアイデアではありません。

Variable: last-command

この変数は、コマンドループにより実行された以前のコマンド(前にカレントだったコマンド)の名前を記録する。値は通常、関数定義をもつシンボルだが、その保証はない。

コマンドがコマンドループからリターンするとき、this-commandから値がコピーされる。ただしそのコマンドが、後続のコマンドにたいしてプレフィクス引数を指定されたときを除く。

この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。

Variable: real-last-command

この変数はEmacsによりlast-commandと同様にセットアップされるが、Lispプログラムから決して変更されない。

Variable: last-repeatable-command

この変数は、入力イベントと一部としではなく、もっとも最近実行されたコマンドを格納する。これはコマンドrepeatが再実行を試みるコマンドである。Repeating in The GNU Emacs Manualを参照のこと。

Variable: this-command

この変数は、コマンドループにより現在実行中のコマンドの名前を記録する。last-commandと同様、通常は関数定義をもつシンボルである。

コマンドループはコマンドを実行する直前にこの変数をセットして、(そのコマンドが後続のコマンドのプレフィクス引数を指定しない場合)そのコマンドが終了したときに、その値をlast-command内にコピーする。

いくつかのコマンドは、次に実行されるコマンドが何であれ、それにたいするフラグとして、実行中の間この変数をセットする。特にテキストをkillする関数はthis-commandkill-regionにセットするので、直後に実行された任意のkillコマンドは、killしたテキストを前にkillされたテキストに追加すべきことが解かるだろう。

特定のコマンドにおいて、エラーが発生した場合に前のコマンドとして認識されたくない場合は、これを防ぐようにそのコマンドをコーディングしなければならない。これを行う1つの方法は、以下のようにコマンドの最初でthis-commandtをセットして、最後にthis-commandに正しい値をセットする方法である:

(defun foo (args…)
  (interactive …)
  (let ((old-this-command this-command))
    (setq this-command t)
    … 処理を行う …
    (setq this-command old-this-command)))

エラーの場合、letは古い値をリストアするので、わたしたちはletthis-commandをバインドしない。この場合におけるletの機能は、わたしたちが避けたいと思っていることを正確に行ってしまうだろう。

Variable: this-original-command

コマンドのリマップ(Remapping Commandsを参照)が発生したときを除き、これはthis-commandと同じ値をもつ。リマップが発生した場合、this-commandは実際に実行されたコマンド、this-original-commandは実行を指定されたが他のコマンドにリマップされたコマンドを与える。

Function: this-command-keys

この関数は、現在のコマンドを呼び出したキーシーケンスと、加えてそのコマンドにたいするプレフィクス引数を生成した前のコマンドを含む文字列またはベクターをリターンする。read-eventを使用するコマンドにより、タイムアウトせずに読み取られた任意のイベントは最後に加えられる。

しかし、そのコマンドがread-key-sequenceを呼び出していた場合は、最後に読み取られたキーシーケンスをリターンする。Key Sequence Inputを参照のこと。シーケンス内のすべてのイベントが文字列として適当な文字の場合は、文字列が値になる。Input Eventsを参照のこと。

(this-command-keys)
;; これを評価するためにC-u C-x C-eを使用すると、
     ⇒ "^U^X^E"
Function: this-command-keys-vector

this-command-keysと同様だが、常にベクターでイベントをリターンするので、入力イベントを文字列内に格納する複雑さを処理する必要がない(Strings of Eventsを参照)。

Function: clear-this-command-keys &optional keep-record

この関数は、this-command-keysがリターンするイベントテーブルを空にする。keep-recordnilの場合は、その後に関数recent-keys(Recording Input)がリターンするレコードも空にする。これは特定のケースにおいて、パスワードを読み取った後、次のコマンドの一部として不用意にパスワードがエコーされるのを防ぐために有用である。

Variable: last-nonmenu-event

この変数はキーシーケンス(マウスメニューからのイベントは勘定しない)の一部として読み取られた最後の入力イベントを保持する。

この変数の1つの使い方は、x-popup-menuにたいしてどこにメニューをポップアップすべきか告げる場合である。これは内部的にy-or-n-p(Yes-or-No Queriesを参照)にも使用されている。

Variable: last-command-event

この変数には、コマンドの一部としてコマンドループに読み取られた、最後の入力イベントがセットされる。この変数は主に、self-insert-command内でどの文字が挿入されたか判断するために使用されている。

last-command-event
;; これを評価するためにC-u C-x C-eを使用すると、
     ⇒ 5

C-eASCIIコードの5が値になる。

Variable: last-event-frame

この変数は、最後の入力イベントが送られたフレームを記録する。これは通常、そのイベントが生成されたときに選択されていたフレームだが、そのフレームの入力が他のフレームにリダイレクトされていた場合は、そのリダイレクトされていたフレームが値となる。Input Focusを参照のこと。

最後のイベントがキーボードマクロ由来の場合、値はmacroになる。