Next: Adjusting Point, Previous: Distinguish Interactive, Up: Command Loop [Contents][Index]
エディターコマンドループは自分自身と実行するコマンドのために、いくつかのLisp変数にステータス記録を保持します。一般的にthis-command
とlast-command
以外は、Lispプログラム内でこれらの変数を変更するのは良いアイデアではありません。
この変数はコマンドループによって実行された以前のコマンド(前にカレントだったコマンド)の名前を記録する。値は通常は関数定義をもつシンボルだが、その保証はない。
コマンドがコマンドループからリターンするとき、this-command
から値がコピーされる。ただしそのコマンドが後続のコマンドにたいしてプレフィクス引数を指定されたときを除く。
この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。
この変数はEmacsによりlast-command
と同様にセットアップされるが、Lispプログラムから決して変更されない。
この変数は入力イベントの一部ではない、もっとも最近実行されたコマンドを格納する。これはコマンドrepeat
が再実行を試みるコマンドである。Repeating in The GNU Emacs Manualを参照のこと。
この変数はコマンドループにより現在実行中のコマンドの名前を記録する。last-command
と同様、通常は関数定義をもつシンボルである。
コマンドループはコマンドを実行する直前にこの変数をセットして、(そのコマンドが後続のコマンドのプレフィクス引数を指定しなければ)そのコマンドが終了したときにその値をlast-command
にコピーする。
いくつかのコマンドは次に実行されるコマンドが何であれ、それにたいするフラグとして実行中の間この変数をセットする。特にテキストをkillする関数はthis-command
をkill-region
にセットするので、直後に実行された任意のkillコマンドは、killしたテキストを前にkillされたテキストに追加するべきことが解かるだろう。
特定のコマンドでエラー発生時に前のコマンドとして認識されたくなければ、それを防ぐようにそのコマンドをコーディングしなければなりません。これを行う1つの方法は、以下のようにコマンドの最初でthis-command
にt
をセットして、最後にthis-command
に正しい値をセットする方法です:
(defun foo (args…)
(interactive …)
(let ((old-this-command this-command))
(setq this-command t)
… 処理を行う …
(setq this-command old-this-command)))
エラーならlet
は古い値をリストアするので、わたしたちはlet
でthis-command
をバインドしません。この場合におけるlet
の機能は、わたしたちが正に避けたいと思っていることを行ってしまうでしょう。
コマンドのリマップ(Remapping Commandsを参照)が発生したときを除き、これはthis-command
と同じ値をもつ。リマップが発生するとthis-command
は実際に実行されたコマンド、this-original-command
は実行を指定されたが他のコマンドにリマップされたコマンドを与える。
この関数は現在のコマンドを呼び出したキーシーケンスに加えて、以前にそのコマンド用にプレフィックス引数を生成したすべてのコマンドを含む文字列かベクターをリターンする。read-event
を使用するコマンドにより、タイムアウトせずに読み取られたすべてのイベントが最後に加えられる。
しかしそのコマンドがread-key-sequence
を呼び出していたら、最後に読み取られたキーシーケンスをリターンする。Key Sequence Inputを参照のこと。シーケンス内のすべてのイベントが文字列として適当な文字なら文字列が値になる。Input Eventsを参照のこと。
(this-command-keys)
;; これを評価するためにC-u C-x C-eを使用すると
⇒ "^U^X^E"
this-command-keys
と同様だが常にベクターでイベントをリターンするので、入力イベントを文字列内に格納する複雑さを処理する必要がない(Strings of Eventsを参照)。
この関数はthis-command-keys
がリターンするイベントテーブルを空にする。keep-recordがnil
なら、その後に関数recent-keys
(Recording Inputを参照)がリターンするレコードも空にする。これは特定のケースにおいてパスワードを読み取った後、次のコマンドの一部として不用意にパスワードがエコーされるのを防ぐために有用である。
この変数はキーシーケンス(マウスメニューからのイベントは勘定しない)の一部として読み取られた最後の入力イベントを保持する。
この変数の1つの使い方は、x-popup-menu
にたいしてどこにメニューをポップアップすべきか告げる場合である。これは内部的に
y-or-n-p
(Yes-or-No Queriesを参照)にも使用されている。
この変数にはコマンドの一部としてコマンドループに読み取られた最後の入力イベントがセットされる。この変数は主にself-insert-command
内でどの文字が挿入されたか判断するために使用されている。
last-command-event
;; これを評価するためにC-u C-x C-eを使用すると
⇒ 5
C-eのASCIIコードの5が値になる。
この変数は最後の入力イベントが送られたフレームを記録する。これは通常はそのイベントが生成されたときに選択されていたフレームだが、そのフレームの入力が他のフレームにリダイレクトされていたら、そのリダイレクトされていたフレームが値となる。Input Focusを参照のこと。
最後のイベントがキーボードマクロに由来する場合、値はmacro
になる。