Макеты фреймов с боковыми окнами
Боковые окна могут использоваться для создания более сложных макетов фреймов, подобных тем, которые предоставляют интегрированные среды разработки (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 записи (см. Выбор окна) для буферов с фиксированными именами. В частности, он запрашивает отображение *Список буферов* с настраиваемой высотой в верхней части фрейма и *Список тегов* с настраиваемой шириной в правой части фрейма. Также он запрашивает совместное использование буферов *help*, *grep* и *Completions* в окне в левом нижнем углу фрейма и буферов *shell* и *compilation* в окне в правом нижнем углу фрейма.
Обратите внимание, что параметр 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 ()
"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, вы должны воспроизвести макет фрейма, изображенный выше.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Frame-Layouts-with-Side-Windows.html