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

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

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

Когда  Emacs создает множество окон, каждое окно имеет свой выбранный буфер, но в любой момент времени только одно из окон является выбранным, и его буфер — это выбранный буфер. Строка режима каждого окна показывает имя буфера, который в нем отображен (см. Глава 16 [Окна], с. 141).

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

‘*scratch*’, который может быть использован для вычисления выражений Лиспа в Emacs.

В именах буферов имеет значение различие между верхним и нижним регистрами.

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

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

C-x b буфер hRETi

Выбрать или создать буфер с именем буфер (switch-to-buffer).

C-x 4 b буфер hRETi

Аналогично,  но выбирает буфер в  другом  окне  (switch-to-buffer-otherwindow).

C-x 5 b буфер hRETi

Аналогично, но выбирает буфер в другом фрейме (switch-to-buffer-otherframe).

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

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

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

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

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

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

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

Знак ‘*’ в начале строки указывает, что буфер “модифицирован”. Если модифицированы несколько буферов, то может быть пора записать некоторые из них при помощи C-x s (см. Раздел 14.3 [Сохранение],  с. 108). Знаком ‘%’ обозначаются буферы, доступные только для чтения. Знак ‘.’ отмечает выбранный буфер. Вот пример перечня буферов:

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/’.

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

C-x C-q      Переключить доступ на запись в буфер (vc-toggle-read-only).

M-x rename-buffer hRETимя hRETi

Изменить имя текущего буфера.

M-x rename-uniquely

Переименовать  буфер добавлением ‘<числа>’ в конец имени.

M-x view-buffer hRETбуфер hRETi

Просмотреть буфер.

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

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

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

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

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

Команды M-x append-to-buffer and M-x insert-buffer можно использовать для копи-

рования текста из одного буфера в другой. См. Раздел 9.3 [Накопление текста], с. 73.

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

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

C-x k имябуфера hRETi

Уничтожает буфер имябуфера (kill-buffer).

M-x kill-some-buffers

Предлагает уничтожить каждый буфер один за другим.

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

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

Меню буферов (см. Раздел 15.5 [Несколько  буферов], с. 138) также предоставляет удоб-

ный способ уничтожения различных буферов.

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

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

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

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

ременной midnight-mode в значение t. См. Раздел 31.2.2 [Простая настройка], с. 344.

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

Меню буферов похоже  на “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                Уничтожить  любой запрос, сделанный для текущей строки, и сдвинуть курсор вниз.

hDELi              Сдвинуть курсор к предыдущей строке и уничтожить любой запрос, сделанный для этой строки.

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

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

~                Пометить буфер как “неизмененный”.  Команда ~ делает это немедленно после того, как вы ее ввели.

%                             Переключает флаг доступности на запись для буфера. Команда %  действует сразу после ввода.

t         Обратиться к буферу как к таблице тегов. См. Раздел 22.13.3 [Выбор таблицы тегов], с. 228.

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

q                Выйти из меню буферов — сразу отобразить последний буфер, бывший прежде видимым на его месте.

hRETi

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.

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

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

M-x make-indirect-buffer базовыйбуфер hRETкосвенноеимя hRETi

Создает косвенный буфер с именем косвенноеимя,  чей базовый буфер — это

базовыйбуфер.

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

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

Один из способов применения косвенных буферов — отображение нескольких различных видов схемы текста. См. Раздел 21.8.4 [Несколько  видов для Outline], с. 193.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий