Текст, который вы редактируете в Emacs, находится в объекте, называемом буфером. Каждый раз, когда вы обращаетесь к файлу, для хранения его текста создается буфер. Каждый раз, когда вы запускаете Dired, создается буфер, содержащий список каталога. Если вы посылаете сообщение с помощью C-x m, то для текста этого сообщения используется буфер с именем `*mail*'. Когда вы запрашиваете документацию команды, она появится в буфере с именем `*Help*'.
В любой момент один и только один буфер является выбранным. Он также называется текущим буфером. Часто мы говорим, что команда действует в "буфере", как если бы он был только один; но на самом деле это означает, что команда действует в выбранном буфере (большинство команд так и делают).
Когда Emacs создает множество окон, каждое окно имеет свой выбранный буфер, но в любой момент времени только одно из окон является выбранным, и его буфер -- это выбранный буфер. Строка режима каждого окна показывает имя буфера, который в нем отображен (смотрите раздел Множество окон).
У каждого буфера есть имя, которое может быть произвольной длины, и вы можете выбрать любой буфер по имени. Большинство буферов создаются при обращении к файлам, и их имена производятся из имени файла. Но вы можете также создать пустой буфер с любым именем, каким захотите. Только что запущенный Emacs несет один буфер с именем `*scratch*', который может быть использован для вычисления выражений Лиспа в Emacs. В именах буферов имеет значение различие между верхним и нижним регистрами.
Каждый буфер записывает отдельно, к какому файлу он обращается, изменен ли он, и какие основной и второстепенные режимы в нем действуют (смотрите раздел Основные режимы). Любая переменная Emacs может быть сделана локальной для конкретного буфера; имеется в виду, что ее значение в этом буфере может отличаться от ее значения в других буферах. Смотрите раздел Локальные переменные.
switch-to-buffer
).
switch-to-buffer-other-window
).
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 использует буферы с именами, начинающимися с пробела, для внутренних целей. Отчасти он обращается с буферами с такими именами особенным образом -- например, по умолчанию в них не записывается информация для отмены изменений. Вам лучше избегать использования таких имен для буферов.
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/'.
vc-toggle-read-only
).
Буфер может быть доступен только для чтения, что означает, что команды для изменения его содержимого не разрешены. Строка режима указывает на то, что буфер доступен только для чтения, знаками `%%' или `%*' около левого края. Буферы только для чтения обычно создаются подсистемами вроде 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 довольно долго, вы можете накопить большое количество буферов. Тогда вы можете посчитать удобным уничтожить те из них, в которых вы больше не нуждаетесь. В большинстве операционных систем уничтожение буфера освобождает занимаемое им пространство, так что его смогут использовать другие процессы. Вот несколько команд для уничтожения буферов:
kill-buffer
).
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) или показывать их.
Команда buffer-menu
записывает список всех буферов Emacs в
буфер с именем `*Buffer List*' и выбирает этот буфер в режиме
Buffer Menu. Этот буфер предназначен только для чтения и может быть
изменен только при помощи специальных команд, описанных в этом разделе.
В буфере `*Buffer List*' могут использоваться обычные команды Emacs
для движения курсора. Следующие специальные команды применяются к
буферу, описанному в текущей строке:
Команды d, C-d, s и u для добавления или сброса флагов также перемещают вниз (или вверх) на одну строку. Они принимают числовой аргумент в качестве счетчика повторов.
Эти команды действуют сразу на буфер, перечисленный в текущей строке:
Есть также команды для выбора другого буфера или нескольких буферов:
Все, что 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
.
Косвенный буфер разделяет текст с каким-то другим буфером, называемым базовым буфером косвенного буфера. Это своего рода аналог символьных ссылок на файлы, но для буферов.
Текст в косвенном буфере всегда идентичен тексту его базового буфера; изменения, сделанные в одном, сразу же становятся видны в другом. Но во всем остальном косвенный буфер и его базовый буфер абсолютно различны. У них разные имена, разные значения точки, разное сужение, разные пометки, разные основные режимы и разные локальные переменные.
Косвенные буферы не могут обращаться к файлам, но их базовые буферы могут. Если вы пытаетесь записать косвенный буфер, это в действительности работает как запись базового буфера. Уничтожение базового буфера уничтожает косвенный буфер, но уничтожение косвенного буфера не влияет на базовый буфер.
Один из способов применения косвенных буферов -- отображение нескольких различных видов схемы текста. Смотрите раздел Просмотр одной схемы в нескольких видах.