2008-11-15 96 views
14

有一个相对路径,我如何从我加载的elisp文件的位置将它变成绝对路径。也就是说,我有一个我正在加载的elisp文件,它有一个相对路径,我需要一个绝对路径。Elisp中绝对路径的相对路径

回答

17
'file-truename 

从文档:

返回文件名的truename,这 应该是绝对的。通过在文件 的级别处追踪符号 链接以及在包含它的目录级别 处发现 文件名的激烈名称,直到没有链接在任何级别上留下 。

提供的另一个解决方案('expand-file-name)留下符号链接,这可能是也可能不是你想要的。 'file-truename使用'expand-file-name',所以它们都将确定缓冲区的路径相对default-directory(这就是你要求的)。

在看到不同答案的评论/问题后,问题在于默认目录是调用'load'的缓冲区的目录。

幸运的是,有一个“加载集”的变量,用于存储要加载的文件的路径。尝试此代码段时指出:

;; this is in the file being loaded 
(let ((default-directory (file-name-directory load-file-name))) 
    (file-truename "blih")) 
+0

它也可以用于目录吗? – Pablo 2008-11-15 09:22:09

5

您可以使用expand-file-name函数将相对文件名或路径转换为绝对文件名/路径。请参阅here了解更多信息。

+0

的问题是,当我加载〜/胡说/ bleh.el并评估(扩展文件名“blih”),我结束了〜/的blih代替〜 /嗒嗒/ blih。我需要它相对于文件的位置,而不是当我加载文件时碰巧出现的位置。 谢谢。 – Pablo 2008-11-15 02:18:22

10

我最终使用:

(expand-file-name "relative/path" (file-name-directory load-file-name)) 
+1

如果你想更加强大,你可以使用`(file-name-directory(或者load-file-name buffer-file-name)'),这会在加载文件或者使用eg Cx Ce。 – 2013-10-28 19:37:39