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

30.15.3 子フレームの特異性

子フレームの挙動は、いくつかの特異な点において通常のフレームの挙動とは異なる。ここではそのうちのいくつかを概説する。

以下のオプションをカスタマイズすると、子フレームにおける iconify-frame の動作を微調整するのに役立ちます。

ユーザーオプション: iconify-child-frame

このオプションは、子フレームをアイコン化するよう指示された際に、Emacsがどのように処理するかを指定します。nil の場合、子フレームに対して iconify-frame が呼び出されても何も行われません。iconify-top-level の場合、Emacs は代わりにこの子フレームのルートフレームをアイコン化しようとします。make-invisible の場合、Emacs はこの子フレームをアイコン化するのではなく、非表示にしようとします。

それ以外の値は、子フレームをアイコン化しようとすることを意味します。こうした試みはすべてのウィンドウマネージャでサポートされているとは限らず、場合によっては子フレームがユーザー操作に反応しなくなることさえあるため、デフォルトでは代わりにルートフレームをアイコン化します。

テキスト端末で取り得る値は、nilとmake-invisibleのみです。

テキスト端末では、リペアレンティングに関していくつかの制約があります。その一つは、トップフレーム(Framesを参照)を直接子フレームにすることはできないという点です。まず別のルートフレームを、その端末の新しいトップフレームにする必要があります。一方、子フレームをその端末の新しいトップフレームにしたい場合は、あらかじめそのフレームをルートフレームにする必要があります。

また、テキスト端末上の任意のフレームにおけるサロゲート・ミニバッファウィンドウは、同一のルートフレームを持つフレーム上に配置されていなければなりません。リペアレンティングがこの制約に違反した場合、エラーが発生します。これはまた、ミニバッファウィンドウをミニバッファ専用の子フレーム上に配置する、ミニバッファを持たないフレームを作成することがより困難であることも意味します。GUIにおいて、ユーザーがinitial-frame-alistのminibufferパラメータにchild-frameという値を指定した場合、Emacsは次のように動作します(初期フレームパラメータを参照):

  1. ミニバッファ専用のフレームを作成する。
  2. minibuffer パラメータにミニバッファ専用フレームのウィンドウを指定した、ミニバッファなしのフレームを作成する。
  3. ミニバッファのないフレームを、ミニバッファのみのフレームの親フレームにする。
  4. 最初に選択したフレームを削除する。

テキストターミナルでは、以下のスニペットに示すように、これらの操作を手動で行う必要があります。

(let* ((selected (selected-frame))
       (mini-only
        (make-frame
         `((parent-frame . ,selected)
           (minibuffer . only)
           (left . 1) (top . -1) (width . 20) (height . 1))))
       (mini-less
        (make-frame
         (append `((parent-frame . ,selected)
                   (minibuffer . ,(minibuffer-window mini-only)))))))
  (set-frame-parameter mini-only 'parent-frame mini-less)
  (set-frame-parameter mini-less 'parent-frame nil)
  (select-frame mini-less)
  (delete-frame selected))

つまり、まず minibuffer-less フレームと minibuffer-only フレームの両方を、選択したフレームの子フレームとしてインストールする必要があります。その際、minibuffer-less フレームの minibuffer パラメータに、minibuffer-only フレームのミニバッファウィンドウを指定してください。次に、minibuffer-only フレームを minibuffer-less フレームの子フレームにし、minibuffer-less フレームを新しいルートフレームにします。最後に、minibuffer-less フレームを選択し、元々選択していたフレームを削除してください。