Чтобы скопировать содержимое файла в буфер, используйте функцию
insert-file-contents. (Не используйте команду
insert-file в программе Lisp, так как она устанавливает маркер.)
Эта функция вставляет содержимое файла 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, за исключением того, что
каждый байт в файле обрабатывается отдельно, преобразуясь в восьмибитный символ при
необходимости. Она не выполняет after-insert-file-functions и не выполняет
декодирование формата, преобразование кодировки символов, автоматическую распаковку и так далее.
Если вы хотите передать имя файла другому процессу, чтобы другая программа могла прочитать
файл, используйте функцию file-local-copy; см. Обеспечение «магических» имен файлов.