Spec-Zone.ru › Elisp

Частичное описание

В отличие от описания двусторонней конверсии, описанной в предыдущем подразделе (см. Конверсия форматов в обе стороны), вы можете использовать переменные after-insert-file-functions и write-region-annotate-functions для отдельного управления соответствующими преобразованиями чтения и записи.

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

Эта ситуация лучше всего понимается в контексте преобразования свойств текста во время write-region. Например, символ в позиции 42 в буфере — это ‘X’ со свойством текста foo. Если преобразование для foo выполняется путем вставки в буфер, скажем, ‘FOO:’, то это изменит символ в позиции 42 с ‘X’ на ‘F’. Следующее преобразование сразу же начнётся с неправильных данных.

Чтобы избежать конфликта, кооперативные преобразования не изменяют буфер, а вместо этого задают аннотации — список элементов вида (position . string), отсортированный по возрастанию position.

Если имеется более одного преобразования, write-region объединяет их аннотации деструктивно в один отсортированный список. Позже, когда текст из буфера фактически записывается в файл, он перемешивает указанные аннотации в соответствующих позициях. Всё это происходит без изменения буфера.

В отличие от этого, при чтении аннотации, перемешанные с текстом, обрабатываются немедленно. insert-file-contents устанавливает указатель в начало некоторого текста для преобразования, затем вызывает функции преобразования с длиной этого текста. Эти функции всегда должны возвращаться с указателем в начале вставленного текста. Этот подход имеет смысл для чтения, потому что аннотации, удалённые первым конвертером, не могут быть ошибочно обработаны последующим конвертером. Каждая функция преобразования должна сканировать распознаваемые аннотации, удалить аннотацию, изменить текст буфера (например, для установки свойства текста) и вернуть обновлённую длину текста, как она выглядит после этих изменений. Значение, возвращаемое одной функцией, становится аргументом для следующей функции.

Переменная: write-region-annotate-functions

Список функций для вызова write-region. Каждая функция в списке вызывается с двумя аргументами: началом и концом области, подлежащей записи. Эти функции не должны изменять содержимое буфера. Вместо этого они должны возвращать аннотации.

В качестве специального случая, функция может возвратиться с другим текущим буфером. Emacs понимает это как означающее, что текущий буфер содержит изменённый текст для вывода. Поэтому он изменяет аргументы start и end вызова write-region, присваивая им значения point-min и point-max в новом буфере соответственно. Он также отбрасывает все предыдущие аннотации, поскольку они должны были быть обработаны этой функцией.

Переменная: write-region-post-annotation-function

Значение этой переменной, если оно не nil, должно быть функцией. Эта функция вызывается без аргументов после того, как write-region завершится.

Если какая-либо функция в write-region-annotate-functions возвращается с другим текущим буфером, Emacs вызывает write-region-post-annotation-function более одного раза. Emacs вызывает его с последним текущим буфером, а затем с буфером перед ним и так далее, возвращаясь к исходному буферу.

Таким образом, функция в write-region-annotate-functions может создать буфер, присвоить этой переменной локальное значение kill-buffer в этом буфере, настроить буфер с изменённым текстом и сделать буфер текущим. Буфер будет уничтожен после завершения write-region.

Переменная: after-insert-file-functions

Каждая функция в этом списке вызывается insert-file-contents с одним аргументом — количеством вставленных символов и с указателем в начале вставленного текста. Каждая функция должна оставлять указатель неизменённым и возвращать новое количество символов, описывающих вставленный текст, как он был изменён функцией.

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

Мы предлагаем не пытаться обрабатывать произвольные объекты Lisp как имена или значения свойств текста — потому что программа, которая настолько универсальна, вероятно, будет сложной в написании и медленной. Вместо этого выберите набор возможных типов данных, которые достаточно гибкие и не слишком сложные для кодирования.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Format-Conversion-Piecemeal.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API