interactive
の使い方本節では、Lisp関数を対話的に呼び出し可能なコマンドにするフォーム
interactive
の書き方について述べます。
このスペシャルフォームは、これを含む関数がコマンドであり、 (M-xや当該関数にバインドしたキー列を入力することで) 対話的に呼び出せることを宣言する。 引数arg-descriptorは、コマンドを対話的に呼び出したときに コマンドに対する引数の計算方法を宣言する。
他の関数と同様に、コマンドはLispプログラムからも呼び出せるが、 その場合、呼び出し側が引数を渡し、arg-descriptorにはなんの効果もない。
フォーム
interactive
が効果を発揮するのは、 コマンドループ(実際にはサブルーティンcall-interactively
)が 関数を呼び出すまえに関数定義を走査してこのフォームを探すからである。 関数が呼び出されると、フォームinteractive
を含めて その本体のフォームが実行されるが、そのとき、interactive
は引数を評価せずに単にnil
を返す。
引数arg-descriptorには3つの可能性があります。
nil
。
この場合、コマンドは引数なしで呼ばれる。
コマンドが1つ以上の引数を必要とする場合、これはただちにエラーになる。
してはいけないことの例を示す。
(interactive (list (region-beginning) (region-end) (read-string "Foo: " nil 'my-history)))
キーボード入力を読み終えてからポイントやマークを調べることで、 問題を回避する。
(interactive (let ((string (read-string "Foo: " nil 'my-history))) (list (region-beginning) (region-end) string)))
(interactive "bFrobnicate buffer: ")
コード文字‘b’は、補完を用いて既存のバッファ名を読むことを指示する。 バッファ名は、コマンドに渡される唯一の引数である。 文字列の残りはプロンプトである。
文字列内に改行文字があると、それはプロンプトを終える。 その部分で文字列が終らないときには、 文字列の残りの部分には、別の引数を指定するコード文字やプロンプトがある。 このようにして、何個の引数でも指定できる。
プロンプトの文字列では、プロンプト内の(第1引数から始まる)
まえの引数値を含めるために‘%’を使える。
これはformat
(see Formatting Strings)を用いて行う。
たとえば、既存バッファの名前を読み、
続けてそのバッファに与える新たな名前を読むにはつぎのようにする。
(interactive "bBuffer to rename: \nsRename buffer %s to: ")
文字列の最初の文字が‘*’である場合、 バッファが読み出し専用であるとエラーを通知する。
文字列の最初の文字が‘@’であり、 コマンドを起動したキー列にマウスイベントが含まれる場合、 コマンドを実行するまえに それらのイベントの最初のものに関連したウィンドウを選択する。
‘*’と‘@’は同時に使え、その順序は関係ない。 引数の実際の読み取りはプロンプトの (‘*’でも‘@’でもない最初の文字で始まる)残りの部分で制御される。