28.11 Непрямые буферы

Непрямой буфер (indirect buffer) разделяет текст какого-либо другого буфера, который называется базовым буфером (base buffer) непрямого буфера. В некотором смысле это аналог для буферов символической ссылки между файлами. Базовый буфер сам по себе может не быть непрямым буфером.

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

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

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

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

Команда: make-indirect-buffer base-buffer name &optional clone inhibit-buffer-hooks

Эта команда создает и возвращает непрямой буфер с именем name, базовым буфером которого является base-buffer. Аргумент base-buffer может быть живым буфером или именем (строкой) существующего буфера. Если name является именем существующего буфера, сигнализируется ошибка.

Если clone не равен nil, то непрямой буфер изначально наследует состояние base-buffer, такое как основной режим, второстепенные режимы, локальные переменные буфера и так далее. Если clone опущен или равен nil, состояние непрямого буфера устанавливается в состояние по умолчанию для новых буферов.

Если base-buffer является непрямым буфером, его базовый буфер используется в качестве основы для нового буфера. Если, кроме того, clone не равен nil, начальное состояние копируется из фактического базового буфера, а не из base-buffer.

См. Создание буферов для информации о inhibit-buffer-hooks.

Команда: clone-indirect-buffer newname display-flag &optional norecord

Эта функция создает и возвращает новый непрямой буфер, который разделяет базовый буфер текущего буфера и копирует остальные атрибуты текущего буфера. (Если текущий буфер не является непрямым, он используется в качестве базового буфера.)

Если display-flag не равен nil, как это всегда происходит при интерактивных вызовах, это означает отображение нового буфера вызовом pop-to-buffer. Если norecord не равен nil, это означает, что новый буфер не будет помещен в начало списка буферов.

Функция: buffer-base-buffer &optional buffer

Эта функция возвращает базовый буфер buffer, по умолчанию текущий буфер. Если buffer не является непрямым, возвращается nil. В противном случае возвращается другой буфер, который никогда не является непрямым буфером.