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

Чтобы скопировать содержимое файла в буфер, используйте функцию 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) помещает меньше данных в список отмены.

Возможно прочитать специальный файл (например, FIFO или устройство ввода-вывода) с insert-file-contents, при условии, что 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; см. Обеспечение «магических» имен файлов.