Множество окон

Emacs может делить фреймы на два или более окна. Несколько окон могут отражать части разных буферов или разные части одного буфера. Использование нескольких фреймов всегда подразумевает множество окон, потому что в каждом фрейме свой набор окон. Каждое окно принадлежит одному и только одному фрейму.

Понятие окна в Emacs

Каждое окно Emacs отображает в одно время один буфер. Один и тот же буфер может появиться более чем в одном окне; если это произошло, то любые изменения в его тексте показываются во всех окнах, где он отображен. Но окна, показывающие один и тот же буфер, могут показывать различные его части, так как каждое окно хранит своё собственное значение точки.

В любой момент одно из окон является выбранным окном; буфер, отображаемый этим окном, является текущим буфером. Курсор терминала показывает позицию точки в этом окне. Все другие окна также имеют позицию точки, но так как у терминала есть только один курсор, нельзя показать, где находятся эти позиции. Когда есть несколько видимых фреймов в X Windows, в каждом фрейме изображается один курсор, находящийся в выбранном окне этого фрейма. Курсор в выбранном фрейме закрашен; курсоры в других фреймах выглядят как пустые клетки.

Команды движения точки действуют только на значение точки для выбранного окна Emacs. Они не изменяют значение точки в каком-либо другом окне Emacs, даже в показывающем тот же самый буфер. Это верно и для таких команд, как C-x b для изменения выбранного буфера в выбранном окне, на другие окна они не действуют вообще. Однако, существуют другие команды, например C-x 4 b, которые выбирают другое окно и переключают буферы в нём. Также, все команды, которые показывают информацию в окне, включая (например) C-h f (discribe-function) и C-x C-b (list-bufers), работают при помощи переключения буферов в невыбранном окне, не затрагивая выбранное.

Когда несколько окон показывают один и тот же буфер, в них могут быть разные области, потому что они могут иметь разные значения точки. Однако, все они имеют одно и то же значение метки, потому что в каждом буфере может быть только одна позиция метки.

Каждое окно имеет свою собственную строку режима, которая показывает имя буфера, статус модификации и основной и второстепенные режимы буфера, который отражен в данном окне. Смотрите раздел Строка режима, для более подробной информации о строке режима.

Разделение окон

C-x 2
Разделить выбранное окно на два, находящихся одно под другим (split-window-vertically).
C-x 3
Разделить выбранное окно на два окна, находящихся одно рядом с другим (split-window-horizontally).
C-Mouse-2
В строке режима или полосе прокрутки, разделяет это окно.

Команда 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 пытается избежать сдвига текста на экране, помещая точку в каждом окне в уже видимом месте. Она также выбирает то окно, которое содержит строку текста, на которой курсор был раньше. Некоторые пользователи предпочитают такой режим на медленных терминалах.

Использование других окон

C-x o
Выбрать другое окно (other-window). Это буква o, не ноль.
C-M-v
Прокрутить следующее окно (scroll-other-window).
M-x compare-windows
Найти следующее место, где текст выбранного окна не совпадает с текстом в следующем окне.
Mouse-1
Mouse-1 на строке режима какого-нибудь окна выбирает это окно, но не перемещает в нём точку (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 дают разные способы нахождения буфера для выбора.

C-x 4 b имя-буфера RET
Выбрать буфер имя-буфера в другом окне. При этом запускается switch-to-buffer-other-window.
C-x 4 C-o имя-буфера RET
Отобразить буфер имя-буфера в другом окне, но не выбирать в нём этот буфер. Это запускает display-buffer.
C-x 4 f имя-файла RET
Обратиться к файлу имя-файла и выбрать его буфер в другом окне. При этом запускается find-file-other-window. Смотрите раздел Обращение к файлам.
C-x 4 d каталог RET
Выбрать буфер Dired для каталога в другом окне. При этом запускается dired-other-window. Смотрите раздел Dired, редактор каталогов.
C-x 4 m
Начать составление почтового сообщения в другом окне. При этом запускается mail-other-window; аналог этой команды, работающий в том же окне -- C-x m (смотрите раздел Посылка почты).
C-x 4 .
Найти тег в текущей таблице тегов в другом окне. При этом запускается find-tag-other-window, многооконный вариант M-. (смотрите раздел Таблицы тегов).
C-x 4 r имя-файла RET
Обратиться к файлу имя-файла в режиме только для чтения и выбрать его буфер в другом окне. Этот ключ запускает команду 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.

Аналогичная возможность позволяет вам задать буферы, которые должны отображаться в принадлежащих только им фреймах. Смотрите раздел Фреймы специальных буферов.

Удаление и переупорядочение окон

C-x 0
Удалить выбранное окно (delete-window). Последний знак в этой последовательности ключей -- ноль.
C-x 1
Удалить в выбранном фрейме все окна, кроме выбранного (delete-other-windows).
C-x 4 0
Удалить выбранное окно и уничтожить буфер, который был в нём показан (kill-buffer-and-window). Последний знак в этой последовательности ключей -- ноль.
C-x ^
Сделать выбранное окно выше (enlarge-window).
C-x }
Расширить выбранное окно (enlarge-window-horizontally).
C-x {
Сузить выбранное окно (shrink-window-horizontally).
C-x -
Уменьшить это окно, если буфер в нём не требует столько строк (shrink-window-if-larger-than-buffer).
C-x +
Выровнять высоты всех окон (balance-windows).
Drag-Mouse-1
Перемещение строки режима окна с помощью mouse-1 изменяет высоту окон.
Mouse-2
Mouse-2 на строке режима окна удаляет все остальные окна в этом фрейме (mouse-delete-other-windows).
Mouse-3
Mouse-3 на строке режима какого-нибудь окна удаляет это окно (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, который автоматически изменяет размер окна минибуфера, чтобы в нём вмещался текст минибуфера.

Назад |  Вперед |  Содержание



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024