Spec-Zone.ru › Elisp

Запись в файлы

С помощью функций append-to-file и write-region можно напрямую записать содержимое буфера или его части в файл на диске. Не используйте эти функции для записи в посещаемые файлы: это может вызвать путаницу в механизмах посещения файлов.

Команда: append-to-file start end filename

Эта функция добавляет содержимое области текущего буфера, ограниченной start и end, в конец файла filename. Если этот файл не существует, он создаётся. Эта функция возвращает nil.

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

При вызове из Lisp эта функция полностью эквивалентна следующему выражению:

(write-region start end filename t)
Команда: write-region start end filename &optional append visit lockname mustbenew

Эта функция записывает область текущего буфера, ограниченную start и end, в файл, указанный аргументом filename.

Если start равен nil, команда записывает в файл всё содержимое буфера (а не только доступную часть) и игнорирует end.

Если start — строка, то write-region записывает или добавляет эту строку вместо текста из буфера. В этом случае end игнорируется.

Если append не равен nil, указанный текст добавляется к существующему содержимому файла (если оно есть). Если append — число, write-region переходит к указанному смещению в байтах от начала файла и записывает данные начиная с этой позиции.

Если mustbenew не равен nil, write-region запрашивает подтверждение, если filename указывает на существующий файл. Если mustbenew — символ excl, write-region не запрашивает подтверждение, а вместо этого сигнализирует об ошибке file-already-exists, если файл уже существует. Хотя обычно write-region следует по символьной ссылке и создаёт файл, на который она указывает, если цель символьной ссылки отсутствует, при значении excl аргумента mustbenew функция не следует по символьным ссылкам.

Проверка существования файла при значении excl аргумента mustbenew использует специальную системную возможность. По крайней мере для файлов на локальном диске исключена ситуация, когда другая программа создаст файл с тем же именем до того, как это сделает Emacs, и Emacs об этом не узнает.

Если visit равен t, Emacs устанавливает связь между буфером и файлом: после этого буфер посещает этот файл. Кроме того, функция устанавливает время последнего изменения файла для текущего буфера в значение времени изменения файла filename и помечает буфер как неизменённый. Эта возможность используется в save-buffer, но вам, вероятно, не следует использовать её самостоятельно.

Если visit — строка, она задаёт имя файла для посещения. Таким образом, можно записать данные в один файл (filename), а буфер указать как посещающий другой файл (visit). Аргумент visit используется в сообщении в области эха, а также для блокировки файла; значение visit сохраняется в buffer-file-name. Эта возможность используется для реализации file-precious-flag; не используйте её самостоятельно, если только вы точно не знаете, что делаете.

Необязательный аргумент lockname, если он не равен nil, задаёт имя файла, используемое для блокировки и разблокировки; для этой цели оно заменяет значения filename и visit.

Функция write-region преобразует записываемые данные в соответствующие форматы файлов, заданные с помощью buffer-file-format, и также вызывает функции из списка write-region-annotate-functions. См. раздел Преобразование форматов файлов.

Обычно write-region выводит в области эха сообщение «Записан filename». Это сообщение не выводится, если visit не равен ни t, ни nil и не является строкой, а также если Emacs работает в пакетном режиме (см. раздел Пакетный режим). Эта возможность полезна для программ, которые используют файлы для внутренних целей и о которых пользователю знать не нужно.

Переменная: write-region-inhibit-fsync

Если значение этой переменной равно nil, write-region использует системный вызов fsync после записи файла. Если значение равно t, Emacs не использует fsync. Значение по умолчанию — t. См. раздел Файлы и вторичное хранилище.

Макрос: with-temp-file file body…

Макрос with-temp-file вычисляет формы body, используя временный буфер в качестве текущего; затем, в конце, записывает содержимое буфера в файл file. По завершении он удаляет временный буфер и восстанавливает буфер, который был текущим до формы with-temp-file. Затем он возвращает значение последней формы в body.

Текущий буфер восстанавливается даже в случае аварийного выхода через throw или ошибки (см. раздел Нелокальные выходы).

Как и with-temp-buffer (см. раздел Текущий буфер), временный буфер, используемый этим макросом, не запускает хуки kill-buffer-hook, kill-buffer-query-functions (см. раздел Удаление буферов) и buffer-list-update-hook (см. раздел Список буферов).

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Writing-to-Files.html

Spec-Zone.ru

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