2008-11-15 133 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