コマンドとは、インタラクティブ(訳注:対話的) に呼ぶことのできる関数のことで す。関数をインタラクティブに呼ぶためには(通常) 2通りの方法が存在します。関数が キーにバインドされている場合、そのキーシーケンスをキーボードから入力することで 呼ぶことができます。また execute-extended-command (M-x) で呼ぶこともできます。
(Emacs が) コマンドレベル入力ループでコマンドの入力を待っている時にキーを押す と、複数のことが行なわれます。 Emacs の(この)メインループは、カレントなキー マップを用い (その)キーシーケンスを検索し、(その)シーケンスがバインドされてい る関数を探します。この後、その関数をアーギュメントとして関数 call- interactively を呼びます。
関数の関数定義がオートロードフォームである場合、 (オートローディングを行ない) ロードされた関数定義を用います。
Lisp 関数の場合、call-interactively は対象となる関数のコードをスキャンし、その car が interactive であるフォームを探します。 interactive は、関数の先頭にある 必要はありませんが、(通常) 先頭に置かれます。 interactive フォームが見つからな い場合 (これはその関数がコマンドではないことを意味しますが)、call- interactively はエラーを出します。見つかった場合、call-interactive は(そ の)interactive フォームのアーギュメントを調べ、(それに従い)関数に必要なアー ギュメントを渡します。 "アーギュメントが(どのように)準備されるか" という点に関 してはチャプター 17 [interactive]、ページ 138 を参照して下さい。
ここで、何か他に論じなくてはいけないことは??
Function: commandp function
function がインタラクティブな呼び出しを提供する場合、t を返します。 (これ は)その関数が、(与えられる)アーギュメントの読み込み方に関する記述を持って いることを意味します。有効でない(訳注:invalid)関数や関数定義を持たないシ
ンボルに対しては、nil を返します。
インタラクティブに呼び出すことのできる関数は (キーボートマクロとして扱われ る)ストリング、 interactive の呼び出しをトップレベルに持つラムダ式、 nil でない 4 番目のアーギュメントを持つ(autoload で作られた) autoload 定義や、 Lisp の built-in 関数を含みます。
関数定義が commandp である場合、そのシンボルも commandp になります。
Function: call-interactively function &optional record-flag
この関数は、 (インタラクティブ calling specs に従い) function を呼びます。
record-flag が non-nil の場合、(この)コマンドは無条件で command-history に 追加されます。そうでない場合、ミニバッファを用いてアーギュメントを読み込ん だ時にのみ、追加されます。セクション 17.6 [コマンドヒストリー]、ページ 151 参照。
Function: command-execute command &optional record-flag
この関数は、 (エディターコマンドとして) command を実行します。 command は commandp プレディケートを満さなくてはいけません。ストリングは、execute- kbd-macro で実行されます。関数は、オプショナルな record-flag とともに call-interactively に渡されます。
Special Form: interactive [arg-descriptors]
この特殊フォームは、(これを持つ)関数がコマンドであること、(つまり) "M-x か、それにバインドされたキーを入力することでインタラクティブに呼び出すこと ができる" こと、を宣言します。 arg-descriptors は、"(対象とする)関数をイン タラクティブに呼ぶ場合、どのようにアーギュメントを与えるか" を示します。 interactive は(呼ばれた場合)何も行ないません。 arg-descriptors の評価も行 なわず、(常に) nil を返します。 arg-descriptors が与えられない場合、 (対象 とする)関数はアーギュメントを持たずに呼ばれます。もちろん、(対象とする)関 数が 1 つ以上のアーギュメントを必要とする場合、エラーになります。
arg-descriptors がストリングでない場合、それは、評価によって (対象とする) 関数に渡されるアーギュメントのリストが得られるフォームでなくてはいけませ ん。
arg-descriptor がストリングの場合、このストリングは (そのコード文字が必要 とする場合) プロンプトを後に続けたコード文字で構成されてなくてはいけませ ん。プロンプトは、ストリングの終りかニューラインで終ります。ニューラインの 後 (次のアーギュメント用の) 2 番目のコード文字とプロンプトとを与えることが できます(以下同様)。
ストリングの最初の文字が * の場合、バッファがリードオンリーである場合エ ラーを出し(訳注:signal)ます。この場合、(その)次の文字を最初のコード文字と して用います。
コード文字の多くは、(その)アーギュメントが既存の何か (バッファ、関数、ファ イル名、等) の名前でなくてはいけないことを指示します。このような場合、 (Emacs により)デフォルトのものが与えられるとともに、正しくない (訳注:条件 に合わない)名前は受け入れられなくなります (Emacs は `[No Match]' と文句を 言い、プロンプトを出し、再び名前を求めます)。 TAB, SPC, RET は、関数 completing-read に従い名前の commpletion を行ないます。
以下のテーブルにおいて、"completion" とマークされたコード文字は completion を行ないます。 "existing" とマークされたものは(既存の)名前を要求します。 "default" とマークされたものはデフォルトを持ちます。 "prompt" はプロンプト を持たなくてはいけません。
a
関数名(i.e., fboundp である(訳注:fboundp を満たす)シンボル)。 existing, competion, prompt b バッファ名。existing, completion, prompt B バッファ名。completion, prompt c 文字。prompt C コマンド名(i.e. インタラクティブ関数)。existing, completion, prompt d ポイントのポジションを数値として用います。No I/O D ディレクトリ名。existing, completion, default, prompt f
関数名。existing, completion, default, prompt F 関数名。existing, default, prompt k キーシーケンス。 (カレントなキーマップで) コマンドか undefined さ れたコマンドが見つかるまで文字を読み込み、そのキーシーケンスをスト リングとして関数に渡します。カーソルはエコーエリアに移動しません。 prompt m (数値としての)マークのポジション。No I/O n 数値。数値を必要とします。prompt N 未処理のプレフィックスアーギュメントを関数に渡します。プレフィック スアーギュメントが nil の場合、 (n におけるように)数値を読み込みま す。数値を必要とします。prompt p (小文字のp) 処理されたプレフィックスアーギュメントを関数に渡します。No I/O P (大文字のP) 未処理のプレフィックスアーギュメントを関数に渡します。No I/O r ポイントとマークを、関数に対する 2つの(数値の) アーギュメントとし て(小さい方を先にして)渡します。 No I/O s ストリングを読み込み、LFD か RET でターミネートします。このどちら も(訳注:LFD も RETも) C-q を用いることでストリングに含めることは できます。 prompt S ストリングを読み込み、空白(訳注:whitespace) 文字のどれかでターミ ネートします。読み込まれたものは、シンボルとして intern されます。 C-q を用いることで空白文字をストリングに含めることはできます。通常 シンボルをターミネートする文字(e.g., ()[])は (訳注:ここではこのス トリングを)ターミネートしません。 prompt v ユーザーオプションとして宣言された変数(i.e., user-variable-p)。 existing, completion, prompt x Lisp フォームを読み込み、LFD か RET でターミネートします。 読み込まれるストリングが閉じのダブルクォートをタイプする前にターミ ネートされた場合、閉じのダブルクォートを追加します。リストやベクト ルを読み込んでいて、最後の閉じの ) や ] の前にターミネートされた場 合、エラーを出します。 (訳注:読み込んだ)フォームは評価しません。 prompt X (x におけるように)フォームを読み込んだ後、評価し、その結果を関数に 渡します。 prompt
(defun foo1 () ;foo1 はアーギュメントを取らず、 (interective) ;2 word 先に移動させるだけ。 (forward-word 2)) => foo1
(defun foo2 (n) ;foo2 はアーギュメントを 1つ取り、 (interactive "p") ;それは 処理されたプレフィックスである。 (forward-word (* 2 n))) => foo2
(defun foo3 (n) ;foo3 はアーギュメントを 1つ取り、 (interactive "nCount:") ;それは ミニバッファから読み込まれる。 (forward-word (* 2 n))) => foo3
(defun three-b (b1 b2 b3) "Select three existing buffer (prompting for them in the Minibuffer) Put them into three windows, selecting the last one." (interactive "bBuffer1:\nbBuffer2:\nbBuffer3:") (delete-other-windows) (split-window (selected-window) 8) (switch-to-buffer b1) (other-window 1) (split-window (selected-window) 8) (switch-to-buffer b2) (other-window 1) (switch-to-buffer b3) ) => three-b (three-b "*scratch*" "declarations.texinfo" "*mail*") => nil
インタラクティブ入力とキーボードコマンドを示す方法が必要!!
Function: interactive-p
この関数は、このフォームを中に持つ関数がインタラクティブに呼び出されている 場合、t を返します。これは関数が (キーのバインディングとして呼ばれた場合も 含め) call-interactively で呼び出されたことを意味します。別の関数から呼ば れた関数が interactive-p であること (訳注:interactive-p で t を返すこと) はありません。
これを持つ関数がキーボードマクロを通して呼ばれている場合、 interactive-p は nil を返します。
(defun foo () (interactive) (interactive-p)) => foo (defun bar() (interactive) (setq y (list (foo) interactive-p)))) => bar
;; ここで (M-x で) bar を呼ぶ y => (nil t)
Variable: last-command
このグローバル変数には、最後に実行されたコマンドが設定されます。これは(通 常)関数定義を持つシンボルになりますが、 (それが何であれ)キーマップで見つけ られたものや、最後に実行されたコマンドで、変数 this-command に設定されたも のになります。
Variable: this-command
このグローバル変数には、(今現在)実行しているコマンドの名前が設定されます。 この値は、(コマンド終了時に) 変数 last-command に設定されます。(キーボード マクロに関してはどうか??)
this-command に置かれたものは何であれ、 (次のコマンドの実行時には) last- command に置かれます(正確にはいつ??)。 (例えば) テキストを kill する関数 は、直後に行なわれた kill で "その kill(部分)を前の kill(部分)に追加すべき か否か" の判定ができるよう(常に) kill-region を this-command に設定しま す。