28.4 Имя файла буфера

Имя файла буфера — это имя файла, который посещается в этом буфере. Когда буфер не посещает файл, его имя файла буфера равно nil. В большинстве случаев имя буфера совпадает с некаталоговой частью имени файла буфера, но имя файла буфера и имя буфера — это различные понятия, и их можно устанавливать независимо. См. Посещение файлов.

Функция: buffer-file-name &optional buffer

Эта функция возвращает абсолютное имя файла, который посещает buffer. Если buffer не посещает никакой файл, buffer-file-name возвращает nil. Если buffer не указан, по умолчанию используется текущий буфер.

(buffer-file-name (other-buffer))
     ⇒ "/usr/user/lewis/manual/files.texi"
Переменная: buffer-file-name

Эта локальная переменная буфера содержит имя файла, посещаемого в текущем буфере, или nil, если он не посещает файл. Это постоянная локальная переменная, на которую не влияет kill-all-local-variables.

buffer-file-name
     ⇒ "/usr/user/lewis/manual/buffers.texi"

Изменять значение этой переменной без выполнения различных других действий рискованно. Обычно лучше использовать set-visited-file-name (см. ниже); некоторые из выполняемых там действий, такие как изменение имени буфера, не являются строго необходимыми, но другие необходимы, чтобы не запутывать Emacs.

Переменная: buffer-file-truename

Эта локальная переменная буфера содержит сокращённое истинное имя файла, посещаемого в текущем буфере, или nil, если файл не посещается. Это постоянная локальная переменная, на которую не влияет kill-all-local-variables. См. Истинные имена и abbreviate-file-name.

Переменная: buffer-file-number

Эта локальная переменная буфера содержит номер инода и идентификатор устройства файла, посещаемого в текущем буфере, или nil, если файл не посещается или посещаемый файл не существует. Это постоянная локальная переменная, на которую не влияет kill-all-local-variables.

Значение обычно представляет собой список вида (inodenum device). Эта пара уникально идентифицирует файл среди всех файлов, доступных в системе. См. функцию file-attributes в Атрибуты файлов для получения дополнительной информации о них.

Если buffer-file-name является именем символической ссылки, то и inodenum, и device относятся к рекурсивному целевому объекту ссылки.

Функция: get-file-buffer filename

Эта функция возвращает буфер, посещающий файл filename. Если такого буфера нет, она возвращает nil. Аргумент filename, который должен быть строкой, раскрывается (см. Функции, раскрывающие имена файлов), а затем сравнивается с именами посещаемых файлов всех живых буферов. Обратите внимание, что buffer-file-name буфера должен точно соответствовать раскрытию filename. Эта функция не будет распознавать другие имена того же файла.

(get-file-buffer "buffers.texi")
    ⇒ #<buffer buffers.texi>

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

Функция: find-buffer-visiting filename &optional predicate

Эта функция подобна get-file-buffer, за исключением того, что она может вернуть любой буфер, посещающий файл возможно под другим именем. То есть buffer-file-name буфера не обязан точно совпадать с раскрытием filename, достаточно, чтобы он ссылался на тот же файл. Если predicate не равен nil, он должен быть функцией одного аргумента — буфера, посещающего filename. Буфер считается подходящим возвращаемым значением, только если predicate возвращает не nil. Если не удаётся найти подходящий буфер для возврата, find-buffer-visiting возвращает nil.

Команда: set-visited-file-name filename &optional no-query along-with-file

Если filename — непустая строка, эта функция изменяет имя файла, посещаемого в текущем буфере, на filename. (Если у буфера не было посещаемого файла, она назначает его.) В следующий раз, когда буфер будет сохранён, он будет сохранён в указанный новый файл.

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

Если filename равен nil или пустой строке, это означает «нет посещаемого файла». В этом случае set-visited-file-name помечает буфер как не имеющий посещаемого файла, не изменяя флаг изменённости буфера.

Обычно эта функция запрашивает у пользователя подтверждение, если уже существует буфер, посещающий filename. Если no-query не равен nil, это предотвращает задавание этого вопроса. Если уже существует буфер, посещающий filename, и пользователь подтверждает или no-query не равен nil, эта функция делает новое имя буфера уникальным, добавляя номер внутри «‘<…>’» к filename.

Если along-with-file не равен nil, это означает, что следует считать, что предыдущий посещаемый файл был переименован в filename. В этом случае команда не изменяет флаг изменённости буфера, а также записанное время последней модификации файла, возвращаемое visited-file-modtime (см. Время модификации буфера). Если along-with-file равен nil, эта функция очищает записанное время последней модификации файла, после чего visited-file-modtime возвращает ноль.

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

Переменная: list-buffers-directory

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