Emacs может делить фреймы на два или более окна. Несколько окон могут отражать части разных буферов или разные части одного буфера. Использование нескольких фреймов всегда подразумевает множество окон, потому что в каждом фрейме свой набор окон. Каждое окно принадлежит одному и только одному фрейму.
Каждое окно Emacs отображает в одно время один буфер. Один и тот же буфер может появиться более чем в одном окне; если это произошло, то любые изменения в его тексте показываются во всех окнах, где он отображен. Но окна, показывающие один и тот же буфер, могут показывать различные его части, так как каждое окно хранит свое собственное значение точки.
В любой момент одно из окон является выбранным окном; буфер, отображаемый этим окном, является текущим буфером. Курсор терминала показывает позицию точки в этом окне. Все другие окна также имеют позицию точки, но так у терминала есть только один курсор, нельзя показать, где находятся эти позиции. Когда есть несколько видимых фреймов в X Windows, в каждом фрейме изображается один курсор, находящийся в выбранном окне этого фрейма. Курсор в выбранном фрейме закрашен; курсоры в других фреймах выглядят как пустые клетки.
Команды движения точки действуют только на значение точки для
выбранного окна Emacs. Они не изменяют значение точки в каком-либо
другом окне Emacs, даже в показывающем тот же самый буфер. Это верно и
для таких команд, как C-x b для изменения выбранного буфера в
выбранном окне, на другие окна они не действуют вообще. Однако,
существуют другие команды, например C-x 4 b, которые выбирают
другое окно и переключают буферы в нем. Также, все команды, которые
показывают информацию в окне, включая (например) C-h f
(discribe-function
) и C-x C-b (list-bufers
),
работают при помощи переключения буферов в невыбранном окне, не
затрагивая выбранное.
Когда несколько окон показывают один и тот же буфер, в них могут быть разные области, потому что они могут иметь разные значения точки. Однако, все они имеют одно и то же значение метки, потому что в каждом буфере может быть только одна позиция метки.
Каждое окно имеет свою собственную строку режима, которая показывает имя буфера, статус модификации и основной и второстепенные режимы буфера, который отражен в данном окне. Смотрите раздел Строка режима, для более подробной информации о строке режима.
split-window-vertically
).
split-window-horizontally
).
Команда C-x 2 (split-window-vertically
) разбивает
выбранное окно на два, одно под другим. Оба окна cначала показывают
один и тот же буфер с одним и тем же значением точки. По умолчанию
каждое из двух окон получает половину высоты окна, которое было
разделено; числовой аргумент определяет количество строк, которое
необходимо дать верхнему окну.
C-x 3 (split-window-horizontally
) разбивает выбранное
окно на два рядом стоящих окна. Числовой аргумент определяет, сколько
столбцов дать левому окну. Окна разделяются строкой вертикальных
штрихов. Окна, которые не занимают всю ширину фрейма, имеют строки
режима, но они усечены. На терминалах, где Emacs не поддерживает
подсветку, усеченные строки режима иногда появляются не в инверсном
изображении.
Вы можете разделить окно горизонтально, щелкнув C-Mouse-2 на строке режима или полосе прокрутки. Линия раздела проходит от места, где вы щелкнули: если вы щелкнули на строке режима, от этого места отойдет новая полоса прокрутки; если вы щелкнули на полосе прокрутки, в месте вашего щелчка появится строка режима нового окна.
Когда окно меньше полной ширины экрана, часто встречаются слишком
длинные строки текста, которые не помещаются в окне. Продолжение всех
этих строк может привести к путанице. Переменная
truncate-partial-width-windows
может быть установлена не равной
nil
, это принудительно делает во всех окнах усечение строк до
меньшего, чем полная ширина окна, размера независимо от отображаемого
буфера и значения переменной truncate-lines
в нем. Смотрите раздел Строки продолжения.
Горизонтальная прокрутка часто используется в окнах, расположенных рядом вертикально. Смотрите раздел Управление изображением.
Если split-window-keep-point
не равна nil
, как по
умолчанию, то оба окна, получающиеся после C-x 2, наследуют
значение точки от разделяемого окна. Это означает, что необходима
прокрутка. Если эта переменная равна nil
, то C-x 2
пытается избежать сдвига текста на экране, помещая точку в каждом окне в
уже видимом месте. Она также выбирает то окно, которое содержит строку
текста, на которой курсор был раньше. Некоторые пользователи
предпочитают такой режим на медленных терминалах.
other-window
). Это буква o, не ноль.
scroll-other-window
).
mouse-select-window
).
Чтобы выбрать другое окно, щелкните Mouse-1 на его строке
режима. С помощью клавиатуры вы можете переключать окна, набирая
C-x o (other-window
). Это буква о, от слова `other'
(`другое'), а не ноль.
Когда имеется более двух окон, эта команда продвигается через все окна
по кругу, обычно сверху вниз и слева направо. От самого правого нижнего
окна она идет обратно в то, которое находится в верхнем левом углу.
Числовой аргумент означает движение на несколько шагов по круговому
порядку окон. Отрицательный аргумент продвигает по кругу в обратном
порядке. Когда минибуфер активен, он является последним окном в кольце;
вы можете переключиться из окна минибуфера в одно из других окон и позже
переключиться обратно и завершить в минибуфере запрашиваемый аргумент.
Смотрите раздел Редактирование в минибуфере.
Обычные команды прокрутки (смотрите раздел Управление изображением) относятся только к
выбранному окну, но существует одна команда для прокрутки следующего
окна. C-M-v (scroll-other-window
) прокручивает окно,
которое выбрала бы C-x o. Она принимает положительные и
отрицательные аргументы так же, как и C-v. (В минибуфере,
C-M-v прокручивает окно, содержащее справку для минибуфера, если
оно есть, а не следующее окно в стандартном круговом порядке.)
Команда M-x compare-windows позволяет вам сравнить два файла или буфера, видимые в двух окнах, продвигаясь по ним до следующего несовпадения. Смотрите раздел Сравнение файлов, для подробностей.
C-x 4 -- это префиксный ключ для команд, которые выбирают другое окно (разделяя текущее окно, если оно было единственным) и выбирают буфер этом окне. Разные команды на C-x 4 дают разные способы нахождения буфера для выбора.
switch-to-buffer-other-window
.
display-buffer
.
find-file-other-window
. Смотрите раздел Обращение к файлам.
dired-other-window
. Смотрите раздел Dired, редактор каталогов.
mail-other-window
; аналог этой команды, работающий в
том же окне -- C-x m (смотрите раздел Посылка почты).
find-tag-other-window
, многооконный вариант M-.
(смотрите раздел Таблицы тегов).
find-file-read-only-other-window
. Смотрите раздел Обращение к файлам.
Некоторые команды Emacs переключают в определенный буфер с особым содержимым. Например, M-x shell переключает в буфер, называемый `*Shell*'. По соглашению, все эти команды написаны так, чтобы выдавать этот буфер в отдельном окне. Но вы можете указать, что некоторые из этих буферов должны появляться в выбранном окне.
Если вы добавляете имя буфера в список
same-window-buffer-names
, то в результате такие команды
отображают этот буфер, переключаясь к нему в том же окне. Например,
если вы добавите в этот список элемент "*grep*"
, то команда
grep
будет показывать буфер с выводом в текущем окне.
Значение same-window-buffer-names
по умолчанию не равно
nil
: оно задает имена буферов `*info*', `*mail*' и
`*shell*' (а также других буферов, используемых более туманными
пакетами Emacs). Поэтому M-x shell обычно переключает в буфер
`*shell*' в выбранном окне. Если вы удалите этот элемент из списка
same-window-buffer-names
, поведение M-x shell изменится ---
вместо этого она будет выдавать буфер в другом окне.
Вы можете задать эти буферы в более общей форме с помощью переменной
same-window-regexps
. Установите ее равной списку регулярных
выражений; теперь любой буфер, чье имя совпадает с одним из этих
регулярных выражений, будет отображаться с переключением к нему в
выбранном окне. (Еще раз, это относится только к тем буферам, которые
обычно показываются вам в отдельном окне.) Значение этой переменной по
умолчанию задает буферы Telnet и rlogin.
Аналогичная возможность позволяет вам задать буферы, которые должны отображаться в принадлежащих только им фреймах. Смотрите раздел Фреймы специальных буферов.
delete-window
). Последний знак в этой
последовательности ключей -- ноль.
delete-other-windows
).
kill-buffer-and-window
). Последний знак в этой
последовательности ключей -- ноль.
enlarge-window
).
enlarge-window-horizontally
).
shrink-window-horizontally
).
shrink-window-if-larger-than-buffer
).
balance-windows
).
mouse-delete-other-windows
).
mouse-delete-window
).
Чтобы удалить окно, наберите C-x 0 (delete-window
). (Это
ноль). Пространство, занимаемое удаленным окном, достается соседнему
окну (но не окну минибуфера, даже если оно активно в этот момент). Как
только окно удалено, его атрибуты забываются; их может вернуть только
восстановление конфигурации окна. Удаление окна не влияет на буфер,
который оно отображало; этот буфер продолжает существовать, и вы можете
выбрать его в любом окне командой C-x b.
C-x 4 0 (kill-buffer-and-window
) -- более сильная
команда, чем C-x 0; она уничтожает текущий буфер и затем удаляет
выбранное окно.
C-x 1 (delete-other-windows
) -- более мощная в другом
смысле; она удаляет все окна за исключением выбранного (и минибуфера).
Выбранное окно расширяется, чтобы использовать весь фрейм, за
исключением эхо-области.
Вы также можете удалить окно, щелкнув на его строке режима Mouse-2, и удалить все окна во фрейме, кроме одного, щелкнув на строке режима этого окна Mouse-3.
Простейший способ настроить высоту окон -- сделать это с помощью мыши. Если вы нажмете Mouse-1 на строке режима, вы можете перетащить ее вверх или вниз, изменяя высоту окон сверху и снизу от нее.
Чтобы перенастроить деление пространства между вертикально соседними
окнами, используйте C-x ^ (enlarge-window
). Она делает
текущее выбранное окно больше на одну строку или на столько строк,
сколько определено числовым аргументом. С отрицательным аргументом, она
делает выбранное окно меньше. C-x }
(enlarge-window-horizontally
) делает выбранное окно шире, а
C-x { (shrink-window-horizontally
) -- уже на заданное
число столбцов.
Когда вы увеличиваете окно, оно забирает пространство от одного из
своих соседей. Если это делает какие-то окна слишком маленькими, то эти
окна удаляются и их пространство делится между соседними окнами.
Минимальный размер определяется переменными window-min-height
и
window-min-width
.
Команда C-x - (shrink-window-if-larger-than-buffer
)
уменьшает высоту выбранного окна, если оно выше, чем необходимо для
показа всего текста отображаемого в нем буфера. Она передает
освободившиеся строки другим окнам в этом фрейме.
Вы также можете использовать C-x + (balance-windows
),
чтобы выровнять высоты всех окон в выбранном фрейме.
Смотрите раздел Редактирование в минибуфере, подробное описание режима Resize-Minibuffer, который автоматически изменяет размер окна минибуфера, чтобы в нем вмещался текст минибуфера.