Использование множества буферов

Текст, который вы редактируете в Emacs, находится в объекте, называемом буфером. Каждый раз, когда вы обращаетесь к файлу, для хранения его текста создаётся буфер. Каждый раз, когда вы запускаете Dired, создается буфер, содержащий список каталога. Если вы посылаете сообщение с помощью C-x m, то для текста этого сообщения используется буфер с именем `*mail*'. Когда вы запрашиваете документацию команды, она появится в буфере с именем `*Help*'.

В любой момент один и только один буфер является выбранным. Он также называется текущим буфером. Часто мы говорим, что команда действует в "буфере", как если бы он был только один; но на самом деле это означает, что команда действует в выбранном буфере (большинство команд так и делают).

Когда Emacs создаёт множество окон, каждое окно имеет свой выбранный буфер, но в любой момент времени только одно из окон является выбранным, и его буфер -- это выбранный буфер. Строка режима каждого окна показывает имя буфера, который в нём отображён (смотрите раздел Множество окон).

У каждого буфера есть имя, которое может быть произвольной длины, и вы можете выбрать любой буфер по имени. Большинство буферов создаются при обращении к файлам, и их имена производятся из имени файла. Но вы можете также создать пустой буфер с любым именем, каким захотите. Только что запущенный Emacs несет один буфер с именем `*scratch*', который может быть использован для вычисления выражений Лиспа в Emacs. В именах буферов имеет значение различие между верхним и нижним регистрами.

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

Создание и выбор буферов

C-x b буфер RET
Выбрать или создать буфер с именем буфер (switch-to-buffer).
C-x 4 b буфер RET
Аналогично, но выбирает буфер в другом окне (switch-to-buffer-other-window).
C-x 5 b буфер RET
Аналогично, но выбирает буфер в другом фрейме (switch-to-buffer-other-frame).

Чтобы выбрать буфер с именем имя-буфера, наберите C-x b имя-буфера RET. Это запустит команду switch-to-buffer с аргументом имя-буфера. Вы можете применить завершение сокращенного имени желаемого буфера (смотрите раздел Завершение). Пустой аргумент для C-x b задаёт последний выбранный буфер, который не отображен ни в одном окне.

Большинство буферов создаются при обращении к файлам или же командами Emacs, которые хотят показать некоторый текст, но вы также можете явно создать буфер, набрав C-x b имя-буфера RET. Эта команда создаёт новый, пустой буфер, который не обращется ни к какому файлу, и выберет его для редактирования. Такие буферы создаются для заметок. Если вы попытаетесь сохранить этот буфер, то у вас спросят имя файла для записи. Основной режим в новом буфере определяется значением переменной default-major-mode (смотрите раздел Основные режимы).

Отметим, что C-x C-f и любая другая команда для обращения к файлу также могут использоваться для переключения к существующему буферу, обращающемуся к файлу. Смотрите раздел Обращение к файлам.

Emacs использует буферы с именами, начинающимися с пробела, для внутренних целей. Отчасти он обращается с буферами с такими именами особенным образом -- например, по умолчанию в них не записывается информация для отмены изменений. Вам лучше избегать использования таких имён для буферов.

Перечисление существующих буферов

C-x C-b
Перечисляет существующие буферы (list-buffers).

Чтобы напечатать список всех существующих буферов, наберите C-x C-b. Каждая строка в списке показывает имя одного буфера, его основной режим и файл, к которому он обращается. Буферы перечисляются в том порядке, в котором они были текущими; буферы, которые были текущими недавно, идут первыми.

Знак `*' в начале строки указывает, что буфер "модифицирован". Если модифицированы несколько буферов, то может быть пора записать некоторые из них при помощи C-x s (смотрите раздел Сохранение файлов). Знаком `%' обозначаются буферы, доступные только для чтения. Знак `.' отмечает выбранный буфер. Вот пример перечня буферов:

 MR Buffer Size Mode File
 -- ------ ---- ---- ----
.* emacs.tex 383402 Texinfo /u2/emacs/man/emacs.tex
 *Help* 1287 Fundamental
 files.el 23076 Emacs-Lisp /u2/emacs/lisp/files.el
 % RMAIL 64042 RMAIL /u/rms/RMAIL
 *% man 747 Dired /u2/emacs/man/
 net.emacs 343885 Fundamental /u/rms/net.emacs
 fileio.c 27691 C /u2/emacs/src/fileio.c
 NEWS 67340 Text /u2/emacs/etc/NEWS
 *scratch*	 0	 Lisp Interaction

Отметим, что буфер `*Help*' создаётся при запросе справки, и это не является обращением к какому-либо файлу. Буфер `man' был создан Dired для каталога `/u2/emacs/man/'.

Разнообразные операции над буфером

C-x C-q
Переключить доступ на запись в буфер (vc-toggle-read-only).
M-x rename-buffer RET имя RET
Изменить имя текущего буфера.
M-x rename-uniquely
Переименовать буфер добавлением `<числа>' в конец имени.
M-x view-buffer RET буфер RET
Просмотреть буфер.

Буфер может быть доступен только для чтения, что означает, что команды для изменения его содержимого не разрешены. Строка режима указывает на то, что буфер доступен только для чтения, знаками `%%' или `%*' около левого края. Буферы только для чтения обычно создаются подсистемами вроде Dired и Rmail, которые имеют специальные команды для действий над текстом; буфер только для чтения создаётся также, если вы обращаетесь к файлу, для которого у вас нет доступа на запись.

Если вы хотите сделать изменения в буфере, предназначенном только для чтения, используйте команду C-x C-q (vc-toggle-read-only). Она делает буфер, доступный только для чтения, доступным для записи, а буфер, доступный для записи -- доступным только для чтения. В большинстве случаев эта команда работает, устанавливая переменную buffer-read-only, которая имеет локальное значение в каждом буфере и делает буфер закрытым для записи, если её значение не nil. Если этот файл сопровождается с контролем версий, то C-x C-q работает через систему управления версиями и изменяет состояния доступа на запись как для файла, так и для буфера. Смотрите раздел Управление версиями.

M-x rename-buffer изменяет имя текущего буфера. Новое имя задаётся как аргумент минибуфера. Значения по умолчанию нет. Если вы напишете имя, которое используется для какого-то другого буфера, то происходит ошибка, и переименование не делается.

M-x rename-uniquely переименовывает текущий буфер в похожее имя с добавленным числовым окончанием и делает это имя одновременно уникальным и отличным от других. Этой команде не нужен аргумент. Она полезна для создания нескольких буферов с оболочкой: если вы переименуете буфер `*Shell*' и снова сделаете M-x shell, то создастся новый буфер оболочки с именем `*Shell*'; тем временем старый буфер оболочки продолжает существовать под своим новым именем. Этот метод также полезен для буферов почтовых сообщений, буферов компиляции и большинства программ в Emacs, которые создают специальные буферы с конкретными именами.

M-x view-buffer очень похожа на M-x view-file (смотрите раздел Разнообразные действия над файлами), за исключением того, что она показывает уже существующий буфер Emacs. Режим View предусматривает команды для удобной прокрутки буфера, но не для его изменения. Когда вы выходите из режима View с помощью q, вы переключаетесь назад к тому буферу (и позиции), который прежде отображался в этом окне. Или вы можете выйти из режима View с помощью e, в результате после прочтения сохранятся буфер и значение точки.

Команды M-x append-to-buffer and M-x insert-buffer можно использовать для копирования текста из одного буфера в другой. Смотрите раздел Накопление текста.

Уничтожение буферов

Если вы продолжаете работу в Emacs довольно долго, вы можете накопить большое количество буферов. Тогда вы можете посчитать удобным уничтожить те из них, в которых вы больше не нуждаетесь. В большинстве операционных систем уничтожение буфера освобождает занимаемое им пространство, так что его смогут использовать другие процессы. Вот несколько команд для уничтожения буферов:

C-x k имя-буфера RET
Уничтожает буфер имя-буфера (kill-buffer).
M-x kill-some-buffers
Предлагает уничтожить каждый буфер один за другим.

C-x k (kill-buffer) уничтожает один буфер, чье имя задано в минибуфере. По умолчанию, если вы наберете в минибуфере просто RET, уничтожится текущий буфер. Если уничтожается текущий буфер, то выбранным становится другой буфер -- тот, который выбрали недавно, но сейчас он не виден ни в одном окне. Если вы попросили уничтожить буфер, который обращается к файлу и был модифицирован (содержит несохранённые изменения), тогда вас спросят о подтверждении с yes перед тем, как буфер будет уничтожен.

Команда M-x kill-some-buffers спрашивает о каждом буфере, один за другим. Ответ y означает уничтожить буфер. Уничтожение текущего буфера или буфера, содержащего незаписанные изменения, выбирает новый буфер или требует такого же подтверждения, как и kill-buffer.

Меню буферов (смотрите раздел Действия над несколькими буферами) также предоставляет удобный способ уничтожения различных буферов.

Если вы хотите делать что-то особенное каждый раз, когда уничтожается буфер, вы можете добавить свои функции в ловушку kill-buffer-hook (смотрите раздел Ловушки).

Если вы продолжаете один сеанс Emacs в течении многих дней, как делают многие, он может наполниться буферами, которые вы использовали несколько дней назад. Команда M-x clean-buffer-list -- это удобный способ очистить их; она уничтожает все неизмененные буферы, которые вы не использовали долгое время. Обычные буферы уничтожаются, если они не отображались в течении трех дней; однако, вы можете указать определённые буферы, которые никогда не должны уничтожаться автоматически, и другие, которые нужно уничтожать, если их не использовали хотя бы час.

Вы также можете сделать так, чтобы эти буферы очищались для вас сами ежедневно в полночь, включив режим Midnight. Режим Midnight работает каждый день в полночь; в это время он запускает clean-buffer-list или другие функции, которые вы поместите в обычную ловушку midnight-hook (смотрите раздел Ловушки).

Чтобы включить режим Midnight, используйте буфер Customization для установки переменной midnight-mode в значение t. Смотрите раздел Интерфейс для простой настройки.

Действия над несколькими буферами

Меню буферов похоже на "Dired для буферов". Оно позволяет вам запрашивать действия для различных буферов Emacs при помощи редактирования буфера, содержащего их список. Вы можете сохранять буферы, уничтожать их (здесь это называется удалением для согласования с Dired) или показывать их.

M-x buffer-menu
Начать редактирование буфера, содержащего список всех буферов Emacs.

Команда buffer-menu записывает список всех буферов Emacs в буфер с именем `*Buffer List*' и выбирает этот буфер в режиме Buffer Menu. Этот буфер предназначен только для чтения и может быть изменен только при помощи специальных команд, описанных в этом разделе. В буфере `*Buffer List*' могут использоваться обычные команды Emacs для движения курсора. Следующие специальные команды применяются к буферу, описанному в текущей строке:

d
Запросить удаление (уничтожение) буфера, и затем сдвинуться вниз. Запрос показывается как `D' на строке перед именем буфера. Затребованные удаления происходят, когда вы печатаете команду x.
C-d
Как d, но сдвигает вверх, а не вниз.
s
Запросить сохранение буфера. Запрос показывается как `S' на строке. Требуемые сохранения происходят, когда используется команда x. Вы можете запросить и запись, и удаление для одного и того же буфера.
x
Выполнить ранее запрошенные удаления и сохранения.
u
Уничтожить любой запрос, сделанный для текущей строки, и сдвинуть курсор вниз.
DEL
Сдвинуть курсор к предыдущей строке и уничтожить любой запрос, сделанный для этой строки.

Команды d, C-d, s и u для добавления или сброса флагов также перемещают вниз (или вверх) на одну строку. Они принимают числовой аргумент в качестве счетчика повторов.

Эти команды действуют сразу на буфер, перечисленный в текущей строке:

~
Пометить буфер как "неизмененный". Команда ~ делает это немедленно после того, как вы её ввели.
%
Переключает флаг доступности на запись для буфера. Команда % действует сразу после ввода.
t
Обратиться к буферу как к таблице тегов. Смотрите раздел Выбор таблицы тегов.

Есть также команды для выбора другого буфера или нескольких буферов:

q
Выйти из меню буферов -- сразу отобразить последний буфер, бывший прежде видимым на его месте.
RET
f
Немедленно выбрать буфер на этой строке на место буфера `*Buffer List*'.
o
Немедленно выбрать буфер на этой строке в другом окне, как если бы это было сделано при помощи C-x 4 b, оставляя `*Buffer List*' видимым.
C-o
Немедленно отобразить буфер на этой строке в другом окне, но не выбирать это окно.
1
Немедленно выбрать буфер на этой строке в полноэкранном окне.
2
Немедленно создать два окна, одно с буфером на этой строке, а второе с предыдущим выбранным буфером (помимо буфера `*Buffer List*').
b
Спрятать буфер, перечисленный в текущей строке.
m
Пометить этот буфер для показа в другом окне, если вы выйдите с помощью команды q. Такой запрос показывается как `>' в начале строки. (Один и тот же буфер не может иметь и запрос на показ, и запрос на удаление.)
v
Немедленно выбрать буфер на этой строке, а также показать в других окнах любые буферы, прежде помеченные с помощью команды m. Если таких буферов нет, то эта команда эквивалентна 1.

Все, что buffer-menu делает непосредственно, -- это создаёт и выбирает подходящий буфер и включает режим Buffer Menu. Все остальное из описанного выше осуществляется при помощи специальных команд, предоставляемых в режиме Buffer Menu. Одним из следствий этого является то, что вы можете переключиться из буфера `*Buffer List*' в другой буфер Emacs и редактировать там. Вы можете выбрать заново буфер `*Buffer List*' позже, чтобы исполнить уже запрошенные действия, или вы можете уничтожить его или больше не обращать на него внимания.

Существует только одно различие между buffer-menu и list-buffers -- это то, что buffer-menu выбирает буфер `*Buffer List*' в текущем окне, а list-buffers отображает его в другом окне. Если вы запускаете list-buffers (это происходит при наборе C-x C-b) и выбираете список буферов вручную, то вы можете использовать все описанные здесь команды.

Буфер `*Buffer List*' не обновляется автоматически, когда создаются или уничтожаются буферы; его содержимое -- это просто текст. Если вы создавали, удаляли или переименовывали буферы, вы можете обновить `*Buffer List*', чтобы он показывал то, что вы сделали, напечатав g (revert-buffer) или повторив команду buffer-menu.

Косвенные буферы

Косвенный буфер разделяет текст с каким-то другим буфером, называемым базовым буфером косвенного буфера. Это своего рода аналог символьных ссылок на файлы, но для буферов.

M-x make-indirect-buffer базовый-буфер RET косвенное-имя RET
Создает косвенный буфер с именем косвенное-имя, чей базовый буфер --- это базовый-буфер.

Текст в косвенном буфере всегда идентичен тексту его базового буфера; изменения, сделанные в одном, сразу же становятся видны в другом. Но во всем остальном косвенный буфер и его базовый буфер абсолютно различны. У них разные имена, разные значения точки, разное сужение, разные пометки, разные основные режимы и разные локальные переменные.

Косвенные буферы не могут обращаться к файлам, но их базовые буферы могут. Если вы пытаетесь записать косвенный буфер, это в действительности работает как запись базового буфера. Уничтожение базового буфера уничтожает косвенный буфер, но уничтожение косвенного буфера не влияет на базовый буфер.

Один из способов применения косвенных буферов -- отображение нескольких различных видов схемы текста. Смотрите раздел Просмотр одной схемы в нескольких видах.

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



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