GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Sequence-Input.html ・ emacs-doc.conao3.com

22.8.1 キーシーケンス入力

コマンドループは、read-key-sequenceを呼び出すことで、一度に1つのキーシーケンスを入力として読み込みます。Lispプログラムでもこの関数を呼び出すことができ、例えばdescribe-keyはこれを用いて説明対象のキーを読み込みます。

関数: read-key-sequence prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop disable-text-conversion

この関数はキーシーケンスを読み込み、文字列またはベクトルとして返します。完全なキーシーケンス――すなわち、現在有効なキーマップを用いてプレフィックスなしのコマンドを指定するのに十分な長さ――が蓄積されるまで、イベントの読み込みを続けます。(マウスイベントから始まるキーシーケンスは、現在のバッファではなく、そのマウスが位置していたウィンドウ内のバッファのキーマップを用いて読み込まれる点にご注意ください。)

イベントがすべて文字であり、かつすべてが文字列に収まる場合は、read-key-sequence は文字列を返します(キーボードイベントを文字列にまとめるを参照)。そうでない場合は、ベクトルを返します。ベクトルであれば、文字、記号、リストなど、あらゆる種類のイベントを保持できるためです。文字列またはベクトルの要素は、キーシーケンスに含まれるイベントとなります。

キーシーケンスの読み取りには、さまざまな方法でイベントを解釈することが含まれます。イベントシーケンスの解釈用キーマップを参照してください。

引数 prompt は、エコー領域にプロンプトとして表示する文字列か、あるいはプロンプトを表示しないことを意味する nil のいずれかです。引数 continue-echo が nil でない場合は、このキーを直前のキーの続きとしてエコーすることを意味します。

通常、元のイベントが未定義で、かつ小文字相当のイベントが定義されている場合、大文字のイベントはすべて小文字に変換されます。引数 dont-downcase-last が nil 以外の場合、直前のイベントを小文字に変換しないことを意味します。これは、定義済みのキーシーケンスを読み取る際に適切です。

引数 switch-frame-ok が nil でない場合、ユーザーが何も入力する前にフレームを切り替えた際に、この関数が switch-frame イベントを処理することを意味します。ユーザーがキーシーケンスの途中でフレームを切り替えた場合、あるいはシーケンスの開始時に switch-frame-ok が nil である場合、イベントは現在のキーシーケンスが完了するまで保留されます。

引数 command-loop が nil でない場合、このキーシーケンスは、コマンドを順次読み込む処理によって読み取られることを意味します。呼び出し側が単一のキーシーケンスのみを読み取る場合は、nil となるべきです。

引数 disable-text-conversion が nil 以外の場合、このキーシーケンスの読み取り中に、システム入力メソッドがバッファテキストを直接編集することはないことを意味します。代わりに、ユーザー入力は常に個別のキーイベントとして生成されます。テキスト変換の詳細については、その他のシステムイベントを参照してください。

以下の例では、Emacsがエコーエリアにプロンプト ‘?’ を表示し、続いてユーザーが C-x C-f と入力します。

(read-key-sequence "?")

---------- Echo Area ----------
?C-x C-f
---------- Echo Area ----------

     ⇒ "^X^F"

read-key-sequence 関数は終了を抑制します。この関数を使用して読み込んでいる際に C-g と入力すると、他の文字と同様に動作し、quit-flag は設定されません。終了 を参照してください。

関数: read-key-sequence-vector prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop disable-text-conversion

これは read-key-sequence と同様ですが、キーシーケンスを常に文字列ではなくベクトルとして返します。キーボードイベントを文字列に変換する を参照してください。

入力文字が大文字(またはシフト修飾子付き)でキーバインドが設定されておらず、かつ対応する小文字にキーバインドが設定されている場合、read-key-sequence はその文字を小文字に変換します。(この動作は、ユーザーオプション translate-upper-case-key-bindings を nil に設定することで無効にできます。)なお、lookup-key はこのような方法で大文字・小文字の変換を行いません。

このようなシフト変換で入力結果を読み込む際、Emacsは変数this-command-keys-shift-translatedにnil以外の値を設定します。Lispプログラムは、シフト変換されたキーで呼び出された際に動作を変更する必要がある場合、この変数を確認できます。例えば、関数handle-shift-selectionはこの変数の値を確認して、リージョンを有効化または無効化する方法を決定します(handle-shift-selectionを参照)。

read-key-sequence 関数は、一部のマウスイベントも変換します。未バインドのドラッグイベントをクリックイベントに変換し、未バインドのボタンダウンイベントは完全に破棄します。また、フォーカスイベントや各種ウィンドウイベントを再配置し、他のイベントと共にキーシーケンスに現れることがないようにします。

モードラインやスクロールバーなど、ウィンドウやフレームの特殊な領域でマウスイベントや touchscreen-begin、touchscreen-end イベントが発生した場合、イベントタイプに特別な意味はありません。通常、そのマウスボタンと修飾キーの組み合わせを表すのと同じシンボルが使用されます。ウィンドウ領域に関する情報は、イベント内の別の場所――座標――に保持されています。しかし、read-key-sequence はこの情報を仮想的なプレフィックスキーに変換します。これらはすべてシンボルであり、tab-line、header-line、horizontal-scroll-bar、menu-bar、tab-bar、mode-line、vertical-line、vertical-scroll-bar、left-margin、right-margin、left-fringe、right-fringe、right-divider、および bottom-divider となります。これらの仮想プレフィックスキーを用いてキーシーケンスを定義することで、ウィンドウの特殊な領域におけるマウスクリックの意味を定義できます。

例えば、read-key-sequenceを呼び出してから、ウィンドウのモードライン上でマウスをクリックすると、次のように2つのイベントが発生します。

(read-key-sequence "Click on the mode line: ")
     ⇒ [mode-line
         (mouse-1
          (#<window 6 on NEWS> mode-line
           (40 . 63) 5959987))]
変数: num-input-keys

この変数の値は、今回のEmacsセッションでこれまでに処理されたキーシーケンスの数です。これには、ターミナルから読み込まれたキーシーケンスや、実行中のキーボードマクロから読み込まれたキーシーケンスが含まれます。