26.13.2 Спецификация туда и обратно

Наиболее общий из двух механизмов управляется переменной format-alist — списком спецификаций формата файлов, которые описывают текстовые представления, используемые в файлах для данных в буфере Emacs. Описания для чтения и записи объединены в пары, поэтому мы называем это спецификацией «туда и обратно» (см. Пошаговая спецификация для несвязанной спецификации).

Переменная: format-alist

Этот список содержит по одному определению формата для каждого заданного формата файла. Каждое определение формата представляет собой список следующего вида:

(имя строка-документации регулярное-выражение функция-из функция-в изменять функция-режима сохранять)

Вот что означают элементы в определении формата:

имя

Название этого формата.

строка-документации

Строка документации для формата.

регулярное-выражение

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

функция-из

Команда оболочки или функция для декодирования данных в этом формате (для преобразования данных файла в обычное представление данных Emacs).

Команда оболочки задаётся в виде строки; Emacs запускает эту команду как фильтр для выполнения преобразования.

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

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

функция-в

Команда оболочки или функция для кодирования данных в этом формате — то есть для преобразования обычного представления данных Emacs в этот формат.

Если функция-в является строкой, это команда оболочки; Emacs запускает эту команду как фильтр для выполнения преобразования.

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

  • Путём редактирования буфера на месте. В этом случае функция-в должна возвращать конечную позицию диапазона текста после изменений.
  • Путём возврата списка аннотаций. Это список элементов вида (позиция . строка), где позиция — это целое число, задающее относительную позицию в записываемом тексте, а строка — аннотация, которую нужно добавить в этом месте. Список должен быть отсортирован по порядку позиций при возврате функцией-в.

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

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

изменять

Флаг, t, если функция кодирования изменяет буфер, и nil, если она работает путём возврата списка аннотаций.

функция-режима

Функция второстепенного режима, вызываемая после посещения файла, преобразованного из этого формата. Функция вызывается с одним аргументом — целым числом 1; это указывает функции второстепенного режима включить этот режим.

сохранять

Флаг, t, если format-write-file не должен удалять этот формат из buffer-file-format.

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

Посещение файла с помощью find-file-noselect или команд, использующих его, выполняет преобразование аналогичным образом (поскольку она вызывает insert-file-contents); она также вызывает функцию режима для каждого формата, который декодирует. Она сохраняет список имён форматов в буферно-локальной переменной buffer-file-format.

Переменная: buffer-file-format

Эта переменная определяет формат посещённого файла. Точнее, это список имён форматов файлов, которые были декодированы в процессе посещения файла текущего буфера. Эта переменная всегда буферно-локальна во всех буферах.

Когда write-region записывает данные в файл, он сначала вызывает функции кодирования для форматов, перечисленных в buffer-file-format, в порядке их появления в списке.

Команда: format-write-file файл формат &optional подтверждение

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

Команда: format-find-file файл формат

Эта команда находит файл файл, преобразуя его согласно формату формат. Она также делает формат стандартным, если буфер будет сохранён позже.

Аргумент формат — это список имён форматов. Если формат равен nil, преобразование не выполняется. Интерактивно, ввод просто RET для формат задаёт nil.

Команда: format-insert-file файл формат &optional начало конец

Эта команда вставляет содержимое файла файл, преобразуя его согласно формату формат. Если начало и конец не равны nil, они задают, какую часть файла читать, как в insert-file-contents (см. Чтение из файлов).

Возвращаемое значение аналогично тому, что возвращает insert-file-contents: список из абсолютного имени файла и длины вставленных данных (после преобразования).

Аргумент формат — это список имён форматов. Если формат равен nil, преобразование не выполняется. Интерактивно, ввод просто RET для формат задаёт nil.

Переменная: buffer-auto-save-file-format

Эта переменная задаёт формат, используемый для автосохранения. Её значение — это список имён форматов, аналогичный значению buffer-file-format; однако он используется вместо buffer-file-format при записи файлов автосохранения. Если значение равно t (по умолчанию), автосохранение использует тот же формат, что и обычное сохранение в том же буфере. Эта переменная всегда буферно-локальна во всех буферах.