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

Вы можете записывать содержимое буфера или его часть непосредственно в файл на диске, используя функции 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 обычно следует символическим ссылкам и создает указанный файл, если символическая ссылка недействительна, он не следует символическим ссылкам, если mustbenew равен excl.

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

Если visit равен t, то Emacs устанавливает ассоциацию между буфером и файлом: буфер начинает посещать этот файл. Он также устанавливает время последнего изменения файла для текущего буфера в modtime 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 выводит сообщение «Wrote 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 (см. Список буферов).