Spec-Zone.ru › Elisp

Функции расширения имён файлов

Расширение имени файла означает преобразование относительного имени файла в абсолютное. Поскольку это выполняется относительно каталога по умолчанию, необходимо указать каталог по умолчанию и имя файла для расширения. Это также включает в себя расширение сокращений, таких как ~/ (см. сокращение-имени-файла), и устранение избыточности, такой как ./ и name/../.

Функция: expand-file-name filename &optional directory

Эта функция преобразует filename в абсолютное имя файла. Если directory указан, он является каталогом по умолчанию, с которого начинается преобразование, если filename относительно и не начинается с ‘~’. (Значение directory должно быть абсолютным именем каталога или именем каталога; оно может начинаться с ‘~’.) В противном случае используется значение default-directory текущего буфера. Например:

(expand-file-name "foo")
     ⇒ "/xcssun/users/rms/lewis/foo"
(expand-file-name "../foo")
     ⇒ "/xcssun/users/rms/foo"
(expand-file-name "foo" "/usr/spool/")
     ⇒ "/usr/spool/foo"

Если часть filename перед первой косой чертой является ‘~’, она расширяется до вашего домашнего каталога, который обычно определяется значением переменной среды HOME (см. Общие переменные в Руководстве по GNU Emacs). Если часть перед первой косой чертой является ‘~user’ и если user — это допустимое имя пользователя, она расширяется до домашнего каталога пользователя user. Если вы не хотите этого расширения для относительного filename, который может начинаться с буквального ‘~’, вы можете использовать (concat (file-name-as-directory directory) filename) вместо (expand-file-name filename directory).

Имена файлов, содержащие ‘.’ или ‘..’, упрощаются до своего канонического вида:

(expand-file-name "bar/../foo")
     ⇒ "/xcssun/users/rms/lewis/foo"

В некоторых случаях ведущий компонент ‘..’ может остаться в выводе:

(expand-file-name "../home" "/")
     ⇒ "/../home"

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

Расширение . или пустой строки возвращает каталог по умолчанию:

(expand-file-name "." "/usr/spool/")
     ⇒ "/usr/spool"
(expand-file-name "" "/usr/spool/")
     ⇒ "/usr/spool"

Обратите внимание, что expand-file-name не расширяет переменные окружения; это делает только substitute-in-file-name:

(expand-file-name "$HOME/foo")
     ⇒ "/xcssun/users/rms/lewis/$HOME/foo"

Также обратите внимание, что expand-file-name не следует за символическими ссылками на любом уровне. Это приводит к различию в том, как file-truename и expand-file-name обрабатывают ‘..’. Предполагая, что ‘/tmp/bar’ — это символическая ссылка на каталог ‘/tmp/foo/bar’, мы получаем:

(file-truename "/tmp/bar/../myfile")
     ⇒ "/tmp/foo/myfile"
(expand-file-name "/tmp/bar/../myfile")
     ⇒ "/tmp/myfile"

Если вам может потребоваться следовать символическим ссылкам перед ‘..’, вы должны убедиться, что вызывается file-truename без предварительных прямых или косвенных вызовов expand-file-name. См. Полные имена.

Переменная: default-directory

Значение этой переменной, локальной для буфера, — это каталог по умолчанию для текущего буфера. Это должно быть абсолютное имя каталога; оно может начинаться с ‘~’. Эта переменная локальна для каждого буфера.

expand-file-name использует каталог по умолчанию, когда его второй аргумент является nil.

Значение всегда является строкой, заканчивающейся косой чертой.

default-directory
     ⇒ "/user/lewis/manual/"
Функция: substitute-in-file-name filename

Эта функция заменяет ссылки на переменные окружения в filename значениями переменных окружения. Следуя стандартной синтаксической конструкции оболочки Unix, ‘$’ является префиксом для подстановки значения переменной окружения. Если вход содержит ‘$$’, он преобразуется в ‘$’; это дает пользователю способ указать ‘$’.

Имя переменной окружения — это последовательность буквенно-цифровых символов (включая символы подчеркивания), которые следуют за ‘$’. Если символ, следующий за ‘$’, является ‘{’, то имя переменной — все до соответствующего ‘}’.

Вызов substitute-in-file-name на выводе, полученном с помощью substitute-in-file-name, обычно дает неверные результаты. Например, использование ‘$$’ для указания одного ‘$’ не будет работать должным образом, а ‘$’ в значении переменной окружения может привести к повторной подстановке. Поэтому программы, которые вызывают эту функцию и помещают вывод туда, где он будет передан этой функции, должны удваивать все символы ‘$’, чтобы предотвратить последующие неверные результаты.

Здесь мы предполагаем, что переменная окружения HOME, которая хранит домашний каталог пользователя, имеет значение ‘/xcssun/users/rms’.

(substitute-in-file-name "$HOME/foo")
     ⇒ "/xcssun/users/rms/foo"

После подстановки, если ‘~’ или ‘/’ появляются непосредственно после другой ‘/’, функция отбрасывает все, что находится перед ней (до непосредственно предшествующей ‘/’).

(substitute-in-file-name "bar/~/foo")
     ⇒ "~/foo"
(substitute-in-file-name "/usr/local/$HOME/foo")
     ⇒ "/xcssun/users/rms/foo"
     ;; /usr/local/ has been discarded.

Иногда нет необходимости расширять имена файлов. В таких случаях имя файла можно заключить в кавычки, чтобы подавить расширение и обработать имя файла буквально. Заключение в кавычки выполняется путём добавления префикса ‘/:’ к имени файла.

Макрос: file-name-quote name

Этот макрос добавляет префикс цитирования ‘/:’ к файлу name. Для локального файла name он добавляет префикс ‘/:’ к name. Если name — имя удалённого файла, локальная часть name (см. Магические имена файлов) цитируется. Если name уже является цитируемым именем файла, name возвращается без изменений.

(substitute-in-file-name (file-name-quote "bar/~/foo"))
     ⇒ "/:bar/~/foo"
(substitute-in-file-name (file-name-quote "/ssh:host:bar/~/foo"))
     ⇒ "/ssh:host:/:bar/~/foo"

Макрос нельзя использовать для подавления обработчиков имён файлов из магических имён файлов (см. Магические имена файлов).

Макрос: file-name-unquote name

Этот макрос удаляет префикс цитирования ‘/:’ из файла name, если таковой имеется. Если name — имя удалённого файла, локальная часть name разцитируется.

Макрос: file-name-quoted-p name

Этот макрос возвращает не-nil, когда name цитируется с префиксом ‘/:’. Если name — имя удалённого файла, проверяется локальная часть name.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Expansion.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API