サイドウィンドウを利用することで、統合開発環境(IDE)で提供されるような、より複雑なフレームレイアウトを構築できます。こうしたレイアウトでは、メインウィンドウの領域が通常の編集作業が行われる場所となります。サイドウィンドウは、一般的な意味での編集を想定して設計されたものではありません。むしろ、ファイルやタグ、バッファの一覧、ヘルプ情報、検索やgrepの結果、シェルの出力など、現在の編集作業を補完する情報を表示するためのものです。
このようなフレームのレイアウトは、次のようになるかもしれません。
___________________________________
| *Buffer List* |
|___________________________________|
| | | |
| * | | * |
| d | | T |
| i | | a |
| r | Main Window Area | g |
| e | | s |
| d | | * |
| * | | |
|_____|_______________________|_____|
| *help*/*grep*/ | *shell*/ |
| *Completions* | *compilation* |
|_________________|_________________|
| Echo Area |
|___________________________________|
以下の例では、ウィンドウパラメータ(ウィンドウパラメータを参照)をdisplay-buffer-in-side-window(サイドウィンドウでのバッファ表示を参照)と組み合わせて、上述のフレームレイアウトを生成するためのコードを設定する方法を示します。
(defvar parameters
'(window-parameters . ((no-other-window . t)
(no-delete-other-windows . t))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
(setq
display-buffer-alist
`(("\\*Buffer List\\*" display-buffer-in-side-window
(side . top) (slot . 0) (window-height . fit-window-to-buffer)
(preserve-size . (nil . t)) ,parameters)
("\\*Tags List\\*" display-buffer-in-side-window
(side . right) (slot . 0) (window-width . fit-window-to-buffer)
(preserve-size . (t . nil)) ,parameters)
("\\*\\(?:help\\|grep\\|Completions\\)\\*"
display-buffer-in-side-window
(side . bottom) (slot . -1) (preserve-size . (nil . t))
,parameters)
("\\*\\(?:shell\\|compilation\\)\\*" display-buffer-in-side-window
(side . bottom) (slot . 1) (preserve-size . (nil . t))
,parameters)))
ここでは、固定名を持つバッファに対して display-buffer-alist
エントリを指定します(バッファ表示用のウィンドウの選択
を参照)。具体的には、フレーム上部に高さ調整可能な *Buffer List*
を、フレーム右側に幅調整可能な *Tags List*
を表示するよう指定しています。また、*help*、*grep*、*Completions*
バッファをフレームの左下側で一つのウィンドウに共有し、*shell* と *compilation* バッファをフレームの右下側のウィンドウに表示するよう指定しています。
ウィンドウの水平方向の調整を可能にするには、オプション fit-window-to-buffer-horizontally に nil
以外の値を指定する必要がある点に注意してください。また、フレームの上下にあるサイドウィンドウの高さと、フレームの左右にあるサイドウィンドウの幅を保持するよう指定する項目も追加されています。フレームを最大化した際にサイドウィンドウがそれぞれのサイズを維持するように、変数
window-resize-pixelwise には nil 以外の値が設定されます。ウィンドウのサイズ変更を参照してください。
最後のフォームでは、これらの各ウィンドウにno-other-windowパラメータを設定することで、作成されたサイドウィンドウのいずれもC-x o経由でアクセスできないようにしています。さらに、これらの各ウィンドウにno-delete-other-windowsパラメータを設定することで、サイドウィンドウがC-x 1経由で削除されないようにしています。
dired
バッファには固定名がないため、フレームの左側にシンプルなディレクトリバッファを表示させる専用関数 dired-default-directory-on-left を使用しています。
(defun dired-default-directory-on-left ()
"Display `default-directory' in side window on left, hiding details."
(interactive)
(let ((buffer (dired-noselect default-directory)))
(with-current-buffer buffer (dired-hide-details-mode t))
(display-buffer-in-side-window
buffer `((side . left) (slot . 0)
(window-width . fit-window-to-buffer)
(preserve-size . (t . nil)) ,parameters))))
前述のフォームとタイピングを評価し、任意の順序で M-x list-buffers、C-h f、M-x shell、M-x list-tags、M-x dired-default-directory-on-left と入力すれば、上記でスケッチしたフレームレイアウトが再現されるはずです。