@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
@c See the file elisp-jp.texi for copying conditions.
@c 複製の条件は elisp-jp.texi に書いてあります。
@setfilename ../info/commands-jp
@node Command Loop, Keymaps, Minibuffers, Top
@chapter コマンド・ループ
@cindex editor command loop
@cindex command loop
@cindex エディタ・コマンド・ループ[えでぃた・こまんど・るーぷ]
@cindex コマンド・ループ[こまんど・るーぷ]

    Emacsを実行すると、ほぼ直ちに@dfn{エディタ・コマンド・ループ
(editor command loop)}に入ります。このループはキー・シーケンスを読み取り、
それらの定義を実行し、結果を表示します。本章では、これがどのように
行なわれるかと、Lispプログラムでそれを行なうことができるサブルーチンを
説明します。

@menu
@c  メニューは常体でいいのね
* Command Overview::    コマンド・ループがコマンドを読む方法。
* Defining Commands::   関数がどのように引数を読むかを指定する。
* Interactive Call::    引数を読み込むように、コマンドを呼び出す。
* Command Loop Info::   コマンド・ループが設定する、自分で調べるための変数。
* Input Events::	入力を読み込んだときにどのように見えるか。
* Reading Input::       キーボードやマウスから入力イベントを読む方法。
* Waiting::             時間の経過あるいは入力を待つ。
* Quitting::            どのように@kbd{C-g}が働くか。
                        とりやめをcatchするあるいは延期する方法。
* Prefix Command Arguments::    コマンドが前置引数を使えるようにする方法。
* Recursive Editing::   再帰編集に入ることと、普通はそうすべきでない理由。
* Disabling Commands::  禁止されたコマンドをコマンド・ループが操作する方法。
* Command History::     コマンド履歴はどう設定されるかと、アクセスの方法。
* Keyboard Macros::     キーボード・マクロがどのように実装されているか。
@c  word    defer   延期
@c  word    catch   (そのまま)
@c  word    disabled command    禁止されたコマンド
@c  word    implement   実装
@end menu

@node Command Overview, Defining Commands, Command Loop, Command Loop
@section コマンド・ループ概観

    コマンド・ループが最初にやらなければならないことは、
キー・シーケンスを読み込むことです。キー・シーケンスはイベントの
シーケンスであり、コマンドに翻訳されます。コマンド・ループは、
これを行なうのに関数@code{read-key-sequence}を呼びます。
自作のLispコードでもこの関数を呼ぶことができます
(@pxref{Key Sequence Input})。Lispプログラムでは@code{read-event}
(@pxref{Reading One Event})による低水準な入力や、
@code{discard-input}(@pxref{Event Input Misc})によって未処理の入力を
捨てることもできます。
@c  word    translate   翻訳
@c  word    pending input   未処理の入力
@c  word    discard     捨てる

    キー・シーケンスは現在アクティブなキーマップを通してコマンドに
変換されます。これがどうなされるかを知るためには、@xref{Key Lookup}。
結果は、キーボード・マクロあるいは対話的に呼出し可能な関数です。
キーが@kbd{M-x}ならば、これは別のコマンドの名前を読み込み、
その後それを呼びます。これは、コマンド@code{execute-extended-command}
(@pxref{Interactive Call})が行ないます。

    コマンドを実行するには、まずその引数を読み込む必要があります。
これには@code{command-execute}(@pxref{Interactive Call})を呼び出します。
Lispで書かれたコマンドでは、@code{interactive}指定にどのように引数を
読むのかが書かれています。これによって、
前置引数(@pxref{Prefix Command Arguments})を使ったり、
ミニバッファ(@pxref{Minibuffers})にプロンプトを出して
読み取ったりします。たとえば、コマンド@code{find-file}は
ミニバッファを使ってファイル名を読むよう書かれた@code{interactive}指定を
持っています。コマンドの関数本体はミニバッファを使いません。つまり、
このコマンドをLispコードから関数として呼び出した場合、ファイル名文字列を
普通のLisp関数引数として与えなければなりません。

    コマンドが文字列あるいはベクタ(即ち、キーボード・マクロ)ならば、
@code{execute-kbd-macro}を使ってそれを実行します。この関数を
自分自身で呼んでも構いません(@pxref{Keyboard Macros})。

    実行中のコマンドを終らせるには、@kbd{C-g}をタイプします。
この文字によって@dfn{とりやめる(quitting)}(@pxref{Quitting})ことができます。

@defvar pre-command-hook
@c  word    normal hook 正規フック
エディタ・コマンド・ループは、この正規フックを各コマンドの前に実行します。
この時点で、@code{this-command}の内容はこれから実行しようとしているコマンドに
なっています。そして、@code{last-command}は直前のコマンドを表しています。
@xref{Hooks}。
@end defvar

@defvar post-command-hook
エディタ・コマンド・ループは、この正規フックを各コマンドの後
(とりやめあるいはエラーによって、途中で終ったコマンドも含む)に実行します。
それから、最初にコマンド・ループに入ったときにも実行します。
その時点では、@code{this-command}はたった今実行したコマンドを表し、
@code{last-command}はその前のものを表します。@xref{Hooks}。
@end defvar

@c  word    suppress    抑止
    @code{pre-command-hook}と@code{post-command-hook}との実行中、
とりやめは抑止されます。これらフック中でエラーが起こった場合には、
フックの実行だけを終らせ、それ以外は何もしません。

@node Defining Commands, Interactive Call, Command Overview, Command Loop
@section コマンドの定義
@cindex defining commands
@cindex commands, defining
@cindex functions, making them interactive
@cindex interactive function
@cindex コマンドの定義[こまんどのていぎ]
@cindex コマンド、定義[こまんど、ていぎ]
@cindex 関数、対話的にする[かんすう、たいわてきにする]
@cindex 対話的関数[たいわてきかんすう]

@c  word    actually    実際に
@c  word    serve       働く
    Lisp関数は、その本体のトップレベルに特殊形式@code{interactive}の
呼出しを行なう形式があるならば、コマンドになります。この形式は、
実際の実行のときには何もしませんが、その存在は対話的呼出しが許されている
という意味のフラグとして働きます。その引数は、対話的呼出しの際に
引数をどのように読み込むかを制御します。

@menu
* Using Interactive::     @code{interactive}についての一般規則。
* Interactive Codes::     さまざまな方法で引数を読み込むための
                            標準英文字コード。
* Interactive Examples::  対話的引数の読込み方の例。
@c  word    rule    規則
@end menu

@node Using Interactive, Interactive Codes, Defining Commands, Defining Commands
@subsection @code{interactive}を使う

    本節では、Lisp関数を対話的呼出し可能なコマンドにする
@code{interactive}形式を、どのように書くのかを説明します。

@defspec interactive arg-descriptor
@cindex argument descriptors
@cindex 引数記述子[ひきすうきじゅつし]
@c  word    declare 宣言
この特殊形式が関数中にあると、それがコマンドであり、
それゆえ対話的に(@kbd{M-x}やこのコマンドにバインドされた
キー・シーケンスの入力によって)呼び出され得ることを宣言します。
引数@var{arg-descriptor}は、コマンドが対話的に呼び出されたときに
コマンドへの引数をどのように計算するかを宣言します。

コマンドはほかの関数同様Lispプログラムから呼び出されるかもしれませんが、
その場合は呼び手が引数を用意し、@var{arg-descriptor}は効果を持ちません。
@c  word    caller      呼び手

@code{interactive}形式が効果をもつのは、関数を呼び出す前に、
コマンド・ループ(実際にはそのサブルーチン@code{call-interactively})が
その関数定義をスキャンして@code{interactive}を探すからです。
一旦関数が呼び出されると、その本体の@code{interactive}形式を含む全ての形式が
実行されますが、この際は@code{interactive}は引数の評価さえ行なわずに
単に@code{nil}を返します。
@end defspec

引数@var{arg-descriptor}には三つの可能性があります:

@itemize @bullet
@item
省略あるいは@code{nil}。この場合、コマンドは引数なしで呼ばれます。
この結果、コマンドが一つ以上の引数を要求している場合は即座にエラーとなります。

@item
文字列以外のLisp式。この場合、評価の結果がコマンドに引き渡す引数のリストに
なるような形式であることが必要です。
@cindex argument evaluation form
@cindex 引数評価形式[ひきすうひょうかけいしき]

@c  word    subprocess  サブプロセス
@c  word    relocate    再配置
この式がキーボード入力(ミニバッファの使用を含む)を読み込むならば、
入力読込み前のポイントあるいはマークを表す整数値は入力読込み後には
誤っているかもしれないということを忘れてはいけません。理由は
カレント・バッファがサブプロセスからの出力を受け取っているかもしれないから
です。コマンドが入力を待つ間にサブプロセス出力が来ると、
それがポイントとマークを再配置するかもしれません。

やっては@emph{いけない}ことの例を挙げます:

@smallexample
(interactive
 (list (region-beginning) (region-end)
       (read-string "Foo: " nil 'my-history)))
@end smallexample

@noindent
先の問題を回避するには、キーボード入力を読み込んだ後にのみ
ポイントとマークを調べればよいのです:

@smallexample
(interactive
 (let ((string (read-string "Foo: " nil 'my-history)))
   (list (region-beginning) (region-end) string)))
@end smallexample

@item
@cindex argument prompt
@cindex 引数プロンプト[ひきすうぷろんぷと]
文字列。この場合、その中身はコード文字にプロンプトを続けたもので
構成する必要があります(プロンプトはコード文字によって、
使うことも無視することもあります)。
文字列自体の終りか改行までが、プロンプトの終りです。
以下に簡単な例を示します:
@c  word    code character  コード文字
@c  word    newline 改行; linefeedは行送り

@smallexample
(interactive "bFrobnicate buffer: ")
@end smallexample
@c  XXX frobnicate って、どんな意味だっけ?

@noindent
コード文字@samp{b}で、補完を使って既存のバッファ名を読み込むことを
表します。バッファ名がコマンドに渡される唯一の引数で、文字列の残りは
プロンプトです。

文字列中に改行文字があった場合、それがプロンプトの終りです。
文字列がそこで終ってなかった場合、文字列の残りは別の引数を指定する
別のコード文字とプロンプトを含んでなければなりません。
このようにして、任意個数の引数を指定できます。

@c Emacs 19 feature
@c  word    previous    直前の
プロンプト文字列に@samp{%}を使って、直前の引数の値(第1引数以降)を
プロンプト中に含めることができます。これは@code{format}
(@pxref{Formatting Strings})によって行なわれます。たとえば、
既存のバッファ名に続いて、そのバッファにつける新しい名前を読み込むには、
こうします:

@smallexample
@group
(interactive "bBuffer to rename: \nsRename buffer %s to: ")
@end group
@end smallexample

@cindex @samp{*} in interactive
@cindex read-only buffers in interactive
@cindex @samp{*}、interactive中の[@samp{*}、interactiveちゅうの]
@cindex interactive中の@samp{*}[interactiveちゅうの@samp{*}]
@cindex interactiveにおける読出し専用バッファ[interactiveにおけるよみだしせんようばっふぁ]
@cindex 読出し専用バッファ、interactiveにおける[よみだしせんようばっふぁ、interactiveにおける]
@c  word    read only   読出し専用
文字列の最初の文字が@samp{*}の場合、バッファが読みだし専用バッファならば
エラーを通知します。

@cindex @samp{@@} in interactive
@cindex interactive中の@samp{@@}[interactiveちゅうの@samp{@@}]
@cindex @samp{@@}、interactive中の[@samp{@@}、interactiveちゅうの]
@c Emacs 19 feature
文字列の最初の文字が@samp{@@}の場合、そしてそのコマンドを起動するのに使われた
キー・シーケンスがマウス・イベントを含むならば、その最初のイベントに
関連づけられたウィンドウがコマンド実行前に選択されます。

@c  word    actual  実際の
@samp{*}と@samp{@@}とを一緒に使うこともできます。その順序は関係ありません。
実際の引数の読込みは、(@samp{*}や@samp{@@}以外の文字から始まる)
プロンプト文字列の残りの部分によって制御されます。
@end itemize

@node Interactive Codes, Interactive Examples, Using Interactive, Defining Commands
@comment  node-name,  next,  previous,  up
@subsection @code{interactive}用のコード文字
@cindex interactive code description
@cindex description for interactive codes
@cindex codes, interactive, description of
@cindex characters for interactive codes
@cindex interactiveコードの記述[interactiveこーどのきじゅつ]
@cindex 記述、interactiveコードの[きじゅつ、interactiveこーどの]
@cindex コード、interactive、記述[こーど、interactive、きじゅつ]
@cindex interactiveコード文字[interactiveこーどもじ]
@cindex コード文字、interactive[こーどもじ、interactive]

    以下のコード文字の記述は、ここに定義するキー・ワードを含んでいます:

@table @b
@item 補完
@cindex interactive completion
@cindex 対話的補完[たいわてきほかん]
補完が使えます。@key{TAB}、@key{SPC}、@key{RET}は名前の補完を行ないます。
引数が
@c Overfull対策
@iftex
@linebreak
@end iftex
@code{completing-read}(@pxref{Completion})で読み込まれるためです。
@kbd{?}で可能な補完のリストを表示します。

@item 既存
@c  word    existing    既存
既存のオブジェクトの名前を要求します。無効な名前は受けつけません。つまり、
ミニバッファを抜けるコマンドでも、現在の入力が有効にならないかぎり抜けません。

@item デフォルト
@cindex default argument string
@cindex デフォルト引数文字列[でふぉるとひきすうもじれつ]
ユーザが何のテキストもミニバッファに入力しないならば、ある種のデフォルト値が
使われます。デフォルトはコード文字次第です。
@c  word    depend on   ……次第

@item 入出力なし
コード文字は何ら入力を読み込むことなしに、引数を計算します。
そのために、プロンプト文字列を使いませんし、プロンプト文字列を
与えても無視します。

コード文字がプロンプト文字列を使わなくとも、
それが文字列中の最後のコード文字でないかぎり、これに続く改行が必要です。

@item プロンプト
プロンプトがコード文字直後に続きます。プロンプトは文字列の終りか改行で
終ります。

@item 特殊
このコード文字はinteractive文字列の先頭においてのみ意味を持ちます。
これにはプロンプトや改行は不要です。これは単独の孤立した文字です。
@end table

@cindex reading interactive arguments
@cindex interactive引数の読込み[interactiveひきすうのよみこみ]
@cindex 読込み、interactive引数の[よみこみ、interactiveひきすうの]
    @code{interactive}に使用するコード文字記述子を挙げます:

@table @samp
@item *
カレント・バッファが読みだし専用ならば、エラーを通知します。特殊。

@item @@
このコマンドを起動したキー・シーケンス中の最初のマウス・イベントについての
ウィンドウを選択します。特殊。

@item a
関数名(即ち、@code{fboundp}を満たすシンボル)。既存、補完、プロンプト。

@item b
既存のバッファ名。デフォルトには、カレント・バッファ(@pxref{Buffers})の名前を
使います。既存、補完、デフォルト、プロンプト。
@c  XXX by default ねぇ。

@item B
バッファ名。バッファが存在する必要はありません。デフォルトには、
カレント・バッファ以外の最近使われたバッファ名を使います。
補完、デフォルト、プロンプト。

@item c
文字。カーソルはエコー領域に移動しません。プロンプト。

@item C
コマンド名(即ち、@code{commandp}を満たすシンボル)。既存、補完、プロンプト。

@item d
@cindex position argument
@cindex 位置引数[いちひきすう]
@c  word    position    (バッファ内)位置
整数でのポイント位置(@pxref{Point})。入出力なし。

@item D
ディレクトリ名。デフォルトはカレント・バッファの現在の
デフォルト・ディレクトリ、
@code{default-directory}(@pxref{System Environment})。
既存、補完、デフォルト、プロンプト。

@item e
コマンドを起動したキー・シーケンス中の、最初あるいは次のマウス・イベント。
さらに詳しくいうと、@samp{e}によりリストでイベントを取れるので、
リスト中のデータを見ることができます。@xref{Input Events}。入出力なし。

@samp{e}は一つのコマンドのinteractive指定で何度でも使えます。
コマンドを起動したキー・シーケンスにリストが@var{n}イベント分あった場合、
@var{n}番目の@samp{e}は@var{n}番目のそういったイベントを与えます。
リストではないイベント、ファンクション・キーや@sc{ASCII}文字などは、
@samp{e}に関するかぎり勘定に入れません。
@c  word    provide 与える
@c  word    function key    ファンクション・キー

@item f
既存ファイル名(@pxref{File Names})。デフォルト・ディレクトリは
@code{default-directory}。既存、補完、デフォルト、プロンプト。

@item F
ファイル名。ファイルが存在する必要はありません。補完、デフォルト、プロンプト。

@item k
キー・シーケンス(@pxref{Keymap Terminology})。これによりイベントが
現在のキーマップ中にコマンド(あるいは未定義コマンド)として見つかるまで、
イベントを読み込み続けます。キー・シーケンス引数は文字列あるいはベクタで
表現されます。カーソルはエコー領域に移動しません。プロンプト。

この種の入力は@code{describe-key}や@code{global-set-key}のようなコマンドで
使います。

@item K
定義を変更しようと考えているキー・シーケンス。これは@samp{k}のように
働きますが、キー・シーケンスの最後の入力イベントについて、
普通(必要ならば)使用する未定義のキーを定義キーに変換するための変換を
抑止する点が異なります。

@item m
@cindex marker argument
@cindex マーカ引数[まーかひきすう]
@c  word    marker  マーカ
整数でのマーク位置。入出力なし。

@item n
@c  word    ask 乞う
ミニバッファから読み込む数。入力が数でなければ、ユーザは再度入力を
乞われます。前置引数がもしあっても、使いません。プロンプト。

@item N
@cindex raw prefix argument usage
@cindex そのままの前置引数の使用[そのままのぜんちひきすうのしよう]
@c  word    raw そのままの
そのままの前置引数。前置引数が@code{nil}ならば、@kbd{n}のときのように
数を読み込みます。数を要求します。@xref{Prefix Command Arguments}。プロンプト。

@item p
@cindex numeric prefix argument usage
@cindex 数値前置引数の使用[すうちぜんちひきすうのしよう]
@c  word    numeric prefix argument 数値前置引数
数値前置引数(この@samp{p}が小文字であることに注意)。入出力なし。

@item P
そのままの前置引数(この@samp{p}が大文字であることに注意)。入出力なし。

@item r
@cindex region argument
@cindex リージョン引数[りーじょんひきすう]
ポイントとマークを二つの数値引数として、小さい方が先。これだけが
一つではなく、二つの連続した引数を指定するコード文字です。入出力なし。

@item s
任意テキスト、ミニバッファで読み込み、文字列として返します
(@pxref{Text from Minibuffer})。@key{LFD}、@key{RET}のいずれでも入力を
打ち切ります(これらの文字を入力に含めるためには@kbd{C-q}を使います)。
プロンプト。
@c  word    terminate   打ち切る

@item S
ミニバッファでinternされたシンボルの名前を読み込みます。
いずれの空白文字でも入力を打ち切ります(空白文字を文字列に含めるには
@kbd{C-q}を使います)。普通ならシンボルを打ち切るようなほかの文字
(たとえば括弧や角括弧)も、ここではそうなりません。プロンプト。

@item v
@c  word    user option ユーザ・オプション
ユーザ・オプションとして宣言された変数(即ち、述語@code{user-variable-p}を
満たす)。@xref{High-Level Completion}。既存、補完、プロンプト。

@item x
リード構文を指定したLispオブジェクト。@key{LFD}あるいは@key{RET}で
打ち切ります。オブジェクトは評価されません。@xref{Object from Minibuffer}。
プロンプト。
@c  XXX specified with its read syntax の意味がよくわからない。

@item X
@cindex evaluated expression argument
@cindex 評価された式引数[ひょうかされたしきひきすう]
@kbd{x}のときのように読み込むLisp形式ですが、その後評価してその値がコマンドの
引数になるようにしたもの。プロンプト。
@end table

@node Interactive Examples,  , Interactive Codes, Defining Commands
@comment  node-name,  next,  previous,  up
@subsection @code{interactive}使用例
@cindex examples of using @code{interactive}
@cindex @code{interactive}, examples of using 
@cindex @code{interactive}、使用例[interactive、しようれい]
@cindex 使用例、@code{interactive}[しようれい、interactive]

    @code{interactive}の例をいくつか挙げます:

@example
@group
(defun foo1 ()              ; @r{@code{foo1}は引数を取らない、}
    (interactive)           ;   @r{単に2語前に進むだけ。}
    (forward-word 2))
     @result{} foo1
@end group

@group
(defun foo2 (n)             ; @r{@code{foo2}は引数を一つ取り、}
    (interactive "p")       ;   @r{それは数値前置引数。}
    (forward-word (* 2 n)))
     @result{} foo2
@end group

@group
(defun foo3 (n)             ; @r{@code{foo3}は引数を一つ取り、}
    (interactive "nCount:") ;   @r{それはミニバッファから読み込まれる。}
    (forward-word (* 2 n)))
     @result{} foo3
@end group

@group
(defun three-b (b1 b2 b3)
  "Select three existing buffers.
Put them into three windows, selecting the last one."
@end group
    (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))
     @result{} three-b
@group
(three-b "*scratch*" "declarations.texi" "*mail*")
     @result{} nil
@end group
@end example

@node Interactive Call, Command Loop Info, Defining Commands, Command Loop
@section 対話的呼出し
@cindex interactive call
@cindex 対話的呼出し[たいわてきよびだし]

    コマンド・ループはキー・シーケンスを定義に変換した後、
その定義を関数@code{command-execute}を使って起動します。
定義がコマンドとしての関数ならば、@code{command-execute}は
@code{call-interactively}を呼び出し、それが引数を読み込んでコマンドを
呼び出します。自分自身でこれら関数を呼んでも構いません。

@defun commandp object
@var{object}が対話的呼出しに適しているならば、@code{t}を返します。
即ち、@var{object}がコマンドであれば、そうします。さもなくば、
@code{nil}を返します。

@c  word    lambda expression   ラムダ式
対話的に呼出し可能なオブジェクトには文字列とベクタ(キーボード・マクロとして
扱われます)、トップレベルの@code{interactive}呼出しを含むラムダ式、
そういったラムダ式から得られたバイトコード関数オブジェクト、
対話的と宣言された(@code{autoload}への第4引数が非@code{nil})
自動ロード・オブジェクト、いくつかのプリミティブ関数を含みます。

シンボルはその関数定義が@code{commandp}ならば、@code{commandp}です。
@c  一瞬何言ってんだかわからなかった。

キーやキーマップはコマンドではありません。それどころか、コマンドを
検索するために使うものです(@pxref{Keymaps})。

@code{commandp}の実際の使用例については、
@ref{Accessing Documentation}の@code{documentation}を参照してください。
@end defun

@defun call-interactively command &optional record-flag
この関数は、対話的呼出し可能な関数@var{command}を、
そのinteractive呼出し指定に基づいて引数を読み込んで、呼び出します。
@var{command}が関数や対話的に呼出し可能ではない場合(即ちコマンドではない)、
エラーを通知します。キーボード・マクロ(文字列とベクタ)は、たとえそれらが
コマンドとみなされる場合でも、受けつけません。これらは関数ではないからです。

@cindex record command history
@cindex コマンド履歴の記録[こまんどりれきのきろく]
@var{record-flag}が非@code{nil}ならば、本コマンドとその引数は、
無条件にリスト@code{command-history}に追加されます。
さもなくば、コマンドはそれが引数読込みのためにミニバッファを使った場合に
かぎり、追加されます。@xref{Command History}。
@end defun

@defun command-execute command &optional record-flag
@cindex keyboard macro execution
@cindex キーボード・マクロの実行[きーぼーど・まくろのじっこう]
この関数は、編集コマンド@var{command}を実行します。引数@var{command}は
@code{commandp}述語を満足する必要があります。即ち、対話的に呼出し可能な関数か
キーボード・マクロでなければなりません。

@var{command}の文字列あるいはベクタは@code{execute-kbd-macro}が実行します。
関数は@code{call-interactively}にオプション@var{record-flag}とともに渡します。

@c  word    place   場所;   ほかに訳しようがあるか?  placeholderと連動してないか?
シンボルはシンボルの場所内の関数定義を使うことで処理します。
@code{autoload}定義によるシンボルは、それが対話的呼出し可能な関数として
宣言されていたならば、コマンドとして扱います。こういった定義の処理は、
指定のライブラリをロードしてから、そのシンボルの定義を再検査することで
行ないます。
@end defun

@deffn Command execute-extended-command prefix-argument
@cindex read command name
@cindex コマンド名の読込み[こまんどめいのよみこみ]
この関数は、コマンド名をミニバッファから@code{completing-read}
(@pxref{Completion})を使って読み込みます。続いて指定のコマンドを
呼び出すために、@code{command-execute}を使います。そのコマンドが何を
返そうとも、それが@code{execute-extended-command}の値になります。

@cindex execute with prefix argument
@cindex 前置引数とともに実行する[ぜんちひきすうとともにじっこうする]
@cindex 実行する、前置引数とともに[じっこうする、ぜんちひきすうとともに]
コマンドが前置引数を求めると、@var{prefix-argument}の値を受け取る
ことになります。@code{execute-extended-command}が対話的に呼び出されたならば、
現在の前置引数がそのまま@var{prefix-argument}に使われます。
そのため、これが実行されるどのようなコマンドにも渡ります。
@c  XXX whatever command is being run …… だよね?  やっぱ文法わからん

@c !!! Should this be @kindex?
@cindex @kbd{M-x}
@c  word    painful 辛い
@code{execute-extended-command}は@kbd{M-x}の普通の定義なので、
文字列@w{@samp{M-x}}をプロンプトとして使用します
(@code{execute-extended-command}の起動に使われたイベントから
プロンプトを取る方がよいのですが、これは実装するのが辛いのです)。
前置引数があれば、その値の記述も同じくプロンプトの一部となります。

@example
@group
(execute-extended-command 1)
---------- Buffer: Minibuffer ----------
1 M-x forward-word RET
---------- Buffer: Minibuffer ----------
     @result{} t
@end group
@end example
@end deffn

@defun interactive-p
この関数は、これを含む関数(@code{interactive-p}を呼んだ関数)が
@code{call-interactively}で対話的に呼び出されたのであるならば、
@code{t}を返します(@code{call-interactively}がLispから呼ばれようと、
エディタ・コマンド・ループから直接呼ばれようとも、何ら違いはありません)。
これを含む関数がLispの評価(あるいは@code{apply}や@code{funcall})で
呼ばれたならば、対話的に呼び出されたことになりません。

@code{interactive-p}の最も普通の使い方は、案内メッセージを表示するかしないか
決めるために使うことです。特殊な例外として、@code{interactive-p}は
キーボード・マクロ実行中はいつでも@code{nil}を返すというのがあります。
これは、案内メッセージを抑制して、マクロの実行を速くするためです。
@c  word    informative messages    案内メッセージ

例:

@example
@group
(defun foo ()
  (interactive)
  (and (interactive-p)
       (message "foo")))
     @result{} foo
@end group

@group
(defun bar ()
  (interactive)
  (setq foobar (list (foo) (interactive-p))))
     @result{} bar
@end group

@group
;; @r{@kbd{M-x foo}とタイプする。}
     @print{} foo
@end group

@group
;; @r{@kbd{M-x bar}とタイプする。}
;; @r{こっちは何も表示しない。}
@end group

@group
foobar
     @result{} (nil t)
@end group
@end example
@end defun

@node Command Loop Info, Input Events, Interactive Call, Command Loop
@comment  node-name,  next,  previous,  up
@section コマンド・ループからの情報

エディタ・コマンド・ループは、いくつかのLisp変数を設定して
自身のためと実行されるコマンドのために、状態の記録を保持しています。

@defvar last-command
この変数は、コマンド・ループで実行された直前のコマンド(現在のコマンドの
一つ前)の名前を記録しています。普通、値は関数定義をともなうシンボルですが、
そうである保証はありません。

この値は@code{this-command}から、コマンドがコマンド・ループに帰るときに
コピーされます。そのコマンドが後続のコマンドのために前置引数を指定している
場合は、別です。

この変数は、常に現在の端末に対してローカルなのであって、バッファローカルには
なりません。@xref{Multiple Displays}。
@end defvar

@defvar this-command
@cindex current command
@cindex 現在のコマンド[げんざいのこまんど]
この変数は、エディタ・コマンド・ループで今実行しているコマンドの名前を
記録しています。@code{last-command}のように、普通は関数定義をともなう
シンボルです。

コマンド・ループはこの変数をコマンド実行の直前に設定し、
その値をコマンド実行終了時に@code{last-command}にコピーします
(コマンドが後続のコマンドのために前置引数を指定する場合を除きます)。

@cindex kill command repetition
@cindex killコマンドの繰り返し[killこまんどのくりかえし]
いくつかのコマンドではこの変数をコマンド実行中に設定して、
次に実行するコマンドへのフラグとします。特に、テキスト集合をkillする関数群は、
@code{this-command}を@code{kill-region}に設定して、直後に続く任意の
killコマンドがkillしたテキストを直前のkillに追加すべきであることが
わかるようにします。
@end defvar

@c  なんと、1ヶ月半ぶり。ちと、いろいろあったからなぁ。
エラー時に特定のコマンドを直前のコマンドとみなされたくない場合には、
そのコマンドをこれを防ぐように書かなければなりません。方法の一つは、
そのコマンドの冒頭で@code{this-command}を@code{t}に設定し、
末尾で@code{this-command}を適切な値に戻すことです。このようにします:

@example
(defun foo (args@dots{})
  (interactive @dots{})
  (let ((old-this-command this-command))
    (setq this-command t)
    @r{@dots{}do the work@dots{}}
    (setq this-command old-this-command)))
@end example

@defun this-command-keys
この関数は、現在のコマンドを起動したキー・シーケンスと、そのコマンドに対する
前置引数を生成した直前のコマンドを含む文字列あるいはベクタを返します。
これらイベントが全て文字ならば、値は文字列となります。@xref{Input Events}。

@example
@group
(this-command-keys)
;; @r{ここで@kbd{C-u C-x C-e}を使って、評価する。}
     @result{} "^U^X^E"
@end group
@end example
@end defun

@defvar last-nonmenu-event
この変数は、キー・シーケンスの一部として読み込んだ、最後に入力されたイベントを
保持します。このキー・シーケンスには、マウス・メニューからのイベントは
含みません。

この変数の使い方の一つは、メニューを次にポップ・アップするのにいい
デフォルト位置を見つけることです。
@end defvar

@defvar last-command-event
@defvarx last-command-char
この変数には、コマンドの一部としてコマンド・ループによって読み込まれた、
最後に入力されたイベントが設定されます。この変数の本質的使い方は、
@code{self-insert-command}中にあります。そこでは、どの文字を挿入するかを
決定するために使っています。

@example
@group
last-command-event
;; @r{ここで@kbd{C-u C-x C-e}を使って、評価する。}
     @result{} 5
@end group
@end example

@noindent
値は5となり、理由はそれが@kbd{C-e}の@sc{ASCII}コードであるからです。

別名@code{last-command-char}がEmacsバージョン18との互換のために存在します。
@end defvar

@c Emacs 19 feature
@defvar last-event-frame
@c  word    focus   フォーカス
この変数は、最後に入力したイベントがどのフレームに向けられたものかを
記録します。普通これはイベント発生時に選択されていたフレームですが、
そのフレームが入力フォーカスを別フレームにリダイレクトしていた場合、
この値はイベントのリダイレクト先のフレームになります。@xref{Input Focus}。
@end defvar

@node Input Events, Reading Input, Command Loop Info, Command Loop
@section 入力イベント
@cindex events
@cindex input events
@cindex イベント[いべんと]
@cindex 入力イベント[にゅうりょくいべんと]

@c  word    activity    動き
Emacsコマンド・ループはキーボードあるいはマウスの動きを表す
@dfn{入力イベント(input event)}のシーケンスを読み込みます。キーボードの
動きのためのイベントは、文字あるいはシンボルです。しかし、マウス・イベントは
常にリストです。本節では入力イベントの表現と意味を詳細に説明します。

@defun eventp object
この関数は、@var{object}が入力イベントならば非@code{nil}を返します。
@c  typo;   @var{event} →  @var{object};   RMS確認済。
@end defun

@menu
* Keyboard Events::		普通の文字。つまり、その記号が刻まれたキー。
* Function Keys::		ファンクション・キー 
                                つまり、記号ではなく名前が刻まれたキー。
* Mouse Events::                マウス・イベントの概要。
* Click Events::		マウス・ボタンを押して離すこと。
* Drag Events::			ボタンを離す前にマウスを移動すること。
* Button-Down Events::		ボタンは押されたがいまだ離されていない。
* Repeat Events::               ダブルおよびトリプルクリック
                                    (あるいはドラッグ、押下)。
* Motion Events::		単にマウスを移動する、ボタンは押さない。
* Focus Events::		フレーム間のマウス移動。
* Misc Events::                 ウィンドウ・システムが発生し得る
                                    ほかのイベント。
* Event Examples::		マウス・イベントのリストの例。
* Classifying Events::		イベント・シンボル中に修飾キーを見つける方法。
                                イベント・タイプ。
* Accessing Events::		イベントから情報を抜き出す関数。
* Strings of Events::           キーボード文字イベントを文字列に入れるための
                                    特別な配慮。
@c  word    extract     抜き出す
@end menu

@node Keyboard Events, Function Keys, Input Events, Input Events
@subsection キーボード・イベント

キーボードから取ることができる入力には2種類あります。それらは、通常キーと
ファンクション・キーです。通常キーは文字に対応します。これらが生成する
イベントをLispは文字で表現します。Emacsバージョン18以前では、文字のみが
イベントでした。文字イベントのイベント・タイプはその文字自身(整数)です。
イベント・タイプについては、@ref{Classifying Events}を参照してください。
@c  word    event type  イベント・タイプ

@cindex modifier bits (of input character)
@cindex basic code (of input character)
@cindex 修飾ビット、入力文字の[しゅうしょくびっと、にゅうりょくもじの]
@cindex 基本コード、入力文字の[きほんこーど、にゅうりょくもじの]
@c  word    modifier    修飾(子)
@c  word    basic code  基本コード
入力文字イベントは0〜255までの@dfn{基本コード(basic code)}にいくつかあるいは
全ての@dfn{修飾ビット(modifier bit)}を加えたものから成ります:

@table @asis
@item メタ
文字コードの
@iftex
$2^{27}$
@end iftex
@ifinfo
2**27
@end ifinfo
ビットは、メタ・キー押下状態でタイプされた文字であることを表します。

@item 制御
文字コードの
@iftex
$2^{26}$
@end iftex
@ifinfo
2**26
@end ifinfo
ビットは、非@sc{ASCII}制御文字であることを表します。

@kbd{C-a}のような@sc{ASCII}制御文字はそれ自身が特別な基本コードをもつので、
Emacsはそれらに特別なビットを与える必要がありません。
それゆえ、@kbd{C-a}のコードは単なる1です。

@c  XXX うーーーん。制御キーか、すっきりしない。
@c  XXX でもバランスのために機能キーとするのもなんか厭だし。
しかし@sc{ASCII}にない制御の組合せをタイプした場合、
たとえば@kbd{%}を制御キーとともにタイプしたような場合、
得られる数値は@kbd{%}に
@iftex
$2^{26}$
@end iftex
@ifinfo
2**26
@end ifinfo
を加えたものです(端末が非@sc{ASCII}制御文字を
サポートしていると仮定)。
@c  word    support     サポート

@item シフト
文字コードの
@iftex
$2^{25}$
@end iftex
@ifinfo
2**25
@end ifinfo
ビットは、
シフト・キー押下状態でタイプされた@sc{ASCII}制御文字であることを表します。

@c  word    letter  英文字
英文字については、小文字に対する大文字の基本コードを表します。
けれども数字と句読点については、シフト・キーは異なる基本コードの全く別な文字を
選択します。可能なときには@sc{ASCII}文字集合の範囲内に収まるようにするために、
Emacsはこれらの文字については
@iftex
$2^{25}$
@end iftex
@ifinfo
2**25
@end ifinfo
ビットを使わないようにします。

けれども、@sc{ASCII}は@kbd{C-A}を@kbd{C-a}と区別する手段を持たないので、
Emacsは
@iftex
$2^{25}$
@end iftex
@ifinfo
2**25
@end ifinfo
ビットを@kbd{C-A}に使用して、@kbd{C-a}には使いません。

@item ハイパー
文字コードの
@iftex
$2^{24}$
@end iftex
@ifinfo
2**24
@end ifinfo
ビットは、
ハイパー・キー押下状態でタイプされた文字であることを表します。

@item スーパー
文字コードの
@iftex
$2^{23}$
@end iftex
@ifinfo
2**23
@end ifinfo
ビットは、
スーパー・キー押下状態でタイプされた文字であることを表します。

@item オルト
文字コードの
@iftex
$2^{22}$
@end iftex
@ifinfo
2**22
@end ifinfo
ビットは、
オルト・キー押下状態でタイプされた文字であることを表します
(端末によっては、@key{ALT}と書かれたキーが実際のメタ・キーです)。
@end table

    自作プログラム内では、特定のビット番号は書かないのが一番です。
文字の修飾ビットを検査するには、関数@code{event-modifiers}を
使ってください(@pxref{Classifying Events})。キー・バインドを作る場合、
修飾ビットつき文字のリード構文(@samp{\C-}, @samp{\M-}, などなど)を
使うことができます。@code{define-key}を使ってキー・バインドを作る場合は、
文字の指定に@code{(control hyper ?x)}といったリストを使うこともできます
(@pxref{Changing Key Bindings})。関数@code{event-convert-list}は
そういったリストをイベント・タイプ(@pxref{Classifying Events})に変換します。

@node Function Keys, Mouse Events, Keyboard Events, Input Events
@subsection ファンクション・キー

@cindex function keys
@cindex ファンクション・キー[ファンクション・キー]
ほとんどのキーボードは@dfn{ファンクション・キー(function key)}(文字ではなく
名前や記号をもつキー)も備えています。ファンクション・キーはLispでは
シンボルとして表現されます。そしてシンボルの名前はファンクション・キーの
ラベルを小文字にしたものです。たとえば、@key{F1}と書かれたキーを押下すると、
シンボル@code{f1}が入力ストリームに置かれます。
@c  word    labeled 書かれた
@c  word    stream  ストリーム

ファンクション・キー・イベントのイベント・タイプは、イベント・シンボル自身です。
@xref{Classifying Events}。

以下に、ファンクション・キーについてのシンボル命名法の特例をいくつか挙げます:
@c  word    convention      ……法

@table @asis
@item @code{backspace}, @code{tab}, @code{newline}, @code{return}, @code{delete}
これらのキーは、ほとんどのキーボードに専用のキーをもつ共通の
@sc{ASCII}制御文字に対応します。
@c  XXX common は共通か、ありふれた、か?

@sc{ASCII}では、@kbd{C-i}と@key{TAB}は同じ文字です。
端末がこれらを区別できるならば、Emacsはその違いを前者を整数の9として、
後者をシンボル@code{tab}として、Lispプログラムに伝えます。
@c  word    convey  伝える

@c  word    set up  準備
ほとんどの場合、これら二つを区別することは有用ではありません。
そのため普通は@code{function-key-map}が準備されていて、
@code{tab}を9に対応させます。そのため文字コード9(文字@kbd{C-i})の
キー・バインドが@code{tab}にも適用されます。
このグループのほかのシンボルについても同様です。
関数@code{read-char}も同様にこれらイベントを文字に変換します。

@sc{ASCII}では、@key{BS}は@kbd{C-h}そのものです。しかし@code{backspace}は
文字コード127(@key{DEL})に変換されます。8(@key{BS})ではありません。
ほとんどのユーザがこちらの方を好みます。

@item @code{left}, @code{up}, @code{right}, @code{down}
@c  word    cursor arrow key    カーソル矢印キー
カーソル矢印キー。
@item @code{kp-add}, @code{kp-decimal}, @code{kp-divide}, @dots{}
キーパッド・キー(通常のキーボードの右側にある)。
@item @code{kp-0}, @code{kp-1}, @dots{}
キーパッド・キーの数字。
@item @code{kp-f1}, @code{kp-f2}, @code{kp-f3}, @code{kp-f4}
キーパッドのPFキー。
@item @code{kp-home}, @code{kp-left}, @code{kp-up}, @code{kp-right}, @code{kp-down}
キーパッドの矢印キー。Emacsは普通これらを非キーパッド・キー
@code{home}, @code{left}, @dots{}に変換します。
@item @code{kp-prior}, @code{kp-next}, @code{kp-end}, @code{kp-begin}, @code{kp-insert}, @code{kp-delete}
付加的なキーパッド・キーで、普通はどこかほかの場所にも見つかるものと
重複します。Emacsは普通これらを似た名前の非キーパッド・キーに変換します。
@end table

ファンクション・キーとともに、修飾キー@key{ALT}, @key{CTRL}, @key{HYPER},
@key{META}, @key{SHIFT}, @key{SUPER}を使うことができます。
これらの表現方法は、シンボル名に前置をつけることです:

@table @samp
@item A-
オルト修飾子。
@item C-
制御修飾子。
@item H-
ハイパー修飾子。
@item M-
メタ修飾子。
@item S-
シフト修飾子。
@item s-
スーパー修飾子。
@end table

よって、@key{META}を押下した@key{F3}キーのシンボルは、@code{M-f3}です。
一つ以上の前置を使う場合、それらを英文字順に並べることを勧めます。
しかしその順序は、キー・バインドの検索と修正の関数への引数に使うときは
影響しません。

@node Mouse Events, Click Events, Function Keys, Input Events
@subsection マウス・イベント

Emacsは4種類のマウス・イベントをサポートしています。それらは
クリック・イベント、ドラッグ・イベント、ボタン押下イベント、移動イベントです。
全てのマウス・イベントはリストで表現されます。リストの@sc{car}は
イベント・タイプです。これはどのマウス・ボタンが関係し、どの修飾キーがともに
使われたかを示します。イベント・タイプによって2連続、3連続のボタン押下も区別できます
(@pxref{Repeat Events})。リストの残りの要素は、位置と時間の情報を与えます。

@c  word    interactive code    対話コード
キー検索には、イベント・タイプのみが関わります。ここで二つのイベントが同じ
イベント・タイプならば同じコマンドを実行しなければなりません。コマンドは
これらイベントの完全な値に@samp{e}対話コードを使ってアクセスできます。
@xref{Interactive Codes}。

マウス・イベントで始まるキー・シーケンスは、マウスが入っていたウィンドウ中の
バッファのキーマップを使って読み込まれます。カレント・バッファではありません。
これは、ウィンドウ中のクリックがそのウィンドウ即ちそのバッファを選択するという
意味ではありません。キー・シーケンスのコマンドのバインド制御についてのみの
話です。

@node Click Events, Drag Events, Mouse Events, Input Events
@subsection クリック・イベント
@cindex click event
@cindex mouse click event
@cindex クリック・イベント[くりっく・いべんと]
@cindex マウス・クリック・イベント[まうす・くりっく・いべんと]

ユーザが同じ位置でマウス・ボタンを押して離したときに、@dfn{クリック(click)}・
イベントが発生します。マウス・クリック・イベントは次の形式を持ちます:

@example
(@var{event-type}
 (@var{window} @var{buffer-pos} (@var{x} . @var{y}) @var{timestamp})
 @var{click-count})
@end example

これら要素が普通何を意味するかを説明します:

@table @asis
@item @var{event-type}
どのマウス・ボタンが使われたかを示すシンボルです。ボタンの左から右に向かって、
@code{mouse-1},@code{mouse-2}, @dots{}と番号づけられたシンボルのうちの
一つになります。

前置@samp{A-}, @samp{C-}, @samp{H-}, @samp{M-}, @samp{S-}, @samp{s-}を
修飾子オルト、制御、ハイパー、メタ、シフト、スーパーに対して、
ファンクション・キーのときと同様に使うことができます。

このシンボルはイベントのイベント・タイプとしても働きます。キー・バインドは
そのイベントをイベント・タイプで記述します。それゆえ、@code{mouse-1}に対する
キー・バインドがあれば、そのバインドは@var{event-type}が@code{mouse-1}である
全てのイベントに対して適用されます。

@item @var{window}
クリックを行なったときのウィンドウです。

@item @var{x}, @var{y}
これらはクリックのピクセル座標で、@var{window}の左上隅@code{(0 . 0)}からの
相対で表します。

@item @var{buffer-pos}
クリックされた文字のバッファ位置です。

@item @var{timestamp}
イベント発生の時刻で、ミリ秒単位です(この値はEmacs Lisp整数の全範囲を、
約5時間で一周するので、時間的に近いイベントに関してのみ有効です)。

@item @var{click-count}
同じマウス・ボタンを素早く続けて押した回数です。@xref{Repeat Events}。
@end table

@var{buffer-pos}, @var{x}, @var{y}の意味は、イベント位置がモード行や
スクロール・バーのような画面の特別な部分内にあるときに若干異なってきます。

位置がスクロール・バー内にあるときは、@var{buffer-pos}はシンボル
@code{vertical-scroll-bar}か@code{horizontal-scroll-bar}になり、
@code{(@var{x} . @var{y})}の対は@code{@var{portion} . @var{whole}}の対で
置き換えられます。ここで@var{portion}は、スクロール・バーの上端あるいは
左端からのクリックの距離であり、@var{whole}はスクロール・バーの全長です。

@c  word    location    位置; あれ、positionとの違いは?
位置がモード行あるいは@var{window}を右隣から分離する垂直線にあるときは、
@var{buffer-pos}がシンボル@code{mode-line}あるいは@code{vertical-line}に
なります。モード行の場合は、@var{y}は意味のないデータです。垂直線の場合は、
@var{x}が意味のないデータとなります。

一つの特例として、@var{buffer-pos}が単なるシンボルの代わりに、
シンボル(上に挙げたものの一つ)を含むリストになっている場合があります。
これは、イベントに対する架空の前置キーが入力ストリームに挿入された場合に
起こります。@xref{Key Sequence Input}。

@node Drag Events, Button-Down Events, Click Events, Input Events
@subsection ドラッグ・イベント
@cindex drag event
@cindex mouse drag event
@cindex ドラッグ・イベント[どらっぐ・いべんと]
@cindex マウス・ドラッグ・イベント[まうす・どらっぐ・いべんと]

Emacsでは、着替えもせずにドラッグ・イベント@footnote{訳注: drag eventで、
女装パーティのことらしい}を行なえます。@dfn{ドラッグ・イベント(drag event)}は
ユーザがマウス・ボタンを押して、それを離す前に異なる文字位置へ
マウスを動かしたとき常に起こります。ほかの全てのマウス・イベント同様、
ドラッグ・イベントはLispのリストで表現されます。このリストはマウスの移動の
開始位置と最終位置との両方を記録しています。こんな感じです:

@example
(@var{event-type}
 (@var{window1} @var{buffer-pos1} (@var{x1} . @var{y1}) @var{timestamp1})
 (@var{window2} @var{buffer-pos2} (@var{x2} . @var{y2}) @var{timestamp2})
 @var{click-count})
@end example

ドラッグ・イベントは、シンボル名@var{event-type}に前置@samp{drag-}が
ついています。イベントの2番目3番目の要素がドラッグの開始と終了の位置を
与えます。これを別にすれば、データはクリック・イベント(@pxref{Click Events})と
同じ意味合いを持ちます。マウス・イベントの2番目の要素は、皆同じ方法で
アクセスできます。ドラッグ・イベントをほかと区別する必要はありません。

@samp{drag-}前置は、@samp{C-}や@samp{M-}のような修飾キー前置の後に来ます。

@code{read-key-sequence}がキー・バインドのないドラッグ・イベントを受け取り、
対応するクリック・イベントの方がバインドをもつならば、
@code{read-key-sequence}はドラッグ・イベントを
ドラッグ開始位置でのクリック・イベントに変換します。
つまり、そうしたくないかぎり、クリックとドラッグの両イベントを区別する必要は
ない、ということです。

@node Button-Down Events, Repeat Events, Drag Events, Input Events
@subsection ボタン押下イベント
@cindex button-down event
@cindex ボタン押下イベント[ぼたんおうかいべんと]

クリックとドラッグのイベントは、ユーザがマウス・ボタンを離したときに起きます。
これより早く起こせないのは、ボタンが離されるまでクリックをドラッグと
区別できないからです。

ボタンが押されると同時に動作を起こしたいならば、@dfn{ボタン押下(button-down)}
イベント@footnote{ボタンダウン(シャツ)は保守的で、女装とは対象的です。

訳注: drag eventが女装パーティなのに対し、button-down(ボタン押下)eventは
ボタンダウン・シャツを着たパーティ、といいたいらしい。}を
操作する必要があります。これはボタンが押されるやいなやに発生します。
これはクリック・イベント(@pxref{Click Events})と全く見かけが同じ
リストで表現されます。違うのは、@var{event-type}シンボル名が
前置@samp{down-}を含むことです。@samp{down-}前置は@samp{C-}や@samp{M-}のような
修飾キー前置の後に来ます。

関数@code{read-key-sequence}は、コマンドにバインドされていない
ボタン押下イベントは全て無視します。その結果Emacsコマンド・ループもそうする
ことになります。つまりボタン押下イベントで何かしようと思わないかぎり、
その定義を気にする必要がないという意味です。ボタン押下イベントを定義する
理由としてあり得そうなのは、そうすることでボタンが離されるまでのマウスの動きを
(移動イベントを読み込むことで)追跡できるというのがあります。
@xref{Motion Events}。

@node Repeat Events, Motion Events, Button-Down Events, Input Events
@subsection 繰り返しイベント
@cindex repeat events
@cindex double-click events
@cindex triple-click events
@cindex 繰り返しイベント[くりかえしいべんと]
@cindex ダブルクリック・イベント[ダブルクリック・いべんと]
@cindex トリプルクリック・イベント[トリプルクリック・いべんと]

マウスを動かさずに素早く続けて同じマウス・ボタンを何度も押した場合、
Emacsでは特別な@dfn{繰り返し(repeat)}マウス・イベントを2回目以降の押下に対して
発生します。

もっともありふれた繰り返しイベントは、@dfn{ダブルクリック(double-click)}・
イベントです。Emacsではボタンを2度クリックしたときにダブルクリックを
発生します。このイベントはボタンを離したときに起きます(それがクリック・イベント
全てで普通)。

ダブルクリック・イベントのイベント・タイプには前置@samp{double-}が
ついています。そのため、@key{meta}を押下した2番目のマウス・ボタンの
ダブルクリックは、@code{M-double-mouse-2}としてLispプログラムに渡ります。
ダブルクリック・イベントにバインドがない場合は、対応する通常の
クリック・イベントのバインドが使われて、実行されます。そのため、
気にしたくなければダブルクリック機能に注意を払わなくて構いません。

ユーザがダブルクリックをすると、Emacsは最初に通常のクリック・イベントを
発生し、次にダブルクリック・イベントを発生します。それゆえ、
ダブルクリック・イベントのコマンド・バインドは、
シングルクリックのコマンドがすでに実行されていることを仮定して
設計しないとなりません。設計は、ダブルクリックが望みどおりの結果になるように、
シングルクリックの結果からやらないといけません。
@c  XXX start from は、これでいいんだよね?

ダブルクリックの意味がシングルクリックの意味の上にともかく
「増築されている」ならば、都合いいです --- これがダブルクリックに対する
お薦めのユーザ・インタフェース設計の習慣です。
@c  XXX practiceを習慣、としておく。build onが増築だったなんて。

ボタンをクリックして、再びそれを押下し、ボタンを押下したままでマウスを
動かしはじめると、最後にボタンを離したときに@dfn{ダブルドラッグ(double-drag)}・
イベントを得ることになります。そのイベント・タイプには、単なる@samp{drag}の
代わりに@samp{double-drag}がつきます。ダブルドラッグ・イベントがバインドを
持たない場合、Emacsはイベントが通常のドラッグだったかのように
代替バインドを探します。
@c  XXX ultimately  最後に

ダブルクリックやダブルドラッグ・イベントよりも前に、ユーザが2度目にボタンを
押下したときに、Emacsは@dfn{ダブル押下(double-down)}イベントを発生します。
そのイベント・タイプには、単なる@samp{down}の代わりに@samp{double-down}が
つきます。ダブル押下イベントがバインドを持たない場合、Emacsはイベントが
通常のボタン押下イベントだったかのように代替バインドを探します。
それでもバインドが見つからない場合は、ダブル押下イベントは無視されます。

要約すると、ボタンをクリックして、直ちに再びそれを押下すると、
Emacsは押下イベントとクリック・イベントを最初のクリックに対して、
ダブル押下イベントを2回目の押下に対して、
最後にダブルクリックあるいはダブルドラッグ・イベントのいずれかを生成します。

ボタンを2度クリックして、さらにもう1度押下する、これらを素早く続けて行うと、
Emacsは@dfn{トリプル押下(triple-down)}イベントを、続けて
@dfn{トリプルクリック(triple-click)}あるいは
@dfn{トリプルドラッグ(triple-drag)}のいずれかを発生します。これらのイベントの
イベント・タイプには@samp{double}の代わりに@samp{triple}がつきます。
どのトリプル・イベントでも、バインドを持たない場合、
Emacsは対応するダブル・イベントに使われるであろうバインドを使います。

ボタンを3回以上クリックし、再び押下した場合、3回目以降の押下に対するイベントは
全てトリプル・イベントとなります。Emacsは4重、5重、などなどのイベントを
区別するイベント・タイプを持ちません。それでも、イベント・リストを見て、
何回ボタンが押下されたかを正確に知ることができます。

@defun event-click-count event
この関数は、@var{event}を導くまでに到った、連続したボタン押下の回数を返します。
@var{event}がダブル押下、ダブルクリック、ダブルドラッグならば、
値は2です。@var{event}がトリプル・イベントならば、値は3以上です。
@var{event}が(繰り返しイベントではない)通常のマウス・イベントならば、
値は1です。
@end defun

@defvar double-click-time
繰り返しイベントを発生させるには、同じ画面位置で連続してマウス・ボタンを
押下し、連続するボタン押下の間隔がミリ秒で@code{double-click-time}の値よりも
小さくなければなりません。@code{double-click-time}を@code{nil}に設定すると、
マルチ・クリックの検出を完全に禁止します。@code{t}に設定すると、
時間の制限を取り除きます。つまりEmacsはマルチ・クリックを場所のみで
検出するようになります。
@end defvar

@node Motion Events, Focus Events, Repeat Events, Input Events
@subsection 移動イベント
@cindex motion event
@cindex mouse motion events
@cindex 移動イベント[いどういべんと]
@cindex マウス移動イベント[まうすいどういべんと]

Emacsは、マウス・ボタンの動きがなくてもマウス移動を表すために
@dfn{マウス移動(mouse motion)}イベントを時折発生します。

@example
(mouse-movement
 (@var{window} @var{buffer-pos} (@var{x} . @var{y}) @var{timestamp}))
@end example

リスト2番目の要素は、丁度クリック・イベント(@pxref{Click Events})のときの
ように、マウスの現在の位置を表します。

@c  word    enable  可能になる; それとも素直に「イネーブル」とする?
@c  word    body    本体
特殊形式@code{track-mouse}本体内では、移動イベントの発生が可能になっています。
@code{track-mouse}形式外では、Emacsは単なるマウスの移動についてのイベントは
発生しません。よって、これらイベントは現れません。
@c  XXX mere の意味がよく分かってなかったりする。

@defspec track-mouse body@dots{}
この特殊形式は@var{body}を実行し、そこではマウス移動イベントの発生が
可能になっています。典型的な@var{body}は、@code{read-event}を使って
移動イベントを読み込み、それにしたがって表示を修正します。
@c  word    display 表示

ユーザがボタンを離すと、クリック・イベントが発生します。
典型的には、@var{body}はクリック・イベントを認識した時点で帰り、
なおかつそのイベントは捨てるべきです。
@end defspec

@node Focus Events, Misc Events, Motion Events, Input Events
@subsection フォーカス・イベント
@cindex フォーカス・イベント[ふぉーかす・いべんと]
@cindex focus event

ウィンドウ・システムはどのウィンドウがキーボード入力を受け取るかを
ユーザが制御する一般的方法を備えています。このウィンドウの選択を
@dfn{フォーカス(focus)}と呼びます。ユーザがEmacsのフレームを切替えるために
何かをすると、@dfn{フォーカス・イベント(focus event)}が発生します。
フォーカス・イベントの通常の定義はグローバル・キーマップにあり、ユーザが
期待するとおりにEmacs内で新たなフレームを選択するようになっています。
@xref{Input Focus}。

フォーカス・イベントはLispではこんな感じのリストで表現されます:

@example
(switch-frame @var{new-frame})
@end example

@noindent
ここで@var{new-frame}は切替え先のフレームです。

@c  justが「単に」、enoughが「だけ」
@c  word    solid   (カーソルが)はっきりする
ほとんどのXウィンドウ・マネージャは、単にマウスをウィンドウの中に移動するだけで
フォーカスをそこに置けるようになっています。Emacsもこうなっているように
見えます。新たなフレーム内で、カーソルがはっきりするからです。
けれども、Lispプログラムにとってはほかの種類の入力が来ないかぎり、
フォーカスが変わったことを知る必要がありません。
そこで、Emacsは実際にユーザがキーボード・キーをタイプするか
マウス・ボタンを押下するかを新たなフレームで行なった場合にかぎり、
フォーカス・イベントを発生します。つまりフレーム間でマウスを単に移動しても、
フォーカス・イベントは発生しません。

キー・シーケンスの途中でフォーカス・イベントが発生すると、
キー・シーケンスがグシャグシャになってしまうことでしょう。
@c  word    garble  グシャグシャになる
そのためEmacsではキー・シーケンス途中でフォーカス・イベントが発生することは
絶対にありません。ユーザがキー・シーケンスの途中(つまり、前置キーの後)で
フォーカスを変えたならば、Emacsはそのイベントを並べ替えて、
フォーカス・イベントが多重イベントのキー・シーケンスの前か後に来るように、
途中には来ないようにします。

@node Misc Events, Event Examples, Focus Events, Input Events
@subsection そのほかのウィンドウ・システム・イベント
@c  word    miscellaneous   そのほか

ウィンドウ・システム内で発生したことを表す、そのほかのイベント・タイプ。

@table @code
@cindex @code{delete-frame} event
@cindex @code{delete-frame}イベント[@code{delete-frame}いべんと]
@item (delete-frame (@var{frame}))
@c  word    delete      消去; 個人的には素直に削除と訳したいが、Emacsじゃあね
@c  word    indicate    示す
この種のイベントはユーザがウィンドウ・マネージャに特定のウィンドウを
消去するように命令したこと、それがEmacsのフレームだったことを示します。

@code{delete-frame}イベントの標準定義は、@var{frame}の消去です。

@cindex @code{iconify-frame} event
@cindex @code{iconify-frame}イベント[@code{iconify-frame}いべんと]
@item (iconify-frame (@var{frame}))
@c  word    iconify   アイコン化
この種のイベントはユーザがウィンドウ・マネージャを使って@var{frame}を
アイコン化したことを示します。この標準定義は@code{ignore}です。
というのも、フレームはすでにアイコン化されていたので、
Emacsはすることがないのです。このイベント・タイプの目的は、
必要ならこういったイベントを追跡できるようにすることです。
@c  deiconifiedは、iconifiedの誤植; RMS確認済。

@cindex @code{make-frame-visible} event
@cindex @code{make-frame-visible}イベント[@code{make-frame-visible}いべんと]
@item (make-frame-visible (@var{frame}))
@c  word    deiconify   アイコン化解除
この種のイベントはユーザがウィンドウ・マネージャを使って@var{frame}を
アイコン化解除したことを示します。この標準定義は@code{ignore}です。
というのも、フレームはすでにアイコン化解除されていたので、
Emacsはすることがないのです。
@c  iconifiedは、deiconifiedの誤植; RMS確認済。
@end table

    これらイベントのいずれかがキー・シーケンスの途中にきた場合
(つまり、前置キーの後)は、Emacsはこれらイベントを並べ替えて、
このイベントが多重イベントのキー・シーケンスの前か後に来るように、
途中には来ないようにします。

@node Event Examples, Classifying Events, Misc Events, Input Events
@subsection イベントの例

ユーザが同じ場所で左マウス・ボタンを押下して離したならば、
このようなイベント列が発生します:

@smallexample
(down-mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864320))
(mouse-1      (#<window 18 on NEWS> 2613 (0 . 38) -864180))
@end smallexample

制御キーを押下したまま、ユーザが2番目のマウス・ボタンを押下し、
マウスをある行から次の行へドラッグしたとします。これによって、
以下に示すような二つのイベントが発生します:

@smallexample
(C-down-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219))
(C-drag-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219)
                (#<window 18 on NEWS> 3510 (0 . 28) -729648))
@end smallexample

メタとシフト・キーを押下したまま、ユーザが2番目のマウス・ボタンを
ウィンドウのモード行で押下し、マウスを別のウィンドウへドラッグしたとします。
これによって、このようなイベントの組が発生します:

@smallexample
(M-S-down-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844))
(M-S-drag-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844)
                  (#<window 20 on carlton-sanskrit.tex> 161 (33 . 3)
                   -453816))
@end smallexample

@node Classifying Events, Accessing Events, Event Examples, Input Events
@subsection イベントの分類
@cindex event type
@cindex イベント・タイプ[いべんと・たいぷ]

    全てイベントは@dfn{イベント・タイプ(event type)}を持ち、キー・バインドでの
使用では、それによってイベントを分類しています。キーボード・イベントに
ついては、イベント・タイプはイベント値に同じです。そのため文字の
イベント・タイプは文字で、ファンクション・キー・シンボルのイベント・タイプは
シンボル自身です。リストであるようなイベントについては、イベント・タイプは
リストの@sc{car}にあるシンボルです。よって、イベント・タイプは常にシンボルか
文字となります。

@c  word    equivalent  等価
    同じ種の二つのイベントはキー・バインドに関するかぎり等価です。
そのため、どちらも常に同じコマンドを実行します。これは必ずしも
これらが同一のことを行なうことを意味するわけではありません。
というのも、コマンドによってはイベント全体を見て何をするのか決めるからです。
たとえば、コマンドによってはマウス・イベントの位置を使って、
どのバッファに作用するかを決めます。

@c  word    involve ... key ...キーとともに使われる
    ときにはイベントをさらに詳しく分類することが便利です。たとえば、
イベントが@key{META}キーとともに使われたかどうかを確かめたい場合が
あるかもしれません(ほかのキーやマウス・ボタンの使用は無視する)。

    関数@code{event-modifiers}と@code{event-basic-type}が、
こういった情報を都合よく得るために用意されています。

@defun event-modifiers event
この関数は、@var{event}がもつ修飾子のリストを返します。
修飾子はシンボルです。これらは@code{shift}, @code{control},
@code{meta}, @code{alt}, @code{hyper}, @code{super}を含みます。
加えて、マウス・イベント・シンボルの修飾子リストは、
常に@code{click}, @code{drag}, @code{down}のいずれかを含みます。

引数@var{event}は完全なイベント・オブジェクトであるか、
単なるイベント・タイプかのいずれかです。

以下に例を挙げます:

@example
(event-modifiers ?a)
     @result{} nil
(event-modifiers ?\C-a)
     @result{} (control)
(event-modifiers ?\C-%)
     @result{} (control)
(event-modifiers ?\C-\S-a)
     @result{} (control shift)
(event-modifiers 'f5)
     @result{} nil
(event-modifiers 's-f5)
     @result{} (super)
(event-modifiers 'M-S-f5)
     @result{} (meta shift)
(event-modifiers 'mouse-1)
     @result{} (click)
(event-modifiers 'down-mouse-1)
     @result{} (down)
@end example

クリック・イベントについての修飾子のリストは、
明示的に@code{click}を含みますが、イベント・シンボル名自身は@samp{clisk}を
含みません。
@end defun

@defun event-basic-type event
この関数は、@var{event}が表す全ての修飾子を取り除いたキーあるいはマウス・ボタンを
返します。例を挙げます:

@example
(event-basic-type ?a)
     @result{} 97
(event-basic-type ?A)
     @result{} 97
(event-basic-type ?\C-a)
     @result{} 97
(event-basic-type ?\C-\S-a)
     @result{} 97
(event-basic-type 'f5)
     @result{} f5
(event-basic-type 's-f5)
     @result{} f5
(event-basic-type 'M-S-f5)
     @result{} f5
(event-basic-type 'down-mouse-1)
     @result{} mouse-1
@end example
@end defun

@defun mouse-movement-p object
この関数は、@var{object}がマウス移動イベントならば、非@code{nil}を返します。
@end defun

@defun event-convert-list list
この関数は、修飾子名のリストと基本イベント・タイプをそれら全てを指定する
イベント・タイプに変換します。例を挙げます:

@example
(event-convert-list '(control ?a))
     @result{} 1
(event-convert-list '(control meta ?a))
     @result{} -134217727
(event-convert-list '(control super f1))
     @result{} C-s-f1
@end example
@end defun

@node Accessing Events, Strings of Events, Classifying Events, Input Events
@subsection イベントへのアクセス

    本節ではマウス・ボタンや移動イベント中のデータをアクセスするのに
都合がいい関数を説明します。

    これら二つの関数はマウス・ボタン・イベントの開始あるいは終了位置を
返します。位置はこの形式のリストです:

@example
(@var{window} @var{buffer-position} (@var{x} . @var{y}) @var{timestamp})
@end example

@defun event-start event
これは@var{event}の開始位置を返します。

@var{event}がクリックあるいはボタン押下イベントならば、
これがイベントの位置を返します。@var{event}がドラッグ・イベントならば、
これがドラッグの開始位置を返します。
@end defun

@defun event-end event
これは@var{event}の終了位置を返します。

@var{event}がドラッグ・イベントならば、これがユーザがボタンを離した位置を
返します。@var{evnet}がクリックあるいはボタン押下イベントならば、
その値は実際には開始位置で、こういったイベントが唯一もつ位置です。
@end defun

    これら四つの関数は上に挙げたような位置を取り、それのさまざまな部分を
返します。

@defun posn-window position
@var{position}が入っているウィンドウを返します。
@end defun

@defun posn-point position
@var{position}のバッファ位置を返します。これは整数です。
@end defun

@defun posn-x-y position
@var{position}内のピクセル・ベースのx, y座標を
@code{(@var{x} . @var{y})}というコンス・セルで返します。
@end defun

@defun posn-col-row position
@var{position}の(文字単位の)行と桁を@code{(@var{x} . @var{y})}という
コンス・セルで返します。これらは@var{position}から実際に取り出した
@var{x}, @var{y}の値より計算します。
@end defun

@defun posn-timestamp position
@var{position}のタイムスタンプを返します。
@end defun

@defun scroll-bar-event-ratio event
@c  word    fractional  割合
この関数は、スクロール・バー・イベントのスクロール・バー中の垂直位置を割合で
返します。値は@code{(@var{portion} . @var{whole})}というコンス・セルで、
その比が位置の割合となるような二つの整数を含みます。
@end defun

@defun scroll-bar-scale ratio total
この関数は、(事実上)@var{ratio}に@var{total}を乗じて、結果を整数に丸めます。
引数@var{ratio}は数ではなく、@code{(@var{num} . @var{denom})}の組です。
典型的には@code{scroll-bar-event-ratio}が返した値です。

この関数は、スクロール・バー上の位置をバッファ位置に変換するのに便利です。
こうやります:

@example
(+ (point-min)
   (scroll-bar-scale
      (posn-x-y (event-start event))
      (- (point-max) (point-min))))
@end example

スクロール・バー・イベントが、x, y座標の組の代わりに、
二つの比をなす整数をもつことに注意してください。
@end defun

@node Strings of Events,  , Accessing Events, Input Events
@subsection 文字列にキーボード・イベントを入れる

    文字列が使われるほとんどの部分において、私たちはその文字列をテキスト文字を
含むものとして概念化しています(同じ種類の文字がバッファあるいはファイルにも
あるのです)。時折Lispプログラムは文字列をキーボード文字を含むものとして
扱います。たとえば、それらはキー・シーケンスやキーボード・マクロ定義であるかも
しれません。そこで、キーボード文字を文字列中に置くための特別な規則が
存在します。というのも、それらはテキスト文字のように0から255の範囲に
限定されないからです。

@c  word    meta character  メタ文字
    @key{META}を使ってタイプされたキーボード文字を
@dfn{メタ文字(meta character)}と呼びます。このようなイベントに対する
数値コードは
@iftex
$2^{27}$
@end iftex
@ifinfo
2**27
@end ifinfo
ビットを含みます。けれどもこれでは全然文字列に収まりません。
しかし初期のEmacsの版においては、これら文字に対して異なる表現を使っていました。
これらに128から255の範囲のコードを与えるのです。こうすれば文字列に収まり、
多くのLispプログラムが、特に@code{define-key}や類似の関数の引数において、
@samp{M-}によって表現されたメタ文字を文字列定数に含めていました。

    キーボード文字イベントを文字列に入れる特別な規則を使っている
これらプログラムを実行するために、後方互換性を提供しています。
こういう規則です:

@itemize @bullet
@item
キーボード文字の値が0から127の範囲にあるならば、そのまま文字列に入る。

@item
@c  word    variants    ……類
これら文字のメタ類のもの、コードが
@iftex
$2^{27}$
@end iftex
@ifinfo
2**27
@end ifinfo
から
@iftex
$2^{27} + 127$,
@end iftex
@ifinfo
2**27+127,
@end ifinfo
の範囲にあるものについては、同じく文字列に入る。ただし、その数値は変更する
必要がある。
@iftex
$2^{7}$
@end iftex
@ifinfo
2**7
@end ifinfo
ビットを
@iftex
$2^{27}$
@end iftex
@ifinfo
2**27
@end ifinfo
ビットの代わりに設定する必要がある。こうして、値が128から255の間に
なるようにする。

@item
ほかのキーボード文字イベントは文字列に収まらない。これは、
128から255の範囲のキーボード・イベントを含む。
@end itemize

    @code{read-key-sequence}のような関数は、これら規則にしたがった
キーボード入力文字の文字列を構築することができます。これら関数は、
イベントが文字列に収まらない場合には文字列の代わりにベクタを構築します。

    リード構文@samp{\M-}を文字列中で使用した場合、128から255の範囲内の
コードが作られます(対応するキーボード・イベントを文字列に入れるために
修正したときに得られるコードと同じものです)。そのため、文字列中の
メタ・イベントは、それらがどのように文字列に入ってくるかに関わらず、
一貫して機能します。

    キーボード・イベントとしてのメタ文字の表現を変更した理由は、
127を超える基本文字コードのために空間を空けるためと、
そういった大きな文字コードのメタ類をサポートするためです。

    新たなプログラムでは、これらの特別な互換性規則の使用を避けることが
できます。メタ文字を含む可能性があるキー・シーケンスに対しては、
文字列の代わりにベクタを使い、イベントの文字列をアクセスするには
@code{listify-key-sequence}を使用すればいいのです。

@defun listify-key-sequence key
この関数は、文字列あるいはベクタ@var{key}を、@code{unread-command-events}に
入れることができるイベントのリストに変換します。ベクタの変換は簡単ですが、
文字列の変換は文字列中のメタ文字に使用する特別な表現のために込み入ってます。
@end defun

@node Reading Input, Waiting, Input Events, Command Loop
@section 入力の読込み

    エディタ・コマンド・ループはキーボード入力を関数@code{read-key-sequence}で
読み込み、その関数は@code{read-event}を使っています。これらのおよびほかの
キーボード入力のための関数も同様に、Lispプログラムで使用できるように
なっています。@ref{Temporary Displays}の@code{momentary-string-display}や、
@ref{Waiting}の@code{sit-for}を参照してください。端末入力モードの制御と
端末入力のデバッグのための関数や変数については、@xref{Terminal Input}。

    高水準入力機能については、@ref{Minibuffers}を参照してください。

@menu
* Key Sequence Input::		1キー・シーケンスの読込み方。
* Reading One Event::		1イベントの読込み方。
* Quoted Character Input::	ユーザに1文字指定させる。
* Event Input Misc::    	入力イベントの再読込みや破棄。
@end menu
@c  word    reread      再読込み
@c  word    throw away  破棄

@node Key Sequence Input, Reading One Event, Reading Input, Reading Input
@subsection キー・シーケンス入力
@cindex key sequence input
@cindex キー・シーケンス入力[きー・しーけんすにゅうりょく]

    コマンド・ループはキー・シーケンス入力を1回に一つ、
@code{read-key-sequence}を呼び出すことで読み込みます。Lispプログラムで
同じようにこの関数を使えます。たとえば、@code{describe-key}はこれを使って
説明するキーを読み込みます。

@defun read-key-sequence prompt
@cindex key sequence
@cindex キー・シーケンス[きー・しーけんす]
この関数は、キー・シーケンスを一つ読み込んで、それを文字列あるいはベクタで
返します。イベントを読み込み続け、それが完全なキー・シーケンスになったとき
止めます。即ち、現在アクティブなキーマップで、何らかの非前置コマンドを
指定するに十分となるまでです。

イベントが全て文字で、その全てが文字列に収まるならば、
@code{read-key-sequence}は文字列を返します(@pxref{Strings of Events})。
それ以外ではベクタを返します。ベクタは全種類のイベント(文字、シンボル、リスト)
を収めることができるからです。文字列やベクタの要素はキー・シーケンス中の
イベントです。

関数@code{read-key-sequence}は、とりやめを抑止します。つまりこの関数で
読込み中にタイプされた@kbd{C-g}は、ほかのなんらかの文字のように働き、
@code{quit-flag}を設定しません。@xref{Quitting}。

引数@var{prompt}は、プロンプトとしてエコー領域に表示されるべき文字列であるか、
プロンプトを表示しないことを意味する@code{nil}であるか、のどちらかです。

以下の例では、プロンプト@samp{?}がエコー領域に表示され、
ユーザは@kbd{C-x C-f}をタイプします。

@example
(read-key-sequence "?")

@group
---------- Echo Area ----------
?@kbd{C-x C-f}
---------- Echo Area ----------

     @result{} "^X^F"
@end group
@end example
@end defun

@defvar num-input-keys
@c Emacs 19 feature
この変数の値は、現在のEmacsセッションにおいてこれまで処理された
キー・シーケンスの個数です。これは端末から読み込んだキー・シーケンスと
実行されたキーボード・マクロ自身を読み込んだときのキー・シーケンスとを
含みます。
@end defvar

@cindex upper case key sequence
@cindex downcasing in @code{lookup-key}
@cindex 大文字のキー・シーケンス[おおもじのきー・しーけんす]
@cindex @code{lookup-key}における小文字化[@code{lookup-key}におけるこもじか]
@cindex 小文字化、@code{lookup-key}における[こもじか、@code{lookup-key}における]
入力文字が大文字でキー・バインドはないが、その小文字のバインドならある場合、
@code{read-key-sequence}はその文字を小文字に変換します。
@code{lookup-key}は大文字小文字変換をこのように行なわないことに
注意してください。

@c  word    transform   変形
@c  word    reshuffle   並べ替える
関数@code{read-key-sequence}はマウス・イベントも同じように変形します。
バインドされてないドラッグ・イベントをクリック・イベントに変換し、
バインドされてないボタン押下イベントを完全に捨てます。
同じようにフォーカス・イベントとそのほかのウィンドウ・イベントを並べ替えて、
キー・シーケンス中にほかの種類のイベントが絶対現れないようにします。

マウス・イベントがウィンドウの特別な部分、たとえばモード行やスクロール・バーで
発生した場合、イベント・タイプは何も特別なことを示しません。マウス・ボタンと
修飾キーの組合せが、いつもの表現と同じシンボルになっています。
ウィンドウ部分に関する情報は、イベントの違う場所、座標の中にあります。でも、
@code{read-key-sequence}はこの情報を架空の前置キーに変換します。
これらは全てシンボルで、@code{mode-line}, @code{vertical-line},
@code{horizontal-scroll-bar}, @code{vertical-scroll-bar}です。

これら架空の前置キーを使ったキー・シーケンスを定義することで、
特別なウィンドウ部分内でのマウス・クリックに対する意味を定義できます。

たとえば、@code{read-key-sequence}を呼び、マウスをウィンドウのモード行で
クリックした場合、このような二つのイベントを得ます:

@example
(read-key-sequence "Click on the mode line: ")
     @result{} [mode-line
         (mouse-1
          (#<window 6 on NEWS> mode-line
           (40 . 63) 5959987))]
@end example

@node Reading One Event, Quoted Character Input, Key Sequence Input, Reading Input
@subsection イベントを一つ読み込む

    コマンド入力の最低水準関数は、これら単一のイベントを読み込むものです。

@defun read-event
この関数は、コマンド入力の次のイベントを読み込んで返します。
必要ならばイベントが来るまで待ちます。イベントはユーザから直接あるいは
キーボード・マクロから来ます。

関数@code{read-event}は入力待ちであることを示すメッセージは何も表示しません。
もしそうしたいならば、@code{message}をはじめに使ってください。メッセージを
表示しなかったならば、@code{read-event}はエコーすることでプロンプトを出します。
つまり、現在のコマンドを導いた、または、現在のコマンドによって読み込まれた
イベントを表す表示をします。@xref{The Echo Area}。
@c  XXX or の訳し方、led toの訳し方、あってるかな?

@code{cursor-in-echo-area}が非@code{nil}ならば、@code{read-event}は
カーソルを一時的にエコー領域に移動し、そこに表示される何らかのメッセージが
終るまでそうしています。それ以外では、@code{read-event}はカーソル移動しません。

@code{read-event}を呼んで右矢印ファンクション・キーを押下したとすると、
こうなります:

@example
@group
(read-event)
     @result{} right
@end group
@end example
@end defun

@defun read-char
この関数は、コマンド入力の1文字を読み込んで返します。
文字を拾うまで、文字以外のいかなるイベントも捨てます。

最初の例では、ユーザが文字@kbd{1}(@sc{ASCII}コード49)をタイプします。
2番目の例はキーボード・マクロ定義で、ミニバッファから@code{eval-expression}を
使って@code{read-char}を呼んでいます。@code{read-char}がキーボード・マクロの
直後の文字@kbd{1}を読み込んでいます。次に@code{eval-expression}は
その戻り値をエコー領域に表示します。

@example
@group
(read-char)
     @result{} 49
@end group

@group
;; @r{これを評価するために@kbd{M-:}を使うと仮定。}
(symbol-function 'foo)
     @result{} "^[:(read-char)^M1"
@end group
@group
(execute-kbd-macro 'foo)
     @print{} 49
     @result{} nil
@end group
@end example
@end defun


@node Quoted Character Input, Event Input Misc, Reading One Event, Reading Input
@subsection Quoteした文字入力
@cindex quoted character input
@cindex Quoteした文字入力[Quoteしたもじにゅうりょく]

    関数@code{read-quoted-char}を使って、ユーザに文字を指定するよういい、
ユーザが制御やメタ文字を簡便に指定できるようにすることができます。
文字どおりでも、8進文字コードでもどちらでもできます。
コマンド@code{quoted-insert}はこの関数を使っています。

@defun read-quoted-char &optional prompt
@cindex octal character input
@cindex control characters, reading
@cindex nonprinting characters, reading
@cindex 8進文字の入力[8しんもじのにゅうりょく]
@cindex 制御文字の読込み[せいぎょもじのよみこみ]
@cindex 読込み、制御文字の[よみこみ、せいぎょもじの]
@cindex 印字されない文字の読込み[いんじされないもじのよみこみ]
@cindex 読込み、印字されない文字の[よみこみ、いんじされないもじの]
この関数は、@code{read-char}に似てますが、最初の文字が8進数字(0-7)だったときに
あと二つ8進数字を読み込んで(ただし、非8進数字が見つかれば止める)、
これら8進数字で表現される文字を返すというところが異なります。

とりやめは最初の文字の読込みでは抑止されているので、ユーザは@kbd{C-g}を
入力できます。@xref{Quitting}。

@var{prompt}を与えると、それはユーザへのプロンプト文字列の指定となります。
プロンプト文字列は常にエコー領域に表示され、@samp{-}がそれに続きます。

次の例では、ユーザが8進数177(10進で127)をタイプしています。

@example
(read-quoted-char "What character")

@group
---------- Echo Area ----------
What character-@kbd{177}
---------- Echo Area ----------

     @result{} 127
@end group
@end example
@end defun

@need 2000
@node Event Input Misc,  , Quoted Character Input, Reading Input
@subsection そのほかのイベント入力機能

@c  word    peek        覗く
本節ではイベントを取り出さずに「あらかじめ覗く」方法、
未処理の入力を検査する方法、保留中の入力を捨てる方法を説明します。

@defvar unread-command-events
@cindex next input
@cindex peeking at input
@cindex 次の入力[つぎのにゅうりょく]
@cindex 入力を覗く[にゅうりょくをのぞく]
この変数は、コマンド入力として読み込まれるのを待っているイベントのリストを
保持しています。これらイベントはリストに現れた順に使われ、使われるにしたがって
一つづつ取り除かれます。

この変数が必要だったわけは、場合によっては関数がイベントを読み込んで、
それを使わないと決めることがあるからです。そのイベントをこの変数に格納すると、
コマンド・ループやコマンド入力を読み込む関数が、それを普通に処理します。

@cindex prefix argument unreading
@cindex 前置引数の読み戻し[ぜんちひきすうのよみもどし]
@c  word    unread  読み戻し
例として、数値前置引数を実現する任意桁数の数字を読み込む関数があります。
これが非数字イベントを見つけると、コマンド・ループが普通に読み込むように、
それを読み戻さなければなりません。同様に、段階的検索はこの機能を使って
検索時に特別な意味を持たないイベントを読み戻すようにします。というのも、
これらイベントは検索を抜けてから、普通に実行しなければならないためです。

@code{unread-command-events}中に置けるようにするために、
キー・シーケンスからイベントを抜き出す信頼できる簡単な方法は、
@code{listify-key-sequence}を使うことです(@pxref{Strings of Events})。
@end defvar

@defvar unread-command-char
この変数は、コマンド入力として読み込まれるべき文字を保持します。
値 -1 の意味は、「空」です。

この変数は、今やほとんどobsoleteで、それは@code{unread-command-events}を
代わりに使えるからです。これはEmacsバージョン18以前のために書かれたプログラムを
サポートするためだけに存在します。
@end defvar

@defun input-pending-p
@cindex waiting for command key input
@cindex コマンド・キー入力待ち[こまんど・きーにゅうりょくまち]
この関数は、現在読込み可能なコマンド入力があるかないかを判別します。
読込み可能な入力があれば@code{t}の値で、そうでなければ@code{nil}の値で、
直ちに戻ります。ごくまれに読込み可能な入力がないのに@code{t}で
戻ることもあります。
@end defun

@defvar last-input-event
この変数は、読み込んだ最新の端末入力イベントを記録します。
コマンドの一部でも、Lispプログラムによる明示的なものでも関係ありません。
@c  whetherのこんな使い方知らなんだ

次の例では、Lispプログラムが文字@kbd{1}、@sc{ASCII}コード49を読み込みます。
これは@code{last-input-event}の値になります。一方、
@kbd{C-e}(@kbd{C-x C-e}コマンドを使ってこの式を評価したと仮定)の方は
@code{last-command-event}の値として残ります。

@example
@group
(progn (print (read-char))
       (print last-command-event)
       last-input-event)
     @print{} 49
     @print{} 5
     @result{} 49
@end group
@end example

@vindex last-input-char
別名@code{last-input-char}が、Emacsバージョン18との互換のために存在します。
@end defvar

@defun discard-input
@cindex flush input
@cindex discard input
@cindex terminate keyboard macro
@cindex 入力の掃き出し[にゅうりょくのはきだし]
@cindex 入力を捨てる[にゅうりょくをすてる]
@cindex 端末キーボード・マクロ[たんまつきーぼーど・まくろ]
@c  word    flush   掃き出す
この関数は、端末入力バッファの中身を捨てて、定義の最中のキーボード・マクロが
あったならばキャンセルします。@code{nil}を返します。
@c  word    in the process of   の最中

次の例では、この形式の評価が始まり次第、ユーザは沢山の文字をタイプすることも
できます。@code{sleep-for}がスリープを終り次第、@code{discard-input}が
スリープ中にタイプされた全ての文字を捨て去ります。
@c  word    sleep   スリープ

@example
(progn (sleep-for 2)
       (discard-input))
     @result{} nil
@end example
@end defun

@node Waiting, Quitting, Reading Input, Command Loop
@section 時間の経過あるいは入力を待つ
@cindex pausing
@cindex waiting
@cindex ポーズを置く[ぽーずをおく]
@cindex 待つ[まつ]
@c  word    pausing ポーズを置く
@c  word    waiting 待つ

    待ち関数は、一定の時間が経つか入力があるまで待つために設計されました。
たとえば、計算の途中でポーズを置いて、ユーザが表示を眺めることができるように
したいことがあるかもしれません。@code{sit-for}はポーズを置いて画面を
更新し、入力があれば直ちに戻ります。一方、@code{sleep-for}は画面の更新は
しません。

@defun sit-for seconds &optional millisec nodisp
この関数は、(ユーザの未処理の入力がないならば)再表示を実行し、
@var{seconds}秒か入力があるまで待ちます。値が@code{t}となるのは、
@code{sit-for}が入力が来ないでフルに待った場合です
(@ref{Event Input Misc}の@code{input-pending-p}参照)。
それ以外のときは、値は@code{nil}です。

引数@var{seconds}は整数でなくても構いません。浮動小数点数ならば、
@code{sit-for}は小数で指定した秒を待ちます。いくつかのシステムでは
秒未満をサポートしていません。このようなシステムでは、@var{seconds}は
切り捨てられます。

オプション引数@var{millisec}はミリ秒単位の追加待ち時間を指定します。
これは@var{seconds}で指定した時間に追加されます。
システムが小数秒をサポートしない場合の非0の@var{millisec}指定は、
エラーとなります。

@cindex forcing redisplay
@cindex 再表示の強制[さいひょうじのきょうせい]
@cindex 強制、再表示の[きょうせい、さいひょうじの]
@c  XXX preemptは、割り込み、横取り、優先、どう訳すか?
再表示は入力が来ると常にpreemptされるので、再表示が始まる前に入力が来ると、
再表示は全く行なわれなくなります。そのため、未処理の入力がある場合に
画面の更新を強制する方法はありません。けれども、未処理の入力がなければ
@code{(sit-for 0)}を使って遅延なしに更新を強制できます。

@var{nodisp}が非@code{nil}ならば、@code{sit-for}は再表示をしません。
しかし相変わらず、入力があり次第(または時間経過後すぐに)戻ります。

フレームのアイコン化あるいはアイコン化解除があると@code{sit-for}から戻ります。
というのも、これらはイベントを発生するからです。@xref{Misc Events}。

@code{sit-for}の普通の目的は、表示したテキストを読む時間をユーザに
与えることです。
@end defun

@defun sleep-for seconds &optional millisec
この関数は、単純に@var{seconds}秒ポーズを置きます。表示は更新しません。
入力も全く気にしません。@code{nil}を返します。

引数@var{seconds}は整数でなくても構いません。浮動小数点数ならば、
@code{sleep-for}は小数で指定した秒を待ちます。いくつかのシステムでは
秒未満をサポートしていません。このようなシステムでは、@var{seconds}は
切り捨てられます。

オプション引数@var{millisec}はミリ秒単位の追加待ち時間を指定します。
これは@var{seconds}で指定した時間に追加されます。
システムが小数秒をサポートしない場合には、非0の@var{millisec}指定は
エラーとなります。

@c  word    delay   遅延; 文脈的にあまりうまい訳になってない
確実に遅延を取りたい場合は@code{sleep-for}を使ってください。
@end defun

    現在時刻を得るための関数については、@xref{Time of Day}。

@node Quitting, Prefix Command Arguments, Waiting, Command Loop
@section とりやめ
@cindex @kbd{C-g}
@cindex quitting
@cindex とりやめ[とりやめ]

    Lisp関数実行中の@kbd{C-g}のタイプは、Emacsがやっていることを
何であれ@dfn{とりやめ(quit)}ます。これは制御が最も内側のアクティブな
コマンド・ループに帰ることを意味します。

    コマンド・ループがキーボード入力を待っているときに@kbd{C-g}をタイプしても
とりやめになりません。これは普通の入力文字同様に働きます。最も単純な例では、
違いを見分けることはできません。なぜなら、@kbd{C-g}は普通はコマンド
@code{keyboard-quit}を実行し、その効果はとりやめだからです。
けれども、前置キーに続く@kbd{C-g}の場合、結果は未定義キーとなります。
この効果は、前置引数もろとも前置キーをキャンセルします。

@c  word    abort   中断
    ミニバッファ中では、@kbd{C-g}は異なる定義を持ちます。即ち、
ミニバッファを中断して外へ出るのです。つまり、事実上、ミニバッファを抜けて
とりやめます(単にとりやめると、@emph{ミニバッファ中の}コマンド・ループに戻る)。
コマンド・リーダが入力を読み込んでいるときに、直に@kbd{C-g}でとりやめないのは、
こうするとミニバッファ中で@kbd{C-g}の意味を再定義できるからです。
前置キーに続く@kbd{C-g}はミニバッファ中で再定義されていないので、
前置キーと前置引数とをキャンセルするという普通の効果を持ちます。
これも、@kbd{C-g}が常に直にとりやめるのだったら、できなかったことです。
@c  so thatのこの使い方も認識してなかったよ〜〜〜ん、だ。ケッ!

    @kbd{C-g}が直にとりやめるときは、変数@code{quit-flag}を@code{t}に
設定することでそうします。Emacsはこの変数を適切なときに検査して、値が
非@code{nil}ならばとりやめます。そのためどんな方法でも、@code{quit-flag}を
非@code{nil}に設定すると、とりやめを引き起こします。

    Cコードのレベルでは、とりやめはどこでも起こるというわけではありません。
@code{quit-flag}を検査している特別な場所でのみ起こります。この理由は、
ほかの場所でとりやめるとEmacsの内部状態を一貫性のない状態にしてしまうかも
しれないからです。とりやめが安全な場所まで遅延されるので、とりやめでEmacsが
クラッシュすることはありません。
@c  word    crash   クラッシュ

    ある種の@code{read-key-sequence}や@code{read-quoted-char}のような関数は
入力待ち中だったとしてもとりやめを完全に防ぎます。とりやめの代わりに、
@kbd{C-g}は要求された入力として働きます。@code{read-key-sequence}の場合なら、
コマンド・ループ中の@kbd{C-g}の特別な振舞をするように働きます。
@code{read-quoted-char}の場合なら、@kbd{C-q}で@kbd{C-g}をquoteできるようにする
ために、こうなってます。

@c  word    behavior    振舞
    Lisp関数内のある部分でとりやめを防ぎたいならば、変数@code{inhibit-quit}を
非@code{nil}に束縛すればできます。こうすると、@kbd{C-g}が@code{quit-flag}を
@code{t}にいつもどおり設定しても、普通なら起こるはずのとりやめが起きません。
そのうち、@code{inhibit-quit}が再び@code{nil}になったとします。
たとえば@code{let}形式の終りでその束縛が解かれるなどです。
そのとき、@code{quit-flag}がいまだ非@code{nil}だったならば、
要求されていたとりやめが直ちに起こります。この振舞は、プログラムの
「クリティカル・セクション」内でとりやめが絶対起こらないようにしたい場合に
ふさわしいものです。

@cindex @code{read-quoted-char} quitting
@cindex @code{read-quoted-char}のとりやめ[read-quoted-charのとりやめ]
    (@code{read-quoted-char}のような)関数によっては、
@kbd{C-g}は特別な方法で扱われてとりやめを起こしません。
@code{inhibit-quit}を@code{t}に束縛して入力を読み込み、
@code{inhibit-quit}を@code{nil}にする前に@code{quit-flag}を
@code{nil}に再び設定すると、こうなります。@code{read-quoted-char}の
定義からの引用が、これをどう行なうかを示しています。これは通常のとりやめが
最初の文字の入力後は許されていることも示しています。

@example
(defun read-quoted-char (&optional prompt)
  "@dots{}@var{documentation}@dots{}"
  (let ((count 0) (code 0) char)
    (while (< count 3)
      (let ((inhibit-quit (zerop count))
            (help-form nil))
        (and prompt (message "%s-" prompt))
        (setq char (read-char))
        (if inhibit-quit (setq quit-flag nil)))
      @dots{})
    (logand 255 code)))
@end example

@defvar quit-flag
この変数が非@code{nil}ならば、@code{inhibit-quit}が非@code{nil}でないかぎり、
Emacsは直ちにとりやめます。@kbd{C-g}のタイプで、普通@code{quit-flag}は
@code{inhibit-quit}の値に関わらず、非@code{nil}に設定されます。
@end defvar

@defvar inhibit-quit
この変数は、@code{quit-flag}が@code{nil}以外の値に設定されているときに、
Emacsがとりやめるべきか否かを決定します。@code{inhibit-quit}が
非@code{nil}ならば、@code{quit-flag}は特別な効果を持ちません。
@end defvar

@deffn Command keyboard-quit
この関数は、@code{quit}条件を@code{(signal 'quit nil)}によって通知します。
これは、とりやめと同じことを行ないます(@ref{Errors}の@code{signal}を参照)。
@end deffn

    @kbd{C-g}以外の文字をとりやめのために指定できます。
関数@ref{Terminal Input}の@code{set-input-mode}を参照してください。

@node Prefix Command Arguments, Recursive Editing, Quitting, Command Loop
@section 前置コマンド引数
@cindex prefix argument
@cindex raw prefix argument
@cindex numeric prefix argument
@cindex 前置引数[ぜんちひきすう]
@cindex そのままの前置引数[そのままのぜんちひきすう]
@cindex 数値前置引数[すうちぜんちひきすう]

    ほとんどのEmacsコマンドは、コマンド自身に先立って指定される数値である
@dfn{前置引数(prefix argument)}を使えます(前置引数と前置キー(prefix key)を
混同しないように)。前置引数はいつでも一つの値で表現され、それは現在前置引数は
ないという意味の@code{nil}かもしれません。Emacsコマンドは前置引数を使うかも
しれないし、無視するかもしれません。

    前置引数には二つの表現があります。それらは@dfn{そのまま(raw)}と
@dfn{数値(numeric)}です。エディタ・コマンド・ループはそのままの表現を
内部的に使用し、その情報を格納するLisp変数もそのようにしますが、
コマンドはいずれの表現も要求できます。

    以下がそのままの前置引数の取り得る値です:

@itemize @bullet
@item
@code{nil}、前置引数がないことを意味します。この数値は1ですが、多くのコマンドが
@code{nil}と整数1とを区別します。

@item
整数、それ自身を表します。

@item
要素一つのリスト、この要素は整数です。この形式の前置引数は、
数値なしで1回以上@kbd{C-u}の連打した結果です。
数値はリスト中の整数で、コマンドによってはこういったリストと数字単体とを
区別します。

@item
シンボル@code{-}。これは、数値なしで@kbd{M--}あるいは@kbd{C-u -}を
タイプしたことを示します。これと等価な数値は@minus{}1ですが、
コマンドによっては整数@minus{}1とシンボル@code{-}とを区別します。
@end itemize

これら可能性は、次の関数をさまざまな前置で呼び出すことで例示できます。
@c  word    illustrate  例示

@example
@group
(defun display-prefix (arg)
  "Display the value of the raw prefix arg."
  (interactive "P")
  (message "%s" arg))
@end group
@end example

@noindent
以下がさまざまなそのままの前置引数で@code{display-prefix}を呼び出した結果です:

@example
        M-x display-prefix  @print{} nil

C-u     M-x display-prefix  @print{} (4)

C-u C-u M-x display-prefix  @print{} (16)

C-u 3   M-x display-prefix  @print{} 3

M-3     M-x display-prefix  @print{} 3      ; @r{(@code{C-u 3}と同じ。)}

C-u -   M-x display-prefix  @print{} -      

M--     M-x display-prefix  @print{} -      ; @r{(@code{C-u -}と同じ。)}

C-u - 7 M-x display-prefix  @print{} -7     

M-- 7   M-x display-prefix  @print{} -7     ; @r{(@code{C-u -7}と同じ。)}
@end example

    Emacsは前置引数を格納するために二つの変数を使用します。それらは
@code{prefix-arg}と@code{current-prefix-arg}です。@code{universal-argument}の
ようなほかのコマンドのために前置引数を準備するコマンドが、
値を@code{prefix-arg}に格納します。対照的に、@code{current-prefix-arg}は
現在のコマンドに前置引数を伝えます。これに値を設定してもこれ以降のコマンドの
前置引数には何の影響もありません。

    普通コマンドは、前置引数に数値あるいはそのまま、どちらの表現を使うかを
@code{interactive}宣言で指定します(@xref{Using Interactive})。
その一方で、関数は前置引数の値を直に変数@code{current-prefix-arg}で
見るかも知れません。しかしこれは若干汚いやり方です。

@defun prefix-numeric-value arg
この関数は、有効なそのままの前置引数@var{arg}の数としての意味を返します。
引数はシンボル、数、リストです。@code{nil}ならば、値1が返ります。
@code{-}ならば、@minus{}1が返ります。数ならば、その数が返ります。
リストならば、リストの@sc{car}(数であるはず)が返ります。
@end defun

@defvar current-prefix-arg
この変数は、@emph{現在の}コマンドのそのままの前置引数を保持します。
コマンドは直接それを調べても構いませんが、普通は@code{(interactive "P")}で
アクセスします。
@end defvar

@defvar prefix-arg
この変数の値は、@emph{次の}編集コマンドのそのままの前置引数です。
次のコマンドのために前置引数を指定するコマンドは、
この変数を設定する働きがあります。
@end defvar

    関数@code{universal-argument}, @code{digit-argument},
@code{negative-argument}は、ユーザに@emph{次の}コマンドのための前置引数を
入力させようというのでないかぎり、呼び出さないでください。

@deffn Command universal-argument
本コマンドは入力を読み込み、次のコマンドのための前置引数を指定します。
本コマンドを自分で呼び出す場合は、自分が何をしているのかを理解の上で
やってください。
@end deffn

@deffn Command digit-argument arg
本コマンドは、次のコマンドのために前置引数を追加します。
引数@var{arg}は、本コマンド前までのそのままの前置引数です。
これは、前置引数を更新するために使います。本コマンドを自分で呼び出す場合は、
自分が何をしているのかを理解の上でやってください。
@end deffn

@deffn Command negative-argument arg
本コマンドは、次のコマンドのための数値引数を追加します。
引数@var{arg}は本コマンド前までのそのままの前置引数です。
この値は新たな前置引数を作るために負数にされます。本コマンドを自分で
呼び出す場合は、自分が何をしているのかを理解の上でやってください。
@end deffn

@node Recursive Editing, Disabling Commands, Prefix Command Arguments, Command Loop
@section 再帰編集
@cindex recursive command loop
@cindex recursive editing level
@cindex command loop, recursive
@cindex 再帰的コマンド・ループ[さいきてきこまんど・るーぷ]
@cindex 再帰編集レベル[さいきへんしゅうれべる]
@cindex コマンド・ループ、再帰的[こまんど・るーぷ、さいきてき]

@c  word    top-level   トップレベル
@c  word    suspend     サスペンド
@c  word    activate    アクティブ
    Emacsのコマンド・ループには、Emacs起動時に自動的に入ります。
このトップレベルで起動したコマンド・ループを抜けることはありません。
Emacsが実行を続けるかぎり、これも実行を続けます。
Lispプログラムもやはりコマンド・ループを起動できます。
これはコマンド・ループを複数回アクティブにするので、
@dfn{再帰編集(recursive edit)}と呼びます。再帰編集レベルは、それを起動した
いかなるコマンドをもサスペンドし、そのコマンドに戻るまではユーザに
任意の編集を許します。

    再帰編集の間に利用可能なコマンドは、トップレベルの編集ループで
利用可能なものと同一であり、キーマップに定義されています。
いくつかの特殊なコマンドのみが再帰編集レベルを抜けます。
それ以外は終了時にその再帰編集レベルに戻ります
(抜けるための特殊なコマンドは常に利用可能ですが、それらは再帰編集中以外は
何もしません)。

@c  word    all-purpose 汎用
    再帰的なものを含む、全てのコマンド・ループは汎用のエラー・ハンドラを
準備します。そうすることでコマンド・ループから実行したコマンド中で
エラーが起きても、コマンド・ループを抜けることがなくなります。

@cindex minibuffer input
@cindex ミニバッファ入力[ミニバッファにゅうりょく]
    ミニバッファ入力は特別な種類の再帰編集です。いくつかの特徴があり、
ミニバッファとミニバッファ・ウィンドウの表示を可能にしたりできますが、
思ったほど多くはありません。いくつかのキーはミニバッファ中では異なる振舞を
します。しかし、それはミニバッファのローカル・マップのせいでしかありません。
したがってウィンドウを切替えれば、普通のEmacsコマンドが使えます。

@cindex @code{throw} example
@kindex exit
@cindex exit recursive editing
@cindex aborting
@cindex @code{throw}の例[throwのれい]
@c @kindexって訳す必要ある?
@c @kindex 抜ける
@cindex 再帰編集を抜ける[さいきへんしゅうをぬける]
@cindex 中断[ちゅうだん]
@c  word    tag     タグ
@c  word    throw   throw
    再帰編集レベルを起動するには、関数@code{recursive-edit}を呼び出します。
この関数は、コマンド・ループを含みます。タグ@code{exit}での@code{catch}
呼出しも含むので、@code{exit}をthrowすることで再帰編集レベルを
抜けることが可能になります(@pxref{Catch and Throw})。@code{t}以外の値を
throwしたならば、@code{recursive-edit}は普通にそれを呼び出した関数に戻ります。
コマンド@kbd{C-M-c}(@code{exit-recursive-edit})は@code{exit}のthrowを
行ないます。@code{t}値をthrowすると@code{recursive-edit}をとりやめ、
その結果制御は一つ上のコマンド・ループに戻ります。これを@dfn{中断(abort)}と
呼び、@kbd{C-]}で行ないます(@code{abort-recursive-edit})。

@c  word    application     アプリケーション
@c  word    major mode      主モード
@c  word    technique       テクニック
    ほとんどのアプリケーションでは、ミニバッファの使用の一部を除いて
再帰編集を使うべきではありません。普通、カレント・バッファの主モードを
一時的に特別な主モードに変更すると、ユーザにとって使い易くなります。
この特別なモードは、直前のモードに戻るためのコマンドを持たなければなりません
(Rmailの@kbd{e}コマンドはこのテクニックを使っています)。
あるいは特別なモードの新しいバッファを作成して、それを選択し、その中でユーザに
「再帰的に」編集する別のテキストを与えたいと思うことがあるかもしれません。
このモードでは、処理を完結させ、直前のバッファに戻るコマンドを定義して
おきます(Rmailの@kbd{m}コマンドはこれを行ないます)。

@c  word    breakpoint  ブレークポイント
    再帰編集はデバッグに便利です。関数定義にブレークポイントの一種として
@code{debug}呼出しを挿入しておき、関数がそこへきたら調べられるように
することができます。@code{debug}は再帰編集の起動だけでなく、
デバッガのほかの機能も備えています。

    再帰編集レベルは、@code{query-replace}で@kbd{C-r}をタイプしたときや
@kbd{C-x q} (@code{kbd-macro-query})を使ったときにも使われます。

@defun recursive-edit
@cindex suspend evaluation
@cindex 評価のサスペンド[ひょうかのさすぺんど]
この関数は、エディタ・コマンド・ループを起動します。Emacs初期化では自動的に
呼び出され、ユーザが編集を開始できるようにします。
Lispプログラムから呼び出した場合、再帰編集レベルに入ります。

    次の例では、関数@code{simple-rec}がはじめにポイントを1語進め、
再帰編集に入り、エコー領域にメッセージを表示します。そこでユーザは望みの
編集を行なうことができます。それから@kbd{C-M-c}のタイプでそれを抜けて、
@code{simple-rec}の実行を継続できます。

@example
(defun simple-rec ()
  (forward-word 1)
  (message "Recursive edit in progress")
  (recursive-edit)
  (forward-word 1))
     @result{} simple-rec
(simple-rec)
     @result{} nil
@end example
@end defun

@deffn Command exit-recursive-edit
この関数は、最も内側の(ミニバッファ入力を含む)再帰編集から抜けます。
この定義は事実上@code{(throw 'exit nil)}です。
@end deffn

@deffn Command abort-recursive-edit
この関数は、最も内側の(ミニバッファ入力を含む)再帰編集を抜けた後、
その再帰編集を要求したコマンドを@code{quit}の通知によって中断します。
この定義は事実上@code{(throw 'exit t)}です。@xref{Quitting}。
@end deffn

@deffn Command top-level
この関数は、全ての再帰編集レベルを抜けます。その結果いかなる計算からも
完全に飛び出してメインのコマンド・ループに直接戻ってしまうので、
値を返しません。
@end deffn

@defun recursion-depth
この関数は、現在の再帰編集の深さを返します。再帰編集にない場合、
0を返します。
@end defun

@node Disabling Commands, Command History, Recursive Editing, Command Loop
@section コマンドの禁止
@cindex disabled command
@cindex 禁止されたコマンド[きんしされたこまんど]

    @dfn{コマンドの禁止(disabling a command)}は、その実行の前にユーザの
確認を要求するようにコマンドに印をつけます。禁止は、初心者が混乱しやすい
コマンドを、彼らが間違って使うのを防ぐために使います。

@kindex disabled
@c @kindexって訳す必要ある?
@c @kindex 禁止[きんし]
    コマンドを禁止する低水準の機構は、そのコマンドのLispシンボルの
@code{disabled}属性に非@code{nil}を置くことです。これら属性は
普通ユーザの@file{.emacs}ファイルでこのようなLisp式によって設定されます。

@example
(put 'upcase-region 'disabled t)
@end example

@noindent
いくつかのコマンドは、これら属性がデフォルトで存在し、
@file{.emacs}ファイルでそれを取り除いているかも知れません。

    @code{disabled}属性の値が文字列なら、このコマンドが禁止されている旨を
告げるメッセージがその文字列を含んでいます。こんなふうに:

@example
(put 'delete-region 'disabled
     "Text deleted this way cannot be yanked back!\n")
@end example

    禁止されたコマンドを対話的に起動した場合に何が起こるかの詳細は、
@xref{Disabling,,, emacs, The GNU Emacs Manual}。コマンドの禁止は
Lispプログラムからそれを関数として呼び出す場合には何の効果も持ちません。

@deffn Command enable-command command
これ以後、@var{command}の実行に特別な確認が不要になります。
そして、(ユーザがいいといえば)ユーザの@file{.emacs}ファイルを書き換えて、
今後のセッションでもそうなるようにします。
@end deffn

@deffn Command disable-command command
これ以後、@var{command}の実行には特別な確認が必要になります。
そして、(ユーザがいいといえば)ユーザの@file{.emacs}ファイルを書き換えて、
今後のセッションでもそうなるようにします。
@end deffn

@defvar disabled-command-hook
本正規フックは、ユーザが禁止されたコマンドを対話的に起動したときに、
そのコマンドの代わりに実行されます。フック関数は@code{this-command-keys}を
使ってユーザがこのコマンドを実行するために何をタイプしたかを判別することが
できます。そのため、何のコマンドだったかを知ることができます。@xref{Hooks}。

デフォルトでは、@code{disabled-command-hook}はユーザに続行するか否かを
尋ねる関数を含んでいます。
@end defvar

@node Command History, Keyboard Macros, Disabling Commands, Command Loop
@section コマンド履歴
@cindex command history
@cindex complex command
@cindex history of commands
@cindex コマンド履歴[こまんどりれき]
@cindex 複雑なコマンド[ふくざつなこまんど]
@cindex 履歴、コマンドの[りれき、こまんどの]
@c  word    complex 複雑な

    コマンド・ループはそれまでに実行された複雑なコマンドの履歴を持っています。
こうすることで、これらコマンドの繰り返しの便宜を図ります。
@dfn{複雑なコマンド(complex command)}とは、対話引数の読込みにミニバッファを
使うものをいいます。これは、@kbd{M-x}コマンドの全て、@kbd{M-:}コマンドの全て、
そして@code{interactive}指定でミニバッファから引数を読み込むコマンド全てを
含みます。コマンド自身の実行中にミニバッファを明示的に使用しても、
そのコマンドを複雑とは考えません。

@defvar command-history
この変数の値は、最近の複雑なコマンドのリストで、各要素が評価されるべき形式で
表現されています。編集セッションの間中、この変数に全ての複雑なコマンドが
記録し続けますが、ガベージ・コレクションが発生すると、
最初(最近)の30個以外の要素は削除されます(@pxref{Garbage Collection})。

@example
@group
command-history
@result{} ((switch-to-buffer "chistory.texi")
    (describe-key "^X^[")
    (visit-tags-table "~/emacs/src/")
    (find-tag "repeat-complex-command"))
@end group
@end example
@end defvar

    この履歴リストは実際はミニバッファ履歴の特別な場合ですが
(@pxref{Minibuffer History})、一つだけ捻りが加えられています。つまり、
要素は文字列ではなく式となってます。

    沢山のコマンドが以前のコマンドの編集と呼出しのために用意されています。
コマンド@code{repeat-complex-command}, @code{list-command-history}は
ユーザ・マニュアル(@pxref{Repetition,,, emacs, The GNU Emacs Manual})に
説明してあります。ミニバッファ中では、使用された履歴コマンドは任意の
ミニバッファで利用可能なものと同じです。

@node Keyboard Macros,  , Command History, Command Loop
@section キーボード・マクロ
@cindex keyboard macros
@cindex キーボード・マクロ[きーぼーど・まくろ]

    @dfn{キーボード・マクロ(keyboard macro)}は、入力イベント・シーケンスの
缶詰で、コマンドとみなすこともできるし、キー定義をなすこともできます。
キーボード・マクロのLisp表現は、文字列あるいはイベントを含むベクタです。
Lispのマクロとキーボード・マクロとを混同しないようにしてください
(@pxref{Macros})。

@defun execute-kbd-macro macro &optional count
この関数は、@var{macro}をイベントのシーケンスとして実行します。
@var{macro}が文字列あるいはベクタなら、その中のイベントはユーザによって
入力されたのと全く同じように実行されます。シーケンスが単一の
キー・シーケンスであると思っては@emph{いけません}。つまり、
普通キーボード・マクロ定義は複数のキー・シーケンスを連結したものです。

@var{macro}がシンボルならば、その関数定義を@var{macro}の代わりに使います。
それがまた別のシンボルならば、この処理を繰り返します。
最終的には結果が文字列あるいはベクタになるはずです。結果がシンボル、文字列、
ベクタのいずれでもない場合は、エラーが通知されます。

引数@var{count}は繰り返し回数です。ここでは@var{macro}がその回数だけ
実行されます。@var{count}が省略されるか、@code{nil}だった場合、
@var{macro}は1回だけ実行されます。0ならば、@var{macro}はエラーとなるか
検索に失敗するまで、延々と実行されます。
@end defun

@defvar executing-macro
この変数の内容は、現在実行中のキーボード・マクロを定義している文字列
あるいはベクタです。その時点で何のマクロも実行していないなら、値は
@code{nil}です。コマンドを実行中のマクロから実行した場合、
コマンドはこの変数を検査して振舞を変えることができます。
自分自身でこの変数を設定するのは止めてください。
@end defvar

@defvar defining-kbd-macro
この変数は、キーボード・マクロの定義中であるか否かを示します。
コマンドはこの変数を検査して、マクロ定義中ならば振舞を変えることができます。
コマンド@code{start-kbd-macro}と@code{end-kbd-macro}とは、
この変数を設定します(自分自身でこの変数を設定するのは止めてください)。

この変数は、常に現在の端末に関してローカルであり、バッファローカルには
できません。@xref{Multiple Displays}。
@end defvar

@defvar last-kbd-macro
この変数は、最新のキーボード・マクロを定義したものです。
その値は文字列あるいはベクタ、あるいは@code{nil}です。

この変数は、常に現在の端末に対してローカルであり、バッファローカルには
できません。@xref{Multiple Displays}。
@end defvar
