29.17.3 Макеты фреймов с боковыми окнами

Боковые окна могут использоваться для создания более сложных макетов фреймов, подобных тем, что предоставляются интегрированными средами разработки (IDE). В таких макетах область основного окна используется для обычных операций редактирования. Боковые окна не предназначены для редактирования в обычном смысле. Скорее, они должны отображать информацию, дополняющую текущую операцию редактирования, такую как списки файлов, тегов или буферов, справочная информация, результаты поиска или grep, или вывод командной строки.

Макет такого фрейма может выглядеть следующим образом:

     ___________________________________
    |          *Список буферов*            |
    |___________________________________|
    |     |                       |     |
    |  *  |                       |  *  |
    |  d  |                       |  T  |
    |  i  |                       |  a  |
    |  r  |   Область основного окна    |  g  |
    |  e  |                       |  s  |
    |  d  |                       |  *  |
    |  *  |                       |     |
    |_____|_______________________|_____|
    | *Справка*/*grep*/  |  *Командная строка*/       |
    | *Автодополнение*   |  *Компиляция*  |
    |_________________|_________________|
    |             Область вывода             |
    |___________________________________|


Приведенный ниже пример иллюстрирует, как можно использовать параметры окна (см. Параметры окна) вместе с 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
 `(("\\*Список буферов\\*" display-buffer-in-side-window
    (side . top) (slot . 0) (window-height . fit-window-to-buffer)
    (preserve-size . (nil . t)) ,parameters)
   ("\\*Список тегов\\*" display-buffer-in-side-window
    (side . right) (slot . 0) (window-width . fit-window-to-buffer)
    (preserve-size . (t . nil)) ,parameters)
   ("\\*\\(?:справка\\|grep\\|Автодополнение\\)\\*"
    display-buffer-in-side-window
    (side . bottom) (slot . -1) (preserve-size . (nil . t))
    ,parameters)
   ("\\*\\(?:командная строка\\|компиляция\\)\\*" display-buffer-in-side-window
    (side . bottom) (slot . 1) (preserve-size . (nil . t))
    ,parameters)))

Это указывает записи display-buffer-alist (см. Выбор окна для отображения буфера) для буферов с фиксированными именами. В частности, это запрашивает отображение *Список буферов* с регулируемой высотой в верхней части фрейма и *Список тегов* с регулируемой шириной справа на фрейме. Также запрашивается, чтобы буферы *справка*, *grep* и *Автодополнение* делили окно в левой нижней части фрейма, а буферы *командная строка* и *компиляция* появлялись в окне в правой нижней части фрейма.

Обратите внимание, что опция fit-window-to-buffer-horizontally должна иметь не-nil значение, чтобы разрешить горизонтальную настройку окон. Также добавлены записи, которые запрашивают сохранение высоты боковых окон в верхней и нижней частях фрейма, а также ширины боковых окон слева или справа на фрейме. Чтобы гарантировать, что боковые окна сохраняют свои соответствующие размеры при максимальном размере фрейма, переменная window-resize-pixelwise устанавливается в не-nil значение. См. Изменение размера окон.

Последняя форма также гарантирует, что ни одно из созданных боковых окон не может быть вызвано через C-x o путем установки параметра no-other-window для каждого из этих окон. Кроме того, она гарантирует, что боковые окна не удаляются через C-x 1 путем установки параметра no-delete-other-windows для каждого из этих окон.

Поскольку буферы dired не имеют фиксированных имен, мы используем специальную функцию dired-default-directory-on-left для отображения чистого буфера каталога слева на фрейме.

(defun dired-default-directory-on-left ()
  "Отображает 'default-directory' в боковом окне слева, скрывая детали."
  (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 теперь должны воспроизвести схематический макет фрейма, показанный выше.