26.6.3 Truenames (Истинные имена)

truename файла — это имя, которое вы получаете, следуя символическим ссылкам на всех уровнях до тех пор, пока они не закончатся, затем упрощая появившиеся в качестве компонентов имени «.» и «..». Это приводит к некоторому каноническому имени для файла. Файл не всегда имеет уникальное истинное имя; количество различных истинных имен, имеющихся у файла, равно количеству жестких ссылок на этот файл. Однако истинные имена полезны, поскольку они устраняют символические ссылки как причину вариации имени.

Функция: file-truename filename

Эта функция возвращает истинное имя файла filename. Если аргумент не является абсолютным именем файла, эта функция сначала расширяет его относительно default-directory.

Эта функция не расширяет переменные окружения. Это делает только substitute-in-file-name. См. Определение substitute-in-file-name.

Если вам может потребоваться следовать символическим ссылкам, предшествующим «..», появляющимся в качестве компонента имени, вызовите file-truename без предварительных прямых или косвенных вызовов expand-file-name. В противном случае компонент имени файла, непосредственно предшествующий «..», будет упрощен до вызова file-truename. Чтобы устранить необходимость вызова expand-file-name, file-truename обрабатывает «~» так же, как это делает expand-file-name.

Если цель символической ссылки имеет синтаксис удаленного имени файла, file-truename возвращает его в кавычках. См. Функции, расширяющие имена файлов.

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

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

Чтобы проиллюстрировать разницу между file-chase-links и file-truename, предположим, что /usr/foo — символическая ссылка на каталог /home/foo, а /home/foo/hello — обычный файл (или, по крайней мере, не символическая ссылка) или не существует. Тогда у нас будет:

(file-chase-links "/usr/foo/hello")
     ;; Это не следует ссылкам в родительских каталогах.
     ⇒ "/usr/foo/hello"
(file-truename "/usr/foo/hello")
     ;; Предполагая, что /home не является символической ссылкой.
     ⇒ "/home/foo/hello"
Функция: file-equal-p file1 file2

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

Функция: file-name-case-insensitive-p filename

Иногда имена файлов или их части необходимо сравнивать как строки, в случае чего важно знать, является ли базовый файловая система нечувствительной к регистру. Эта функция возвращает t, если файл filename находится в файловой системе, нечувствительной к регистру. Она всегда возвращает t в MS-DOS и MS-Windows. В Cygwin и macOS файловые системы могут быть чувствительными или нечувствительными к регистру, и функция пытается определить чувствительность к регистру с помощью теста во время выполнения. Если тест неубедителен, функция возвращает t в Cygwin и nil в macOS.

В настоящее время эта функция всегда возвращает nil на платформах, отличных от MS-DOS, MS-Windows, Cygwin и macOS. Она не обнаруживает нечувствительность к регистру смонтированных файловых систем, таких как шары Samba или тома Windows, смонтированные через NFS. На удаленных хостах она предполагает t для метода «smb». Для всех других методов подключения выполняются тесты во время выполнения.

Функция: vc-responsible-backend file

Эта функция определяет ответственный бэкенд VC для заданного file. Например, если emacs.c — файл, отслеживаемый Git, (vc-responsible-backend "emacs.c") возвращает «Git». Обратите внимание, что если file является символической ссылкой, vc-responsible-backend не разрешит ее — сообщается бэкенд самой символической ссылки. Чтобы получить бэкенд VC файла, на который указывает file, оберните file функцией разрешения символических ссылок, такой как file-chase-links:

(vc-responsible-backend (file-chase-links "emacs.c"))