Next: Permanent Installation, Previous: Interactive, Up: Writing Defuns [Contents][Index]
interactive
この例でmultiply-by-seven
はinteractive
の引数として"p"
を使用しています。これはC-u、あるいはMETAの後に数値をタイプした場合には、関数の引数としてその数値を渡すためのコマンドと解釈するようEmacsに指示するための引数です。Emacsにはinteractive
を用いる際のために事前定義された文字が20以上あります。ほとんどすべての場合において、これらのオプションのいずれかを使って、関数に正しい情報を対話的に渡すことが可能です(Code Characters for interactive
in The GNU Emacs Lisp
Reference Manualを参照)。
zap-to-char
という関数で考えてみます。以下はこの関数のinteractive式です
(interactive "p\ncZap to char: ")
interactive
にたいする引数の最初の部分である‘p’はすでに目にしました。これはEmacsにたいしてプレフィックス(前置)されたものを関数に渡す数値として解釈するよう告げる引数です。C-uかMETAの後に数値をタイプすればプレフィックスを指定できます。このプレフィックスは指定する文字の文字数を指定します。つまりプレフィックスが3で文字に‘x’を指定すると、次の3つ目の‘x’までを含んだすべてのテキストを削除することになります。プレフィックスをセットしない場合には指定した文字までのすべてのテキストを削除しますが、それを超えた削除は行われません。
削除する文字の名前を関数に伝えるのが‘c’です。
正確に言うと、2つ以上の引数をもつ関数はそれぞれの引数にたいする情報をinteractive
の後の文字列内のパーツに含めることができるということです。この場合には、、引数それぞれに渡される情報はinteractive
リストで指定されるのと同じ順序になります。この文字列内におけるパーツは、それぞれ改行文字である‘\n’によって次のパーツと区切られます。たとえば‘\n’によって‘p’の後に‘cZap
to char: ’を続けることができるのです。これによって(もしあれば)プレフィックス引数や文字の値をEmacsに渡すことができます。
このような場合の関数定義は以下のようになるでしょう。interactive
はarg
とchar
をそれぞれプレフィックス引数と指定する文字にバインドします:
(defun name-of-function (arg char) "documentation…" (interactive "p\ncZap to char: ") body-of-function…)
(プロンプト内のコロンの後のスペースは入力を求める際の見栄えをよくするため。例についてはThe
Definition of copy-to-buffer
を参照のこと。)
引数を受け取らない関数のinteractive
に引数は必要ありません。そのような関数にはシンプルな式(interactive)
を含めます。たとえば以下はmark-whole-buffer
です。
この特殊な文字コードがあなたのアプリケーションにそぐわない場合には、リストとしてあなた独自の引数をinteractive
に渡せます。
例についてはThe Definition of
append-to-buffer
の定義を、このテクニックに関するより完全な例についてはUsing Interactive
in The GNU Emacs Lisp Reference
Manualを参照してください。