Функции расширения имён файлов
Расширение имени файла означает преобразование относительного имени файла в абсолютное. Поскольку это выполняется относительно каталога по умолчанию, необходимо указать каталог по умолчанию и имя файла для расширения. Это также включает в себя расширение сокращений, таких как ~/ (см. сокращение-имени-файла), и устранение избыточности, такой как ./ и 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