Next: , Previous: , Up: コマンドループ   [Contents][Index]


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

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

Variable: last-command

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

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

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

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

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

Variable: current-minibuffer-command

これはthis-commandと同じ値をもつが、ミニバッファーへエンター時2再帰的にバインドされる。この変数はカレントミニバッファーセッションをオープンしたコマンドが何かを判定するために、ミニバッファーフック等から使用されるかもしれない。

Function: this-command-keys

この関数は現在のコマンドを呼び出したキーシーケンスを含む文字列かベクターをリターンする。read-eventを使用するコマンドにより、タイムアウトせずに読み取られたすべてのイベントが最後に加えられる。

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

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

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

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

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

Variable: last-nonmenu-event

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

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

Variable: last-command-event

この変数にはコマンドの一部としてコマンドループに読み取られた最後の入力イベントがセットされる。この変数は主にself-insert-command (どの文字が挿入されたか判断するため)、およびpost-self-insert-hook (挿入された文字にアクセスするため)の内部で使用されている(ユーザーレベルの挿入コマンドを参照)。

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

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

Variable: last-event-frame

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

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

入力イベントには、その発生元となるどこかから送られてこなければなりません。それがキーボードマクロ、シグナル、あるいは‘unread-command-events’のときもありますが、通常はコンピューターに接続されたユーザーの制御する物理的な入力デバイスからでしょう。これらのデバイスは入力デバイス(input device)と呼ばれており、Emacsは入力イベントそれぞれを発生元である入力デバイスに関連付けています。これらのデバイスは入力デバイスそれぞれにたいして一意な名前によって識別されます。

使用された入力デバイスを正確に判別できる能力は、各システムの詳細に依存します。その情報が利用できなければ、Emacsはキーボードイベントの発生元を‘"Virtual core keyboard"’、その他のイベントの発生元を‘"Virtual core pointer"’のように報告します(これらは詳細なデバイス情報が不明なときにXサーバーが報告するデバイス名なので、すべてのプラットフォームでこれらの値をデバイス名として使用する)。

Variable: last-event-device

この変数は最後に読み取られた入力イベントの発生元となる入力デバイス名を記録する。そのようなデバイスが存在しなければnil(たとえば最後の入力イベントをunread-command-eventsから読み取ったときや、キーボードマクロが発生元のとき)。

XウィンドウでXInput拡張(X Input Extension)が使用される際のデバイス名はXサーバーに接続された物理キーボード、ポインティングデバイス、タッチスクリーンそれぞれにたいして一意な文字列となる。それ以外の場合には‘"Virtual core pointer"’か‘"Virtual core keyboard"’という文字列のいずれかであり、それはそのイベントが(マウスのような)ポインティングデバイス、あるいはキーボードのいずれによって生成されたかに依存する。

Function: device-class frame name

異なるさまざまなタイプのデバイスがあり、それらのデバイスは名前によって判別できる。この関数はframeで発生したイベントにたいして、デバイスnameの正しいタイプを決定するために使用できる。

リターン値は以下のシンボル(“デバイスクラス”)のいずれか:

core-keyboard

コアキーボード(core keyboard)。そのデバイスがキーボードのようなデバイスだが、その他の特徴が不明なことを意味する。

core-pointer

コアキーボード(core pointer)。そのデバイスがポインティングデバイスのようなデバイスだが、その他の特徴が不明なことを意味する。

mouse

コンピューターマウス。

trackpoint

トラックポイントやジョイスティック(または同種のコントローラー)。

eraser

グラフィックタブレットのスタイラス(タッチペン)の反対側やスタンドアロンのイレイサー(消しゴム)。

pen

グラフィックタブレットのペン、スタイラス、または同種デバイスのペン先端。

puck

コンピュータのマウスのように見えるが、他の何かの面にたいする絶対座標を報告するデバイス。

power-button

電源ボタンやボリュームボタン(または同種のコントローラー)。

keyboard

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

touchscreen

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

pad

描画タブレットの周辺機器で一般的なセンシティブボタン(sensitive button)、リング(ring)、ストリップ(strip)のコレクション。

touchpad

タッチパッドのような二次的タッチデバイス。

piano

電子キーボードのような音楽器。

test

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


Next: コマンド後のポイントの調整, Previous: インタラクティブな呼び出しの区別, Up: コマンドループ   [Contents][Index]