32

Emacs Lisp 関数はしばしば次のように始まります:

(lambda () (interactive) ...

「(インタラクティブ)」は何をしますか?

4

5 に答える 5

28

明確にするために(チャーリーが引用しているのは引用されたドキュメントにあります)(interactive)、キーにバインドされた関数だけでなく、任意の関数のためのものです。がない(interactive)場合は、プログラムでのみ呼び出すことができ、からM-x(またはキーバインドを介して)呼び出すことはできません。

編集:関数に「(インタラクティブ)」を追加するだけでは、必ずしもそのように機能するとは限らないことに注意してください。関数がインタラクティブでない理由はたくさんあります。スコープ、依存関係、パラメーターなど。

于 2008-12-18T20:38:51.947 に答える
19

つまり、キーにバインドされたときに関数を呼び出し可能にするために必要なコードをいくつか含めているということです。たとえば、CTRL-u から引数を取得するなどです。

詳細については、CTRL-h f interactive以下をご覧ください。

    interactive は、「C ソース コード」の特別な形式です。
    (インタラクティブな引数)

    関数を対話的に使用するために引数を解析する方法を指定します。
    たとえば、次のように記述します。
      (defun foo (arg) "Doc string" (interactive "p") ...use arg...)
    `foo' がコマンドとして呼び出されたとき、ARG が前置引数になるようにします。
    `interactive' への「呼び出し」は、実際には関数ではなく宣言です。
     引数の読み方を `call-interactively' に伝える
     関数に渡します。
    実際に呼び出されると、`interactive' は単に nil を返します。

    `interactive' の引数は通常、コード文字を含む文字列です
     プロンプトが続きます。(一部のコード文字は、取得に I/O を使用しません。
     複数の引数を要求するには、次のように入力します。
     コード文字、そのプロンプト、改行、および別のコード文字などを指定します。
     プロンプトは format に渡され、% エスケープを使用して
     既に読み取られた引数。
于 2008-12-18T19:40:10.070 に答える
14

さらに、interactiveの主な目的は、インタラクティブなコンテキスト(たとえば、ユーザーがキーバインディングを使用して関数を呼び出す場合)で、プログラムでしか指定できない関数の引数をユーザーに指定させることです。

たとえば、関数sumが2つの数値の合計を返すとします。

(defun sum (a b)
  (+ a b))

あなたはそれを呼び出すこと(sum 1 2)ができますが、あなたはLispプログラム(またはREPL)でのみそれを行うことができます。関数で特殊な形式を使用する場合はinteractive、ユーザーに引数を求めることができます。

(defun sum (a b)
  (interactive
   (list
    (read-number "First num: ")
    (read-number "Second num: ")))
  (+ a b))

これM-x sumで、ミニバッファに2つの数値を入力できるようになりますが、それでも実行できます(sum 1 2)

interactive関数がインタラクティブに呼び出された場合に引数リストとして使用されるリストを返す必要があります。

于 2009-04-17T14:53:24.493 に答える
4

(interactive) は、Mx を介して、またはキーバインディングを介して、ユーザーと対話することを意図した関数用です。

文字列、整数、バッファ名などをキャッチするパラメータを含む、使用方法の詳細については、 Mx describe-function RET インタラクティブ RET を参照してください。

于 2012-03-17T15:42:58.090 に答える