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

29.28 ウィンドウ構成

ウィンドウ構成は、1つのフレームのレイアウト全体――すべてのウィンドウ、そのサイズ、装飾、どのバッファを含んでいるか、それらのバッファがどのようにスクロールされているか、およびpointの値――を記録します。また、minibuffer-scroll-windowの値も含まれます。特別な例外として、ウィンドウ構成は、現在のバッファにおける選択済みウィンドウのpointの値は記録しません。

以前に保存したウィンドウ設定を復元することで、フレームレイアウト全体を元に戻すことができます。単一のフレームではなく、すべてのフレームのレイアウトを記録したい場合は、ウィンドウ設定ではなくフレーム設定を使用してください。フレーム設定を参照してください。

関数: current-window-configuration &optional frame

この関数は、frameの現在のウィンドウ構成を表す新しいオブジェクトを返します。frameのデフォルト値は選択中のフレームです。変数window-persistent-parametersでは、この関数によって保存されるウィンドウパラメータ(もしあれば)を指定します。ウィンドウパラメータを参照してください。

関数: set-window-configuration configuration &optional dont-set-frame dont-set-miniwindow

この関数は、configuration が作成されたフレームについて、そのフレームが選択されているか否かにかかわらず、configuration で指定されたウィンドウおよびバッファの設定を復元します。引数 configuration には、当該フレームに対して current-window-configuration が以前に返した値を指定する必要があります。通常、この関数は設定に記録されているフレームも選択しますが、dont-set-frame が nil 以外の場合は、関数開始時に既に選択されていたフレームを選択したままにします。

通常、この関数は保存済みのミニバッファ(もしあれば)を復元しますが、dont-set-miniwindow が nil でない場合は、関数開始時のミニバッファのカレント(もしあれば)がミニウィンドウに残ります。

configuration が保存されたフレームが消滅している場合、この関数が行うのは、変数 minibuffer-scroll-window の値を復元し、minibuffer-selected-window が返す値を調整することだけである。この場合、関数は nil を返す。それ以外の場合は、t を返す。

この関数は、configuration の記録後にバッファが破棄されたウィンドウを復元しようとする際、変数 window-restore-killed-buffer-windows(後述)を参照します。

この関数を使って save-window-excursion と同じ効果を得る方法は以下の通りです。

(let ((config (current-window-configuration)))
  (unwind-protect
      (progn (split-window-below nil)
             ...)
    (set-window-configuration config)))
マクロ: save-window-excursion forms…

このマクロは、選択中のフレームのウィンドウ構成を記録し、formsを順次実行した後、元のウィンドウ構成を復元します。戻り値は、forms内の最後のフォームの値となります。

ほとんどのLispコードではこのマクロを使うべきではなく、通常はsave-selected-windowで十分です。特に、このマクロではformsのコードによる新しいウィンドウのオープンを確実に防ぐことはできません。というのも、他のフレームで新しいウィンドウが開く可能性があるためです(バッファ表示用のウィンドウの選択を参照)。また、save-window-excursionは現在のフレーム上でのみウィンドウ構成を保存・復元します。

関数: window-configuration-p object

この関数は、object がウィンドウ設定である場合に t を返します。

関数: window-configuration-equal-p config1 config2

この関数は、2つのウィンドウ構成が同じウィンドウレイアウトを持つかどうかを判定しますが、point の値や保存済みのスクロール位置は無視します。これらの点が異なっていても、t を返すことがあります。

関数: window-configuration-frame config

この関数は、ウィンドウ設定 config が行われたフレームを返します。

ウィンドウ構成の内部を参照する他のプリミティブがあっても理にかなっていますが、必要なかったため実装されていません。ウィンドウ構成に関するその他の操作については、ファイル winner.el を参照してください。

current-window-configuration が返すオブジェクトは、Emacs プロセスと共に終了します。ウィンドウ構成をディスクに保存し、別の Emacs セッションで読み込むには、次に説明する関数を使用できます。これらの関数は、フレームの状態を任意のアクティブなウィンドウにクローンする際にも有用です(set-window-configuration は、実質的にフレームのウィンドウを、そのフレーム自身のルートウィンドウにのみクローンします)。

関数: window-state-get &optional window writable

この関数は、windowの状態をLispオブジェクトとして返します。引数windowは有効なウィンドウである必要があり、デフォルトでは選択中のフレームのルートウィンドウが指定されます。

オプション引数 writable が nil 以外の場合、これは window-point や window-start のようなサンプリング位置用のマーカーを使用しないことを意味します。状態をディスクに書き込み、別のセッションで読み込む場合は、この引数を nil 以外にする必要があります。

writable と変数 window-persistent-parameters を組み合わせることで、この関数で保存するウィンドウパラメータを指定します。デフォルトでは、writable が nil の場合に clone-of パラメータを保存します。ウィンドウパラメータ を参照してください。

window-state-normalize-buffer-name を non-nil にバインドすることで、uniquify 管理下のバッファ名から接頭辞と接尾辞を取り除き、正規化します。これにより、Emacs セッションをまたいでウィンドウバッファを復元できます。The GNU Emacs Manual の Uniquify を参照してください。

window-state-get が返す値は、同一セッション内でウィンドウをクローンする際に使用できます(後述)。また、ディスクに書き込んで別のセッションで読み込むことも可能です。いずれの場合も、以下の関数を使用してウィンドウの状態を復元してください。

関数: window-state-put state &optional window ignore

この関数は、ウィンドウの状態 state を window に格納します。引数 state には、前述の window-state-get の呼び出しによって返されたウィンドウの状態を指定する必要があります。オプション引数 window には、ライブウィンドウまたは内部ウィンドウのいずれかを指定できます(ウィンドウとフレーム を参照)。window がライブウィンドウでない場合は、state を格納する前に、同じフレーム上に作成された新しいライブウィンドウに置き換えられます。window が nil である場合、ウィンドウの状態が新しいウィンドウに格納されます。

この関数は、state に格納されているすべてのウィンドウパラメータを割り当てます。デフォルトでは、state が引数 writable および nil を指定して window-state-get を呼び出した際に取得された場合、このパラメータは clone-of となります。ウィンドウパラメータ を参照してください。

この関数は、state の記録後にバッファが破棄されたウィンドウを復元しようとする際、変数 window-restore-killed-buffer-windows(後述)を参照します。

オプション引数 ignore が nil 以外の場合、最小ウィンドウサイズおよび固定サイズの制限を無視することを意味します。ignore が safe の場合、ウィンドウは1行および/または2列まで小さくなることができます。

ウィンドウの状態という観点では、ウィンドウのクローンとは、その状態を用いて生成されたウィンドウと同じ装飾と内容を持ちながら、実際には別のウィンドウオブジェクトによって表現されているウィンドウのことである。したがって、元のウィンドウとは同一のアイデンティティを持たない。元のウィンドウまたはそのクローンに対して操作を行っても、他方に何ら影響を及ぼすことはない。

なお、set-window-configuration はフレームに戻したウィンドウの同一性を常に復元しますが、window-state-put は決してそうしません。また、window-state-get は既存のウィンドウをクローンしますが、これらのクローンはまだ有効なウィンドウではありません。window-state-put がそれらをライブフレームに配置して初めて、有効なウィンドウとなります。

デフォルトでは、対応する設定や状態が記録されて以降、バッファが破棄されたことが判明した場合、set-window-configuration および window-state-put は復元された設定や状態からウィンドウを削除することがあります。次に説明する変数を使用することで、この動作を微調整できます。

変数: window-restore-killed-buffer-windows

この変数は、対応する設定または状態が記録されて以降にバッファが破棄されたウィンドウを、set-window-configuration および window-state-put がどのように扱うかを指定します。このようなウィンドウは、これらの関数のいずれかが呼び出された時点で、ライブ状態(その場合は別のバッファが表示される)であるか、あるいはデッド状態であるかのいずれかです。通常、set-window-configuration はウィンドウがライブ状態であればそのままにしますが、window-state-put はそれを削除します。

以下の値を使用することで、set-window-configuration の場合はデッドウィンドウの、window-state-put の場合はデッドウィンドウおよびライブウィンドウの既定の動作を上書きできます。

t

この値は、ウィンドウを無条件に復元し、その中に別のバッファを表示することを意味します。

delete

これは、無条件にウィンドウを削除しようとすることを意味します。

dedicated

つまり、ウィンドウが自身のバッファ専用である場合に限り、そのウィンドウを削除しようとするということです。

nil

これがデフォルトの設定であり、set-window-configuration はそのウィンドウが自身のバッファ専用である場合に限り削除を試み、window-state-put は無条件に削除を試みることを意味します。

関数

これは、ウィンドウを復元し、値が t である場合などに別のバッファをそこに表示し、さらにそのウィンドウのエントリを、後で当該関数の第2引数として渡されるリストに追加することを意味します。

ウィンドウを削除できない場合(通常は、フレーム上の最後のウィンドウであるため)、set-window-configuration と window-state-put には別のバッファが表示されます。

この変数の値が関数である場合、その関数は3つの引数を取る必要があります。第1引数は、ウィンドウが復元されたフレームを指定します。第3引数は、ウィンドウが set-window-configuration によって復元された場合はシンボル configuration を、window-state-put によって復元された場合はシンボル state となります。

第2引数には、set-window-configuration または window-state-put が復元を試みた時点で、以前のバッファがデッド状態であったすべてのウィンドウのエントリリストを指定します(ミニバッファウィンドウは除外されます)。つまり、この関数は set-window-configuration によってライブ状態であると判定されたウィンドウも削除する可能性があります。

関数の第2引数として渡されるリストの各要素は、それ自体が6つの値からなるリストです。具体的には、バッファがデッドであると判定されたウィンドウ、デッドバッファまたはその名称、そのウィンドウ内のバッファのウィンドウ開始位置(ウィンドウの開始・終了位置を参照)およびウィンドウポイント(ウィンドウとポイントを参照)、window-dedicated-p で以前に報告されたウィンドウの専用状態、そして set-window-configuration および nil によってウィンドウが生存していると判定された場合は t となるフラグです。

関数 window-state-get と window-state-put を使えば、2つのライブウィンドウの内容を入れ替えることもできます。以下の関数は、まさにそれを行うものです:

コマンド: window-swap-states &optional window-1 window-2 size

このコマンドは、2つのライブウィンドウ window-1 と window-2 の状態を入れ替えます。window-1 にはライブウィンドウを指定する必要があり、デフォルトでは選択中のウィンドウが指定されます。window-2 にはライブウィンドウを指定する必要があり、デフォルトでは、ミニバッファウィンドウを除外し、すべての可視フレーム上のライブウィンドウを含めたウィンドウの循環順において、window-1 の次のウィンドウが指定されます。

オプション引数 size が non-nil の場合は、window-1 と window-2 のサイズも入れ替えようとします。height は高さのみを、width は幅のみを入れ替え、t は可能であれば幅と高さの両方を入れ替えます。この関数でフレームのサイズは変更されません。