26.1.1 Функции для посещения файлов

В этом разделе описаны функции, обычно используемые для посещения файлов. По историческим причинам эти функции имеют имена, начинающиеся с ‘find-’ вместо ‘visit-’. См. Имя файла буфера для функций и переменных, которые обращаются к имени посещённого файла буфера или находят существующий буфер по имени его посещённого файла.

В программе на Lisp, если вы хотите просмотреть содержимое файла, но не изменять его, самый быстрый способ — использовать insert-file-contents в временном буфере. Посещение файла не обязательно и занимает больше времени. См. Чтение из файлов.

Команда: find-file filename &optional wildcards

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

Если не учитывать некоторые технические детали, тело функции find-file в основном эквивалентно:

(switch-to-buffer (find-file-noselect filename nil nil wildcards))

(См. switch-to-buffer в Переключение на буфер в окне.)

Если wildcards не равен nil, что всегда истинно при интерактивном вызове, то find-file раскрывает шаблонные символы в filename и посещает все соответствующие файлы.

При интерактивном вызове find-file запрашивает filename в минибуфере.

Команда: find-file-literally filename

Эта команда посещает filename, как и find-file, но она не выполняет никаких преобразований формата (см. Преобразование формата файла), преобразований кодировки символов (см. Системы кодирования) или преобразований концов строк (см. Преобразование концов строк). Буфер, посещающий файл, делается однобайтовым, а его основной режим — Fundamental, независимо от имени файла. Спецификации локальных переменных файла (см. Локальные переменные файла) игнорируются, а автоматическая распаковка и добавление новой строки в конец файла из-за require-final-newline (см. require-final-newline) также отключены.

Обратите внимание: если в Emacs уже есть буфер, посещающий тот же файл не буквально, он не будет посещать тот же файл буквально, а вместо этого просто переключится на существующий буфер. Если вы хотите быть уверены в буквальном доступе к содержимому файла, вам следует создать временный буфер, а затем прочитать содержимое файла в него с помощью insert-file-contents-literally (см. Чтение из файлов).

Функция: find-file-noselect filename &optional nowarn rawfile wildcards

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

Функция возвращает существующий буфер, если такой есть; в противном случае она создаёт новый буфер и читает в него файл. Когда find-file-noselect использует существующий буфер, она сначала проверяет, не изменился ли файл с момента его последнего посещения или сохранения в этом буфере (если только nowarn не равен nil, см. ниже). Если файл изменился, эта функция спрашивает пользователя, нужно ли перечитать изменённый файл. Если пользователь отвечает ‘yes’, все правки, ранее сделанные в буфере, теряются.

Чтение файла включает декодирование содержимого файла (см. Системы кодирования), включая преобразование концов строк, и преобразование формата (см. Преобразование формата файла). Если wildcards не равен nil, то find-file-noselect раскрывает шаблонные символы в filename и посещает все соответствующие файлы.

Эта функция отображает предупреждающие или информационные сообщения в различных особых случаях, если только необязательный аргумент nowarn не равен nil. Например, если нужно создать буфер, а файла с именем filename не существует, она выводит сообщение ‘(New file)’ в области эхо и оставляет буфер пустым. Проверка последнего изменения файла также пропускается, если nowarn не равен nil.

Функция find-file-noselect обычно вызывает after-find-file после чтения файла (см. Подпрограммы посещения). Эта функция устанавливает основной режим буфера, анализирует локальные переменные, предупреждает пользователя, если существует файл автосохранения более новый, чем только что посещённый файл, и завершает работу, запуская функции в find-file-hook.

Если необязательный аргумент rawfile не равен nil, то after-find-file не вызывается, и find-file-not-found-functions не запускаются в случае ошибки. Более того, значение rawfile, не равное nil, подавляет преобразование системы кодирования и преобразование формата.

Функция find-file-noselect обычно возвращает буфер, который посещает файл filename. Но если шаблоны действительно используются и раскрываются, она возвращает список буферов, посещающих различные файлы.

(find-file-noselect "/etc/fstab")
     ⇒ #<buffer fstab>
Команда: find-file-other-window filename &optional wildcards

Эта команда выбирает буфер, посещающий файл filename, но делает это в окне, отличном от выбранного окна. Она может использовать другое существующее окно или разделить окно; см. Переключение на буфер в окне.

При интерактивном вызове эта команда запрашивает filename.

Команда: find-file-read-only filename &optional wildcards

Эта команда выбирает буфер, посещающий файл filename, как find-file, но помечает буфер как доступный только для чтения. См. Буферы только для чтения для связанных функций и переменных.

При интерактивном вызове эта команда запрашивает filename.

Пользовательская опция: find-file-wildcards

Если эта переменная не равна nil, то различные команды find-file проверяют наличие шаблонных символов и посещают все файлы, соответствующие им (при интерактивном вызове или когда их аргумент wildcards не равен nil). Если эта опция равна nil, то команды find-file игнорируют свой аргумент wildcards и никогда не обрабатывают шаблонные символы особым образом.

Пользовательская опция: find-file-hook

Значение этой переменной — список функций, вызываемых после посещения файла. Спецификация локальных переменных файла (если есть) будет обработана до запуска хуков. Буфер, посещающий файл, является текущим во время выполнения функций хука.

Эта переменная является обычным хуком. См. Хуки.

Переменная: find-file-not-found-functions

Значение этой переменной — список функций, вызываемых, когда find-file или find-file-noselect передаётся имя несуществующего файла. find-file-noselect вызывает эти функции, как только обнаруживает несуществующий файл. Она вызывает их в порядке списка, пока одна из них не вернёт значение, отличное от nil. buffer-file-name уже установлен.

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

Переменная: find-file-literally

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