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