Go to the first, previous, next, last section, table of contents.

コマンド

コマンドとは、インタラクティブ(訳注:対話的) に呼ぶことのできる関数のことで す。関数をインタラクティブに呼ぶためには(通常) 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 に設定しま す。


Go to the first, previous, next, last section, table of contents.