2012-07-30 94 views
0

我認爲標題不能清楚地描述問題。但我會嘗試更詳細地描述單詞。如何在Emacs Lisp中連接模式?

這裏是我的Emacs Lisp代碼來設置備份文件夾:

(setq backup-directory-alist '(("" . "/hom/test/.backups"))) 

但是,如果我想在一個動態的方式,它基於用戶的路徑上的路徑生成的備份路徑做這個工作。

這裏是我想要做的事:

(setq temp-file-folder "/home/test") 
(setq backups-save-folder (concat temp-file-folder "/.backups")) 
(setq backup-directory-alist '(("" . backups-save-folder))) 

但它不工作。以上代碼的最終輸出是:

(("" . backups-save-folder)) 

我想什麼,我試圖讓應該是:

(("" . "/home/test/.backups")) 

那麼,什麼是生成路徑動態正確的代碼?什麼意思。在代碼中?

謝謝

回答

4

首先,一點。您可以使用format函數代替concat來執行此操作(與printf類似)。下面是一個例子

(let ((home_dir "/home/noufal") 
     (posts_dir "posts")) 
    (format "%s/%s" home_dir posts_dir)) 

評估爲"/home/noufal/posts"

這不是地道的口齒不清到setq臨時變量。您應該在let構造的範圍內工作,該構造可以將值綁定到幾個臨時符號,然後完成您的工作。

在你最後一種情況下,你在第二個參數前使用了'。這將阻止它被評估(這是「直接引用」的代名詞),因此,backups-save-folder將不會被替換爲值。如果你想這樣做,請做這樣的事情。

(setq backup-directory-alist (list (cons "" backups-save-folder))) 

.是代表名單,其cdr不是一個列表的方式。有關更多詳細信息,請參閱elisp documentation

+1

你也可以使用quasiquote,看起來更好的IMO。 (setq backup-directory-alist'((「」,backups-save-folder))) – jpkotta 2012-07-31 01:46:41

+0

根據你的建議,我添加了以下代碼,它的工作原理是:(setq backup-directory-alist(list(cons「 ((backups_dir「/.backups」) (temp_folder desktop-temp-file-folder)) (格式爲「%s /%s」temp_folder backups_dir))))) – 2012-07-31 04:17:48

0

看來你並不需要一個關聯列表,設計用於存儲配對值,但一個簡單的列表:

獲取當前用戶目錄(getenv的「HOME」)

可能與另一個任意字符串組合「-BACKSTAGE-AREA」

(setq我-DIR(名單(CONCAT(getenv的 「HOME」) 「 - BACKSTAGE-AREA」)))

得到的目錄名稱以那種方式存儲與

(車我-DIR)

0

根據Noufal Ibrahim的答案,這是我最後的代碼:

(setq backup-directory-alist (list (cons "" 
            (let ((backups_dir "/.backups") 
              (temp_folder desktop-temp-file-folder)) 
             (format "%s/%s" temp_folder backups_dir))))) 

它的工作原理。

謝謝