Spec-Zone.ru › Elisp

Чтение из файлов

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

Функция: insert-file-contents filename &optional visit beg end replace

Эта функция вставляет содержимое файла filename в текущий буфер после точки. Она возвращает список, содержащий абсолютное имя файла и длину вставленных данных. Если filename не указывает на файл, доступный для чтения, или указывает на каталог, сигнализируется ошибка.

Эта функция проверяет содержимое файла на соответствие определённым форматам и при необходимости преобразует его, а также вызывает функции из списка after-insert-file-functions. См. Преобразование форматов файлов. Обычно одна из функций в списке after-insert-file-functions определяет кодировку (см. Кодировки), используемую для декодирования содержимого файла, включая преобразование символов конца строки. Однако если файл содержит нулевые байты, по умолчанию он открывается без каких-либо преобразований кодировки. См. inhibit-null-byte-detection.

Если visit не равен nil, эта функция также помечает буфер как неизменённый и задаёт различные поля буфера, чтобы он считался связанным с файлом filename: в частности, имя посещаемого буфером файла и время последнего изменения файла при сохранении. Эта возможность используется функцией find-file-noselect, и вам, вероятно, не следует использовать её самостоятельно.

Если beg и end не равны nil, они должны быть числами, задающими смещения в байтах и указывающими часть файла, которую нужно вставить. В этом случае visit должен быть равен nil. Например:

(insert-file-contents filename nil 0 500)

вставляет символы, закодированные первыми 500 байтами файла.

Если beg или end окажется в середине многобайтовой последовательности символа, преобразование кодов символов в Emacs вставит в буфер один или несколько восьмибитовых символов (так называемых «сырых байтов») (см. Наборы символов). Если вы хотите таким образом прочитать часть файла, рекомендуем привязать coding-system-for-read к подходящему значению на время вызова этой функции (см. Указание кодировки для одной операции) и написать код на Lisp, который будет проверять наличие сырых байтов на границах, считывать всю последовательность этих байтов и преобразовывать их обратно в допустимые символы.

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

С помощью insert-file-contents можно читать специальный файл (например, FIFO или устройство ввода-вывода), если replace равен nil или if-regular, а visit и beg равны nil. Однако для таких файлов обычно следует задавать аргумент end, чтобы избежать вставки в буфер потенциально неограниченного объёма данных (например, при вставке данных из /dev/urandom).

Функция: insert-file-contents-literally filename &optional visit beg end replace

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

Если вам нужно передать имя файла другому процессу, чтобы другая программа могла прочитать этот файл, используйте функцию file-local-copy; см. Создание «магических» имён файлов.

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/Reading-from-Files.html

Spec-Zone.ru

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